Архив рубрики: Программирование

Мультипроектность по Сазерленду

За годы проведённые на фрилансе я, как правило, занимался огромным количеством проектов одновременно. Данная практика была обусловлена тем, что в самом начале этого невероятно сложного пути – работы не было вообще никакой. И последующие появления любого намёка на удачный проект – бронировался авансом наперёд (т.к. часть проектов непременно само собой отваливалось). “Вы заняты?Нет!“. Именно поэтому никто на фрилансе (сейчас раскрою одну большую тайну) никогда не ставит статус “Занято”. Никто, кроме меня :)

Так вот, недавно прочитал книжку Джеффа Сазерленда: “SCRUM. Революционный метод управления проектами” – довольно-таки спорную, но достаточно интересную. И вот в одной из глав там был описан забавный эксперимент, который меня определённо заставил задуматься.

Суть такова: возьмите лист бумаги, нарисуйте три колонки: “Арабские числа“, “Римские числа“, “Буквы“. Приготовьте таймер. Задача следующая – заполнить данную матрицу 3×10, обязательно слева-направо. Т.е. начинаем с “1” арабской, следующую пишем “I” римскую, затем латинскую букву “A“; переходим к следующему ряду – “2“, “II“, “B” и т.д. до 10 включительно. У вас это займёт какое-то время, запомните его. Теперь выполним вторую часть эксперимента – заполните эту же матрицу, но теперь вертикально, а не горизонтально – т.е. сверху-вниз. Сначала вводим все арабские цифры: “1“, “2“… “10“; римские “I“, “II“… “X” и латинские буквы “A“, “B“…

У вас вторая часть опыта займёт куда меньшее время, в среднем от половины до трети экономии. Наш мозг намного производительнее работает в рамках какой-то одной выбранной системы, контекста. Любое переключение за рамки – добавляют обязательное время “на это самое переключение, т.е. потери в чистом виде. Это означает, что контора (команда, фрилансер), которая делает два проекта одновременно – закончит их через (абстрактно) 3 месяца, а занимаясь сначала исключительно 1м, затем 2м проектом – завершит оба за ~2-2.3 месяца. Всё остальное – потери. Согласно Сазерленду, работа над двумя проектами не означает, что вы будете уделять 50% времени на проект. Всего сорок. Сорок процентов и двадцать на потери. Три проекта – не тридцать три процента, а 20% (!!!) с суммарной величиной потерь – 40% (!!!).

Не меняя количества работы, не добавляя ресурсов – мы экономим колоссальное время.

Где-то с лета 2015 года стараюсь перевести себя на “академический″ SCRUM (пока выходит частично, не все принципы “заезжают”). Работа над одним проектом “здесь и сейчас” – наверное, самое важное, что я получил в этой книге (второе – спринты). С лета 2015 на “поддержку” и “допиливания” выделяю отдельный какой-то конкретный день (или выходные), без вмешательства в основной рабочий процесс.

И я обязательно расскажу про эту интересную книгу ещё.. )

Написать игру размером в твит или знай наших!

Утро началось в маршрутке со статьи в “хакере” на тему того, что какой-то чувак бросил вызов девелоперам мира сия на предмет “а слабо ли сделать игру размером в твит?”. И  что вроде как кое-кому даже это удалось. Дома, с рабочего компьютера я поковырял тему глубже – оказывается, что предоставленная игра – “игрой″ по сути не является. Можете попробовать сами: твит. Суть такова – тыкать в крестик и не промахиваться. Но я не знаю при каких обстоятельствах можно промахнуться по крестику, поэтому игра.. она теоретически влезла в твит, но игра ли это – большой вопрос.

Параллельно я вспомнил про реализацию игры “угадай число”, которую я писал на qbasic лет так 16 назад. Суть такова: компьютер загадывает число и предлагает пользователю угадать. Если введённое число больше загаданного – компьютер пишет “загаданное число меньше” и т.д. Параллельно считая количества попыток на угадывание и т.д.. Вот эту вот задачу я и попытался втиснуть в твит. Понадобилось чуть более получаса, чтобы я всунул всё-таки всё, что планировал всунуть без особого вреда к геймплею :)

Итак, код моей фантастической игры размером в 139 символов (а это означает, что на ещё один байт можно ой как разгуляться):

