автор: Евгений Золотов
Программирование, как и любой вид человеческой деятельности, заплыло жиром правил, легенд и мифов. Что-то не требует доказательств и принимается сразу («Хороший программист — в равной степени трудяга, инженер и художник»), другое вдалбливают в головы, но его неочевидность всё-таки мешает поверить до конца («Хороший программер обязан быть и хорошим математиком»). Но лучше всего — чистые заблуждения, в которые тем не менее верят подавляющее большинство написателей кода. О самом ярком из них сегодня и пойдёт речь. Выбор языка программирования влияет на качество программы. Ведь вы согласны? 😉
Возьмите десяток программистов — и восемь из них ответят на этот вопрос утвердительно: все верят, что качество программы напрямую связано с языком, на котором она написана. Классики вроде Кнута об этом, правда, почти не писали, но многолетний коллективный опыт как будто бы позволяет такое утверждать.
Си? Плох своей неприкрытой, некомпенсированной низкоуровневостью, из-за чего легко проморгать опасные места. Ассемблер? Не годится ни на что кроме системного программинга, а ещё чрезвычайно сложен для чтения, отчего писать на нём большие долговечные проекты как будто бы невозможно. BASIC развращает сознание юных программистов наличием безусловного перехода, что опять-таки отражается на качестве (а чуть раньше то же самое говорили про Фортран). Javascript узок, Pascal стар и громоздок, Java медлительна и т.д. и т.п.
Впрочем сформулированы и, так сказать, общие закономерности — рисующие «качественную» кривую для целых классов языков. К примеру, есть «правило» относительно сильной и слабой типизации: считается, что языки программирования (ЯП), не требующие строго соответствия типов передаваемых из функций в функцию данных, более склонны к непредсказуемому поведению, то есть, дают код более низкого качества. Так же и динамическая типизация, якобы, проигрывает статической: если ЯП позволяет определять тип переменной в момент присвоения значения, а не во время её объявления, программа так же может прерваться внезапно или выдать непредсказуемый результат. А ещё скриптовые языки хуже процедурных, а ещё разные ЯП по-разному управляют памятью и оттого тоже разнятся качеством кода, и так далее и так далее.
Переубедить человека, принявшего постулат предопределённости качества, трудно, если возможно вообще: ведь мысль кажется такой логичной, такой естественной! Но если не ради других, то для самих себя именно это попытались сделать несколько исследователей из США (есть среди них и русское имя). Они не стали апеллировать к логике, очевидно, зная по собственному опыту, что логика тут бесполезна: сами айтишники. Вместо этого они обратились к статистике. Пошли на GitHub (крупнейшее программистское сообщество в Сети, своего рода площадка для хранения и работы с исходниками для более чем трёх миллионов человек) и отобрали семь с лишним сотен самых активных проектов (включая и такие крупные как Linux, Bitcoin, и т.п.). В общей сложности в поле их зрения попали 80 миллионов строк, написанных на 17 языках программирования тридцатью тысячами авторов. Качество каждой программы оценивалось по количеству баг-фиксов для неё.
Результаты исследования: некоторые языки более подвержены определённым ошибкам (тёмные сегменты), но в целом разница слишком мала, чтобы принимать её в расчёт.
И, опуская оговорки относительно математической ценности результатов (обычные для научных трудов), выводы получились неожиданными. Прежде всего, подозрение, что выбор языка сказывается на качестве программы, действительно подтвердилось. Программы на ЯП с сильной типизацией оказались умеренно лучше программ на ЯП с типизацией слабой. Равно и статическая типизация показала себя умеренно лучше динамической. Потом, функциональные языки статистически дают чуть более качественный код, нежели процедурные. Но! Здесь же вскрылось, что выявленная зависимость качества кода от ЯП теряется на фоне других факторов — намного, намного сильней влияющих
на результат. Иначе говоря, принимать её во внимание нет смысла!
Из проделанной работы следует, что намного сильней на качество программы влияют её размер, количество разработчиков, размер «заплаток» — иначе говоря, факторы, не имеющие прямого отношения к языку. Кроме того, даже выявленная слабая зависимость качества от ЯП, вероятно, может быть объяснена индивидуальными особенностями задействованных в проекте людей: попросту говоря, если конкретный программист предрасположен к языкам программирования определённого типа, на других он пишет хуже.
Выводы наделали много шуму на англоязычных технофорумах, вызвав массу скептических откликов. Так, совсем не факт, что большое количество выявленных ошибок эквивалентно низкому качеству кода. Или — что по сотне свободных программ можно судить об общем качестве приложений, написанных на конкретном языке. И тем не менее, учитывая масштабы исследования, его стоит принять как аргумент в затянувшемся споре относительно связи качества кода и ЯП — и оттолкнуться, чтобы двигаться дальше.
Индекс популярности языков программирования TIOBE (www.tiobe.com).
Одно из важных следствий: выбирать язык для будущих задач теперь можно и стоит смелее! Зная, что статистически качество кода зависит более от индивидуальных предпочтений и способностей человека, можно и нужно выбирать новый язык ориентируясь больше на личный вкус, нежели на социальные стереотипы.
Фортран, Кобол? Что ж, и на них ещё пишут! Но, например, сейчас индустрия программирования переживает волну спроса на статистические ЯП, сформированную необходимостью обработки больших объёмов данных. Классический образчик такого языка — свободный GNU R, и именно он — вопреки обвинениям в неуклюжести, ограниченности, неоригинальности — набирает пользовательскую массу быстрее остальных. Равно и Javascript — до сих пор остающийся номером первым на GitHub — не думает сдавать позиции, за чем тоже просматривается объективное требования времени.
Другой полезный вывод: не все языки одинаковы в смысле лёгкости изучения. То, что ЯП оказались взаимозаменяемы в смысле качества кода, не отменило правила, что какие-то освоить легче, чем другие. Так что — особенно для новичков — есть смысл начинать с языков простых. Лидером тут Python, но с другой стороны, грех не учесть и фактор новизны: HTML5 только что официально рекомендован к применению консорциумом W3C, рождённый в Google Dart вошёл в двадцатку самых востребованных ЯП, сформировал аудиторию гугловский же Go, просматривается перспектива у Apple Swift.
Короче говоря, смотрите шире, выбирайте смелей. Качество не пострадает!