суббота, 15 февраля 2014 г.

[prog.flame] Хорошая заметка о выборе языка для серьезного проекта от kaa.python

Ув.тов. Александр Ставонин (он же kaa.python) написал хорошую и интересную заметку "Как выбрать язык программирования для нового проекта". Я подпишусь практически под всем, что там сказано (правда, я бы поставил Ruby в один ряд с Python-ом, но это, скорее, мои личные эстетические предпочтения).

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

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

Полагаю, многие молодые разработчики, среди которых особенно много падких на привлекательность экзотики, никогда не читали "Человеческий фактор" ДеМарко и Листера. А зря. Это, вероятно, самая лучшая книга, рассказывающая об основополагающих принципах разработки ПО. И в ней этот феномен успешности первого применения нового инструмента разбирается "по косточкам". Причины успеха при разработке нового проекта на новом языке программирования определяются вовсе не уникальными возможностями инструмента. Основная причина успеха в самой новизне: само по себе использование нового языка дает мощный толчок, мобилизует разработчиков, заставляет напрягаться и стремиться к успеху. Но, когда ощущение новизны уходит и использование нового языка переходит в рутину, все возвращается на свои места. Только, если экзотика не перейдет в мейнстрим, компания окажется в худшем положении. Ибо кадры решают все, а вот с кадрами...

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

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

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

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

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

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

Ну а в завершении потока мыслей, вызванных заметкой ув.kaa.python выскажу два моих личных наблюдения о Java и C++ (при этом прошу учитывать, что Java я не люблю еще со времен ее выхода в 1995-м году, хотя при необходимости могу что-нибудь на Java изобразить; а языком C++ я с удовольствием пользуюсь уже более 20 лет):

  • из-за ущербности в своих выразительных возможностях Java заставляет писать больше кода чем на других мейнстримовых языках программирования. Следствием чего, если ваш проект на Java "взлетит", станет постоянный рост кодовой базы и постоянная необходимость увеличения проектной команды. Так что, при всем том, что Java удешевляет получение работающего решения (по сравнении с тем же C++), расплачиваться за это придется большой проектной командой, участники которой будут вынуждены работать с простым (на грани примитивности), но объемным кодом;
  • С++, напротив, имеет возможности делать нетривиальные вещи более компактными и выразительными (если сравнивать с Java). Поэтому, небольшая и сильная команда C++ников способна вести сложный проект на C++, аналог которого на Java мог бы требовать раза в два больше разработчиков. Но тут нужно понимать, что под сложностью понимается именно алгоритмическая и логическая сложность (например, сложные преобразования данных, хитрые структуры данных, изощренные алгоритмы, жесткие требования к ресурсоемкости и т.д.). Если же под сложностью понимается необходимость задействования в проекте целой кучи трех-четырех-пяти буквенных аббревиатур (вроде XML, HTTP, REST, SOAP и т.д.), то ситуация может оказаться прямо противоположной и десять Java-разработчиков легко будут делать работу двадцати C++ников.

Ну и совсем уже напоследок выскажу мысль о том, что по моим наблюдениям "за эфиром" (форумы, статьи, блоги и др. источники) сейчас такие языки, как Haskell и Erlang вполне можно считать мейнстримовыми. И, при наличии достаточного количества разработчиков для формирования проектной команды, я бы всерьез рассматривал варианты применение Haskell-я и Erlang-а наряду с Python/Ruby/Java/C#/C++. Правда Haskell бы я не выбрал из-за того, что чистая функциональность, имхо, вступает в противоречие с объективной реальностью, которую нужно выражать в коде. Ну и из-за некоторой неадекватности его адептов :) А Erlang -- из-за динамической типизации :)

PS. Блог я веду уже давно, понаписал за это время многого. Что дает возможность делать ссылки на самого себя :)
Отлично сказано! Так почему же самые продвинутые языки не попадают в мейнстрим?
Каким же образом знание разных языков делает программиста лучше?
Споры о языках программирования – не могу смолчать

Комментариев нет: