Showing posts with label Software development. Show all posts
Showing posts with label Software development. Show all posts

Thursday, March 18, 2010

Метрики при разработке софта

Все, конечно, слышали про метрики, используемые при разработке софта. Это может быть количество написанных строк кода, количество исправленных багов, количество исправленных багов в день, количество сделанных багов, количество регрессий, способность делать без опозданий, количество функциональных точек, имплементированных за релиз или этап проекта, и т.д., и т.п.

Долгое время мир делился на теоретиков-апологетов метрик и практиков. Апологеты гордо и самоуверенно вещали: "Ну, мы же инженеры или не инженеры? Инженеры должны мерять! И ваще, процесс!" В качестве положительных примеров приводились случаи, когда тот или иной процесс применялся и продукт таки удавалось создать и шипнуть!

Практики указывали на очевидную слабость любой метрики. Количество строк кода порождает стиль с обилием пустых строк, отдельными фигурными скобками на строку и многословными непонятными комментариями. Количество исправленных багов, ясное дело, стимулирует их создание в первую очередь, а количество сделанных багов или регрессий приводит процесс к скрежещащей тормозами скорости и функциональной бедности результата, поскольку ничего не удается успеть и почти все приходится перекладывать на следующую версию. А если мерять девов по числу исправленных багов, а тестеров по числу открытых, то команда достигает невероятного единения в желании растянуть этот процесс до бесконечности – гармония обычно плохо сочетающаяся с желанием менеджмента все-таки закончить проект в какой-то разумный срок.

Инженеры меряют, но что?

К слову, я лично в большинство метрик не верю и считают аргумент, что "инженеры меряют" полной фальшивкой. Инженеры во все времена меряли обьекты, которые они контролировали, или индустриальных работников, которыми они управляли. Насколько я знаю, успешных способов мерять инженеров вне разработки софта в истории не бывало, да и в разработке софта это в основном фальшивые успехи. Хотя тут история, конечно, чуть сложнее, о чем я скажу отдельно.

Дело в том, что разработка софта бывает очень разной. Сравните это с автомобилестроением. Одно дело завинчивать гайки на потогонной линии, другое дело создать новую модель. Первое меряется, второе – разве что по результату и продажам новой модели. А заметьте, и то, и другое – это "создание автомобиля".

Вот и с "созданием софта" так же история. Одно дело склепать типичный вебсайт типа брошюры или там, каталога с покупательской корзинкой. Это как завинчивать гайки на конвейере, меряй – не хочу. Вот только сайты создают не совсем инженеры, там работа ближе к индустриальному рабочему, потому и мерять такую работу легко, и проекты управляемые, если, конечно, заказчик не полный идиот и не меняет требования на лету каждый день, но тут уж не ваших рабоников надо мерять.

А другое дело, когда вы работаете на фирму, по положению обязанную выпускать каждый раз нечто, от чего должны челюсти на пол со стуком падать, а если этого не сделал, то во-первых, проигрываешь конкурентам, а во-вторых, тебя и твою фирму публика начинает обзывать разными неприличными именами, причем совершенно заслуженно.

И с чего вы решили, что ваши менеджеры смогут мерить и предсказывать то, что весь остальной мир считал невозможным и что ему даже в голову не приходило? Не обманывайтесь, вероятность того, что вы наняли всех умных людей в мире ничтожна, особенно, если вы управляете ими при помощи метрик – метода обычно приводящая к уменьшению количества умных людей в окрестности.

Много ли толку от метрик?

На ту же тему есть еще одно интересное рассуждение. Недавно, один из классиков инженерного подхода к разработке софта Том ДеМарко разродился статьей, где в основном отказывается от своей позиции сторонника метрик, причем приводит интереснейший пример.

Допустим, у вас есть два проекта, которые по смете каждый стоит миллион. Проект А, после реализации, принесет фирме 100 миллионов, а проект Б только 2 миллиона.

Теперь скажите сами, для какого проекта важнее контролировать его стоимость? Проект Б, верно? Если вы ошибетесь с оценкой стоимости проекта в два раза, то проект А принесет 98 миллионов вместо 99, разница около одного процента, а вот проект Б окажется полностью бесприбыльным и безполезным.

Видите что получается? Чем более бесполезен проект, тем более важны метрики.

Этот вывод имеет еще одно интересное следствие: Чем более менеджмент озабочен метриками, тем более он неспособен находить или выбирать прибыльные проекты, на которых значение метрик менее значительно. По сути это значит, что чем более менеджмент озабочен метриками, тем более он, менеджмент, бесполезен для фирмы.

Опять же, повторюсь, может быть ваша фирма – консалтинг, который делает коммодитизированную работу (например, клепает брошюрные вебсайты) и работает за небольшую маржу, определяемую конкуретным рынком. В этом случае и метрики, и процессы – все по делу. Только не заблуждайтесь, вы меряете не инженеров, а почти что промышленных рабочих, владеющих HTML и Javascript'ом. Никакого особого отношения к инженерии это не имеет. А если вам действительно нужна инженерия, то увы...

Баланс между риском и шампанским, или любовь – зла...

Я уже приводил этот пример в статье про экономику открытий, но рискну повторить его. Очень уж хорошо он описывает суть дела.

Представьте себе сказочного принца, решившего спасти сказочную принцессу. Явилась она ему в "видении"... Одна беда – он понятия не имеет где она, как туда добраться, сколько драконов окажется по дороге, и прочие мелочи, делающие жизнь интересной и непредсказуемой. Причем непредсказуемой оказывается не только жизнь, но и время и денежные затраты, требующиеся для миссии, что совершенно не устраивает папу-короля, которому нужно только чтобы его балбес в предсказуемый срок и с предсказуемыми затратами притащил особу женского пола, которую можно будет выдать замуж за принца и посадить королевой, когда придет их время. И начинается процесс планирования с метриками и прочими причандалами управления проектами спасения сказочных принцесс.

Во-первых, "открытый поиск" не входит в планы королевства, так что требуется спецификация. Спецификация, как обычно, включает задачу минимум и задачу максимум. В качестве задачи максимум записываются смутные воспоминания принца о его видении или там сновидении, а в задачу минимум вставляется упомянутое выше описание короля. Дальше начинается планирование work items – промежуточных задач, и milestones – этапов проекта для достижения результата.

По ходу дела выясняется, что воспоминания принца мягко говоря смутные, поэтому менджмент решает, что надо максимально ясно специфицировать как принцессу, так и маршрут. По обоим направлениями создаются task force, которые исследуют обычные маршруты сказочных принцев и характеристики принцесс.

С маршрутом оказывается, что практически все принцы (и царевичи) начинали с первого этапа – визита к Бабе-Яге, благо маршрут хорошо известен. Правда, проходит он по соседнему королевству-царству-государству, так что создается еще одна группа, занимающаяся отношениями с партнерской командой, но в остальном первый этап выглядит неплохо и достаточно ясно.

Вот со вторым этапом появляются проблемы. Оказывается, что большинство успешных принцев получило указания на второй этап от Бабы-Яги, а эти указания совершенно невозможно получить, не выполнив первого этапа. И что же делать? Не бойтесь, нет такой задачи, которую не мог бы решить менеджерский ум. Создается еще одна таск форс, которая анализирует успешных принцев и на основе этого решает, какие указания даст Баба-Яга. Оказывается, что все они следовали одному и тому же шаблону. На втором этапе они сразили дракона. На третьем этапе женились на принцессе, которую этот дракон охранял.

К сожалению, драконов никто из менеджеров в глаза не видел, а допустить плохо определенный термин при планировании просто недопустимо. В результате задача второго этапа формулируется как "Добраться до места, указанного Бабой-Ягой. Сразить мечом животное, на которое укажет Баба-Яга." Правда, "место, указанное Бабой-Ягой" звучит несколько неопределенно, так что в задачу принцу так же ставится добиться, чтобы "указанное место" было в пределах X дней пути. По поводу величины X разворачивается длительная дискуссия, приводящая к тому, что после времени затраченного на дискуссию, на X остается не более одного дня.

Этап три в этом случае уже совсем простой. Есть правда проблема с определением принцессы, поскольку ни в одной сказке ни одна принцесса не размахивала сертификтом о королевском рождении, но все сказки описывали другой признак, которым обладали принцессы. Таким образом и третий этап формулирется достаточно точно и предсказуемо.

В результате такого планирования получается техническое задание для принца:

Этап 1. Добраться до избушки Бабы-Яги.

Этап 2. Добраться до животного, на которое укажет Баба-Яга (убедить Бабу-Ягу указывать на зверя не далее одного дня пути, либо предварительно найти такого самостоятельно) и сразить его.

Этап 3. Жениться на особе женского пола, которую охраняло сраженное животное и привезти ее обратно в королевство.

В общем, вы уже поняли, что женится наш принц на внучке Бабы-Яги, сразив козла, которого та пасла на лужайке огородом.

Так, к чему это я? А к тому, что баланс между риском проекта и его полезностью обычно в той же пропорции, что и в старой пословице про рискующих и пьющих шампанское. Да, вы можете снизить риск проекта и получить предсказуемый результат в предсказуемое время. Но вы можете это сделать только ценой полезности этого результата, либо времени.

Есть классическое высказывание, что в любом проекте имеет место баланс между функциональностью, качеством и временем. Практически любой проект можно сделать с практически сколь угодно хорошим качеством при наличии бесконечного времени. Практически любой проект можно сделать в почти любое фиксированное время, если не требуется, чтобы результат реально работал. Практически любой проект можно сделать с практически сколь угодно хорошим качеством, если можно отрезать произвольное количество запланированной функциональности (например, снизив функциональность до нуля). Ни одна их этих крайностей недопустима, поэтому приходится достигать баланса между ними – приемлемый обьем функциональности в приемлемое время с приемлемым качеством. Слово "приемлемое", как вы понимаете, никакого отношения к пользователям (скажем, принцу) не имеет, и является функцией хорошего отношения к группе высшего менеджмента. Если время начинает истекать, первым теряется функциональность, вторым – очень часто – качество.

Что я пытаюсь сказать в этой статье, это то, что используя мудреные процессы для снижения риска (предсказуемое время) вы всего-навсего частично переводите процесс отрезания функциональности в начало проекта, и когда функциональности оказыватся так мало, что ее действительно можно запланировать – менеджмент рапортует о победе. Вот и получаются проекты, где "сразили животное и женились на особе женского пола, которую оно охраняло." И хорошо, если это – внучка Бабы-Яги, а не она сама, или там, коза, которая паслась рядом. Кстати, не оттуда ли взялась сказка о царевне-лягушке?

Послесловие к метрикам при разработке софта и опять об экономика открытий

В заключении к этой статье о метриках при разработке софта, хочу повториться (см. мою предыдущую статью "Экономика открытий") и сказать, что метрики можно использовать, но, как сказал Омар Хайам о вине, надо знать когда, и где, и с кем.

Разработка софта скрывает за собой очень разные виды деятельности. В некоторых случаях, проекты могут быть нивелированы до практически индустриальной эры, когда менеджер знает в точности, что надо делать, а работники просто выполняют его указания. Тут и метрик особенно не нужно, разве что такие простые типа количества закрученных за смену гаек. Иногда это проекты экономики знаний, где менеджер не знает, как конкретно достичь результата, но это знают работники, потому что они обладают знанием предмета. В этом случае обычно метрики можно использовать, хотя и куда сложнее.

