Archive for February, 2008

Ремонт нельзя закончить, его можно только остановить.

Friday, February 15th, 2008

Сегодня, немного углублюсь в технические особенности рефакторинга и их бизнес последствия.

Я не буду рассматривать обычный маленький рефакторинг, когда в процессе проекта проекта немножко изменяется и улучшается код. А я хочу рассмотреть ситуацию, когда код находится абсолютно в жутком состоянии.

Естественно, проект лучше не доводить до жуткого состояния, но тем не менее, множество проектов до него таки доходят и зачастую не в ваших силах было на это повлиять (например, когда проект вам достался в наследство).

Собственно, в чем проблема проектов с плохим кодом. Опустим моральную сторону, что над проектом плохим кодом неприятно работать, так как постоянно приходится все делать через одно место.

С бизнес точки зрения проблема состоит в том, что:

- существенно увеличивается время на внесение изменений и написание новой функциональности

- соотношение поддержка старого кода / инновации, очень сильно начинает крениться в сторону поддержки

- увеличивается время “въезжания” новых программистов в проект

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

Сначала, опишу три выхода из этой ситуации, а потом обсудим каждый их них:

- сделать кучу маленьких рефакторингов

- переписать все заново

- сделать большой рефакторинг

Начнем с малого рефакторинга. В любой момент, если вы видите, что можно по ходу работы потихоньку обновлять и улучшать код – то это и нужно сделать, так как остальные выходы гораздо хуже (более рискованные и съедают больше времени и увеличивают время до выхода следующей версии).

Бывают такие ситуации, когда малые рефакторинги – не выход. Например, если постепенное улучшение кода может занять 5 лет.

Переписывать заново нельзя никогда. Точнее переписать прототип на рабочий код можно (а зачастую и нужно), но вот переписывать работающий продукт – это самоубийство.

Плохой код состоит из нескольких частей

- плохая и непродуманная архитектура (написание проекта без продумывания архитектуры наперед)

- плохой код на уровне использования языка (обычно это код написанный слабыми или неопытными программистами)

- кучу заплаток поверх архитектуры

Переписывание заново лучше всего решает архитектурные проблемы. Плохой код на уровне языка оно решает, только если текущие программисты сильные чем те, которые писали предыдущую версию. А вот с заплатками обычно наблюдаются проблемы.

Чаще всего большинство функциональности заплаток упускаются при переписывании, так как обычно это куча мелких частных ситуаций, которые не внесены не в тесты, не в документацию. И получается, что код переписан, но он не выполняет всей функциональности или не работает во все usercases. Причем, это обнаруживается в самом конце переписывания (когда начинается полное тестирование). И опять поверх стройной новой архитектуру начинают копироваться или переписывать заплатки из предыдущего проекта. Обычно это очень затягивается, фактически убивая заново написанный продукт.

Теперь, перейдем к возможности большого рефакторинга, о которой собственно это статья. Большой рефакторинг – это ситуация, когда он проводится не параллельно с разработкой чего-то нового, а скорее в режиме когда проект замораживается для новой функциональности и пофикса и начинается рефакториться день и ночь.

Обычно такой рефакторинг позволяет существенно улучшить качество проекта в достаточно короткие сроки, без необходимости переписывать проект с нуля.

И тут кроется одна большая проблема, качество кода, достаточно сложно измеримая величина. Поэтому рефакторить проект можно до бесконечности полируя заново какие-то кусочки. Поэтому, еще до того, как начинается рефакторинг нужно определиться с несколькими вещами:

- что конкретно улучшается

- поставить жесткие временные рамки

- точно определить как будет измеряться достижения целей

Если не соблюсти эти три правила, то рефакторинг превращается в научное исследования уходящее в бесконечность или ремонт (кому какое сравнение ближе к душе).

Очень важно избежать двух тенденций.

