Какой язык программирования учить в 2018 году и почему именно его?
Если Вы настойчиво хотите попасть в команду разработчиков компилятора или в «мир Дикого Запада» — то смело выбирайте и учите топовый язык программирования из TIOBE и лучше всего: на уровне его спецификации. А если серьезно, то сейчас в отрасли все так запутанно с логикой и выводами, столько маркетинга и воды, что самая выигрышная стратегия — включить свои собственные мозги и сделать экспресс-переоценку технических ценностей, к которым мы так привыкли. В посте я постараюсь максимально ясно сориентировать начинающих свою карьеру разработчиков по рискам выбора технологий и сделать им правильные и далеко (далеко-далеко) идущие выводы.
Вы уже повзрослели или пока еще нет?
Дети отличаются от взрослых пониманием слова «ответственность». К сожалению, далеко не все дети — взрослеют вовремя, а некоторые — так и умирают в памперсе. Ничего страшного тут нет — кроме одного: дети в команде программистов заставляют других очень сильно страдать, особенно когда сроки горят и релиз близко: либо внезапно обделываются посреди опенспейса, либо требуют соску во время мозгового штурма предметной области с представителями клиента.
Взрослые отличаются от детей пониманием ключевого принципа IT-менеджмента: «программирование — это привилегия». Среди опытных и успешных коллег-разработчиков наиболее адекватные и кодят хорошо и «двигают компанию вперед» одновременно.
IT-индустрия — сошла с ума
Да, мы — люди и склонны к эмоциям. Но до сих пор никто не знает, как правильно нужно программировать, хотя прошло уже больше 50 лет с момента изобретения компьютера. Никто! Все только истерят и пытаются привлечь в свой лагерь все больше сторонников, одновременно соблазняя бизнес создать на «себе» проект :-) Поясню на примере.
Скорость «головного мозга»
Дело в том, что первые компьютеры работали действительно медленно, очень медленно, и были очень дорогими. Поэтому первые программы писали на очень низкоуровневых языках, а иногда прямо на машинном коде. Сейчас подобные «доисторические» технологии иногда применяются, но точечно: для создания операционных систем и их компонентов (близких к «железу»), для игровых движков, для высокопроизводительных библиотек и серверов, для криптовалют и, конечно, для создания языков программирования.
И если C, несмотря на его тотальную дырявость и высокую опасность для разработчика, получился действительно хорошим и завоевал сердца ценителей, то C++ получился на редкость уродливым и противоречивым созданием —, но что делать, это жизнь. Может Rust, с правильными идеями относительно безопасной работы с памятью, повлияет на ситуацию в лучшую сторону, но по уродству синтаксиса и нечитаемости он, похоже, оставил C++ далеко позади.
Ситуацию еще больше усугубляет появление Golang. С одной стороны — ничего нового в нем нет, дембельский аккорд великого Кена Томпсона: лишь жалкие остатки от возможностей Java. С другой — стало действительно проще писать «относительно» системный и многопоточный софт и это факт, который оценили многие компании :-)
В этом лагере Вы встретите преимущественно глубоко знающих низкоуровневые технологии и железо «настоящих» хардкорных бородатых программистов, которые учили, как правило, один язык программирования — зато всю жизнь и засыпают со спецификацией компилятора вместо жены. Воистину — в этом лагере крутые люди. И если Вы не знаете, на какие команды x86 процессора раскладывается yield в python — стыд Вам и позор. Поэтому совет — избегайте этого лагеря, пока не дочитаете до конца поста.
Но есть и обратная сторона медали. Проекты тут делаются не то что долго, а… десятилетиями. Низкоуровневые языки программирования не то, что помогают, а наоборот — мешают. Постоянно происходят нарушения в работе с памятью, требуются десятки и сотни тестировщиков (либо можно выложить на github и тестировать будем мы с вами коллективно) и тысячи unit и других видов тестов, чтобы «оно взлетело». Многие разработчики, которые влились в команду на старте проектов, не доживают до релиза и умирают от старости, помогая до последнего вздоха бета-тестерам. Но эти мужественные люди, до кровоточения из глаз, до появления стигматов делают все возможное и… рождаются шедевры.
Архитектура и энтерпрайз «головного мозга»
Т.к. никто до сих пор не знает, как нужно правильно программировать, методом естественного отбора образовался лагерь «грамотного проектирования и надежности». Вы с ума сошли программировать на языках, допускающих небезопасные операции с памятью через указатели — так же можно мир довести до апокалипсиса: «segmentation fault в софте ядерного реактора». Как можно начинать вообще делать проект без поддержки строгой типизации в языке? И придумали очередные правильные языки программирования: Java и C#. Но в Java забыли о вреде null-значений, а в C# — не до конца продумали обратную совместимость. В результате образовался огромный корпоративный, относительно безопасный и относительно обратно совместимый мир. В этом мире цель измеряется строками кода в день (обычно не больше нескольких десятков, ибо пальцы растираются в кровь) и толстыми философско-религиозными книжками про шаблоны проектирования и, о да, чуть не забыл, про способ зарыть себя, проект, клиента и окружающий мир в код и утонуть в нем, вспоминая в агонии 20 уровневую иерархию наследования — про ООП. Один из основных девизов лагеря — «зачем делать просто, если можно… сложно и надежно, надолго, на века!». Причем некоторая часть умеет писать таки быстро и элегантно, стирая руки в кровь и собирая в голове каждое утро структуру проекта, смотря одновременно на 3 монитора. Но некоторые так увлекаются, что продолжают создавать иерархии иерархий внутри иерархий иерархий до бесконечности — и цель уже давно потеряна, а глаза продолжают гореть и руки чесаться.
На самом деле, в областях, где предметная область хорошо устаканилась и укладывается в «объекты со статусом и сообщения между ними» — подобный подход работает очень хорошо.
Особенно радует при «строгой» (кавычки, потому-что дальше будет про haskell) статической типизации (это когда заранее известны типы сущностей, они проверяются компилятором и к числу нельзя прибавить строку) легкость и удовольствие при проведении рефакторинга и улучшения кода и высокое, если не сказать великолепное, качество сред разработки. Коллеги в этом лагере часто очень образованы в архитектуре софта, много читают (порог входа — высок), разбираются в возможностях многочисленных библиотек платформ, шаблонах проектирования, техниках написания тонн документации и создания автоматизированных тестов, тестах этих тестов и могут месяцами писать mock, который окажется ненужен. Опять таки — часто проекты делаются и запускаются весьма долго, большими командами, требуются многочисленные тестировщики, но характер ошибок на порядок менее фатален, что вдохновляет. Попасть в эту «касту» энтерпрайз-разработки — очень непросто. Если вы продемонстрируете, как на PHP можно решить задачу в 5 строк, которую коллеги на java решат за 5 дней — вас заживо сожгут в микроволновке:-)
Надежность «головного мозга»
В академической среде образовался еще один, очень интересный и рекомендуемый к пониманию лагерь и набор функциональных языков программирования (Lisp, Haskell, Erlang и другие). Вы что, с ума сошли программировать с использованием переменных и циклов — так же можно натворить много ошибок! Программа это — набор вызовов функций, а вместо циклов — используйте рекурсию, господа! ООП? Нет, не слышали — typeclasses и алгебраические типы данных. Не знаете об аппликативных функторах и не листали теорию категорий — да вы не развиваете собственный мозг, батенька.
На самом деле, по моему мнению, чтобы войти в этот лагерь и понять его ценности, нужно ооочень сильно напрячь мозги — ибо математики будет море и еще больше неожиданных, но прекрасных концепций. Опыт, приобретенный в этой команде — окажется бесценным и пригодится при работе с другими языками программирования. Говорят, что кто-то иногда использует функциональные языки в реальных проектах: компиляторах, криптовалютах — несомненно, в ваших проектах будет на порядки меньше логических ошибок, которые отловит компилятор, да и краткость и ясность и лаконичность кода в Haskell, конечно, поражает —, но в эпоху «на лабутенах!» изучающих и понимающих эту красоту становится все меньше и меньше.
Результат и эффективность «головного мозга»
К черту архитектуру и ООП, брат! Ктулху любит тебя, а утиная типизация — ключ к успеху! Строгая типизация? А кто в здравом уме будет присваивать к числу строку? Статическая типизация и компиляция — трата времени, ибо код пишется один раз и если его не успеть написать к релизу, его выбросят (да и так выбросят, но чуть позже). Рефакторинг? Сразу пиши правильно :-) Инкапсуляция? Поставил черточку перед именем переменной и все дела. ООП — переусложнение без нужды. Какая к черту компиляция — F5 и видишь результат. Шаблоны проектирования — нет, не слышали: скриптинг наше все… Хочешь «травки»?
Самое интересное, что когда вникаешь в языки с динамической типизацией (строгой в python, нестрогой в php и javascript) то постепенно открываются глаза на реальную картину вещей, ибо:
- код становится очень ясным и кратким и не нужно лазать по 20 классам (если дело не касается системных библиотек)
- можно быстро проверить идею через REPL
- языки просты, часто минималистичны, содержат необходимые и мощные примитивы (списки, словари), которые, что самое главное — помещаются в голове!
- имеется туча библиотек и всегда можно в 5 строк решить любую задачу
И черт с ним, с рефакторингом :-) Жить-то веселее стало (я надеюсь разработчик, поддерживающий мой код, не узнает, где я живу). В этом лагере вы часто встретите множество жизнерадостных людей совершенно разных специальностей, кроме «программирования на ассемблере», умеющих, тем не менее, очень быстро и эффективно, в 5 строк решать задачи и долго и успешно поддерживать код и веб-проекты.
Посмотрите на последние тенденции в этом лагере и проникнитесь этой философией счастья. Простая и понятная среда программирования в браузере, ну что может быть сексуальнее?
А как просто можно сейчас поднять неблокирующий веб-сервер, обслуживающий тысячи соединений в 10 строк на node.js и комьюнити растет как на дрожжах?
И никаких «Eclipse XML Soap Entiny beans энтерпрайз ООП…» — json и csv и улыбка (и запах неизвестного растения). И код при этом читается, и помещается в мозг и поэтому долго и счастливо работает и поддерживается с той же легкостью долгие годы.
И оказывается, что «так» тоже можно успешно программировать и потраченные в «промышленных языках программирования» годы — прожиты зря (зато пальцы стали крепче).
Выбор технологии
Вы в шоке? Я тоже. А представьте в каком изумлении пребывают клиенты, выбирающие технологию для реализации бизнес-проекта! :-)
Я думаю Вы в данный момент хорошо поняли, что IT-мир действительно сошел с ума и потерялся (шутка). Некоторые языки программирования, типа Scala, пытаются усидеть на всех стульях, но это у них пока не очень получается — код становится сложно понимать простым смертным. А если серьезно, то конкуренция парадигм программирования будет только усиливаться ибо… задачи в проектах существуют совершенно разные и именно от задач и нужно «плясать»! В устаканенной предметной области (серверы, библиотеки) лучше подойдет номинальная типизация (С++, Java, C#…), где-то лучше будет со структурной типизацией (Golang, Haskell…), а в скриптинге веба или задачах машинного обучения придет настоящее счастье с утиной (python, php, javascript…). Не нужно думать, что статическая типизация, особенно строгая, это прямо «must have» — вы провалите сроки и код с удовлетворенной параноидальной мыслью о «возможных ошибках» будет выброшен на помойку. В вебе, скриптинге и машинном обучении можно уверенно двигаться с большой скоростью вперед и с динамической утиной типизацией и php и python с огромным количеством прекрасных и мощных библиотек этому хороший пример.
Поэтому забудьте про «какой выучить язык программирования в 2018 году» к чертовой матери:
- разберитесь в парадигмах программирования (ООП может быть могилой, а может спасти Вам проект)
- поймите тонкости типизации и связанные с этим риски и возможности (Вы можете проклянуть динамическую типизацию в финансовой библиотеки, а можете принести в жертву Ктулху java-программиста и переписать его 100 классов на 100 строках в понятном даже детям скриптике)
- на уровне интуиции разберитесь в алгоритмах (нужно отличать поиск от сортировки, а нейронную сеть от логистической регрессии —, а чтобы понять дальше, придется учиться… всю жизнь, но оно стоит того)
- поймите, что опытные разработчики (правда никто не знает, где их найти на рынке) реализуют проект в срок практически на любой технологии (даже на brainfuck) и сделают это хорошо, а вот неопытным придется подбирать язык программирования с самым комфортным уровнем вхождения и риски коллапса все равно велики
Дальше, выберите область задач, которыми вам будет интересно заниматься, например веб или машинное обучение и:
- посмотрите, на чем люди решают эти задачи
- раскидайте по критериям выше риски и возможности каждого инструмента
- посидите пару выходных с 1–3 конкретных инструментов, но не в коем случае не до фанатизма или спецификаций
- быстрее беритесь за дело и накапливайте опыт применения инструментов на практике — это самое главное
- не нужно учить язык программирования «до конца» — лучше выучите способ решения Вашей задачи в 5 самых популярных инструментах в 10–15 строк и вы поступите на самом деле в высшей степени адекватно!
Конкретный пример — ML
Допустим, Вам интересно машинное обучение… Поздравляю! С одной стороны находится академическая теория —, но из нее Вы должны вытащить суть по матстатистике и линейной алгебре и ни в коем случае не зависать на многомесячных курсах (сойдете, поверьте мне, с ума, если вы не математик, а гуманитарий — причем незаметно для себя). С другой стороны нужно научиться быстро писать полезный код и решать задачку в 5–15 строк. Да, можно все написать на C лет через 10 000, поэтому Вы смотрите на опыт коллег и выбираете, правильно, python, в котором на данную тему море библиотек и готовых решений. Вы посвящаете изучению python пару выходных — больше там нечего учить, язык очень прост (а в дебри мы договорились не лезть, ибо время-деньги). Дополнительно еще почитайте про суть numpy, pandas, scikit-learn и, если прямо глаза горят, то Keras и вперед, делать проекты. Но можно пойти по другому пути, долгому, трудному и ведущему к личной святости и социальной бедности (поймете через 3 года суть алгоритма, продавая газеты в электричке, но может это такой, особый путь) — начать реализовывать алгоритмы самостоятельно, с ручным управлением памятью, или внедрить более тяжеловесное решение и зарыться в коде на месяцы. Неправильно выбранный инструмент — ключ к бессонным ночам и бесцельно потраченному времени — избегайте сложности всеми способами.
Неправильно выбранный инструмент, даже самый распиаренный, даже бесплатно в подарок, пускай даже теоретически все умеющий в перспективе — может угробить вам проект, провалив все сроки. Минимизируйте этот риск как только можете и не можете.
Выводы
Итого, друзья, мы убедились с вами, что никто не знает, как программировать правильно и успешно, даже мы, разработчики :-) Конкуренция парадигм программирования и технологий все сильнее возрастает, голова пухнет, а свободного времени становится все меньше. Поэтому наиболее выигрышной стратегией начинающего свою карьеру разработчика является — выпить баночку прохладного пива, расслабиться и:
- избежать залипания и погружения в излишние технологические детали, число которых экспоненциально растет
- выбрать интересную область задач, в которой вам интересно решать задачи клиентов
- научиться извлекать из инструментов и языков программирования короткую и эротичную суть
- писать как можно меньше, но ясного и понятного вам и окружающим людям кода
- научиться решать задачи в 5–15 строк, а не 20–50 классов
- если и хочется куда нибудь углубиться, то пусть это будут фундаментальные вещи типа математики, haskell или rfc по tcp/ip
- получать от программирования удовольствие и согревать им ваших коллег!
И всегда помните, что время, особенно свободное — ценный ресурс и от нас самих зависит, куда его инвестировать. Удачи всем и хорошего настроения!