Вот только похоже, что все больше и больше компаний жизенно зависит от своих групп и подразделений, работающих в экономике открытий. Давайте прикинем, сколько отраслей уже не могут существовать даже в экономике знаний, производя просто небольшие улучшения своих продуктов тут и там, а вынуждены каждые несколько лет удивлять чем-то новым... Я даже не упоминаю индустрию разработки софта, вот несколько другиих примеров:

  • Автомобильная индустрия – конкуренция и постоянно меняющиеся требования покупателей. Гонка за экономичностью, безопасностью, маневренностью, комфортом. Три крупнейшие группы производителей – японские, европейские и американские, готовы друг друг глотку перерезать, не говоря уж о конкуренции внутри групп, Тойота проти Хонды и Ниссана, Даймлер против БМВ, Форд против GM и Крайслера... Неудивительно, что производители, оставшиеся в индустриальной эпохе, вроде Лады или Фиата большинству даже в голову не приходят, несмотря на то, что и те, и другие имеют свои наработки – Фиат, например, вроде бы лидер в экономичности, к сожалению, с непримлемой для многих мощностью двигателей.
  • Авиастроение – все слыхали историю с Dreamliner от Боинга? Вот, кажется, ярчайший пример компании, застрявшей в экономике знаний, а то и индустриальной. Люди у них грамотные, образованные, а вот методы управления... Это ж насколько надо было плевать на людей, чтобы перевести штаб-квартиру компании из Сиэттла в Чикаго, просто потому что новый CEO с Восточного побережья!
  • Тяжелое машиностроение – опять же гонка между японскими, европейскими и американскими производителями. Знаете разницу между экскаватором за полмиллиона и три миллиона? Бортовое ПО, которое знает как его выкрутить в стабильное положение, когда он стоит на крае котлована и его покачнуло к краю.
  • Военная техника – вот уж индустрия, где победа в конкурентной борьбе буквально вопрос выживания.

Конечно, все эти индустрии не такие очевидные как разработка софта. В конце концов, у них всех есть и чисто производственные отделения, ресурсы. Та же автомобильная конвейерная линия к экономике знаний имеет относительное отношение, но в том-то и дело, что эти отделения – это вовсе не то, что определяет успех или провал этих компаний.

Так что, когда мне возражают, что и гвозди все еще надо штамповать, и картошку, или там, ананасы растить – я и не спорю. Конечно, есть сектора экономики по-прежнему живущие вне экономики знаний или экономики открытий. Вот только не они определяют выживание фирм и конкурентоспособность национальных экономик.

Хотите два примера? Пример номер один: Россия начала 20-го века. Вся страна была еще по сути феодальной с какой-то степенью капитализма. Социализм нарос только в столицах и нескольких крупных городах, так что конфликт производительных сил и производственных отношений был весьма локализован географически. И все равно жахнуло так, что мало не показалось. Кстати, в феврале, а не октябре. Вся эта кодла Временного правтельства была по сути разношерстной смесью социалистов представляющих уже не капитализм или феодализм, а социализм – индустриальное общество.

Пример номер два? Ага, Россия конца 20-го века. Опять же, экономика знаний нарасла в столицах плюс нескольких крупных центрах. Вся глубинка была индустриальной, с отдельными вкраплениями микрокапитализма, специфического феодализма и даже местами первобытнообщинного строя. Конфликт производства и управления из-за прогресса производства опять весьма локализованный. И тем не менее, опять жахнуло.

По сравнению с Россией Америка имеет громадное преимущество – ее социализм корпоративный, а не государственный, так что она может ломаться и "перестраиваться" по кусочкам, отдельными компаниями или индустриями. Там, отдельно дот-комы, отдельно коммуникации, потом банки... Все равно неприятно, но полегче чем перестройка. Но если экономику открытий в производстве и дальше игнорировать, то выводов Маркса никто так и не отменял, и перестройка в рамках отдельно взятой фирмы тоже будет не мед, если окажешься в ней в этот момент.

Как обычно, кросс-пост с персонального блога.

Friday, August 14, 2009

Корпорация, которая нанимает лучших

Многие фирмы очень гордятся тем, что нанимают только "лучших". Звучит разумно, правда? Зачем нанимать кого-то, как не лучших, если можешь себе это позволить?

Нет, правда. Скажем, нужны вам очки, одни, другие, дюжина... разве имеет смысл покупать хоть какие, кроме лучших? Там полизать, на хвост нанизать... Или, скажем, собрались вы с тремя приятелями сыграть квартетом. Опять же, какие инстументы и покупать, как не лучшие?

Вы уже поняли, наверное, к чему я клоню. Нанять лучших может и непросто, но управиться с ними -- задача большинству корпоративных менеджеров просто непосильная. А если лучшими и шибко умными не управлять, то такую фирму подстерегают определенные опасности...

Если вы следили за моим блогом, то должны были видеть перевод статьи Филиппа Су "Каждый хочет править миром", в котором он дает рецепт создания хорошего софта:

  1. Разбросайте девелоперов по чистому кампусу
  2. Посыпьте газиллионом компьютеров
  3. Намажьте акциями, бонусами и хорошими зарплатами
  4. Периодически по необходиомсти засовывайте в них еду
  5. Повторяйте 20 лет

Все. И правда, лучшие - они не случайно лучшие. Как только они перестают заботиться о хлебе насущном, они начинают делать то, что они любят делать. А это как раз создание хороших программ. Все просто, правда?

Просто, да не очень. Это пока пункт 3 на месте все так хорошо, а как начинаются всякие кривые колокольчика и массовые увольнения, идиллический пейзаж (в котором разрабочикам было не о чем беспокоиться, кроме создания хорошего софта) сменяется эволюционной средой. И тут с рецептом начинаются серьезные проблемы.

Эволюционная среда - это такая штука, где выживает наиболее приспособленный. Не самый умный. Не самый сильный. Не самый программистский. Самый приспособленный. А лучшие, они все же еще люди, так что и ведут они себя в эволюционной среде так, как ведут себя люди. А как ведут себя люди в эволюционной среде,  где правит отнюдь не главный закон джунглей из Маугли, а более как бы... просто, закон джунглей. Чтобы понять ответ на этот вопрос, проще всего взглянуть на ближайших родственников человека в животном мире и что они делают в эволюционной среде. А ближайшими нашими родственниками являются шимпанзе, свиньи и крысы.

К слову о крысах... вспомнилась байка о том, как на средневековых кораблях боролись с этими назойливыми грызунами. Ловили пару десятков или больше крыс, сажали в бочку и не кормили. Самых слабых, естественно, тут же сьедали собратья, после чего в бочке оставались только лучшие.

А что дальше? А дальше оказывалось, что в эволюционной среде, вроде бочки без еды, даже если туда посадить исключительно лучших, кто-то все-таки окажется слабейшим. А когда его сьедят, то кто-то другой. Ну, и так далее, пока в бочке не останется ровно один большой Крыс. Вот этого крыса тогда выпускают в трюм, поскольку к этому времени он уже понял, что питаться другими крысами куда вкуснее, чем обьедками и заплесневелым зерном. И никакой кошки не надо...

Впрочем я отвлекся. Переутомился видать на работе, мысли легко отвлекаются на сторонние и не относящиеся к делу темы... О чем это я? Ах, да, про корпорации, которые нанимают самых лучших.

Так, возвращаясь, что я хотел сказать, что нанимать лучших -- это отличная идея. Но надо не забывать с ними правильно обращаться, чтобы у вас была "креативная" атмосфера и среда, а не эволюционная. А то с эволюционной средой ваших самых "лучших" могут запросто сьесть самые приспособленные. Эволюция - она дама серьезная. С ней не поспоришь.

Да, и как вы поняли, статья эта на одну из моих любимых тем -- о корпоративных паразитах.

С персонального блога, само собой...

Tuesday, July 28, 2009

WYMIWYG – хотели? Получите! Ничего не знаю, оплачено!

Все в курсе, что такое WYSIWYG? Наверняка все. А я вот хочу поговорить про WYMIWYG – What You Measure Is What You Get, и почему в большинстве случаев метрики – это совсем не то, что вы хотите в менджменте программными проектами.

Ну, да, кросс-пост с персонального как обычно...

Метрики при разработке софта

Нет, правда, а как иначе? Инженеры мы или не не инженеры? Усё должно меряться. И вот приходит новый менеджер в команду и начинает писать спаслания: «Чего-то я сегодня не заметил, чтобы каждый девелопер, пришедший на работу, исправил бы баг. Нам надо исправлять по крайней мере по два бага на девелопера в день!» Метрика? Еще какая метрика. Осмысленная? Ну, если у вас 300 багов, 10 девелоперов, и две недели, то куда деться? И правда надо чинить по два бага в день. Однако... отгадайте, к чему такая метрика приведет?

Во-первых, люди – не дураки. Им зарплата нужна, а выпендриваться большинству (кроме законченных идиотов вроде меня) – лень. Так что, «командир сказал хорек, и никаких сусликов!» Сказано баги чинить, будем баги чинить. План по валу, вал по плану.

Теперь, о том, что метрика не мерит. Первым результатом в любой команде будет всплеск регрессий. Это когда каждый починенный баг вносит 1-2 новых. Это то, что вы хотели? Вряд ли, правда?

Впрочем, социалистического менеджера такие мелочи не остановят. Он и регрессии может померять. И после того, как он начал мерить все индикаторы, до которых он мог додуматься и увидеть, а люди научатся их имитировать, отгадайте, что происходит следующим?

Ага. Начинают страдать метрики, которые ему и в голову не могли придти. А менеджеру, который пишет такие письма, ясен пень, очень много чего в голову не приходит. Например, количество проблем, которые не видны при разработке, но всплывут как только продукт будет выпущен. Или качество отрываемых багов. Или процент принятия новых фичей, которые совершенно необходимы для успеха продукта, поскольку девы уже в курсе, что их меряют по багам, а не по фичам.

А еще, как думаете, тестеров, что, не меряют? Еще как меряют, и отгадайте как? По количеству открываемых багов. И вот тест начинает открывать тонны багов «Передвинуть кнопку на 2 миллиметра», а девы так же счастливо эти микробаги чинят, метрики и у тех, и у других взлетают под небеса, и вся продуктовая команда превращается в вариант счастливой семьи. И когда продукт выпускают, пользователь тоже начинает себя чувствовать в некотором роде в семье... и требовать развода.

Исторические корни метрик

Сейчас я скажу одну «мыслю», с которой многие не согласятся. Но я ее все-таки скажу. Исторические корни метрик – в социалистическом обществе. Помните, Владимира Ильича? «Социализм – это учет и контроль!» И правда. В социалистическом (индустриальном) общесте метрики работали отлично. Скажем, есть рабочий на заводе, заворачивает винты в правые передние дверцы машин на конвейере. Темп у него задан, так что завинтить он должен одно и то же количество винтов в смену. Зато количество винтов, которые не прошли контроль качества – это отличная метрика, чтобы мерить его производительность. Чем меньше винтов плохо закручено – тем лучше рабоник. Все просто, правда?

Конечно, и тут не все просто, поскольку контроль качества тоже надо мерять, и если их мерять по количеству найденных плохо закрученных винтов, представляете, что за террариум получится? Но тут дирекция сама виновата – надо знать что мерить. Контроль качества должен отвечать за количество гарантийных ремонтов, а не за найденные плохие винты, тогда все будет работать. Социализм, однако, по какую бы сторону океана вы ни находились.

Вы уже заметили проблему? После социализма, в экономике знаний, найти один параметр для измерений практически невозможно. А что самое главное, менеджер обычно не знает, что делают подчиненные. Совершенно не имеет значения, что он сам был девом всю свою жизнь и вот-вот выбился в маленькие начальники. Индустрия развивается умопомрачительно быстро и кластеризована донельзя. Сделайте два шага в сторону – и вы уже не в курсе что действительно важно, а что – ерунда. Дев хоть учиться может, а менеджеру на это времени нет – надо по митингам бегать и щеки надувать, чтоб не сьели.

Это – принцип экономики знаний: менеджер не знает, как действительно его подчиненные достигают результата. Именно это и делает экономику знаний экономикой знаний. Если бы это было не так, ваша фирма была бы обычной социалистической (индустриальной) фабрикой. А теперь сами подумайте, если менеджер реально не знает, как его подчиненные добиваются успеха, как он может мерять это?