static void Main(){int n=new Random().Next(100);int v=-1;while(v!=n){v=int.Parse(Console.ReadLine());Console.Write(v==n?’W':v>n?'<‘:’>’);}}

Соответственно, размещёно и здесь. Данный код являет собой консольное приложение, написанное на C# и выглядит всё это примерно так:

C# Console

C# Console

Фидбек от автора запроса был получен скромным “фавом“, но буду считать, что задачу выполнил:

UPD:

Оказывается задача была сделать игру на JS, ну я потратил времени ещё меньше. Код вышел следующим (здесь получилось сделать всё за 130 символов):

<script>var c=Math.floor(Math.random()*100)+1;function r(v){alert(v==c?”w”:v>c?”<“:”>”);}</script><input onchange=r(this.value);>

Эта фантастическая игра доступна здесь.

Фриланс, родной, прости меня!(..

Пару дней назад до меня достучались знакомые, скинули несколько не очень приятных ссылок, в которых было указано моё имя.. и, конечно, надо отвечать вот подобным открытым письмом :(

Занимаюсь программированием с 6-7 класса школы. На данный момент нахожусь в топ-5 программистов по Украине (на сайте фриланс.ру при включенном ПРО-аккаунте я всегда на 2-4 месте), за все эти годы фрилансерства мне ежедневно присылают огромную кучу всяких странноватых и иногда подозрительных проектов и предложений. Зачастую за очень хорошие деньги. Многие из них что называется “на грани” добра и зла. Я сто раз отказывал мужьям, которые просили утилиту, для отслеживания скайп-разговоров жён; отказывал людям, просившие сделать утилиту, чтобы при запуске ОС и не верно введённом пароле – всё удалялось из “моих документов″.. были люди, которые просили нечто вроде подглядывателей, просмотрщиков, контроллеров и т.д. А всяких порносайтов, скачиваний, подмен кукисов, спам-рассылок и прочих сниферов – не счесть. Каждый божий день-  всё пишут, пишут. Практически всем из них, конечно, я давал отрицательный ответ.

Грань между законом и не законом во всех этих приложениях – миллиметр. Т.е., допустим, директор хочет смотреть за подчинёнными.. ты пишешь софт, а как его буду использовать – это уже вне рамок твоего знания и доступа. Он вполне может поставить эту штуку в раздевалке и подглядывать – да и бог им судья. Или использовать не в офисе на своём ПК, а на домашнем компьютере.. или соседском. Ты пишешь, отдаёшь что-либо и знать не знаешь, что и как будут делать с твоим софтом.

Нарвался я тут на проект один.. с месяц назад. Там же, с фриланса. Добавился человек, попросили сорцы скомпилить – говорит не обидит деньгами. Сейчас период студенческих сдач, уверен, что тот случай – с нас не упадёт. Бывает в таких ситуациях в сам код зашито что-то страшное (пару раз хотели у меня же украсть кукисы и увести аккаунт от фриланса), поэтому качаю, запускаю на виртуальной машине. Там подключёны референсы, которых нет в природе. Отсюда и ошибки. Удаляю их и всё компилится. Отдаю. Мне говорят – не работает. Открываю код и вижу – программа сделана очень плохо, код “карявый″ во всех местах… Суть такая – программа качает с сайта файлы и ставит в AppData, везде указаны пути “жёстко”, как есть. Говорю, что это не будет работать.

Сразу отказался, под предлогом, что подобное не пишу. Но человек устно объяснил, что для своих сугубо локальных целей – своя ферма локальных ПК. По легенде ради “побаловаться”. Это вполне реальная информация, т.к. я пару лет назад тоже ставил себе нечто подобное. Я дал согласие, т.к. считаю эти все майнинги в рамках существующих огромных ферм – полным бредом (ввиду вышеописанного опыта). Перенёс проект на свой рабочий пк, убрал прямые пути и допилил сверху конфиг. Приложение, которое вышло из моих рук – является абсолютно безобидным. С пустым конфигом оно просто запустится и просто закроется. Потратил часа два и передал вместе с конфигуратором (написал также программу для составления конфигурации). Передал “как есть” – вместе с ответственностью за использование и т.д.

Первая версия не работала, попросили всунуть ещё изменений. Изменил. Через день мне сказали, что НОД поставил на карантин. Сомнения и подозрения уже закрались тогда. Но деньги уже получены, а я на поддержке (такие правила в профессии), ну думаю – практически любое неподписанное приложение, которое ломится в интернет – есть подозрительное (и это правильно). Т.е. если сделать свой RSS ридер – он тоже попадёт в список карантина, при этом являясь совершенно безобидным. Исходя из этого, всё что надо – поменять контрольную сумму самого приложения – просто добавляю пару мусорных строк. Перекомпилировал – отдал. И забыл.

Итого: я изменил существующий код – добавил удалённый конфиг и пару тройку исключений к уже написанному приложению. Отдал всё это. Каюсь. Естественно, обфускацией не занимался – раз для баловства, кому надо будет лезть в чужой код. Плюс не убирал сигнатуры свои, потому что … зачем? Человек купил у меня эту доработку, как “лом” у простого ремесленника.

Через некоторое время мой антивирус сказал, что моя программа же – является майнером. Работа над этим проектом тут же прекратилась, исходные коды были удалены (они НЕ БЫЛИ переданы), человек этот добавлен во все черные списки – сайт фриланс.ру, скайп и т.д. Логи очищены, информация стёрта. Не было никаких описанных “версий″, не было обходов, ничего этого. Была первая нерабочая чужая версия, которую я скомпилировал и вторая, которую я изменил уже + одна версия с тем же функционалом, но с мусорным кодом.

То, что я сделал – фактически небольшой инсталлятор, с таким же списком элементарных действий – есть конфиг и есть результат его обработки. Как используют инсталляторы – дело рук уже конечных пользователей. Это инструмент. Может быть всё использоваться во благо, а может и нет. Тот же функционал можно было сделать средствами общедоступными InnoSetup и его же документированными функциями. Подобным образом софт ставят практически все гиганты софтовые. Любой из существующих множества инсталляторов – выполняет те же действия. Может и скачать, и с реестром работает. И “смешать” любой софт с любым другим – также. Это открытая абсолютно прозрачная функция, который может заняться любой человек. По аналогии – как format – несёт убийственную мощь, но есть на каждом компьютере. И будет всегда там.

Моя программа в том виде, в котором есть изначально и до самого конца – НЕ ВИРУС (потому что не вредна и не вредоносна) и НЕ ТРОЯН (потому что не принимает инородную форму). Она и название имело прямое, до безобразия (как сам проект). Использовал её не я – не распространял, не делал инсталлы, не платил рекламщикам или кому-то ещё и, конечно, не получал никакой прибыли. Собственно это, слава богу, заметили специалисты сразу.

Программа не была дописана до конца – я оборвал эту разработку, реализована без самообновления и все исходные коды уничтожены. Реализация была заточена ТОЛЬКО для работы с урлами заказчика (их было всего 2). Использование программы ВНЕ этих урлов невозможно, что даёт гарантии о том, что на этом история этого приложения закончилась раз и навсегда. Материальный или же какой-либо другой ущерб и вред – отсутствует как таковой. Т.к. обфускации не было – можете сами посмотреть в Reflector’е, если где найдёте файл. Даже с учётом той конфигурации, с которой использовали мой софт – это совершенно безобидная “прослойка” между программой-майнером (который, к слову также использовался без ведома автора) и ОС. Добавляемые файлы, строки запуска и добавления в реестр – всё дело конфигурации пользователя.

ЗЫ И на последок, как завет коллегам.. Будьте осторожны и бдительны. Очень часто наши знания покупают не в тех целях, о которых говорилось изначально. А от подобного вообще ни один специалист не застрахован :(

Самопиар: Я и Free-lance.ru

После того, как я купил “пробный″ недельный PRO-аккаунт на сайте free-lance.ru – произошли значительные изменения меня в топе работников меча и топора :) Практически в два раза вырос рейтинг, перекинув меня на 27-ую позицию в разделе “Прикладное программирование” (из более чем полутора тысячи человек). Что, конечно, доставляет. Итого, по Украине на сайте – я шестой программист, по Николаеву – первый. И всего за пять месяцев пребывания там. Пока что багаж мнений, оценок, конечно, не очень. Но это же только начало. Вобщем, можете глянуть. Ну и в случае чего, знаете к кому обращаться :)