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

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

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

Так вот, недавно прочитал книжку Джеффа Сазерленда: «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-ую позицию в разделе «Прикладное программирование» (из более чем полутора тысячи человек). Что, конечно, доставляет. Итого, по Украине на сайте — я шестой программист, по Николаеву — первый. И всего за пять месяцев пребывания там. Пока что багаж мнений, оценок, конечно, не очень. Но это же только начало. Вобщем, можете глянуть. Ну и в случае чего, знаете к кому обращаться 🙂