Баги? Строки кода? См. выше.

Многие начинающие менджеры (несколько лет в менеджменте) высокомерно посмотрят на это и скажут, «Ну, я-то знаю, как они это делают!» Позвольте не согласиться. Вполне возможно, что вы можете сказать, кто из ваших людей вносит больший вклад в дело, а кто – меньший. Это вы должны быть способны, если вы – толковый менеджер. Так что в этом я с вами согласен. А вот в вашу способность найти магически вычисляемую цифру, по которой вы можете мерить людей – не верю!

Подумайте, Билл Гейтс и Стив Джобс ни использовали формальные метрики при управлении командами, когда они еще занимались этим. Что вам дает основания думать, что вы умнее их?

А чего это я все говорю?

Если вы следите за моими статьями, то вы уже в курсе, что я не из тех, кто плачется публике в передник. У меня обычно какая-то интересная мысль зудит по одной из моих любимых тем – эволюционный марксизм или корпоративные паразиты. Так что, чего это я на эту тему расписался?

Ну, эволюционный марксизм вы и сами увидели – то, что метрики – это тяжелое наследие уходящего социалистического общественного строя. Однако самое интересное не это, а то что... отгадайте, кто любит метрики в экономике знаний? Ага. Они, родимые. Корпоративные паразиты.

Сами посудите. Как только вас начинают мерять линейкой, вы знаете что симулировать. Вы знаете, как утилизовать ваши социальные связи. Вы знаете как использовать свое влияние в группе. Если вы – паразит-подчиненный, вы можете хватать легие баги и подсовывать трудные коллегам. Вы можете использовать свои связи с тест командой, чтобы разбивать баги в облако мелких. А уж если вам все-таки достанется трудный баг, вы знаете, как превратить его в проблему для всей группы, застопорить всю работу, чтобы никто не мог ничего чинить, и довести дело до того, что когда вы его все-таки почините, все вздохнут с облегчением и менеджмент еще долго будет восхищаться вашим подвигом. Если вы – паразит-мендежер, вы знаете как использовать баги, чтобы продвигать тех, кого хотите, и задвигать тех, кого хотите; как презентовать успехи высшему менеджменту который в разработке вообще ни в зуб ногой, поскольку пришел из маркетинга; вы знаете как держать людей в напряжении – не спрашивайте, зачем это нужно менеджерам-паразитам, никогда не мог этого понять, но подозреваю, что это «старый добрый принцип» держиморд «щоб боялись!»

Так что ради чего я пишу это статью – это чтобы напомнить, что корпоративная среда – это эволюционная среда. В эволюционной среде выживает наиболее приспособленный. Наиболее приспособленный – это вовсе необязательно наиболее полезный, в большинстве случаев это отнюдь не более полезный. Каждый раз когда вы меряете что-то, кроме сколько денег заработала фирма в результате усилий работника, вы меряете совсем не то, что вы на самом деле хотите. Измерить сколько денег заработала фирма на усилиях конкретного программиста, пи-эма, тестера, спеца по маркетингу обычно просто физически невозможно. Так что если вы их меряете, вы меряете не то, что хотите. А когда вы меряете не то, что хотите, вы получаете не то, что хотите. WYMIWYG, однако…

Saturday, May 16, 2009

МИМУКРАПП - Методология Использования Методологий для Ускорения Карьерного Роста и Акселерации Прозводства Программ

То и дело на Интернете приходится сталкиваться со спорами противников Методологий Разработки Программного Обеспечения и их сторонников. Сторонники с непревзойденным чувством самооценки (self-esteem) обьяснят вам, что не дело лаптем щи хлебать, и что просто сесть и написать – это «ковбойский» стиль, который ни к чему хорошему не приведет. А надо делать... и дальше, в зависимости от сезона идет название очередной модной методологии разработки программ. Сие излагается с апломбом секретаря парторганизации или там шамана племени, так чтобы сразу было ясно, что любой возражающий идет против линии партии и, того гляди, навлечет на племя проклятие Злых Духов Программного Обеспечения, чтобы и мысли не возникало возражать.

Методология эта обычно изложена в толстых трудах, где подробно описано каждый шаг разработки, включая кто, когда и где решает, что нужно делать, как рассаживаться вокруг музыкальных инструметов, сколько раз прыгать вокруг племенного костра на правой ноге, а сколько на левой, и в какой руке при этом держать бубен. Методология подтверждается многочисленными примерами внедрения (case studies), когда, несмотря на применение методологии, та или иная команда все-таки выполнила запланированный проект почти в срок и почти в рамках бюджета. А каждый возражающий узнает, что он мордой не вышел программы писать, и пошел бы он пасти коз, а не совался бы со свиным рылом в калашный... пардон, программный ряд. В общем, как если бы кто пришел на тусовку, посвященную одежде и моде, в модели прошлого сезона, или, о ужас, ваще в одежке простых смертных.

Для начала, позвольте все-таки сунуться в калашный ряд, поскольку критика оных методологий обычно либо отстутсвует («Не тронь ..., вонять не будет.»), либо звучит достаточно примитивно («Они не работают!»). Две крупнейшие технические проблемы с методологиями разработки ПО, которые я вижу, это избыточность и некорректность примеров внедрения. Две крупнейшие организационные проблемы с методологиями разработки ПО, на мой взгляд состоят в политизированности и вирусной природе, которые делают их идеальным оружием в руках корпоративных паразитов против тех, кто делает реальную работу в проектах. Позвольте пояснить.

Избыточность и некорректность примеров внедрения.

Попробуйте покритикуйте любую методику разработки софта, и тут же раздастся хор голосов: «А мы ее использовали и у нас получалось!» Ну, да, получалось. А копните, и окажется, что использовали-то не по букве инструкций, а в вольной форме. Там на правой ноге прыгнули лишний раз, тут бубен не в той руке держали. Что и отражает причины, почему получается. Если подумать, то любая методика разработки софта сводится обычно к одной-двум фразам. Водопад = «сначала выясни что нужно, потом подумай как это сделать, и только потом пиши код.» Экстремистское программирование = «каждый кусок кода должны быть способны починить хотя бы два члена компанды.» Скрам = «собирайтесь на ежедневные летучки.» И правда, чего такого неверного в том, чтобы подумать прежде чем писать или в летучках, чтобы знать, если кто застрял? Все верно.

При этом, если обратите внимание, все методологии устроены примерно так:

1. N страниц текста, описывающих пляски с бубном.
2. «Программист пишет код»
3. Еще K страниц текста, описывающих пляски с бубном.

То есть по сути любая методология в конце концов сводится к тому, что куча народу – менеджер, менджер проекта или ПМ, лиды тестовой команды, архитектор, специально назначенные «умные товарищи» пляшут с бубном вокруг программиста, который во всем этом гвалте должен в определенный момент написать работающий код, а в остальное время также участвовать в плясках. И возникает законный вопрос, а так ли действительно важно загнуть мизинец правой руки после третьего прыжка на левой ноге и четвертого встряхивания бубна?

Вообще, тема такая, что поневоле хочется отвлечься и написать по ней побольше. Например, вы задумывались, что методологии действительно очень напоминают первобытную охотничью магию? У вас есть заклинания шамана (на основе священных книг, описывающих методологию), наскальная живопись с поверженной добычей (UML диграммы и спецификации), сама технология танца (15 минут, все стоят, каждый имеет минуту на статус), собственный словарь («цыпленок», «свинья»,...), строгая иерархия, определяющая в каком порадке воины-охотники поражают нарисованную на стене пещеры добычу... Вообще, а не в человеческой ли природе устраивать что-то подобоное каждый раз, когда очень хочется и не получается. Ну, скажем, хочется кушать, а мамонт убежал. Или там, программный продукт не работает... Впрочем, я отвлекся.

Вот это я и имею в виду под избыточностью. Одна фраза разбавляется до толстого тома очень относительно относящимися к делу деталями, вокруг которых и разгораются потом страсти и борьба за престол очередной крошечной империи.

Вирусная природа и корпоративные паразиты

Второй пример с этим всем мимукраппом в организационных последствиях. Попросту говоря, они являются плодородной почвой для откровенных и не очень откровенных паразитов, который «участием» в процессе подменяют производство результатов. Поскольку почти каждая такая методология вынужденно включает уйму не имеющих реального значения деталей, то всякое ее применение открывает уйму возможностей оную методологию «улучшить».

Скажем, делать летучки в Скраме не 15 минут, а 20, или там 17. Предлагающий может это подать как значительное улучшение, помогающее команде достичь целей. А если кто захочет возражать, то то же самое может быть выставлено как ухудшение методологии. Кто выиграет? А это уже будет решаться исключительно политикой и влиянием в команде, поскольку реально эти плюс-минус две минуты все равно никакого значения не имеют и никогда не соблюдаются.

Впрочем еще более распространенный вариант – это когда на предложение 17  минут кто-нибудь начинает возмущаться, что вообще весь этот «скрам» - сплошная потеря времени. Вот тут-то можно всласть поплясать на костях «неверного язычника».

Вы можете спросить, а зачем? И вообще, а менеджер, что ли, сам не видит? Менеджер может и видит, более того, может и сам считает, что эти лишние две минуты – ерунда. Но вот то, что вы настояли на своем, поплясали на костях, и команда сделала как вы хотели, показывает, что вы – «лидер», что за вами следуют. А вот это уже плюс без дураков на любом ревью. По крайней мере, если вы этого не сделали, то вам уж точно припомнят, что у вас не такое уж сильное влияние в команде, а надо бы...

В результате протест против любого идиотизма в рамках подобного мимукраппа превращается из логического разговора в эмоционально-политическую игру «свой-чужой». То есть, мы имеем дело с мемовирусом – набором мемов с якорем и носителем. Якорь «свой-чужой» заставляет членов команды принять мемовирус и подчиниться ему, поскольку мимукрапп обычно запускает менеджер, а уж к нему, ясное дело, нужно быть «своим». А потом каждый его носитель начинает его распространять на других как средство расширения своего «влияния» в команде.

К слову, мемовирус – это связный набор мемов с якорем и носителем. Якорь – это мемы из этго набора, заставляющие принять весь комплекс. Носитель – это мемы, засталяющие его распространять дальше. Все остальное – «payload», нагрузка. Если  нет якоря или носителя, то нет и мемовируса, а есть просто набор мемов. Скажем, таблица умножения или алфавит – это просто набор мемов, нуждающийся во внешних причинах, чтобы их запомнить или передавать другим. Причины запоминать или распространять в них не встроены. И именно поэтому их так трудно запоминать. Я бы не стал этого обьяснять, но судя по комментариям к предыдущим постам, не все это знают.

Ну, а уж когда команда захвачена таким мемовирусом, то включается самооправдание и рационализация, а народ начинает гордо сообщать всем, что «мы эту методику используем и получается!» Что является уже вторичным носителем, распространяющим мимукрапп вне пределов команды.

С другой стороны...

Собственно, надо признать, что менеджер вводит мимукрапп не от хорошей жизни. Ему-то ведь надо и проект в срок сдать и начальство успокаивать, что все по плану, и какой-то механизм заметания под ковер того, что не лезет. И все эти методологии в этом помогают, по крайней мере с двумя последними пунктами.

Скажем в «водопаде» всегда можно отложить фичу, которую не успеваешь, или даже баг в следующую версию. Конечно, будет мотание хвостом и шевеление ушами, которое надо истолковать ((с) «Повесть о Ходже Насреддине» Соловьева), тем не менее это дает процесс не сделать что-то запланированное с самого начала и все-таки отчитаться о победе. В «скраме» - это перенос на следующий «спринт». В XP я даже не уверен что, но тоже должна быть такая возможность. А уж как хорошо начальству все это докладывать. Одни burndown charts в скраме чего стоят. Красиво. Наглядно. Понятно. И понятно, что все что не лезет заметается под ковер (см. выше как), но зато план по валу, вал по плану. А как еще?

