Google Pixel против iPhone 7 или о том, как выбирают язык программирования в реальной жизни
Однажды, ещё до релиза Специализаций, мы с Лёней Сущевым в очередной раз обсуждали возможный состав этих самых специализаций на mkdev.me. Обсуждения эти были тяжёлыми, вгоняющими в тоску и вызывающими отторжение от всей индустрии. Заниматься таксономией знаний в IT - неблагодарное занятие. Конечный результат точно кому-то не понравится, а некоторых и вовсе взбесит.
Вот лишь некоторые вопросы, с которыми мы столкнулись:
- Стоит ли выделять разработку на Ruby on Rails в отдельную специализацию?
- Стоит ли выделять отдельные JavaScript фреймворки в отдельные специализации?
- Нужна ли отдельная специализация для Chef и Puppet?
И так далее и тому подобное. Результат всех этих обсуждений можно сейчас наблюдать на mkdev.me/specializations.
Интересным нюансом наших обсуждений было то, что Леонид очень слабо разбирается в программировании и смежных темах. Это нормально, ведь на mkdev учат в том числе и таких людей - пришедших к нам с нулевыми знаниями, не понимающими что им делать и что выбирать, но желающими разобраться и научиться. Поэтому приходилось дополнительно объяснять Лёне различные детали и глобальные аспекты волшебного мира разработки.
В какой-то момент разговор зашёл о Django и Ruby on Rails. Леонид пытался понять принципиальную разницу между этими двумя веб-фреймворками, разницу, позволяющую при определённых технических условиях сделать выбор в пользу одного или другого. Разговор принял неожиданный поворот:
— Чем Python принципиально отличается от Ruby?
— Всем. Совершенно другой язык программирования.
— Ну вот значит и возможности по созданию веб-приложений и Rails и Django разные.
— Нет, одинаковые.
— Тогда почему Яндекс написан на Python, а не на Ruby?
— Яндекс написан на паре десятков языков, включая Ruby и Python.
— А почему не всё на одном языке? Почему что-то написано на Ruby, а что-то на Python?
И правда, почему? Чтобы ответить Леониду на этот вопрос, я мог бы затянуть долгую песню о том, что Python идеально подходит для data science задач, а Ruby - лучший инструмент для небольших скриптов, именно поэтому необходимо использовать и то и то. Ещё я мог бы сказать, что иногда скорости этих языков программирования не хватает и поэтому условный Яндекс использует ещё и Go для критичных к производительности компонентов. Это был бы вполне себе адекватный ответ, который бы устроил дорогого со-основателя да и, наверное, более технически искушенного слушателя. В конце концов, это бы ответило на другой вопрос Лёни, подразумевающий то самое принципиальное различие в технологиях:
— Почему в этом доме одни стены деревянные, другие каменные, а третьи из стеклянных блоков? Почему не сделать все из дерева?
Действительно, человек несведущий в программировании или, например, юный Junior, только-только начинающий свой путь, будет считать, что выбор между двумя языками программирования или, например, двумя веб-фреймворками, обусловлен серьёзными технологическими аргументами. Может показаться, что это всегда выбор между молотком и отвёрткой в ситуации, когда тебе точно нужно вбить пару гвоздей. Конечно же тебе нужен молоток. Но и отвёртка тоже однажды пригодится! Именно поэтому в условном Яндексе используются и Ruby, и Python, и C++, и C и наверняка много чего ещё. Ведь так? Наверное, так. Но это не вся правда.
На самом деле, во многом выбор технологий похож на выбор между флагманским айФоном и Андроидом. По крайней мере, различные варианты почему выбран тот или иной телефон очень похожи.
А ментор по JavaScript, Иван Клешнин, имеет своё собственное мнение о том, как выбирать язык программирования Читать
Вася купил свой первый айФон в далёком 2010 году и с тех пор жизни не может представить себе без этих устройств. Ему удобно звонить, делать фотографии, переписываться, залипать в Интернете со своего айФона. И у него нет причин уходить с айФона, ведь дела у Apple идут вполне себе хорошо. Почти у всех друзей Васи тоже есть айФоны, кроме одного упёртого Вити. Витя купил свой первый телефон на Андроиде всё в том же далёком 2010 году. Ему удобно звонить, делать фотографии, переписываться, залипать в Интернете со своего Google Pixel. Витя постоянно пытается убедить своих друзей эпловодов уйти на Андроид, но у него не хватает аргументов. Ведь принципиальных отличий между его флагманским Pixel и iPhone 7 нет.
Витя не похож на своего соседа Аркадия, тоже пользующегося Андроидом. Аркадий постоянно называет владельцев айФоном глупыми людьми и с пеной у рта объясняет, почему Андроид лучше. На его аргументы сложно возразить, но этих аргументов будет достаточно лишь человеку схожего с Аркадием склада ума.
Однажды Вася (у него айФон, помните?) устраивается в некоторую компанию ВагнерКом. Там Васе выдали корпоративный телефон на Андроиде. Васе приходится пользоваться Андроидом для рабочих вопросов, а айФоном - для личных. Спустя какое-то время Вася привыкает к Андроиду. Теперь ему одинаково удобно пользоваться и Андроидом и айФоном. Он соглашается с Витей что в некоторых моментах Андроид лучше, но он так же знает, что в других моментах айФон по-прежнему приятней для Васи.
У Васи есть сын Володя, который очень любит читать сайты про гаджеты. На одном таком сайте он узнаёт про смартфон на совершенно новой экспериментальной операционной системе БольшеУх ОС. Володя перепрошивает свой айФон, ставит туда БольшеУх ОС. БольшеУх ОС хреново работает, там мало приложений, но зато это концептуально другая операционная система. Володя зависает на форуме на 100 человек, каждый из которых так же отважно использует БольшеУх ОС. Они верят, что однажды правильные концепции правильной ОС победят и БольшеУх встанет на один уровень с Андроидом и айФоном, а затем и вовсе победит их. И тогда все люди смогут звонить, делать фотографии, переписываться, залипать в интернете с телефоном на базе БольшеУх ОС.
Ну и, конечно, не будем забывать про коллегу Вити Илью. У Ильи большая необходимость иметь телефон с двумя сим-картами - это очень важно, потому что денег на два телефона нет, а сим-карты точно нужно две. У Ильи нет выбора, кроме как взять редкий телефон на Адроиде, который разрешает впихнуть две сим-карты. Для Ильи выбор этого конкретного Андроида неизбежен, ведь не бывает айФонов с двумя сим-картами.
Вот и получаем мы Васю, Витю, Аркадия, Илью и ещё сотни тысяч и миллионов людей, каждый из которых сделал выбор в пользу определённого телефона. Выбор мог быть навязан компанией (друзей или рабочей), мог быть навязан друзьями или маркетологами, мог быть сделан из желания быть не таким как все и так далее и тому подобное. Но в результате каждый из этих людей может звонить, делать фотографии, переписываться и залипать в интернете со своего телефона. И на самом деле никакой огромной разницы при помощи чего они это делают - нет.
Нет никакой особой разницы на чём писать веб-приложение: на Django или Rails или даже, простите, Node.js. Точно так же нет никакой разницы, чем правильно автоматизировать сервера - Chef и Puppet появились примерно одновременно, решают одинаковые проблемы одинаково успешно. Вы вполне переживёте наличие MySQL вместо PostgreSQL, если вдруг ваш новый работодатель использует именно MySQL. Когда вы будете переписывать медленные части приложения на что-то по-быстрее, чем Ruby, то вам одинаково хорошо подойдут и Go и Scala и Erlang.
Выбор технологий - это не вдумчивый инженерный процесс. Это не выбор лучшего инструмента для работы исходя из технических требований. Это не выбор между молотком и отвёрткой. Это выбор, основанный на технических характеристиках, исторических причинах, на состоянии рынка труда, на личных предпочтениях, компетентности, привычках и интересах команды разработчиков, на качестве маркетинговых материалов и подверженности маркетингу и хайпу людей в компании.
Facebook использует PHP, потому что много лет назад студент Цукерберг знал этот язык и ему было быстрее всего написать Facebook именно на PHP. А полностью переписывать смысла уже не было.
Ещё Facebook использует Chef, потому что много лет назад кто-то в компании больше слышал про Chef, а не про Puppet. Ещё Facebook использует Ruby, потому что Facebook использует Chef.
Наверняка где-то тихо шуршит Go, ведь скучающий SRE решил в свободное от основных задач время попробовать этот язык и переписал пару внутренних сервисов на него, а затем убедил ближайших коллег, что это хорошая идея. Почему он выбрал Go? Потому что о нём столько шума вокруг, столько новых инструментов на нём и потому что, наверное, надо скоро увольняться и Go будет удачной строчкой в резюме в городе этого SRE.
Конечно, есть очевидные неизбежные выборы определённых технологий. Точно так же как Илья вынужден использовать телефон с двумя сим-картами, мы вынуждены использовать Swift для разработки полноценных игрушек для iOS. В какой-то мере такие ограничения вдохновляют. Не нужно выбирать между двумя одинаковыми молотками, уже есть "золотой стэк" инструментов.
Но в большинстве случаев ничего вас не останавливает абсолютно всё написать на одном языке программирования. Мы пишем на Ruby, потому что нам приятно и весело на нём писать. А потом переписываем куски приложения на Go, потому что медленно и потому что Go классный. А потом ещё вставим Spark приложения на Scala. И попробуйте объяснить не-программисту, почему нельзя было взять сразу Scala и написать на нём абсолютно все приложение и все сервисы. Или почему нельзя было оставить только Ruby и просто бросить больше денег на сервера, чтобы работало быстрее.
— Это так тупо. Зачем тогда внутри одного приложения разные куски писать на разных языках?
Действительно, зачем?
Окончательно запутался и теперь не знаешь, что выбрать? Напиши нам, мы подскажем! Написать