Мы, методологи, проектируем сложные системы, но не принимаем во внимание рабочие характеристики активного компонента этих систем, компонента, который известен своей нелинейностью и изменчивостью – человека».
Алистэр Коуберн «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
Стив Макконнелл «Совершенный код»
Совершенность кода
Идеальный код существует – и это не шутка. Нет, космически спутники, безошибочная система управления «ядерным щитом», программное обеспечение АЭС тут совершенно не причём. Идеальный код – это программа, выводящая на экран «Hello world».
Фраза «Здравствуй, мир!» известна каждому программисту. Появилась она в 1978 году, как пример использования языка С, и до сих пор остаётся первым шагом в освоении языков программирования для тысяч студентов по всему миру.
Перейдя по ссылке вы увидите пример «Hello World» на трёхстах языках программирования. Каждый вариант программы является примером идеального, безошибочного, совершенного кода.
Идеальный код не самый короткий, не самый быстрый, не самый удобный для программиста. ИК – наиболее простой вариант исполнения заданной функции. Надо вывести фразу на экран – выведет. Пристыковать Shuttle к Орбитальной Космической Станции – пристыкует. Функция не требует выводить «Hello World» в зелёном неоне, не заставляет Shuttle варить нам кофе. Мы должны сделать лишь то, что должны, так просто, как сможем.
И слепой увидит – код, который пишите лично вы, с точки зрения математики, ужасен.
Идентификация кода
Софт, которым мы пользуемся ежедневно, разрабатывали от одного до нескольких сотен программистов, на протяжении пары часов или нескольких лет. Кто-то из них сидел на кофе и сигаретах, кто-то работал по ночам, нашлись и те, кто программировал по несчастной случайности; были наркоманы, трудоголики, лентяи, гении, посредственности. Финансовый кризис, грязная посуда, сбитая собака – всё отражалась в их головах и в том, что они делали.
Внешние факторы неминуемо сказываются на результатах работы. Нехватка денег в развивающихся странах породила целое культурное явление под названием «индийский код». «Индийский код» - это код, созданный с использованием всех известных программисту технологий, код избыточный, перегруженный странными конструкциями и переходами, но, тем не менее, работающий. Одно время в Индии существовала практика оценки производительности труда программиста на основе количества написанного кода. Чем больше кода, тем больше программист работает, и, следовательно, выше его оклад. Шустрые индусы быстро сообразили как обманывать неквалифицированных заказчиков.
Современное программное обеспечение ненадёжно, непонятно, а часто – опасно. Если вы купите велосипед, вы сядете на него и поедете. С программным обеспечением всё гораздо сложнее. Конечно, времена когда софт требовалось дополнительно «оттачивать напильником», остались в прошлом. Но и сейчас вы можете быть уверенным, когда-нибудь он откажет. Каждый компьютер и фактически каждая программа рано или поздно зависнут, вылетят или сделают недопустимую операцию. Хорошо, что речь идёт не о ваших внутренних органах, не так ли?
Уязвимость кода
Если бы программы писали программы – мир был бы похож на постный пирожок без сахарной пудры. К счастью или к ужасу пока мир не может обойтись без программистов, которые пишут идеальный код лишь однажды в жизни – переписывая из учебника пример программы «Hello World».
Всё, что будет написано программистом после этих сладких мгновений, это «кофеварка в неоновом свечении» - код, одновременно выполняющий несколько функций с десятком дополнительных бонусов. Заглянув в исходники всего программного обеспечения, созданного человечеством, от NetBSD до mail агента, вы увидите признаки этого странного явления. Дайте двум, не знакомым друг с другом программистам, простую задачу, подкиньте незатейливую идею, и вы увидите, насколько по-разному они подойдут к её реализации. В итоге вы получите две программы, к примеру, на PHP и Perl, которые будут делать не то, что вам хотелось бы.
Давайте наконец смело взглянём фактам в лицо: устранение уязвимостей, разработка более совершенных методов программирования, обновление версий ПО, сотни научных конференций, тысячи средств защитного ПО не дадут никакого положительного эффекта, пока мы не поставим основной целью в обеспечении безопасности изучение влияния человеческого фактора. Про обновление ПО, как метод обеспечения безопасности надо сказать отдельно – это катастрофическая ошибка! Множество проектов закрылись из-за увеличения стоимости разработки только потому, что разработчикам велели обновлять весь код после каждой найденной уязвимости.
Эффективность кода
Хоторнский эффект – «Hawthorne effect – это условия, в которых новизна, интерес к эксперименту или повышенное внимание к данному вопросу приводят к искажённому, зачастую слишком благоприятному результату».
В нашем случае каждый новый проект, стартап, неминуемо ведёт к повышению эффективности работы программистов. Потому что проект новый! Однако как только проходит «новизна», интерес к работе у сотрудников резко снижается. Более того, если группе менеджеров дать задачу разработать методологию роста производительности труда – они её разработают и успешно внедрят! Введут пятиминутные перерывы, переставят кактусы, повесят в нужном месте кондиционер, а в другом – усилят освещение. Все эти меры неминуемо дадут положительный эффект. Но лишь на короткий промежуток времени. С тем же результатом вы – как руководитель проекта – можете самостоятельно повышать производительность вашего коллектива. Графики сдачи проектов, зелёные фишки, ползущие по настенному календарю, бесплатный квас (non-alcoholic summer drink), описание угроз мирового кризиса, разосланное по корпоративной почте – всё это даёт положительный результат в течение одного дня. Максимум – недели.
Во многих компаниях, которые не могут позволить себе ежеминутно отслеживать код на ошибки, проблему методологии решили следующим образом: дайте программистам кофе и интернет, а на выходе мы посмотрим, что получилось. И это, а вовсе не популярность программного продукта, является основной причиной существования десяток, сотен уязвимостей и ошибок.
Превосходство кода
Разработка Системы должна основываться на Системе. Любая система состоит из взаимосвязанных и взаимодействующих элементов. Ни одного программиста не следует оставлять наедине с компьютером, кофе и собственными мыслями.
Да, здесь мы можем с уверенностью утверждать – удалённая работа страшный грех, который подрывает основы безопасности будущего проекта. Физическая досягаемость к программисту – важный фактор успеха.
Вам, как лидеру проекта, или заказчику, или любому другому управляющему, не следует позиционировать физическую досягаемость как возможность контроля деятельности. Каждый, повторюсь, каждый человек будет работать хуже под пристальным контролем. Возможность общаться с другими разработчиками, находить общие решения, создавать рабочую атмосферу – вот задачи физической досягаемости.
Код – живой язык, который должен быть понятен не только компьютеру с терафлоповым процессором, но и человеческому мозгу, перегруженному размышлениями «а что нас ждёт на ужин». Написание доступных комментариев и понятной документации – следующий фактор. Он особенно важен в крупных проектах, там, где код кочует между большим количеством групп разработчиков.
Не следует тратить на отладку программы 80% времени разработки – всех ошибок не устранить никогда. 80% времени потратьте на создание эффективного кода, 20% - на отладку и вы увидите, как резко сократится количество ошибок.