То есть, мимукрапп по сути не является проблемой сам по себе, это лишь симптом другой, более серьезной проблемы. Как я уже писал не раз, мы живем во время смены общественно-экономической формации. Индустриальный социализм по обе стороны океана успешно справлялся с индустриальными рабочими при помощи иерархического менеджмента. С начала 60-х производительные силы и их технологический уровень переросли рамки, в которых иерархический менеджмент эффективен, приводя к сбоям. С «работниками знания» уже невозможно обращаться как с рабочими, это просто не работает. Стандартной реакцией иерархического менеджмента в таких случаях является «научный менеджмент» Тейлора, который по сути сводится к разбиению сложных операций на простые шаги и использованию более дешевой рабочей силы тупо повторяющей эти записанные шаги. В начале двадцатого века именно так были разрушены профсоюзы арсенальных рабочих и производителей оптики, а потом тот же метод успешно применялся много раз. Отсюда и прут все эти методологии.

Проблема только в том, что если проанализировать и разбить на шаги производство первой версии, скажем, игрушки «Минера», то потом сколько ни повторяй эти шаги, а все что будет получаться – это все та же первая версия игрушки «Минера». Чтобы сделать Word или PowerPoint шаги должны быть другими. Но соблазн для иерархического менеджмента все равно слишком велик, а понимания все равно слишком мало. Вот и накатываются на нас волны мимукраппа за мимукраппом. И будет это продолжаться пока будут продолжаться попытки управлять работниками знания при помощи иерархического менеджмента.

В общем-то даже и понятно, что придет на замену. Иерархический менеджмент в работниками знания не работает, а вот сетевой, вроде того, что делается в Гугле или сеть PM’ов на Майкрософте – работает.

А напоследок я скажу...

... что вся эта моя критика вовсе не отменяет того здравого, что есть в этих методиках.

Я вообще-то с этого начал, но некоторые люди удивительно тупы, игнорируют прямой текст, а потом начинают топать ногами и кричать, что «они делали и у них получалось», и вообще, не лез бы ты, Элдар, в калашный ряд... Так вот, я полностью одобряю идею подумать, прежде чем писать код; знать, что требуется, перед тем как делать дизайн; собираться на летучки, чтобы вся команда была в курсе кто что делает и нет ли у кого проблем; иметь более одного члена команды, способного исправить конкретный кусок кода и так далее. Я даже понимаю ценность процесса как такового, когда иногда не важно, прыгнуть на левой ноге или на правой, но надо чтобы все прыгнули на одной и той же ноге.

К слову, как обычно с персонального блога...

Я просто указываю на проблемы, которые применение подобных методик нередко создает. И да, я их преувеличил, для внятности. До серьезных проблем они дорастают только в очень больных организациях, в которых мне, слава Богу, уже давно не приходилось работать. Тем не менее, я считаю, что об этих проблемах надо знать, о них надо думать, и если вы – менеджер, то следить, чтобы они не выросли до серьезного масштаба и не влияли на ваши решения. Поскольку обидно терять из-за них хороших людей, и опасно продвигать из-за них плохих. И важно также понимать, что это не панацея для лечения когнитивного диссонанса у высшего менеджмента, а лишь способ ограничить его негативные последствия для вас. А в остальном... ну, мимукрапп. Ну и что? Ничего страшного. В конце концов, почему бы и не поплясать чуть вокруг костра?

Friday, February 13, 2009

Краткая история пути к 64-м битам

Попалась такая вот статья в Communications of ACM - The long Road To 64 Bits. Что мне больше всего понравилось - это коллекция событий ведущих к нынешнему 64-битному компьютингу. Позволю себе содрать сей календарь для вашего удовольствия...

Оригинал на персональном блоге...

1964 IBM S/360 (ага, "старушка" ОС ЕС) 32 бита с 24-х битным адресным пространством (16 Мб) реальной памяти.

1967 Алгол 68 - один из моих любимых, хотя и экзотических языков, который включал тип .long .long.

1970 DEC PDP-11/20 - 16 бит с 16-битным адресным пространством (всего 64 Кб) -- зато поменьше размером чем IBM 360 и ближе к нынешним PC.
А также IBM S/370 с виртуальной памятью, которая давала всю ту же 24-х битную память, но КАЖДОМУ процессу.

1971 IBM 30/145 Переход памяти с магнитных сердечников (core) на DRAM с плотностью (держитесь за стул) 1 Кбит на чип.

1973 "Урожайный год". DEC PDP-11/45 с отдельной памятью для инструкций и данных (64 Кб на каждую), и до 248 Кб реальной памяти.
Unix на PDP 11/45, ОС переписанная на С.
C первый относительно переносимый язык

1975 Unix: 6-ая версия, 24-битная адресация (до 16 Мб адресуемой памяти). Юниксоиды и PDP наконец-то почти достигли уровня IBM 360.

1976 DEC PDP-11/70. По прежнему всего 64К на данные и 64К на программы, но вся память теперь может достигать "огромных" 4 Мб
C Нововведение в языке C - типы short и long. Причем long введено для переноса на XDS Sigma, на которой long был уже 64 бита.

1977 Unix перенесен на 32-х битную систему Interdata 8/32.
C: Куча новых нововведений - unsigned, typedef, union, 32-битный long использован вместо 16-битного int в файловых операциях seek и tell на 16-ти битных PDP-11. Также перенесено на VAX.
DEC VAX-11/780 32 бит с 32-битной адресацией, до 4 Гб всего, 2 Гб на процесс.

1978 Unix: 32-битная версия для VAX-11/780
C: Издана классическая книга The C Programming Language by Brian Kernigan & Dennis Ritchie издательством Prentice-Hall.
Intel 8086 16 бит, но с сегментацией видимой для программы. Ну, и, конечно, славное начало на котором расцвел нынешний компьютинг.

1979 Motorola MC68000 с 32-битной шиной, хотя и 24-битной адресацией как на S/360.

1982 C на MC68000 в Bell Labs Blit терминал.
Intel 80286 теоретически позволяет до 16 Мб реальной памяти, хотя большинство систем по-прежнему ограничено 1 Мб (помните, PC AT и драверы расширения памяти? Да еще отдельно технологии extension и expansion, которые не следовало путать?)

1983 IBM 370/XA добавило 31-битную адресацию (с поддержкой старой 24-х битной).

1984 Motorola: MC 68020 с 32-битной адресацией и размером слова.
C: Появлися тип lon long на UTS (32-bit S/370), в основном для длинных адресов в больших файлах.
C: Convex (64-битный векторый мини суперкомпьютер) использует long long для 64-битных целых.

1986 Intel выпустил 80386 - 32-битный процессор с поддержкой старого 8086 режима.

1987 Apple Mac II на MC68020 с 32 битной адресацией (что вызвало проблемы для более старого софта для MC68000).

1988 IBM ESA/370 31-битные адресные пространства для каждого процесса (с поддержкой старого 24-битного процесса).

1989 ANSI C (C89) принят как стандарт ANSI X3J11. Разработка стандарта была начата в 1983.

1992 SGI выпустила первый 64-битный микропроцессор MIPS R4000 (с поддержкой более старого 32-битного режима).
C: Неформальная Рабочая Группа по 64-битному С (впрочем, работавшая без особого успеха).
DEC выпустил 64-битную систему Альфа с 64-битной ОС LP64.

1994 SGI выпустила IRIX - смешаную 64/32-битную систему на машине Power Challenge.

1995 Sun: UltraSPARC - Смешаная 64/32-битная система с 32-битной операционной системой.
Встреча по большим файлам кодифицирует 64-битный интерфейс к файлам более 2 Гб, в том числе и на 32-битных системах.

1996 Hewlett-Packard объявил о выпуске 64-битного PA-RISC 2.0.

1997 Hewlett-Packard UP/UX 11.0 - 64/32-битная ОС.
IBM RS64 PowerPC с AIX 4.3.

1998 Sun: Выпущен 64/32-бит Соларис 7.

1999 С: ISO/IEC C (WG14 "С99") включает 64-битный (не менее) long long.

2001 IBM: 64-битная zSeries (наследница S/360, с поддержкой для совместимости старой 24-х битной адресации).
Intel: 64-битный Итаниум.

2002 Microsoft: Windows 64-bit для Итаниум.

2003 AMD: 64-битный X86 - AMD64.

2004 Intel: 64-битный X86 - EMT64, совместимый с AMD.

2005 Microsoft: Windows Professional x64 (AMD64/EMT64).

Ну, и 64-битные Виста и Сервер 2008 - это уже не новость.

---

[1] The Long Road To 64 Bit by John Mashey - Communications of the ACM, January 2009, Vol.52, No. 1, p. 45-53

Sunday, December 7, 2008

Как стать хорошим программистом (часть 4. Extra): влияние на межличностые контакты

Как я уже писал, описать все аспекты существования программиста практически невозможно, но в последнем посте я сознательно не затронул еще один очень важный аспект, о котором было бы просто недобросовестно не написать. А именно, как это влияет на ваши межличностные контакты, общение с другими людьми.

Конечно, опять же описать всю проблему невозможно, но я попробую просто привести несколько примеров.

Да-да, тоже с персонального блога...

Плотность информационного канала

В программировании каждая строчка вашего кода делает что-то полезное. В крайнем случае это комментарий, который обьясняет код, или пустая строка, которая делает его более читаемым. Но все равно, каждая строка и каждый знак имеет значение. Хороший программист знает, что код, который не делает что-то полезное, почти наверняка делает что-то плохое. Как минимум, удлиняет код, делает его менее понятным и вносит вероятность бага. В остальных случаях он просто вносит баг.

Усвоив это в искуственных языках, сей принцип влияет на вашу личность и начинает просачиваться в естественные. Вы начинаете замечать, что большинство непрограммистов очень часто страдает тем, что я называю «словесный понос». Ну, если кто еще помнит – в стиле выступлений Горбачева, говорит, говорит, а о чем похоже и сам не знает. Воодушевленный менеджер может распинаться перед командой целый час так и не сказав что-либо полезное. В обыденном общении «легкие разговоры» часто становятся невыносимой мукой. Нет, вы с удовольствием готовы поболтать с собратьями-программистами (и отдельными представителями других инженерных профессий, владеющих человеческой речью) на любые темы от хобби и шоппинга до кулинарии и политики, но ваши нейронные цепи уже настроены на каналы с низким уровнем шума.

Чтоб далеко не ходить, приведу пример. В Америке в большинстве фирм регулярно происходят митинги, посвященные пеп-ток. Это такой американский вариант политинформаций с пропагандой компании или группы в которой ты работаешь, обычно посвященной мудрости менеджмента, осуществляющего очередное изменение оргструктуры и пересаживавние медведей и мартышек между музыкальными инструментами. Так вот, на таких митингах лично я обычно физически начинаю отключаться через 15-20 минут, через 10, если я пытаюсь слушать о чем они говорят... Нет, правда. Глаза начинают слипаться и появляется риск треснуться лбом об стол...

Другой пример: некоторые читатели говорят, что им здорово мешает обилие вводных, междометий и прочих неинформативных элементов в моих статьях. Так вот, я этому сознательно учился, и знаете почему? Если вы принадлежите к этой группе читателей, возьмите любую мою статью, которая вам нравится, и попробуйте убрать все эти вводные и неинформативные слова. Мой опыт показывает что у подавляющего большинства людей от подобного текста просто заклинивает каналы обработки информации. Знаете как иногда с компьютерами бывает – процессор утилизован на 100%, диск крутится как сумасшедший и ничего не происходит. Не шучу.

