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

Перевод статьи Джоэла Спольски.
чт., 6 апреля 2000 года.
Netscape 6.0 медленно, но верно приближается к своей бета-версии. Версии 5.0, впрочем, никогда не было. Прошло уже почти три года со времени последнего глобального обновления, представленного компанией в лице четвертой версии продукта. Три года в мире интренета – это ужасно долго. И на протяжении всего этого времени Netscape будто застыл, беспомощно наблюдая, как теряет свою рыночную нишу.
Мое такое желание заполучить новую версию может даже показаться лестным. И потом, разве такая задержка, это их вина?
Да, их. Это целиком и полностью их вина. Они допустили самую худшую стратегическую ошибку, которую только может сделать софтверная компания, - они решили переписать код с нуля.
И это не первая такая ошибка. Вот еще один пример. Не так давно Borland попытались первыми выдвинуть свою версию dBase для Windows, купили Arago, но пока пыталсиь ее переделать, на сцене появилась Microsoft со своей Access, потом еще один промах, с Quattro Pro, начав переписывать код с нуля, Borland в итоге выпустила на рынок на удивление неконкурентоспособный продукт. Впрочем, и Microsoft чуть было не попалась, взявшись за обреченный проект по переделке Word-a, названный Pyramid, но вовремя его прикрыла и быстро спрятала все концы в воду. Следует отметить, что в Microsoft никогда не бросали старый код, и на его «базе» стремительно разростался новый, превратившись в итоге в настоящую не стратегическую, но финансовую лавину, захлестнувшую весь рынок ПО.
Мы с вами программисты. А программист в душе – это творец, первая мысль, которая повляется, стоит ему взяться за дело, - это все сломать и написать наконец «как надо». Мелкие задачки, связанные с сопровождением продукта, не будоражат воображение и не вдохновляют на подвиг.
Так почему же программист всегда хочет «стереть и написать заново»? Я скажу вам, в чем тут дело. Причина в том, что ему всегда искренне кажется, что старый код никуда не годится. И вот вам любопытное наблюдение, он почти всегда не прав. И заблуждение его обусловлено еще одним фундаменатльным законом разработки: прочитать код гораздо сложнее, чем его написать.
Именно поэтому использование чужого кода не вызывает ни у кого восторга. И по этой же причине каждый предпочтет использовать свою собсвенную функцию. Да потому, что намного интересней разработать свой алгоритм, нежели пытаться разобраться в чужой логике.
В подтверждение моих слов, попробуйте спросить любого программиста, что он думают о своем коде. И услышите: «Ужасная «помойка», я просто мечтаю о том, чтобы его переписать».
Так за что же код так беспощадно нарекается «помойкой»?
- «Нет, ну вы только посмотрите на эту функцию! Она же в два экрана не умещается. А этот код, он там совсем не нужен. А для чего нужны эти API, мне вообще непонятно!»
Перед тем, как виндоусовский табличный процессор от Borland поступил в продажу, Филипп Кан (Philippe Kahn), основатель компании, направо и налево трубил в прессе, как сильно новенький Quattro Pro превзойдет Microsoft Excel. Мы предлагаем полностью новый исходный код. Как будто код может состариться…
Мысль, что новый код лучше старого, вообще абсурдна. Старый код работал. Его тестировали. Было найдено и исправлено множество ошибок. Это рабочий код. И в нем не заведутся новые ошибки, пока он спокойно лежит на вашем жестком диске. Разве нет? Разве программное обеспечение начнет ржаветь в гараже как старый додж? Или, может, оно со временем станет таким же страшненьким, как ваш любимый плюшевый мишка?
Вернемся теперь к нашей функции, той, что занимает два экрана. Да-да, я знаю, это всего лишь простая функция создания окна, но за время она как-то «обросла», и никто не может ответить, как это произошло. Что ж, я скажу вам, как. Она обросла кодом в процессе исправления ошибок. Вот код, устраняющий ошибку, которую обнаружила Нэнси после того, как попыталась установить программу на компьютер, на котором не было Internet Explorer. Этот - относится к ошибке, возникающей при нехватке оперативной памяти. А вот это обрабатывает ситуацию, когда пользователь вынимает дискету в процессе считывания. Функция загрузки библиотеки выглядит ужасно, но зато код ее будет работать под всеми дистрибутивами Windows 95.
Чтобы найти каждую ошибку потребовались недели работы с продуктом. По несколько дней ушло у разработчика на то, чтобы воспроизвести и исправить каждую. Для исправления где-то понадобилось дописать строку кода, а где-то – всего пару символов. Но чего стоили эти символы!
Когда вы выбрасываете весь старый код и начинаете с нуля, вы разом выбрасываете весь накопленный опыт. Весь собранный список подводных камней и все придуманные их обходы. Вы выбрасываете в мусорное ведро несколько лет напряженной работы.
Вы теряете свои позиции на рынке. Дарите конкурентам фору в несколько лет! И уж поверьте мне, несколько лет для мира ПО – это слишком большой срок.
Вы собственноручно загоняете себя в чрезвычайно опасное положение. Вы будете несколько лет пытаться развивать написанный код, но не сможете, когда потребуется, вовремя среагировать на рыночный спрос, внести важные изменения или добавить новую функциональность. А все потому, что у вас нет надежной «базы». Возможно, вам даже придется на вермя уйти с рынка.
Вы нелепейшим образом будете тратить время на то, чтобы написать код, который уже написан.
Так есть ли альтернатива? То, что исходный код Netscape был дейсвительно ужасен, все-таки признали. Что ж, допустим, он дейсвительно был настолько плох, но знаете что? Этот код чертовски хорошо работал на огромном количесве существующих систем.
Когда программист говорит, что его код – помойка (а он говорит так всегда), то он, как правило, имеет в виду три вещи.
Во-первых, плохую архитекуру. Например, когда структуры нет в принципе. То, что следовало бы вынести в отдельный модуль, размыто по обработчикам. Это все довольно легко можно исправить. Перенести код, куда нужно, поменять интерфейсы, поменять названия. С этой задачей справится и один программист, если сделает все аккуртано и быстро, так чтобы изменения прошли незаметно для остальных разработчиков. Да и в случае самых глобальных изменений в архитекуре можно сохранить написанный код. Когда мы работали над проектом Juno, ушло несколько месяцев только лишь на то, чтобы «причесать» код, создать модель классов, грамотно продумать интерфейсы взаимодействия между модулями. Мы сделали все очень аккуртано и использовали весь рабочий код, таким образом, не получилась так, что что-то было выброшено на помойку, или появились какие-то новые ошибки.
Вторая причина недовольства программистов своим кодом – это его неэффективность. Про рендеринг в Netscape гооврили, что он медленный. Но это всего лишь малая часть кода, которая может быть всегда оптимизирована или даже переписана. Нет необходимости ломать всю систему. Когда речь идет об улучшении скорости, то тут одно правильное решение может решить проблему.
В-третьих, сам код может выглядить ужасно. Однажды, например, я наткнулся на чей-то тип данных с названием FuckedString. А в другом проекте столкнулся с тем, что сначала было условлено писать названия внутренних переменных, начиная со знака подчеркивания, а потом стали писать ”m_”. В результате половина названий начиналась с ”m_”, а вторая половина – с ”_”, что тоже выглядело не очень. Собственно говоря, исправить это можно в текстовом редакторе вообще минут за пять, естественно, ничего не переписывая.
Когда вы беретесь переписывать код с нуля, всегда важно понимать, что нет абсолютно никакой гарантии, что новый код окажется лучше старого. Начнем с того, что вряд ли вам удастся собрать ту же команду разработчиков, что работала над первой версией программы, а занчит, старый опыт вы потреяете. Добрую чать прошлых ошибок вы сделаете и во второй раз, да еще и новых наделаете.
Когда речь идет о больших коммерческих разработках, поверьте, ломать то, что уже построено, опасно. Например, когда вы работаете над пилотным проектом, вы можете захотеть переписать функцию, написанную на прошлой неделе, потому что на этой придумали лучший алгоритм. Это нормально. Вы можете поменять название класса, чтобы его было легче исользовать. Никаких проблем. Но целиком выбрасывать работающую систему – опасная недальновидность, ведь, будь у Netscape хоть немного опыта в индустрии ПО, вряд ли они бы так подставились.
Так почему же программист всегда хочет «стереть и написать заново»? Я скажу вам, в чем тут дело. Причина в том, что ему всегда искренне кажется, что старый код никуда не годится. И вот вам любопытное наблюдение, он почти всегда не прав. И заблуждение его обусловлено еще одним фундаменатльным законом разработки: прочитать код гораздо сложнее, чем его написать.
Золотые слова.
Да, и отлично переведено) Жду второй части!
Не думаю, что Netscape сожрал сам себя… Просто очень сложно конкурировать с Microsoft. И такая учесть постигла очень многие даже перспективные проекты. Хотя, конечно же суть статьи не в этом ))
У меня тоже такая утопия бывает. Ctrl+A -> Del )))
Иногда кажется, что я такую хрень написал, что пора вешать клавиатуру на гвоздь… Но даже печальный опыт есть опыт )))
А насчет статьи – GJ. Good Job. Видать не зря в Англию съездила, Кать. Может и мне поможет такая поездка… А то читаю свои переводы и хочется отрефакторить )
Ребят, спасибо за комплименты.
Юр, я ездила в Шотландию) и совсем не за этим) А вообще, нужно на русском языке книжек побольше читать), тем более, у кого из нас есть жена, которая закончила факультет журналистики 8)?
да, и потом, программист всегда недоволен, ты же прочитал)
а я покритикую, не столько Катю, сколько автора заметки.
Нетскейп умер, и хрен бы с ним. Зато есть Firefox (построенный теми же ребятами, если я ничего не путаю), который отлично конкурирует с IE, который в свою очередь написан с использованием старого кода (иначе был бы он таким убогим?).
Или тот же хром, который вообще с нуля возведен? Его популярность и качество только растут, а на рынке он всего ничего.
Когда вы выбрасываете весь старый код и начинаете с нуля, вы разом выбрасываете весь накопленный опыт. Весь собранный список подводных камней и все придуманные их обходы. Вы выбрасываете в мусорное ведро несколько лет напряженной работы.
когда код не выбрасывается, то он обрастает заплатками и затычками, как пирс в море обрастает ракушками и какашками). лучше вникнуть в код, понять, что он делает (с учетом доработок), а затем переписать его, зная все то, что накопилось за время его разработки.
Мысль, что новый код лучше старого, вообще абсурдна. Старый код работал. Его тестировали. Было найдено и исправлено множество ошибок. Это рабочий код. И в нем не заведутся новые ошибки, пока он спокойно лежит на вашем жестком диске. Разве нет? Разве программное обеспечение начнет ржаветь в гараже как старый додж? Или, может, оно со временем станет таким же страшненьким, как ваш любимый плюшевый мишка?
Станет, едрить его растудыть)) Диме известно, как ни с того, ни с сего ломаются приложения, написанные давно (очень давно).
Резюмируя, я пожалуй не до конца соглашусь с автором. Старый код важен и нужен, особенно если он написан качественно. Но если это объективно – помойка, то лучше его переписать, пока не стало поздно и он не захватил мир))
Гоша, на самом деле в статье поднята очень важная тема рефакторинга. Признаюсь, я не читал пока литературы на этот счет (хотя и собираюсь в ближайшее время). Думаю, ответ там, и автор все же прав.
А как я люблю выкинуть старое и начать писать с нуля, ты прекрасно знаешь) Именно поэтому я особенно проникся статьей.
Гош, я поэтому и выбрала данную статью, так как, то, о чем пишет Спольски, может показаться спорным. Твоя критика вполне обоснована. Но не набрасывайся ты так на автора, основную глупость он видит в тотальном пренебрежении старым кодом и самонадеянности, а не желании сделать код лучше как таковом. Он также отмечает, что код не всегда так плох, если «судить объективно», как кажется. И, как верно заметил Дима, тут поднята тема рефакторинга, суть которой в том, что к обновлению большой системы надо подходить трезво и грамотно (о чем, ты сам, кстати, и пишешь), а не нажимать в состоянии аффекта shift+del.
Что касается, хрома, так я сама обеими руками за гугл, жду не дождусь их операционки. Но сравнение тут не совсем уместно, как мне кажется. Не хром завоевал рынок, а гугл заработал себе авторитет, систематически поставляя качественное и, что немаловажно, бесплатное по. И потом, я так понимаю, это же их первый броузер, базы все равно не было, вряд ли бы они стали просить или покупать что-то у кого-то.
«… попробуйте спросить любого программиста, что он думают о _своем_ коде…»
Тут, скорее, «о _вашем_ коде»
Ваня, ну и о _своем_ часто тоже. может, конечно, и не так эмоционально, как о чужом) а вообще, есть отличное выражение, которое замечательно описывает такие вот «эмоции» программиста – «the code smells» (впервые услышала от Димы)
> впервые услышала от Димы
А Дима прочитал в книжке «Экстремальное программирование», рекомендую)
Я немного позанудствую насчёт комментариев. Насколько мне известно, Chrome был написан далеко не с нуля. Основой для него послужил WebKit, открытый проект, основанный в свою очередь на KHTML. Свои у Хрома, по-моему, интерпретатор JavaScript и UI, рендеринг же HTML отдан на растерзание WebKit.
согласен, после комментария уже прочитал об этом