Первая тенденция – это то, что во время рефакторинга находятся все новые плохие куски, которые тоже хочется/нужно улучшить. Как только цели определены, то нельзя их изменять. Вполне имеет смысл иметь список, того, что хочется улучшить. Однако новые улучшения можно делать маленькими рефакторингами, когда большой будет закончен.

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

Но, повторюсь еще раз, нужно пытаться всеми силами избежать большого рефакторинга, если маленький остается возможным.

 P.S. Если вы подписываетесь на получение  писем, когда кто-то добавил комментарии на статью, то теперь есть возможности перейти сразу на нужный комментарий из письма, вместо того, чтобы заходить на статью и искать вручную этот комментарий.

Деньги и конец компаний.

Wednesday, February 13th, 2008

 

Еще одна банальность, но которую нельзя забывать, на тему моего предыдущего поста.

Компании выходят из бизнеса не из-за плохой идеи, продукта, менеджмента или рынка. Они выходят из бизнеса, так как у них кончаются деньги. Остальное можно исправить.

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

Что важнее для компании деньги или драйв?

Monday, February 11th, 2008

Несколько коротких мыслей, на тему что важнее для компании – «Деньги или драйв и организация счастья на земле».

Здесь есть два мнения:

- Если вы будете вести свой бизнес только ради денег – вы никогда не добьетесь большого успеха.

- Если вести свой бизнес без учета денег или не ориентируясь на них, то бизнес вылетит в трубу.

На самом деле, нормальный бизнес живет только когда есть баланс между двумя этими ипостасями.

И если вы в это не верите, то просто оцените два примера крайних ситуаций.

Если вести бизнес только-только ради денег и не думать ни о чем больше, то такая фирма не будет думать о том, как улучшить мир и сделать своих заказчиков счастливыми. Они только будут пытаться «стричь деньги» не возвращая ничего взамен.

Если не думать о деньгах вообще, то тогда вы их вряд ли получите. К вам будет приходить заказчик, а вы его будет посылать в сад, так как у вас драйв.

P.S. Кстати, я писал о том, что нужно для старта/выживания бизнеса в этой статье.

Серебряная пуля в разрезе.

Sunday, February 10th, 2008

В далеком 1986 году, мистер Брукс написал статью “No silver bullet”. Эта статья в последствие стала классикой жанра. И хотя многие не читали оригинальную статью, тем не менее термин “серебряная пуля” очень прижился.

После этого статья вошла в книгу Брукса “мифический человеко-месяц”. Тут эта книга есть на русском (похоже издание 95 года).

Для тех, кому лень читать много букв, там говорится о том, что в программировании не будет изобретено никаких методов или технологий, которые позволят существенно (скажем в 10 раз) улучшить эффективность разработки. Идея обосновывается тем, что вся разработка состоит из двух частей – сущности и побочных сложностей. И что сущность нельзя сделать проще, а основные побочные сложности (такие как, например, написание программ на assembler’е) уже упрощены.

Serg Kond в своем блоге сделал интересную заметку насчет статьи о программистском синхрофазотроне. Что по большему счету, я пытаюсь найти серебренную пулю. Я бы сказал, что действительно методика, которая повысит мотивацию хороших программистов может стать серебренной пулей XXI века. Отличие нынешней ситуации от 86 года в том, что разрыв у хороших и плохих программистов в соотношении эффективность/оплата очень уменьшился за последние двадцать лет. Проще говоря, выросло количество плохих программистов получающих достаточно высокие зарплаты и хороших программистов упершихся в зарплатный потолок (который не слишком далек от зарплат плохих программистов). Но, речь впрочем не об этом.

Просто, хочу внести свою небольшую лепту в обсуждение статьи Брукса.

Взглянем, что же произошло за последние 20+ лет, с тех пор пока была написана его статья. Я специально не хочу давать оценку каждому пункту, насколько он убыстрил программирование, чтобы не возникли споры именно вокруг этих цифр. Но, я хочу показать то, что ускорило написание программ.

Итак, к фактам:

А) Каждый программист получил в свое пользование персональный компьютер (а иногда и несколько).