Это еще сильнее заметно в устном общении. Если вы не уделяете спецально внимания общению с обычными людьми, то обьяснить свою точку зрения и «продать идею» менеджменту часто оказывается практически невозможно. Их информационные каналы просто не рассчитаны на концентрацию, с которой изьясняетесь вы. Нужно ли обьяснять, насколько это осложняет вашу жизнь и карьеру? Лично мне пришлось в свое время потратить немало времени, чтобы научиться искусству оценки собеседника и выбора правильного уровня речи в презентации своих мыслей.

Вы можете сказать, что это очевидно, но это вам очевидно, после обьяснения выше. Большинству программистов, которых я знаю, это не очевидно. Впрочем большинству непрограммистов это может и очевидно, но они понятия не имеют как это делать. И в любом случае суть в том, что вам придется этому учиться и никакого отношения к программированию это иметь не будет.

Бартер лжи

«Fidelity to reality» - «верность истине», о которой я уже писал, имеет целый ряд отрицательных последствий для социальных контактов. К сожалению, целый ряд социальных взаимодействий основан на лжи или по крайней мере на приятии лжи. Любой пеп-ток, пропаганда всегда основаны на этом. Очень часто отношения людей включают в себя элемент лжи. Еще более часто способность вписаться в какую-нибудь очень полезную в плане карьеры или денег структуру вроде КПСС или американского корпоративного менеджмента основана на способности искренне и убежденно врать. Про более приземленные примеры вроде продажи витаминов, средств похудания или там новой информационной системы заказчику я уж и не говорю. Знаю-знаю, сейчас раздадутся возмущенные голоса. Да, вы часто и сами верите в то, о чем говорите, во многих случаях это требование. Вам действительно нужно верить в мудрость вашего сегодняшнего менеджера, иначе очень трудно глядеть на него восхищенными глазами молодой студентки, когда он лепит горбатого про бизнес-цели вашей организации. И это делает ситуацию еще хуже. Поскольку врать себе – еще хуже чем врать другим.

Я уже обьяснял, что программирование не терпит вранья. Если вы пытаетесь соврать компьютеру, вы получаете баг, вот все. Что приучает вас к тому, что это занятие не только бессмысленное, но и сугубо вредное. Но в человеческом общении сплошь и рядом случаются противоположные ситуации. Как неверие в коммунизм мешало в карьере в СССР, так неверие в великую миссию унитазов с компьютерным управлением помешает вашей карьере в американской фирме, производящей оные унитазы.

Причем, мне кажется, что трудности с верой в ложные утверждения у хорошего программиста даже глубже, чем реакция компьютеров на баги. Честно предупрежу – это лишь моя теория, но лично мне она кажется правдоподобной. Такое ощущение, что в некоторых науках, дизайне сложных систем и программировании человечество достигло пределов эксплуатации нейронных сетей человеческого мозга. Если нейронная сеть используется на 1%, как, например, в профессиях вроде уборки мусора, вы можете лгать и верить в чушь используя остальные 99% мозга и ваша способность убирать мусор от этого не страдает. Когда нейронная сеть используется на пределе, у вас нет этой роскоши. Как только вы перестаете отличать правду от лжи, вы перестаете отличать баг от фичи, потому что вы используете одни и те же нейронные цепи. Продолжая аналогию, если у вас в ящике с инструментами лежит микроскоп и молоток, то вы можете забить молотком гвоздь, и микроскоп по-прежнему будет работать. Если у вас весь ящик занят большим микроскопом, то забейте им гвоздь, и он станет бесполезен как микроскоп. Он просто сломается. Это то как ложь действует на человеческий мозг. Большинству хватает ломаного микроскопа в голове, программисту, если он хочет быть хорошим программистом – нет. Уверуйте в развевающееся знамя, программу партии, WMD в Ираке или мудрость корпоративного менеджмента, и ваш код станет хуже.

Опять же, это лишь моя теория.

«Надо»

Третий и последний пример, о котором я хотел бы написать, это слово «надо». В программировании нету отдельностоящего слова «надо», он всегда сопровождается дополнением отвечающим на вопросы «Зачем?», «Для чего?» или «Почему?»

Комментировать программу надо чтобы ее можно было понять. Когда это обьянение пропущено и непонято, получаются строчки кода вроде:

X = 5; // Присвоить переменной X значение 5

With надо использовать, чтобы гарантировать вызов Dispose().

Автопойнтеры полезно использовать, чтобы не было утечек памяти.

Если вы не понимаете зачем что-то «надо», вы скорее всего будете делать это неправильно. Когда вы это осваиваете, это тоже выплескивается в ваше общение с собратьями, если не по разуму, то по крайней мере по биологическому виду.

Дело в том, что к сожалению, большинство мемовирусов устроено так, что они активно используют слово «надо» и программируют свои носители на агрессию на вопрос «зачем?» Попробуйте спросить националиста с окраин бывшего СССР зачем ему его «маленькая но независимая». Попробуйте спросить новообращенного христианина зачем верить в Бога. Попробуйте спросить алкоголика зачем он пьет. Далеко не всегда мемовирусы вредны – некоторые из них являются симбиотами, которые помогают носителю. Здравый патриотизм обеспечивает поддержку и создание среды, в которой легче жить всем. Воздержание от «нечистой» свинины предотвращало отравления в жарких странах. Но в любом случае, «надо» без ответа на вопрос «зачем» плохо лезет в голову программиста, а вопрос «зачем» очень часто оканчивается агрессивной реакцией.

С одной стороны, в экстремальных случаях вроде приведенных выше, это свойство личности программиста защищает вас и только на пользу. Но в граничных, «размытых» случаях оно все равно приносит много проблем.

Например, если ваше дите требует новую видеокарту. Разумеется, это «надо»! Вы, разумеется, спрашиваете «зачем». Вы просто хотите услышать полную версию, вы не понимаете что такое «надо» без обьяснения зачем. Вам может даже вполне устроить ответ «потому что хочется!» или там, «у меня без нее игрушка не идет!» Более того, на второй ответ вы можете заставить ребенка разобраться точно, чего именно не хватает и что именно нужно – поскольку теперь понятна цель и понятен критерий. То есть вы могли бы продолжать и сделать то, что от вас хотят. Что непрограммист слышит в ответ – это то, что вы не хотите купить видеокарту. Дальше в зависимости от отношений в семье вместо ответа на ваш вопрос начинаются игры, чтобы вас уломать, что не только не отвечает на ваш вопрос, а вообще запутывает его до состояния когда вообще ничего не понять. А учитывая то, что непрограммисты не страдают fidelity to reality, то Роулинг отдыхает, дите обижается, а вы получаете лишнюю головную боль.

Вот такое вот вредное слово «надо»...

На этом я, пожалуй, закончу серию статей. Просто для тех, кто хочет стать программистом, я хотел описать некоторые моменты, которые их ждут по другую сторону. В принципе, ничего страшного.

Friday, December 5, 2008

Как стать хорошим программистом? (часть 3 из 3). Обратная сторона Луны

Кстати, если уж говорить о теме, то нужно затронуть и то, что вас ждет на другой стороне. Опять же, задача на самом деле неподъемная, но я по крайней мере могу описать некоторые сюрпризы, которые вас ожидают. Как обычно, не самые приятные.

Да-да, кросс-пост с персонального...

Писатель или литературовед?

Все, что я описал раньше, поможет вам писать хороший код, «любить это дело», да и знать его тоже. Вот только код уже давно не так много взаимодействует с внешним миром, будь то кнопки клавиатуры, движения мышки или взаимодействие со специализированными устройствами, сколько в кодом написанным другими программистами, в первую очередь, платформой и легаси вашей собственной фирмы.

Причем код платформы и легаси код вашей фирмы далеко не всегда написан хорошими программистами. Очень часто совсем наоборот. Более того, и там, и там, отдельные сорвавшиеся с поводка программисты, которые восприняли родную фирму как еще один компьютер, который надо запрограммировать, создают свои «платформы» направо и налево. А вам в этом добре разбираться.

Пример 1: Строки в С++. Строки бывают простые, широкие и мультибайтные. Но это еще ничего, поскольку можно в команде договориться использовать только широкие и тогда преобразования будут требоваться достаточно редко. Но есть еще несколько представлений строк. Есть стандартные С++ строки, кончающиеся нулем. Есть VB-style строки с длиной перед указателем на строку (и нулем в конце). Есть STL строки, которые работают как нормальный автоматический объект, хотя и со своими тараканами. И есть ATL строки, которые претендуют на то же, что и STL строки.

Каждая из них имеет свои проблемы. Кончающиеся нулем С++ строки считаются одной из двух главных причин всех багов в программах на С++ наравне с указателями и адресной арифметикой. VB строки были бы не так плохи, но их необходимо аллокировать одним и тем же способом, иначе вы запутаетесь как их освобождать. А в ряде случаев вы обязаны их аллокировать как глобальную память, то что вам всегда придется так делать. А размещение глобальной памяти – это очень дорогая операция. Особенно для такого популярного обьекта как строка. STL строки в общем не так и плохи, если не считать того, что они тянут за собой всю STL библиотеку. Что в ряде случаев нежелательно. А главное, как только ваш проект начинает ее использовать, незрелые умы в вашей группе тут же начинают использовать и другие обьекты из оной библиотеки – они и правда очень удобные. Что кончается тем, что вы обнаруживаете свой продукт в тестовой лаборатории завесившим всю машину и использующим 100% процессора. Есть такой таракан в  STL. Ну, а уж если вы вляпались в ATL...

Что в этой картине самое поганое, это то, что как только ваш продукт начинает взаимодействовать с платформой и другими компонентами, вы оказываетесь вынуждены использовать чуть ли не все четыре представления и конвертировать их из одного в другое направо и налево. Win32 использует в основном С++ строки с нулем в конце, COM и WMI часто требуют VB строк, а многочисленные левые компоненты, которые вы подобрали, чтобы не изобретать велосипед, запросто могут потребовать STL и ATL строк.

Пример 2: Media Foundation. Это такой новый фреймворк на нашей фирменной горной вершине дабы играть аудио и видео медиа. Выглядит как набор API, где все необходимые источники, парсеры, трубы, дешифровщики, размазыватели по стенкам (как правильно перевести «rendeder»?) соединяются вместе в полной гармонии и дружной работе по проигрыванию того или иного мультимедийного формата. Причем вы можете (теоретически) просто имплементировать еще одну компоненту, скажем, декодер или источник для определенного формата, и он должен магически начать работать. Ну, то есть буквально магически, поскольку вам еще придется поплясать вокруг костра с бубном – записать куда надо в регистр правильные ключи, правильно оформить DLL,... Один из наиболее впечатливших меня па в этом танце и соло на бубне является то, что вам придется писать в практически полной COM системе, имплементируя на каждом вашем объекте IUnknown со всеми причандалами для ref counting и правильного управвления циклом жизни этих объектов, но при этом сам COM не используется. То есть как бы, all pain, no gain. Просто мазохизм какой-то.

Поневоле вспоминается бородатый анекдот про водителя и феечку. Стоит на обочине дороги водитель и грустно смотри на свою машину, у которой отвалилось колесо. Пролетает мимо феечка: «Чего делаешь?» «Да, вот, с колесом #$%^&*!» «А хочешь по-настоящему?» Водитель взглянул на феечку, симпатичная... «Ну, хочу.» Взмахнула феечка волшебной палочкой, и у машины отвалились остальные три колеса. Такое вот «настоящее» программирование.

Так вот, это все – не то ради чего вы пришли в программирование. Это как если  вы стоите на лесной тропинке и брезгливо оттираете подошву кроссовки об опавшую листву, мысленно матеря на все лады любителей собак... или там, создателей платформ. К слову, если кто решит по этому поводу покритиковать Windows, рекомендую поглядеть на Java и Java 2 – тоже очень большой и очень популярный у любителей собак лес. Вы еще помните (оттирая подошву об опавшую листву) AWT? В общем, «учись сынок, а то так и будешь всю жизнь ключи подавать...»

