Программирование по-русски. Особый путь или+?
Александр Фридман
Разработка программного обеспечения - одна из немногих действительно глобальных сфер деятельности. Благодаря международным стандартам, легкости и быстроте распространения новых продуктов и технологий (вершиной которых стал Интернет) программирование оставляет далеко позади другие виды производства. Хорошо известны примеры распределенной разработки программ. Проект GNU реализован, развивается и поддерживается программистами всего мира, так же как и Linux. Распределением работ по разным городам, часовым поясам и даже странам занимаются ныне и коммерческие компании.
Можно ли в таких условиях говорить о каком-то особом подходе к программированию в России, “своем пути” и т. д.? Чем мы лучше или хуже всего остального мира? Или же и в столь абстрактном и нематериальном виде деятельности XXI века загадочная русская душа (или не менее загадочный тульский левша) сумеет привнести что-либо свое?
Оставив в покое проблему загадочности (пускай над ней бьются другие авторы и издания), попробуем подойти к вопросу более трезво. То есть, говоря о программировании в России, будем учитывать специфику страны, что вполне обоснованно и разумно.
Перед любой компанией, занимающейся программированием в России, стоит проблема выживания в условиях действительно глобальной конкуренции. Все перечисленные потрясающие возможности распространения программного обеспечения позволяют ведущим западным (и прежде всего американским) компаниям предлагать для российских клиентов программные решения с такими же, а иногда и меньшими затратами усилий, что и для своих соотечественников. Тем более важно распознать свои сильные и слабые стороны, чтобы в полную меру воспользоваться одними и сгладить нежелательный эффект других.
Истина легче познается в сравнении. Давайте взглянем на то, как программируют в стране, давно ставшей лидером в этой отрасли, - в США.
С тем, что США являются законодателем мод в области компьютеров, пожалуй, никто спорить не станет. Достаточно вспомнить, что в Америке находятся две крупнейшие компьютерные компании, выпускающие и продающие программы - Microsoft и IBM. Не претендуя на исчерпывающий анализ, расскажем о некоторых характерных особенностях “американского” программирования.
Первая и самая главная - массовость. Степень компьютеризации американской жизни чрезвычайно высока. Может быть, слишком высока - но это опять-таки тема другой статьи. Соответственно профессия программиста стала массовой. И, как обычно в таких случаях, с увеличением числа людей средний уровень квалификации снижается.
Большинство крупных американских компаний не пользуются готовыми решениями. Типичная информационная система в фирме представляет собой сочетание готовых пакетов с системами собственной разработки. Такой подход легко объясним и весьма разумен. Во-первых, каждая крупная компания имеет свою специфику и довольно часто ни один из предлагаемых на рынке пакетов ей не отвечает (конечно, речь идет не о редакторах текста или СУБД, а об информатизации или автоматизации самого бизнеса). Во-вторых, у компании уже есть старые информационные системы и просто так их выбросить трудно. Даже если и появится решение, полностью отвечающее потребностям компании, резкий переход на новый программный продукт может быть слишком большим ударом по налаженному производству. Отсюда - интеграция, написание собственных систем и потребность в программистах.
Получается странный замкнутый круг: высокая компьютеризация требует много программистов, массовость снижает общий уровень программирования, следовательно, создаются программные системы худшего качества, с большим количеством ошибок, которые требуют новых программистов для поддержки и модификации. Возникает дефицит программистов, соответственно люди переходят в программисты из других профессий, не имея ни опыта, ни порой нормального образования, - качество падает, нужны новые программисты исправлять ошибки, и т. д. и т. п.
Пока эта проблема решается экстенсивно. В Америку привозятся толпы программистов, в первую очередь из Индии, Китая, Юго-Восточной Азии. Они позволяют удержать зарплаты программистов на приемлемом уровне и существенно снизить дефицитность профессии.
Нельзя сказать, что не делается попыток разорвать этот круг, и прежде всего с помощью повышения эффективности труда программистов. Существуют интересные исследования и разработки как по структуре программистских коллективов, организации их труда, так и по техническим средствам повышения производительности. Эти разработки давно вышли из стадии теоретических, активно используются и дают реальные результаты. Тем не менее перелома в программировании пока что не видно. Почему? Как ни странно, мешает американское стремление к эффективности, но на этот раз со стороны компаний - потребителей ПО. В стремлении снизить стоимость разработки ПО компании не нанимают дорогостоящих программистов на постоянную работу, пользуются услугами временных работников-консультантов, и всячески стараются сэкономить на оплате труда. На низкую зарплату согласятся прежде всего неопытные и малоквалифицированные люди, которые просто не смогут применять на практике методы эффективной работы. А едва чему-то научившись, самые способные немедленно перейдут на другое место, где платят больше и где лучше условия труда.
В этой связи интересно сравнить отношение к программистам в двух крупных компаниях - Microsoft и Andersen Consulting. В большинстве случаев рядовые сотрудники Microsoft довольны отношениями с руководством и условиями работы. Компания осознает, что разработчики - основная ценность и составляющая успеха, поэтому все организовано так, чтобы им было удобно работать. Не случайно в последнее время в разных журналах появляются статьи с изучением опыта работы Microsoft именно в области организации программирования.
Andersen Consulting - одна из крупнейших консалтинговых фирм, занимающаяся разработкой программного обеспечения для клиентов. Несмотря на то что уровень зарплаты в ней сравним с таковым в Microsoft, текучесть среди программистов значительно выше. В Andersen приходит очень много выпускников университетов: их привлекает имя компании, работа с передовой технологией, возможность быстро набрать квалификацию. Однако, отработав два-три года, они уходят в другие компании, так как в конце концов их выталкивает потогонная система. Обычными являются требования, чтобы рабочая неделя составляла 60 и более часов. Руководство понимает, что человек долго здесь не задержится, поэтому из него надо успеть выжать как можно больше. Поэтому программисты рассматриваются в качестве этакого “пушечного мяса”, предназначенного для единственной цели - принесения прибыли. Частенько для ускорения разработки проекта привлекают новых программистов. Такое отношение к людям снижает их лояльность к своей фирме.
Этот пример мы привели для того, чтобы продемострировать существующий разрыв между элитой компьютерного бизнеса - небольшой группой высокоэффективных компаний и основной массой (причем Andersen - далеко не самый худший вариант).
Ситуацию в России легче всего охарактеризовать, перечислив, чего у нас нет. У большинства российских компаний нет багажа старого программного обеспечения. Россия лишена возможности привлекать дешевые кадры из-за границы. Компьютеризация промышленности существенно ниже, чем в США. Отсюда следует оптимистический вывод - повторить ошибки американских компаний мы не сможем.
Рецепт успеха вряд ли покажется новым и оригинальным. Путь российских компаний - создание высокопроизводительных команд квалифицированных программистов, т. е. путь интенсивного развития. Разумеется, легче сказать, чем сделать, однако попробуем показать, что существуют определенные предпосылки для развития по оптимистическому пути.
Во-первых, давайте договоримся, что понимать под высокопроизводительной командой. Существует несколько общепринятых критериев производительности программистского труда. Наиболее часто употребляется показатель количества отлаженных строк программы. В программировании графических интерфейсов часто измеряется число диалогов или окон. Более изощренный показатель - количество реализованных “функциональных точек”. Все эти методы позволяют оценивать производительность труда и размер программных продуктов, однако, несомненно, все они имеют очень серьезные недостатки, и прежде всего слабый учет сложности работы. В настоящее время разрабатываются более сложные количественные способы оценки производительности. Не имея места для их рассмотрения, взглянем на проблему производительности немного с другой стороны.
По разным оценкам, от 60 до 80% всех программных проектов в американских компаниях не доводятся до стадии внедрения. Хотя главный признак высокопроизводительного коллектива - доведение всех выполняемых проектов до внедрения. Разумеется, имеет смысл говорить только о коммерческих проектах. Разработка, которая не ведется в конкурентной борьбе с другими коллективами, не может рассматриваться при учете производительности труда организации. В конкурентной борьбе за контракт с клиентом коллектив обязан предложить лучшие сроки и условия разработки, чем у других претендентов. При разработке программного продукта на продажу сроки и ресурсы, затрачиваемые на его разработку, должны обеспечить своевременный выход на рынок при окупаемости затрат. Эти примеры показывают, что затягивание сроков разработки, работа по не очень напряженному графику, который подстраховывает от неудач и задержек, в большинстве случаев просто невозможны. (Кстати, одна из первейших характеристик профессионального коллектива - умение правильно оценивать сроки разработки.)
Каковы же составляющие успешной работы? Опыт, знания, организация.
Еще около двадцати лет назад такие корифеи программирования, как Дейкстра, Вирт и др., проводили исследования, чтобы выяснить, как различается производительность труда разных программистов. Оказывается, не то что в десятки, а иногда и в сотни раз. Как правило, один программист с десятилетним стажем делает работу лучше и быстрее, чем три-четыре выпускника университета. В литературе встречаются утверждения о двенадцатикратном разрыве в производительности между некоторыми программистами. Несомненно, уровень производительности обусловлен не только опытом, но и способностями. Однако частенько разница между экспертом и новичком выражается в том, что один может решить проблему за полчаса, а второй вообще не может ее решить.
Самый лучший способ повышения квалификации - работа под руководством высококвалифицированного специалиста. Роль “играющего тренера” в программировании, являющемся инженерной дисциплиной лишь наполовину, а наполовину - искусством, особенно велика. Минимальное соотношение опытных (не менее десяти лет стажа) и молодых - один к трем. При таком соотношении еще возможны менторские отношения между более опытными и молодыми работниками при сохранении продуктивности тех и других.
Очень важно избежать соблазна мнимой экономии на зарплате за счет привлечения неопытных программистов (а тем более студентов) для самостоятельного выполнения проектов. Эта экономия обычно приводит к выполнению проекта на невысоком уровне, трудностях его поддержки, необходимости исправления ошибок и, соответственно, к новым затратам.
Иллюзия простоты приобретения знаний в программировании погубила не один проект. Традиционно дневные факультеты кибернетики, электронных вычислительных машин и прикладной математики российских вузов давали не столько знание конкретных систем программирования или пакетов прикладных программ, сколько основы теоретического программирования, вычислительной математики, структур данных. Важно не изменить этой традиции в угоду сиюминутным выгодам обучения конкретному языку программирования (хотя, как известно, без практики теория мертва). Широкий кругозор, приобретаемый в ходе изучения основ, позволяет осваивать конкретные знания быстро и эффективно.
Трудно переоценить значение правильной организации коллектива для эффективной работы. В настоящее время методы организации программирования - одно из наиболее активно развивающихся направлений методологии программирования. Отметим три направления: работы по стандарту ISO 9000 - качество проектирования систем (не только программных), модель SEI-CMM института инженерного программирования и программирование по образцам. Все три направления тесно взаимосвязаны и дополняют друг друга. Исследовательские и практические работы есть и в России (в частности, ряд российских авторов участвует в конференциях по образцам проектирования).
Итак, элементы всех трех необходимых составляющих для создания высокопроизводительных систем в России присутствуют. Другое дело, что основная компьютерная пресса (как периодика, так, что более обидно, и книги) сосредоточилась на конкретных знаниях и коммерческих материалах, совершенно упустив из виду методологические основы программирования.
В условиях ограниченных ресурсов особенную актуальность приобретает лозунг “Мы не настолько богаты, чтобы приобретать дешевые вещи”. Перевод заведомо вторичных книг создает иллюзию изобилия компьютерной литературы, тогда как существенный пласт действительно стоящей литературы оказывается недоступным российскому читателю.
Но ведь альтернативы интенсивному пути развития нет! Вопрос стоит довольно просто - либо становиться лучшим (хотя бы одним из лучших), либо остаться на задворках. И это должны понимать все, кто участвует в процессе становления российских программистских компаний, - программисты, менеджеры, клиенты, пресса, органы образования. Эта статья выражает личное мнение автора, основанное лишь на его опыте и чтении литературы. Она не подкреплена никакими статистическими исследованиями и ссылками.
Автор с удовольствием выслушает мнения по ее поводу, в том числе и критические. Обратиться к нему можно по адресу: afridman@ glasnet.ru или afridman@interaccess.com.