Вещи, которые вам не стоит делать никогда. Часть I
Netscape 6.0 наконец-то выпустил свою первую бету. А версии 5.0 никогда не было. Последний релиз был версией 4.0, и он был выпущен почти 3 года назад (1997). 3 года – ужасно большой срок для интернета. За это время Netscape безнадежно просела, их присутствие на рынке стало ничтожным.
* Netscape Navigator — шестой по популярности (0,57 %) в мире браузер, производившийся компанией Netscape Communications – прим. ред.
Для меня немного неправильно критиковать их за такой большой промежуток между релизами. Они ведь сделали это не специально, не так ли?
Ну, вообще-то, да. Они сделали это специально. Они сделали наихудшую стратегическую ошибку, которую может совершить софтверная компания:
Они решили переписать код с нуля.
Netscape была не первой компанией, совершившей эту ошибку. Borland сделали то же, когда они купили Arago и попытались сделать dBase для Windows, обречённый проект, который занял столько времени, что Microsoft Access съел их с потрохами, затем, они совершили её снова, переписав Quattro Pro с нуля, удивив людей тем, насколько мало в ней стало функций. Microsoft почти сделала ту же ошибку, пытаясь переписать Word с нуля в обреченном проекте, называемом Пирамидой, который был закрыт, выброшен и заметён под ковёр. К счастью для Microsoft, они не переставали работать над старым кодом, так что у них было что продавать, и они свели дело к финансовой катастрофе, а не к стратегической.
Мы программисты. Программисты в душе архитекторы, и первая вещь, которую они хотят сделать, это расчистить бульдозером площадку, чтобы потом возвести на ней что-нибудь грандиозное. Они не вдохновляются эволюционными улучшениями: доведением до ума, совершенствованием, разбивкой цветочных клумб.
Существует неочевидная причина, по которой программисты всегда хотят выкинуть код и начать сначала. Причина в том, что они думают, что старый код это запутанный клубок. И вот одно интересное наблюдение: чаще всего они не правы. Причина, по которой они думают, что старый код запутан – один из главных и фундаментальных законов программирования:
Сложнее читать код, чем писать его.
Именно поэтому повторное использование кода настолько сложно. Именно поэтому у каждого в вашей команде есть своя функция для разбиения строки на массив строк. Они пишут свои собственные функции, потому что это легче и забавнее, чем разбираться в том, как работает старая функция.
Следствие из этой аксиомы: вы можете спросить почти любого программиста насчет кода, над которым он работает в настоящий момент. «Это большой волосатый клубок», - скажет он вам. Мне ничего так не хочется, как выбросить его и начать сначала.
Почему это клубок?
«Ну», - скажут они, - «посмотри на эту функцию. Она же занимает 2 страницы! Всё не на своём месте! Я не понимаю для, чего служит половина вызовов API».
Перед тем как вышла новая электронная таблица для Windows от компании Borland, Филипп Кан, знаменитый основатель Borland, часто цитировался прессой, хвастая тем, насколько Quattro Pro будет лучше Microsoft Excel, потому что он написан с нуля. Новый исходный код! Как будто исходный код ржавеет.
Идея о том, что новый код лучше, чем старый, очевидно абсурдна. Старый код использовали. Его тестировали. Было обнаружено множество багов, и они были исправлены. В нём нет ничего плохого. Он не приобретает ошибки, просто валяясь на вашем винчестере. Наоборот, детка! Разве софт может быть подобен старому Доджу Дарту, который ржавеет, стоя в гараже? Разве софт подобен игрушечному медвежонку, который становится грязным, если он не сделан из новых материалов?
Вернемся к той функции, что занимала 2 страницы. Да, я знаю, что это простая функция, чтобы вывести окно, но она немного обросла волосами и костылями и никто не знает почему. Ну, а я скажу вам почему: это исправления ошибок. Вот этот кусок исправляет ошибку, которая была у Нэнси, когда она пыталась установить программу на компьютер без Internet Explorer’а. А вот это исправляет ошибку, которая происходила в случае недостаточной памяти. Еще одна исправляет ту ошибку, которая происходила, когда файл был на дискете, а пользователь неожиданно вытаскивал ее. Этот вызов LoadLibrary выглядит уродливо, но он позволяет запускать программу на старых версиях Windows 95.
Каждая из этих ошибок прошла недели реального использования программы, прежде чем была обнаружена. Программисты, возможно, провели пару дней, воспроизводя ошибки и исправляя их. Возможно, было множество ошибок, которые исправлялись всего одной строчкой кода, а то и просто парой символов, но на эти пару символов было потрачено много времени и сил.
Когда вы выкидываете код и начинаете с нуля, вы также выкидываете все эти знания. Всю эту коллекцию исправлений. Годы программистской работы.
Вы выбрасываете ваше лидерство на рынке. Вы дарите 2 или 3 года вашим конкурентам, а уж поверьте мне, для программного обеспечения это очень большой срок.
Вы ставите себя в очень опасное положение, при котором вы будете поставлять заказчикам старую версию кода в течение нескольких лет, не имея возможности вносить стратегические изменения, которые требует рынок, потому что у вас еще нет готового кода. Вы с тем же успехом можете приостановить свой бизнес на это время.
Вы зачем-то тратите деньги на написание кода, который уже написан.
А есть ли альтернатива? Похоже, общее мнение было в том, что старый код Netscape был действительно плох. Что ж, возможно он был и плох, но знаете что? Он чертовски замечательно работал на огромном количестве компьютеров по всему миру.
Когда программисты говорят, что их код – чёрная дыра (а они всегда так говорят), есть три причины, по которым это происходит.
Первая – архитектурные проблемы. Код был неправильно разработан. Код для работы в сети выбрасывает свои диалоговые окна из ничего, это должно было обрабатываться в интерфейсной части. Эти проблемы могут быть решены, одна за раз, путём осторожного перемещения кода, рефакторинга (рефакторинг — процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы – прим. ред.) и изменения интерфейсов. Эти изменения могут быть сделаны одним программистом, работающим с большой осторожностью и заливающим свои изменения все разом, чтобы никто не был задет. Даже действительно значительные изменения в архитектуре могут быть сделаны без выбрасывания кода. В проекте Юнона, над которым мы провели несколько месяцев, мы занимались редизайном: перемещали код туда-сюда, очищали его, создавали базовые классы, которые были понятны, и создавали ясные интерфейсы между модулями. Но мы делали это осторожно, использовали существующую кодовую базу и мы не вводили новых ошибок и не выбрасывали работающий код.
Вторая причина того, что программисты думают, что в их коде беспорядок – это его неэффективность. Код рендеринга страниц в Netscape был, по слухам, слишком медленным. Но это затрагивает только малую часть проекта, которую можно оптимизировать, или даже и переписать. Вы не должны переписывать из-за этого всё. Когда оптимизируешь по скорости, 99% результата может быть достигнуто модификацией 1% кода.
Третья причина: код может быть чертовски уродливым. В одном проекте, над которым я работал, был тип данных, который назывался «грёбаная строка». В начале другого проекта было принято соглашение начинать именовать члены класса с подчеркивания, но потом все переключились на более стандартное начало «m_». Так что в половине кода были функции, начинающиеся с «_», а в другой половине - начинающиеся с «m_», и это выглядело уродливо. Честно говоря, эта проблема может быть исправлена за 5 минут макросом Emacs’a, не надо переписывать всё с нуля.
Важно помнить, что начиная с нуля, нет абсолютно никаких оснований предполагать, что вы сделаете лучше, чем в первый раз. В первую очередь, возможно у вас даже нет той команды программистов, что писали первую версию, так что у вас нет «большего опыта». Все что вы сделаете, это пройдётесь по всем старым граблям, и введёте несколько новых, которых не было в оригинальной версии.
Старая мантра о том, что первую версию надо выбросить, опасна в применении к большим коммерческим разработкам. Если вы пишете пробный код, возможно вы захотите выкинуть функцию, которую написали на прошлой неделе, потому что придумали лучший алгоритм. Это хорошо. Возможно, вы захотите переделать класс, чтобы сделать его более простым в использовании. Это тоже замечательно. Но выбрасывание всей программы – это опасная неосмотрительность, и если бы Netscape был под «присмотром взрослых» с опытом в индустрии производства программного обеспечения, возможно, он бы не выстрелил себе в ногу.
статью прочитали: 3726 человек
Сегодня статей опубликовано не было.
Комментарии возможны только от зарегистрированных пользователей, пожалуйста зарегистрируйтесь