Если вы не в курсе, имелся в виду анекдот про двух сантехников, мастера и помощника. Вызывали их на прочистку, весь подвал залит понятно чем, мастер ныряет, ученик сидит на лестнице, ждет. Через пару минут мастер выныривает и кричит «Ключ номер десять!» Ученик подает, мастер ныряет, еще через пару минут раздается бульканье и содержимое подвала уходит вниз в канализацию. Мастер подходит к ученику, стряхивая кусочки того, что только что плавало вокруг, и говорит: «Учись, сынок, а то так и будешь всю жизнь ключи подавать...»

И чем больше кода написано в мире вашими предшественниками, тем больше времени у вас занимает именно это, а отнюдь не написание нового кода, делающего что-то полезное.

Рынок труда

Вообще-то, в плане рынка труда программистам грех жаловаться. В кризисы, когда фирмы увольняют направо и налево, им все равно нужно чтобы работа делалась. Соответственно, ее перекладывают на компьютеры, что приводит к новым проектам и новым рабочим местам для программистов. В условиях нынешнего кризиса, начавшегося в октябре 2008-го, правительство Британии считает, что в следующем году им потребуется на 100,000+ больше программистов, чем в этом году (цифра приблизительная, точнее она выглядит ближе в 150 тысячам, но поскольку точно не помню, то и врать не буду). А когда кризис проходит, все это добро по-прежнему надо сопровождать, развивать, да еще и стратапы появляются.

В общем, я в курсе, что очень много программистов на Восточном побережье США, особенно бывших работников Citi, Wachovia, Washington Mutual со мной не согласятся, но все-таки по сравнению с другими профессиями мы в относительно хорошей форме. С одной стороны сборщикам машин на конвейрных линиях в Детройте или там шахтерам после закрытия завода или шахты остается только прямая дорога в систему общепита – жарить картошку и гамбургеры. Неудачливым или начинающим адвокатам и врачам тоже на самом деле несладко – доходы падают, а конкуренция растет, поскольку все новые толпы молодежи рвутся в эти профессии, думая, что там всегда будет медом намазано. Менджеры низшего и среднего звена вообще никому не нужны. В программировании таких проблем нет.

Конечно, есть некоторая массивная конкуренция со стороны программистов-иммигрантов из Индии и Китая. Но это все равно не сравнить с конкуренцией, которую испытывают между собой скажем выпускники-юристы. Да и ситуация меняется. Многие из них уезжают обратно на родину, либо не найдя работы, либо найдя дома лучшую работу в пересчете на местные цены. Чтобы понять масштаб явления, оцените следующий не очень относящийся к делу, но показательный факт: в 2008-м примерно два миллиона мексиканцев добровольно покинуло США и вернулось домой, считая, что в Мексике у них лучшие шансы на работу и нормальную жизнь. Причем, речь идет отнюдь не о программистах. Оценили?

Так что программисты из Индии и Китая - это скорее больше проблема для начинающих российских программистов здесь, которые еще не понимают культуры других народов. Как только вы начинаете понимать культуру китайцев, индусов, британцев, латиноамериканцев, румынов, и собственно американцев, оказывается, что большинство ваших коллег – отличные ребята и девчата, к которым вы начинаете испытывать искреннюю симпатию, даже если и несогласны с некоторыми их инженерными решениями. Вонючки, ясное дело, тоже иногда попадаются, но где их нет? В общем, конкуренция с программистами из Индии и Китая не такой уж большой фактор. А если вы хотите быть программистом в России, то и тем более неактуальный.

Однако, есть один фактор, который полезно понимать. Это то, что рынок труда программистов начинает структуироваться. И большая часть рынка труда на самом деле предназначена не для лучших, а для средних, а то и посредственных программистов. Так что большая часть того, чему вы научитесь на разных курсах или из тех же книжек, которые я упомянул раньше, вам не пригодится. Я уже упоминал, что за все время жизни в Штатах я только несколько раз написал сортировки, причем только один раз по работе, а остальное время так, для удовольствия?

Самое смешное, что интервьюировать-то вас будут все равно по-серьезному, а вот работа будет куда примитивнее и часто скучнее. Виноваты в этом часто сами программисты, которые проводят интервью. IT менеджеры просто вынуждены полагаться на их мнение, а наши собратья по профессии из средней категории часто отличаются полным отсутствие чувства меры. Так что гоняют вас на должность чуть ли не архитекта, а потом вы рисуете формочки. Причина простая. «Недоделанные» программисты обычно очень гордятся кусочками знания, которые им все-таки довелось получить, и поскольку эти кусочки разрозненные и случайные, то спектр вопросов, который вас ожидает на интервью в средней фирме, фактически очень широк. Куда шире, чем одолели бы те, кто проводит с вами интервью. В общем, вас наймут как микроскоп, и тут же начнут вами забивать гвозды. Это не очень приятно.

Смежный эффект происходит по той же причине: когда у «недоделанного» программиста в голове хорошо проработан один кусочек знания, он часто становится религиозной темой для него. Скажем, работал я с один товарищем (кстати, и правда товарищем – он из Китая), который хорошо знал уже упомянутый MF, и все делал в его стиле. Одна нить, все объекты в стиле COM, все операции асинхронно с обратными вызовами через IMFAsyncResponse... И любой программист, который так не делал, воспринимался им как плохой программист. И попробуйте угадать в первые несколько минут интервью, какие тараканы рулят в голове вашего собеседника? Причем, если вы умеете это делать, может вам лучше не в программисты, а в психиатры?

Никак не забуду один случай еще в конце 97-го – начале 98-го года. Я проходил интервью по телефону в фирме в Чикаго. Интервьюер очень хорошо знал MFC и очень гордился этим, так что и вопрос был по теме:

«А что вы сделаете, если вам нужно засунуть сто тысяч элементов в listbox?»

«Я не буду засовывать сто тысяч элементов в listbox.»

«А если заказчик требует?»

«Я поговорю с заказчиком и обьясню почему это неправильно.»

«А если он настаивает?»

«Тогда я сделаю в лоб, и покажу ему что это не работает. А потом сделаю без этого огромного listbox с какой-то навигацией...»

«А если он все равно настаивает?»

«Можно просто сделать в лоб, поскольку тут уж все равно. Машина – железная, она может и потянет, а пользователь, сидящий перед экраном – нет.»

Ребенок на самом деле хотел услышать ответ, что можно повесить обработчики событий на движения списка и динамически добавлять-убирать элементы из него. Решение, к слову, идиотское сразу по нескольким причинам – для начала слайдер сбоку listbox начал бы вести себя очень странно, попасть в нужную точку списка быстро было бы серьезной проблемой, а уж о дисковых операциях на кручение слайдера вверх-вних и думать страшно (поскольку сыр-бор был в первую очередь из-за того, что весь список не лез в память), но я даже не стал это обсуждать. Ему не было никакого дела до заказчика или пользователя. Вот MFC – это вещчь! В общем, я быстро понял, что туда не хочу, и чувство это было взаимным. Но это – прекрасная иллюстрация к тому, что интервьюировать вас нередко будут как раз не настоящие программисты, а полные идиоты.

И главное, это то, что я уже сказал. Нет так много хороших программистов и нужно в экономике. Да, есть заповедники гоблинов вроде MS или Гугл. Хотя и количество этих островков сокращаются. Sun явно идет на закат, IBM того гляди вообще всю разработку выставит в Китай и Индию, Intel и Motorola уверенно идут той же дорогой, только еще часть работ выводят в Россию... Есть некоторое количество консалтинга. То есть консалтинга много, а вот консалтинга, требующего хороших программистов так себе. Еще в хорошие времена есть стартапы. Ну, в общем-то и все.

В общем, пройти интервью вам это поможет, а насколько вы сможете задействовать свой потенциал – вопрос открытый.

Социальный статус

Не знаю, каков социальный статус у программистов в России, но надо понимать, что в целом программисты – это «синие воротнички» с высокой зарплатой. И обращаются с вами соответственно. Если в России вы работали в науке или преподавании, в университетской среде, то получали вы может и очень немного, но ваша свобода как в распоряжении своим временем, так и в направлении исследований была несравненно выше. Даже если вы подрабатывали консалтингом и проектами на стороне. А свобода – это один из важнейших показателей социального статуса.

Уйдя в программисты, особенно программисты в Америке, все это меняется. Это работа по найму. Это рабочий день с 9 до 5 (а то и с 9 до 9). Это подчинение менеджменту. Это партсобрания, пардон, team meetings, на которых вам втюхивают, как вам повезло и какая классная группа, команда, фирма, на которую вы работаете. Причем делают это так фальшиво и неубедительно, что даже если вы в это и верили, то начнете сомневаться. Это не говоря о том, что вам это будут втюхивать даже если ваша фирма делает цифровые контроллеры для унитазов. Кстати, вероятно полезная штука, но очень неудобный объект для пропаганды. Вас может не клеймят как скот, но периодически выдают футболки с лого фирмы или вашего продукта. В принципе, опять же, это даже и неплохо, но все равно что-то где-то в глубине души... как бы это сказать... шкрябает...

В общем, не все так плохо. Получаете вы все равно неимоверно больше чем сезонный Педро, работающий на уборке фруктов. У вас свой дом, хотя бы и с ипотекой. Страховка от работодателя гарантирует вам доступ к медицине и врачам. Вам есть на что содержать семью, послать детей учиться в университет. Так что, были бы деньги, а на социальный статус можно и плюнуть. В конце концов, доходы программистов сравнимы с доходами многих врачей и юристов. Просто надо понимать, что программирование – это не социальный лифт, и стать миллионером (или просто достичь финансовой независимости) в этой профессии ничуть не легче чем в любой другой. И «стекляный потолок» может и выше, чем в многих других областях, но все равно вполне реален и весьма прочен.

Но наблюдая некоторых наших соотечественников я могу сказать, что многих из них это беспокоит. По крайней мере судя по болезненной потребности доказать первому встречному-поперечному как правильно они сделали, что уехали из России. Я, конечно, не психиатр, но когда кто-то представляет свой внедорожник-Лексус как достижение жизни, и ездит хвастаться им на партсобрания республиканцев... в общем, вспоминается бородатый анекдот про панка и нового русского.

Если не в курсе: Подъезжает новый русский к заправке, рядом стоит панк с зелеными волосами. Тот спрашивает, а что с волосами-то? Панк отвечает, ну, чтобы отличаться. Новый русский тыкает себе в грудь и говорит: «Видишь, пиджак? Тыщу баксов стоит. УМОМ НАДО ОТЛИЧАТЬСЯ!»

К слову, я не пытаюсь вас отговорить от программирования. Просто насколько могу честно рассказываю о некоторых не столь широко известных аспектах этой профессии. И если вы внимательно посмотрите на другие профессии, то скорее всего будет как сказал бы Иа-Иа, «Так и знал. С этой стороны ничуть не лучше.»

 

Tuesday, December 2, 2008

Как стать хорошим программистом? (часть 2 из 3)

Ну, что ж... продолжим. А если все-таки случилось так, что вы – не программист, а хотите им стать. И даже по здравому размышлению, поняли конкретную реальную причину почему вы этого хотите.

Да-да, как обычно, с персонального блога...

Для начала, поздравляю, вы уже удовлетворяете первому требованию к хорошему программисту. Вы не только пытаетесь что-то сделать, вы еще и критично все оценили, убедились, что вам это действительно нужно, и точно знаете причину. Хороший программист просто обязан выпить стакан-другой крови PM'а (менеджера, архитекта, аналиста, или кто там обьясняет вам, что надо делать). И вовсе не потому, что это вам или ему продлит жизнь, даже в полную луну. Скорее наоборот. Но зато вы будете ПОНИМАТЬ что же вы делаете и зачем. А это означает, что ваш код будет делать то, что нужно пользователю. Для справки, я уже писал, что происходит в обратном случае. То есть, когда программист не понимает, что надо. Посмотрите историю блога.

