- Sat 27 May 2023
- articles
- Joel Spolsky
- #spolsky, #programming
Это перевод оригинальной статьи Things You Should Never Do, Part I Автор Joel Spolsky:
Вещи которые вам никогда не следует делать, Часть 1 (April 6, 2000)
Netscape 6.0 наконец входит в свою публичную бета-версию. Никогда небыло версии 5.0. Последний оcновной релиз, версия 4.0, был выпущен практически через 3 года спустя. Три года, - это ужасно долгое время для интернет-мира. Втечение этого времени, Netscape сидела и беспомощно наблюдала, как резко упала их доля.
Немного хитро с моей стороны критиковать их за такое длительное ожидание между релизами. Они не делали это намеренно своей целью, не так ли?
Ну, да. Они сделали. Они сделали одну наихудшую статегическую ошибку что могла сделать любая софтверная комания:
Они решили переписать код с нуля. Netscape не была первой компанией что делает эту ошибку. Borland сделала туже ошибку когда они купили Arago и попытались сделать это в dBase для Windows, обреченный проект который занял так много времени что Miscrosoft Access съел их обед, затем они сделали это снова переписывая Quattro Pro с нуля и удивляя людей как мало функций у нее было. Microsoft практически сделала туже самую ошибку, пытаясь переписать Word для Windows с нуля, обреченный проект назывался Pyramid который был закрыт, выброшенный и сметенный под ковер.
К счастью для Microsoft, они никогда не останавливали работы над старой кодовой базой, поэтому им было что поставлять, превращая это просто в финансовую катастрофу, а не стратегическую.
Мы программисты. Программисты в шлубине души, архитекторы, и первая вещь что они хотят сделать когда они доберуться до места - это снести бульдозером это место и построить что-то грандиозное. Мы не в восторге от постепенных обновлений: допиливание, улучшение, посадка цветочных клумб.
Это тонкая причина по которой программисты всегда хотят выбрасить код и начать заново. Причина в том что они думают старый код - это бардак. Есть интересное наблюдение: они вероятно ошибаются. Причина по которой они считают что старый код беспорядочен заключена в кардинальном, фундаментальном законе программирования:
Читать код сложнее, чем писать
Вот почему повторное использование кода так сложно. Вот почему каждый в вашей команде имеет разную функцию которую они любят использовать для разбиения строк на массивы строк. Они пишут самостоятельно функцию потому-что это легче и более весело чем выяснять как работает старая функция.
Как следствие этой аксиомы, вы можете спросить практически любого программиста сегодня о коде над которым они работают. "Это большой сплошной беспорядок", они расскажут это вам. "Я бы ничего лучше не желал, чем выбросить его и начать заново". Почему это беспорядок?
"Ну" они говорят, "Посмотрите на эту функцию. Она занимает две страницы! Ничего из этого не должно там находиться! Я не знаю для чего половина этих API вызовов".
Перед выпуском новой электронной таблицы Borland для Windows, Philippe Kahn, колоритный основатель Borland, много цитировался в прессе и хвастался о том как Quattro Pro будет намного лучше чем Microsoft Excel, потому что он был переписан с нуля. Все новые исходники! Как буд-то существующий код заржавел.
Идея что новый код лучше, чем старый явно абсурдна. Старый код уже использовался. Он был протестирован. Многие баги были найдены, и они были исправлены. В этом нет ничего плохого. Он не какапливает ошибки просто размещаясь на вашем жестком диске. Наоборот, детка! Програмное обеспечение должно быть похоже на старое авто, что ржавеет просто простаивая в гараже? Является ли програмное обеспечение отвратительным, если не сделано из новейших материалов?
Возвращаясь к двум страницам функций. Да, я знаю это простая функция отображения окна на экран, но на ней появилась маленькая пыль и никто незнает почему. Ну, я расскажу тебе почему: это исправления ошибок. Одна из них исправляет баг, который был у Ненси, когда она пыталась установить эту вещь на компьютер на котором небыло Internet Explorer. Другая исправляет баг что появляется при нехватке памяти. Еще одна исправляет ошибку которая появлялась когда файл находился на гибком накопителе и пользователь его выдергивал посредине. Этот LoadLibrary вызов ужасен, но он делает код рабочим на старой версии Windows 95.
Каждой из этих ошибок потребовались недели реальной работы перед тем как они были найдены. Программист должен потратить пару дней для воспроизведения ошибки в песочнице и исправления ее. Если ошибок много, исправление может быть одной строкой кода или может даже быть парой символов, но много работы и времени потрачено на поиск этих двух символов.
Когда вы хотите выбросить код и начать с нуля, вы выбрасываете все ваши знания. Все эти найденные исправления. Годы программирования.
Вы выбрасываете - ваше лидерство на рынке. Вы делаете подарок на два или три года вашим конкурентам, и поверьте мне, это много время в годах програмного обеспечения.
Вы ставите себя в крайне опасную позицию, когда вы будете выпускать старую версию кода несколько лет, делаете совершенно недоступным любые стратегические изменения или реагировать на новые функции которые требует рынок, потому что вы не имеете поставляемого кода. Вы можете также успешно закрыть ваш бизнес на этот период.
Вы тратите колосальную сумму денег на написание кода который уже существует.
Есть ли альтернатива? По общему мнению старая кодовая база Netscape была действительно плохой. Ну возможно это было плохо, но знаете что? Она работала чертовски хорошо на огромном количестве компьютерных систем по всему миру.
Когда программисты говорят что их код, это полнейший беспорядок (так они всегда делают), есть три вида вещей которые неправильные с ним.
Во-первых это архитектурные проблемы. Код неучитывается правильно. Сетевой код всплывает из ни откуда в собственных диалоговых окнах; это должно было быть отработано в обработчике UI (пользовательского интерфейса). Эти проблемы могут быть решены сразуже путем тщательного переноса кода, переработки, изменения интерфейсов. Их может сделать программист тщательно работающий и проверяющий эти изменения сразуже, так чтобы никто еще не попал. Даже серьезные основные архитектурные изменения могут быть выполнены без выбрасывания кода. В проекте Juno мы потратили несколько месяцев на перестройку архитектуры в какой-то момент: просто перемещять вещи вокруг, очищать их, создание базовых классов в которых есть смысл, и создание четких интерфейсов между модулями. Но мы делали это осторожно, с нашей отличной кодовой базой, и мы не внедряли новые ошибки или выбрасывали рабочий код.
Вторая причина по которой программисты считают, что их код беспорядочен заключена в том, что он не эффеективен. Были случи что отрисовка кода в Netscape была медленной. Но это имело влияние только на маленькую часть нашего проекта, который мы оптимизировали и даже переписали. Вы не доджны переписывать все целиком. Когда оптимизация скорости 1% работы дает вам 99% отдачи.
В-третьих ваш код возможно очень ужасен. В одном проекте над которым я работал, имел тип данных под названием FuckedString. Другой проект начинался с использования соглашения о начальных символах переменных с подчеркивания, но позже переключились на использование более стандартного "m_". Поэтому половина функций начиналась с "_" и вторая половина с "m_" которые выглядели ужасно. Откровенно говоря это то что можно решить за пять минут - макросом в Emacs, но не начинать все с нуля.
Более важно помнить что когда вы начинаете с нуля, абсолютно нет причины верить в то что вы собираетесь сделать лучше работу чем вы сделаи в первый раз. Прежде всего, вы вероятно не имеете туже команду программистов что работала в первый раз, так что у вас нет "больше опыта". Вы просто собираетесь сделать большинство старых ошибок снова, и внедрить некоторые новые проблемы которых небыло в оригинальной версии.
Старая мантра сделать один раз чтобы выбросить опасна когда применяется к большому масштабируемому коммерческому проекту. Если вы пишете эксперементальный код, возможно вы захотите разорвать функцию которую вы написали на прошлой неделе когда вы думали о лучшем алгоритме. Это нормально. Вы пожете захотеть переписать класс чтобы сделать его легче. Это тоже нормально, но выбрасывать целую программу есть опасная глупость, и если бы Netscape действительно имела взрослое супервидение с опытом в программной индустрии, они могли бы не так сильно выстрелить себе в ногу.