Б) Компьютеры стали быстрее, что позволяет вести быстрее разработку (более быстрая компиляция и т.п. вещи)

В) Языке стали еще более высокоуровневыми (например, C# vs C).

Г) Операционные системы предоставляют API с функциональностью, которая гораздо богаче, чем в 86 году.

Д) Множество утилит теперь доступны для разработчиков – система контроля версий, трекинга багов, wiki и т.п.

Е) Ну и естественно, появился доступ к дичайшему количеству документации, обсуждений в интернете особенностей написания кода и т.п..

Я думаю, сюда можно прибавить еще несколько пунктов, если покопаться еще в голову. И ясно, что все эти пункты, хотя и ускорили разработку, но, пожалуй, если собрать их всех вместе то наверно они дадут один порядок в улучшение эффективности (вряд ли больше).

Однако, я напоследок оставил то, что действительно является «серебряной пулей».

Это – библиотеки. Точнее не только библиотеки, но и разнообразные платформы. За последние двадцать лет появилось гигантское количество открытого доступного кода или хотя бы платформ с открытыми интерфейсами. Казалось бы, ну и что? Ну есть библиотеки, и чем это поможет?

Приведу пример. Возьмем автоматизацию склада в 1986 и в 2008 году.

1986 год: Небольшая программка в текстовом режиме написанная на С (не на C++). Возможности – ввод пришедших товаров, удаление ушедших и показ текущих. База данных хранится в текстовом файлике.

2008 год: RFID ворота на складе, подключенные к машинам на которых установлен Ubuntu с программой, которая выгребает данных с RFID считыватели и по сети закатывает в БД. На сервере крутится программа, которая выгребает данные из БД и через SOAP загружает их в Sales Force Automation (я правда не уверен, что они работаю с складскими данными).

Итого, в первом случае мы имеем программку и человека, считающий ящики на входе и выходе, вводящий постоянно это в программу. Фактически полное отсутствие report’ов и невозможность получения данных на другом компьютере (интернета еще нет)

Во втором случае, мы получаем автоматическую систему, в которой не надо считать ящики, к которой можно иметь доступ из любой точки мира в любой момент, которая может построить два десятка разнообразных отчетов, графиков, статистики и т.п. Да, кстати, все это в красивом графическом оформление, которое можно напечатать и показать шефу. 

Дай бог 0.01% второй системы написано программистом, а остальные (сайт sales force, библиотеки по работе с RFID, база данных, tcp/ip, xml, soap, графический интерфейс, броузер и т.п.) досталось ему фактически забесплатно. Если бы он пытался написать все сам (даже «срезая углы») у него это заняло бы всю жизнь.

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

Заметили, что в втором случае количество возможностей (и требований к системе) гораздо больше чем в первом? Именно, из-за этого мы и не заметили серебрянной пули, хотя она находится у нас под носом.

Вместе с эффективность разработки росли и размеры/требования задач. И если вчера всех удовлетворял интерфейс стиля «Нажмите 1, чтобы добавить товар. Нажмите 2, чтобы удалить товар», то сегодня все должно быть интерактивным, красивым, поддерживающим тысячи транзакций в секунду,  совместимым с другими системами и т.п.

Я думаю, индустрия в целом продложит развиваться в туже самую сторону. Вряд ли изобретут что-то супер новое, что позволит серьезно улучшить эффективность. Единственно, что действительно ее будет увеличивать – имеющиеся наработки (библиотеки и платформы) и возможности их использования. С другой стороны задачи тоже продолжат рости (причем судя по всему быстрее, чем будут улучшаться наработки). Так что вероятнее всего разработки проектов постепенно будут становится все более долгосрочными.

P.S. Только дописав статью я понял, за что собственно говоря борется opensource  communit. Ведь собственно во многом именно благодаря им мы получили улучшение в эффективности.

P.P.S. И, кстати, тот же самый WordPress, который я сейчас использую результат этого самого движения.