К слову, это кажется очень простым требованием. Это не простое требование, это только вам так кажется. Мы все привыкли толковать движения ушами и хвостом, как в «Повести о ходже Насреддине», а затем верить в то, что наши фантазии -  это святая правда. Как бы вы ни истолковали, вы от этого не станете визирем, а ишак – принцем. И хороший программист знает, что каким бы ослом ни был заказчик, толковать движения его ушей нельзя – нужно чтобы он сам сказал, что хочет. И если в консалтинге, где заказчик еще и сам платит деньги, приходится идти на компромиссы (аккуратно прикрыв предварительно пятую точку), то уж когда заказчика представляет работник вашей собственной компании – будь то PM, архитект, или там, «аналист» – тут уж точно необходимо переквалифицироваться из легковерного Агабека в папу Мюллера.

Что приводит нас ко второму обязательному университетскому курсу для профессии программиста, называемому «Как стать занудой». Да-да, вы уже догадались? Это шутка. Подчеркиваю, ШУТКА. Нет, не шутка в смысле статьи, для программирования это и правда нужно. Шутка, в том смысле, что такого курса не бывает. Не, правда. Ни в одном университете такого курса я не видал. Вот сходил на Гугл – и правда, нет таких курсов. И вообще, этому не учат в университетах...

Ладно, в тексте блога быть занудой на самом деле необязательно, но это все равно не знание, это – черта личности, которая будет переть из вас где надо, и где не надо. Вообще, вам приходилось слышать фразу «программист – это не профессия, это диагноз»? Упомянутое письмо включало примечание вроде: «Я даже могу принять такой ответ как «Стать программистом нельзя – им надо родиться!»» Так вот, стать программистом можно! Врожденная склонность, равно как и неаккуратные няньки, стукающие младенцев головой об перила, бывает помогают, но само программирование – это не врожденное, это благоприобретенное. Ну, как другие состояния психики, кончающиеся заботливыми руками санитаров. Хорошая новость в том, что состояние психики именуемое «программист» столь полезно обществу, что вместо санитаров и обитой войлоком комнаты вас сажают в обитый тканью кубик и используя особенность заболевания, приковывают вас к тихо шуршащему ящику, переливающемуся яркими красками монитором, мышке и прямоугольному устройству с множеством кнопочек, которые можно нажимать в таком разнообразном количестве комбинаций... Причем приковывают не буквально, а просто знают, что от этой игрушки вы никуда не денетесь. А подающим признаки выздоровления вроде меня всегда можно дать 3-4 таких ящика, желательно разных (пару под Вистой, один под Windows Server, один под XP, один Мак, и один Xbox в версии для разработчкиов – ну, да, обычный Xbox – это для программиста слишком скучно). Такое практически детерминированно заканчивается острым рецидивом весьма полезным для общества, фирмы, и даже счета в банке самого больного. Могу подтвердить. В общем, никто не в обиде.

Собственно, точность и занудность – это просто две стороны главной стороны личности программиста, которую я называю fidelity to reality – верность реальности. Не «правде», не «истине», а именно «реальности». Не тому, что написано на развевающемся знамени, а тому «как на самом деле». И опять же, это не университетский курс, это свойство личности. Не врожденное, благоприобретенное, но тем не менее свойство личности, которое будет видно и во всех остальных областях вашей деятельности. Во всех областях вашей ЖИЗНИ. И это будет мешать. Серьезно будет. Ваш единственный шанс вписаться в организации вроде Коммунистической Партии Советского Союза (а также менеджерской структуры любой американской корпорации) – это воспринять реальность как еще один восхитительный компьютер, который надо запрограммировать. Но добравшись до этого состояния вы, скорее всего, потеряны для программирования, поскольку программирование человеческих сообществ после программирования компьютеров – это как гоночный автомобиль или самолет после механической колымаги от Тойоты или General Motors. Количество адреналина и серотонина просто несравнимое. К слову, а макроэкономика (в рамках стран и мира), если вы не обращаетесь с ней как профессиональные экономисты (дойная корова, способ развести лохов в правительстве на вашу липовую модель), а как программист («как это на самом деле?») – это как космический корабль из StarWars, StarTrek или там Babylon 5.

Обращаясь к автору письма: вы, должно быть, разочарованы. Вы спросили меня о практических советах, а я тут о свойствах личности рассуждаю. Нет, чтобы по-простому, делай раз, делая два, делай три... Но в том-то и дело, что программист – это в первую очередь свойство психики, если вообще, не состояние психики. Я, конечно, говорю о хорошем программисте. Рисовать формочки все это не нужно. Берете месячный курс C# и .Net или там Visual Basic – и вперед. Ни одного настоящего программиста вы не обманете, но такие тоже нужны. В общем, никаких проблем. Даже не раз-два-три, а ррраз, и программист! В общем, если это то, что вам нужно – вперед, и дочитывать этот пост ни к чему. А пока вернемся к настоящему программисту.

Кстати, изменение своей собственной психики кажется далеко не простым делом, но трюк в том, что от вас и не требуется его делать самостоятельно. Нет-нет, никаких университетских курсов. Изменения происходят сами собой по мере того как программирование затягивает вас как наркотик. Fidelity to reality не воспитывается заботливыми гувернантками или профессорами, оно – результат вашего общения с компьютером в роли программиста. В реальной жизни есть много причин предать реальность, и обычно они все сопровождаются кратковременными наградами. В программировании каждый раз, когда вы предаете реальность, вы тут же получаете столом по морде. С полного размаха. Компьютер ляпов не прощает. Компьютер тупой и исполнительный, он делает ровно то, что вы сказали, даже если ваше махание ушами и хвостом не должно было это означать. И это происходит изо дня в день, из месяца в месяц, из года в год. И вы привыкаете к мысли, что ваша вера в то, что вы написали все правильно не имеет никакого значения, и каждый ваш ляп вылезает тут же и нелицеприятно. По крайней мере пока вы не приучились делать только ОЧЕНЬ мелкие ляпы. К чему компьютер и приучает вышеописанным методом очень и очень эффективно.

К слову, еще одна черта воспитываемая компьютером в программисте, это твердая вера, что КАЖДАЯ ПРОГРАММА ИМЕЕТ ХОТЯ БЫ ОДИН БАГ. Это означает знание, что сам ты тоже в чем-то неправ, о чем бы ни шел разговор, и способность продолжать действовать и не впадать в истерику по этому поводу. Правда, общение с простыми смертными часто приводит к убеждению, что они-то вообще почти во всем не правы. К этому вас приучает даже не компьютер, а сами простые смертные, компьютер лишь приучает вас это замечать. Тоже, как понимаете, не самая лучшая черта в плане социальных навыков. Хотя обычно помогает то, что вы в основном общаетесь почти исключительно в обществе программистов, на которых (после многолетнего мордобития со стороны компьютеров) это правило к вашему удовольствию не распространяется. В смысле, они не всегда неправы, а только так, изредка, баг проскакивает. В общем, выражение «тараканы в голове» приобретает несколько новую и очень конкретную форму.

Теперь главный вопрос о том, как стать программистом. Мы уже выяснили, что главное – долго и упорно потихоньку (а лучше в полную силу) программировать, а уж компьютер сам из вас сделает программиста своей нелицеприятной и жесткой реакцией на плохой код. А вот как продолжать программировать достаточно долго, чтобы это произошло. А ответ простой. Для этого нужно получать от программирования удовольствие.

Некоторые сравнивают программирование с сексом. И знаете, в этом есть изрядная доля правды. По крайней мере на стадии хакера. К слову, публика считает «хакеров» какими-то исключительными программистами. Это неправда. Хакер – это как раз начинающий программист. Своего рода личинка программиста. Освещение в прессе и инциденты с хакерами обычно связаны как раз с тем, что их квалификации еще не хватает, чтобы получить нормальную работу программиста, а программировать хочется, поскольку они от этого получают тонны удовольствия, вот и программируют что попало вплоть до компьютерных инфекций. С начинающими в сексе тоже такое случается. Это уже потом случайных dial-up'ов начинает нехватать, и приходится все-таки тратиться на DSL, а то и T1, кому как повезет. Кстати, заметили что от программирования и секса я перескочил на Интернет. К слову, того же поля ягода...

Можно неполткорректный анекдот? Луг, стадо коров, холм, на вершине холма старый здоровый бык и молодой бычок. Бык флегматично жует траву, а бычок прыгает вокруг и с интересом приглядывается к коровам у подножия холма. Подпрыгивает к быку и кричит: «Дядя бык, дяда бык, давай быстро-быстро сбежим с холма и проявим интерес к той ЧЕРНОЙ коровке?» Бык, продолжая жевать, флегматично отвечает: «Не-е-е...» Бычок прыгает вокруг еще и подскакивает с альтрернативным предложением: «Дядя бык, дяда бык, давай быстро-быстро сбежим с холма и проявим интерес к той РЫЖЕЙ коровке?» Бык, продолжая жевать, опять флегматично отвечает: «Не-е-е...» Так повторяется несколько раз. Наконец, бычок спрашивает: «Так, дядя бык, а что ж мы будем делать?» Бык перестает жевать, вздыхает, и отвечает: «Мы медленно-медленно сойдем с холма и проявим интерес ко всему стаду!»

Это к слову, о разнице между хакером и профи, если не поняли.

Ну, и теперь к самому конкретному вопросу в том письме. Какие курсы взять? Хотите честный ответ?

А НИКАКИХ!

Представляете себе такое письмо от бычка: «Дядя бык! Я тут листаю PlayBull и надеюсь когда-нибудь перейти к настоящему сексу. Какие курсы в местном университете и какие сертификации вы посоветуете?» Никаких. Начните общаться с коровками (в случае бычка), девушками (в случае секса) или с компьютером (в случае с программирования). И старайтесь каждый день чуть продвинуться вперед. Ну, там, сегодня пуговку расстегнуть, завтра руку куда засунуть... Если вы IT admin (это я о все о программировании, если вы запутались в моих сравнениях), напишите скрипт там на Питончике, shell или Перле. Потом крохотную программку на C# или C++, которую этот скрипт вызовет. Поучаствуйте в каком-нибудь конкурсе плагинов. Скачайте онлайн библиотеку для персональных нужд. Естественно, программой, которую сами написали. Походите по программистским форумам. Знаете, как начинающие ребята в баре, хвастающиеся своими постельными подвигами. Ну, и так далее. По ходу дела сами увидите какие университетские курсы или сертификации вам нужны. Заодно убедитесь, что как правило лучший способ выучить язык – это начать писать на нем. Ни один курс лучше этого не поможет.

Ну, и в общем и целом, конечно полезно быть в курсе таких университетских предметов как некоторый обьем математики (ставит мозги), вычислительной сложности и алгоритмики, физики и электроники (чтобы знать как эта штука у вас под столом работает, а также быть способным понять изрядный спектр задач во встроенных системах), физики и механики (для тех же нужды, плюс тоже ставит мозги). Короче, хороший университет в области математики, физики, или электроники помогает. Что вы и сами наверняка знаете. Но если возраст уже не тот, чтобы потратить пять лет в хорошем университете (вроде мат-меха Петербургского Государственного, который, как вы понимаете, мой любимый), то просто делайте как описано выше, и заполняйте дырки по мере обнаружения. Все равно ваша карьера в программировании именно так и будет работать – заполнение дырок по мере обнаружения. Как говорится, «век живи – век учись, все равно дураком помрешь.»

