Что главное в танке?

Prog.Stone progstone@yandex.ru

декабрь 2001

Если один инженер смог придумать некий механизм, то другой непременно сможет его разгадать.

Техника - искусство практическое, оно зависит не от таланта того или иного инженера, а от общего технического уровня общества.

Как и все прочие службисты, Мак полагал, что результат работы зависит от количества затраченных человеко-часов. Немудрено, что фирма годами не выпускала ничего нового.

Роберт Хайнлайн "Дверь в лето"

 

Бытует мнение, что самые главные секреты софтверных компаний - это не столько тексты исходников, сколько алгоритмы, реализованные в них. Так ли это?

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

Потребность необходимо или обнаружить, или создать. Это талант предвидения, способность распознать и поддержать перспективную идею, или просто удача. Или умелая реклама. Факторы  важные, но скорее не технические.

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

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

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

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

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

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

Развитие может быть как реакцией на конкуренцию, так и отслеживанием естественного изменения среды использования продукта, так и "конкуренция с собой" (стимулирование продаж новой версией). Это неизбежный закон - остановившийся в развитии продукт умирает. Или его обходят конкуренты, или он перестает удовлетворять новым задачам, или его никто не хочет покупать, потому что уже купили. Общая беда здесь - увлечение второстепенными усовершенствованиями, чему ряд причин как субъективных (нет новых идей), так и объективных (громоздкий код трудно совершенствовать качественно). В этом отношении мне симпатичны примеры QNX Realtime Platform, где ядро действительно новое по сравнению с QNX 4, и хотя не совсем или совсем не коммерческая Linux, где в ядре 2.4 многие составляющие были основательно переработаны и вылизаны, что не дало непосредственных "преимуществ" в виде списка новых опций, но существенно облегчает ее развитие.

И еще одно интересное обстоятельство - постояннно мелькают сообщения о покупке той или иной фирмы: покупается не продукт, код или алгоритмы - покупается целиком фирма, со всеми потрохами. Вместе с продуктом покупается еще что-то нематериальное, неосязаемое.

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

P.S. Для не знакомых с устройством танка:
Главное в танке - не наложить в штаны при выполнении боевой задачи.

Используются технологии uCoz