Навигация

Итоги года

Другие ссылки


Реклама

Счётчики


Об оптимальности

30.10.2014 Четверг 02:31

Вот ни для кого, наверное, не секрет, что программы пишутся не оптимальным образом. Во всяком случае, это должно быть очевидно всем программистам, то есть тем, кто видит код изнутри. С точки зрения конечного пользователя программа может выглядеть вполне исправно работающей. А те недостатки, которые в ней есть, могут казаться неизбежными вследствие несовершенства компьютерных технологий. Однако более чем двадцать лет работы в индустрии убеждают, что, мягко говоря, не всё так радужно. Я видел массу кривого, неоптимального кода. Справедливости ради скажу, что и сам, наверняка, не без греха, и кто-нибудь другой не раз и не два потешался над моим кодом. И речь не идёт об использовании каких-то крутых, математически оптимальных алгоритмов поиска, к примеру. Речь о простой культуре программирования. Как-то: учесть edge cases (ситуации, в которых входные параметры находятся на границе допустимых значений). Позаботиться об элементарной обработке ошибок, которая бы обеспечила наличие диагностической информации в случае возникновения проблем. Написание понятного, незавуалированного кода. Невпадение в крайности — одни люди на объектно-ориентированных языках пишут по сути в процедурном стиле, а другие, наоборот, впадают в какой-то архитектурный экстаз и порой наворотят такую безумную иерархию малопонятных и ненужных классов, что через некоторое время сами не могут в ней разобраться.

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

И вот у меня возникает вопрос. Ведь мы вроде имеем дело со свободным рынком. Значит программисты, пишущие неэффективный код, должны в результате естественного отбора заменяться теми, кто пишет хороший, эффективный, легко поддерживаемый код. Но ведь этого не происходит! Почему? Я размышлял об этом сегодня за игрой в настольный теннис (и ведь, что характерно, в рабочее время... ). И постепенно осознал, что за двадцать с лишним лет своей карьеры программиста, моё мировоззрение в области IT менялось. Если на заре своей практической деятельности я, со свойственной юношеству горячностью и категоричностью, недоумевал и возмущался по поводу того, как разного рода бредовый код живёт и процветает и никто особо не парится по этому поводу, включая не только его автора, но и начальство и даже владельцев бизнеса (то есть тех, кто тратит на это собственные деньги), то со временем я стал гораздо спокойнее к этому относиться. Ибо осознал, что мне, рядовому программисту, открыта лишь часть общей картины. И оптимизация кода совершенно необязательно может являться частью всего "большого" процесса. В конце концов я сделал парадоксальный, на первый взгляд, вывод. Индустрия IT не заинтересована в правильном, оптимальном, понятном коде! Более того, с моей любовью к обобщениям я пошёл дальше и пришёл к выводу, что человечеству не нужны оптимальные процессы! Это касается вообще почти любой области человеческой деятельности.

Тогда я задумался о том, почему так, и мне в голову пришло два объяснения. Я думаю, они оба имеют отношение к реальности.

Версия первая, паразитически-жульническая. Программы пишут одни люди — программисты, а деньги на это выделяют из собственного кармана другие — бизнесмены или чиновники. Так вот в интересах (небобросовестного) программиста сделать так, чтобы создать видимость того, что для решения задачи необходим большой объём работы — больший, чем если бы программист программировал оптимально, и так, чтобы выделяющий деньги об этом несоответствии не догадался. Таким образом, строя самому себе препятствия, а затем героически с ними расправляясь, можно обеспечить себя работой (а значит, доходом) на долгие годы. А в случае с выделением бюджетных денег и при условии наличия коррупции появляется фактор отката. То есть, и тому, кто выделяет деньги, и тому, кто их осваивает, становится выгодным выделить и освоить побольше при том же объёме работы. "И тут им попёрло".

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

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

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

Да что там башни в Коннектикуте! Возьмите Винды! Операционную систему Windows. Вот сидит несколько тысяч человек и пишет всё новые версии операционки, целесообразность создания которых вызывает большие сомнения. Убрали, блин, кнопку "Start"... Сколько на это ушло времени и денег? Я думаю, пара лет и где-то миллиард баксов. А теперь, насколько я слышал, в новой версии её вернули взад. Ну, вернуть, наверное, подешевле обошлось — где-нибудь четыре месяца и двести миллионов.

В общем, теперь, когда я вижу где-то какую-то неоптимальность, я непринуждённо подавляю в себе импульс возмущения и желания исправить. Ибо эта "неоптимальность" может кормить не один десяток людей (включая меня самого), а значит не так уж она неоптимальна.

Но сам я стараюсь писать правильно.

#1 тов.Дынин
30.10.2014 Четверг 09:49

Поздравляю, Виталий! Теперь и ты понял, что программисты - паразиты!

#2 Escaper
30.10.2014 Четверг 11:14

Не все. И не только они.

#3 Alex
31.10.2014 Пятница 15:31

Очень интересное рассуждение.

1. Про программистский распил: может оно где и есть, но я не видел.
2. Про обеспечение всех скучной работой: по отношению к программистам как-то всё таки сомнительно.

В целом я с большинством идей согласен, но есть одна деталь "хороший код."

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

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

В общем я за профессионализм, мастерство и качественное развитие программистов :)

#4 frukt
01.11.2014 Суббота 14:39

Вообще говорят оптимальное число жителей планеты 2миллиарда а уже 7..

#5 Escaper
03.11.2014 Понедельник 15:42

> 1. Про программистский распил: может оно где и есть, но я не видел.

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

Насчёт хорошого кода — согласен. Писать его не просто, но нужно стремиться. :)

#6 Escaper
03.11.2014 Понедельник 15:47

> Вообще говорят оптимальное число жителей планеты 2миллиарда а уже 7..

Меня вообще, честно говоря, удивляет то, что человечество как-то совершенно спокойно смотрит на стремительное увеличение своей численности и ничего не предпринимает для того, чтобы что-то с этим сделать. Это ж к катастрофе приведёт.