Ну, и для совсем уж зануд, есть хороший список из трех книжек на блоге у Сережи Соляника, а в комментариях альтернативный список от Вадика Слесарева. К слову, я уже писал, что быть занудой – обязательное требование для программиста? В общем, привожу эти списки...

Список Сергея:

Список Вадима (то же место):

Sunday, November 30, 2008

Как стать хорошим программистом? (часть 1 из 3)

На самом деле я уже писал об этом. Вот здесь, или еще более широко, вот здесь. Но недавно пришо письмо примерно следующего содержания: «Здрасьте, я классный сисадмин, но всегда мечтал стать программистом. Посоветуйте, как это сделать? Ах, да, ответить можете на eldar.com» Нет, письмо было значительно длиннее и подробнее, и в конце была просьба не публиковать его, посколько «оно – глупое». Хм-м-м... Ну, из уважения к автору, письмо не публикую и его имя не упоминаю, но...

К слову, это как обычно,
пост с персональног блога...

Во-первых, позвольте сразу пояснить.

Письмо – не глупое. Письмо – очень умное. Человек знает, что он хочет, и спрашивает совета у тех, кто это уже сделал. 90% населения нашей планеты (подозреваю, что на самом деле что-то вроде 98%) до этого не додумались бы. Ну, или скажем так, на практике не додумываются. Нет, правда, подтверждено на наблюдениях. Так что, первый совет – отбросьте ложную скромность. В конце концов, один из необходимых шагов для хорошего секса – это раздеться, а программирование неоднократно сравнивалось с этим исторически любимым способом времяпровождения наших предков. Если сомневаетесь – подумайте сами: ни один из ваших предков без него не остался.

Во-вторых....

Ага, это стоит сделать подзаголовком. Поскольку уводит тему в сторону, так сказать, лирическое отстутпление. Процветающая последнее время индустрия называется IT, и включает в себя она и администрацию, и программирование.

Итак, вы – успешный сисадмин. Рассматривая вашу фирму как отдельную вселенную, вы – Бог. Ок, ок, ну, не "Бог", а так, бог, вроде Гефеста, поставляющего молнии Зевсу. Ну, или там, Верхоный Жрец Бога. Глава фирмы трепещет от ваших аббревиатур, финансирует ваши расходы, поскольку они позволяют уволить больше работников, и никто не понимает, что же вы делаете, кроме программистов, этих пеонов от клавиатуры... Ок, ок, если ваша фирма большая, то CIO – это Бог, а вы один из его жрецов. По-прежнему, ваша красная книжечка с гербом КГБ или там символом Озириса позволяет вам решать, что должно делаться, а что не должно.

Ну, да, да, я приукрашаю... но все-таки! Если посмотреть на наиболее перспективные профессии 21 века, что из статей ACM, что ректрутинговых сайтов вроде «монстра» или «лестницы», что обзоры на экономических сайтах вроде MarketWatch, все – одно. Да, админы и программеры в числе перспективных профессий, но админов больше.

Для этого есть хорошая причина. Подумайте об абстрактом програмном продукте. Сколько нужно программистов, чтобы его создать? Ну, скажем, сто. То есть, сто программистов на версию. И это продукт очень приличного размера. Сколько нужно его админов? По штуке на проданную копию. Ну, может быть, на комплект. Причем если ваш продукт продан лишь ста покупателям, скорее всего вы его не оправдали. В общем, админов всегда нужно больше чем программистов, иначе программисты не очень нужны. Уловили тонкую разницу?

То есть, вы имеете хорошую профессию, где все вам кланяются и готовы платить хорошую зарплату, а при случае, вы всегда можете обвинить «козлов из ...», ну, той фирмы, что производит большую часть вашего софта, и вы хотите стать программистом??? То есть, тем, на кого все сисадмины катят бочку, если что не так?

Не, правда. Есть такая хорошая пословица: «От добра добра не ищут.» Чем же вам так не нравится работа сисадмина? Нет-нет, я не спорю, может у вас и есть хорошая причина для этого. Я просто ОЧЕНЬ серьезно вам советую задуматься, А ЕСТЬ ЛИ ОНА, ЭТА ПРИЧИНА? Или это просто блажь и дань моде?

Ну, а уж о программировании – это отдельный пост через пару дней. На случай, если такая причина у вас все-таки есть.

Friday, October 31, 2008

Веселого Хеллоуина!

Сегодня в США странный праздник Halloween. Ну, вы в курсе наверняка. Это что-то вроде гоголевской "ночи перед Рождеством". Дословно название произошло от "канун Дня Всех Святых" (All Hallows' Even - в ирландско-шотландском стиле), а сам День Всех Святых - 1 ноября. Происходит он (Хеллоуин) из Шотландии и Ирландии, где до христианства это был праздник Самаин означающий границу между летней ("светлой") и зимней ("темной") частью года в кельтском календаре. Основная идея переодевания в том, чтобы напугать всякую нечисть до того, чтобы она весь следующий год носу не показывала. Правда сами кельты относились к этому серьезнее, с теоретической базой, считая что в эту ночь нарушается грань между Явью и Навью, а потому покойники могут появляться в реальности и создавать проблемы. Так что надо их напугать так... ну, и дальше по тексту.

Я бы не стал об этом писать, но дружелюбное привидение в одном из приложений напомнило, сменив тему на хеллоуиновскую. Баггер это такая мелкая и очень удобная оболочка к нашей системе отслеживания багов, которая позволяет видеть вместе все баги, которые на тебе висят сразу в нескольких базах данных и иметь возможность открывать их быстро и легко одним кликом. Обычно он выглядит поскромнее, а сегодня вот сменил тему :-)

Обычно на экране только присутстуют счетчики багов, которые на картинке справа вверху. Один для активных, другой для уже исправленных, но еще не проверенных. А кликнув на счетчик открывается весь список (приватную информацию о багах я, уж, извините, убрал).

Вот так вот! В общем, Йох! Унлах! Повеселимся!

---
Кросс-пост с персонального блога.

Saturday, August 23, 2008

О проблемах с code reviews

Кросс-пост с персонального как обычно...
--- 

Да-да, знаю... Очень необычно ругаться на code reviews (ревизии кода), особенно в мире где они воспринимаются чуть ли не как одиннадцатая заповедь, за неуважение к которой легко угодить на костер... Так что, потерпите немного ереси, я все обьясню!

Итак... Я не говорю, что ревизия кода – это плохо. Просто все в нашем грешном мире имеет свои преимущества и недостатки. Или как говорили утомленные мудростью греков римляне – cons et pros. Так вот, я хотел бы обратить ваше внимание на некоторую con ревизии кода, которая обычно не упоминается вслух...

Представьте себе, вы работаете в небольшой команде и вы все жутко заняты создавая новый продукт. Обратите внимание: «жутко заняты». И – удивительно, не правда ли? – как и в любом другом продукте, у вас есть баги. А баг – это такая штука, которую надо чинить. Без дураков, не шучу....

Теперь, вопрос на засыпку. Как вы будете чинить баг? Насколько я знаю, есть только две философии как это делать: заплатки и рефакторинг. Ну, да, да, есть еще идиотское «просто почини его», но мы не будем опускаться так низко, правда? Идиоты, которые не понимают о чем я говорю, могут прогуляться и не лезть в наши разговоры. А для нас – оставшихся – выбор все-таки есть. Итак, заплатки или рефакторинг?

Так, как вы думаете, что является правильным способом исправления багов? Да-да, есть случаи, когда заплатки – это верное решение. Например, Quick Fix Engineering – когда нужно доставить заплатку критическому пользователю с несколькими тысячами копий вашего софта. Другой пример – когда продукт уже давно сделан, и все что вы хотите – это трогать его как можно меньше. Ну, и, наконец, ситуации, когда каждый фикс – это очень большой риск. Скажем, когда вы исправляете софт для космического аппарата на орбите Юпитера... real time… и любой баг оставит ваших заказчиков с куском мертвого железа, стоящего много-много миллионов долларов на ... той самой орбите Юпитера.

Однако в большинстве случаев я бы поспорил, что в терминах «хорошего инжиниринга» рефакторинг обычно превосходит заплатки. Well… не просто превосходит... а как бы это сказать... «как бык овцу»! Не, правда. Дайте обьяснить на примере.

Учитывая короткий размер статьи, мне придется привести довольно примитивный пример, но все-таки, весьма наглядный, как мне кажется. Итак, представьте себе, что у вас есть метод ЗагрузкаЗакончена(), которая вызывается в момент, когда закончена загрузка куска медиа, и которая означает, что вы можете начать загрузку следующего куска. И тут вы заметили, что один из ваших коллег вставил в нее какой-то совершенно идиотский код. Нет, будем справедливы, код был бы совершенно неидиотским, если бы он бы вставлен не в ЗагрузкаЗакончена(), а в ЗагрузкаЗаконченаНаФиг(). Ну, что поделать, неудачный идентификтор. Но в результате, у вас выбор из двух опций:

1. Просто перенести код из ЗагрузкаЗакончена() в ЗагурзкаЗаконченаНаФиг(). Баг будет исправлен. Исправление занимает несколько строк перенесенных чуть-чуть вниз в файле.

2. Сделать (1) и переименовать ЗагрузкаЗакончена() в РазрешитьЗагрузкуСледующегоФайла(), чем, собственно, эта функция и является, тем самым предотвратив подобыне ошибки раз и навсегда. Исправление заденет дюжину-другую файлов.

Теперь, не забывайте, ваша команда действительно занята. Каковы ваши шансы получить code review (ревизию кода) быстро, при выборе (1) или при выборе (2)? Ага. Ну, да. Точно. 1. При попытке (2), парни быстро взглянут на список измененных файлов и тут же выпадут в осадок. Причем по хорошей причине. А вам совершенно не в кайф держать код черт-те-сколько на своей машине и тянуть с чекином, верно? Вот-вот.

А каков результат? Результат в том, что ваш продукт получит заплатку, а не рефакторинг. И через неделю другую, кто-то другой опять вляпается в этот самый ЗагрузкаЗакончена(), и вы будете править следующий баг-близнец... Хорошо, если такой же, а то и похуже...

Не знаю, честно, как это выглядит? Я и вправду о чем-то серьезном говорю, или мне мерещится?

Tuesday, August 12, 2008

THOU SHALT GIVE MNEMONIC NAMES TO THY VARIABLES или о важности мнемоники

Кросс-пост с персонального блога...

В воскресенье убил почти шесть часов на вылавливание одного бага. Полное сумасшествие - все нормально, все работает, одна строчка выкидывает тонны строк в выходной файл без малейших проблем, через несколько строчек то же самое просто не работает, хоть убейся...

Программка сканирует тысячи (а точнее сотни тысяч) лог файлов и пытается превратить их в большую таблицу. Каждый лог файл исправно появляется в большой таблице, а вот в аггрегированной - фиг - появляется меньше одного процента... Ну, ясное дело, подозрения на локи, на параллельное исполнение, на неправильные ключи... Ан, нет, все вроде правильно, а все равно ни фига не работает! Ну, да, должны отфильтроваться записи приходящие от пользователей вне США, но вот в общем-то и все. И не так и много их должно быть, поскольку сайт заботливо сам признается, что не может их обслужить. А получается почти ничего.

Нет, честно. И вот, после шести часов я внимательно поглядел и понял... оказывается логическая переменная GeoFence, предназначенная для отличия записей с IP адресов внутри США от оных вне, означает что запись таки пришла из США... Обычно в таких случаях пишут много плохо читабельных символов вроде #$%&! @#& *()+ @#$%! Ну, и так далее....

В общем, переименование переменной в NoGeoFence и быстрая проверка мест, где она используется исправила проблему в пять минут, последовавших за этим открытием. А сколько на нее потратил времени, чтобы найти.... Нет, правда... "абыдно, да"?