// Вот Вступление серии, вместо содержания тыкать на тэг, что не должно быть сложным.


Сразу зайду с агрессии. В темах «надо знать больше» всегда всплывают люди, у которых невероятно мудрое мнение «всё знать невозможно[, потому ну нафиг знать ещё и вот это]». Если у вас есть (а он есть, даже если помалкивает) такой знакомый, ставьте на нём крест и его невероятно мудрое мнение не учитывайте, пусть сам в своей берлоге варится.

Вам же надо стремиться к следующей матрице языков в голове… Расклад даю для типового рыночного бойца, в специальных областях есть отклонения от.


Базовый язык. То, чем вы зарабатываете 70% времени. То, из-за чего вас обзывают плюсистом, питонистом, джавистом и т.д. Можно сказать, это язык программирования, который по аналогии с естественными языками в анкетах указывался бы как родной. Его следует знать идеально, он и будет кормить, пока вам не надоест быть коалой, грызущей листья только одного вида эвкалиптов (ладно, на самом деле «из 800 видов эвкалипта коалы питаются всего 120 видами», но удобнее фантазировать, что одним). БЯ у вас должен быть на пальцах, вы должны помнить синтаксис назубок, знать механику работы, все особенности, окружение и всё-всё-всё. Повторю: этот язык вас кормит.

Братский язык. Ну или сестринский, если очень хочется. Язык, с которым вы с большой вероятностью столкнётесь, или на который (с которого) вам с большой вероятностью надо будет переходить. Или поддерживать legacy. Или ещё чего. Известные пары для примера: Objective-C / Swift, Erlang / Elixir, C / C++, Java / Kotlin, в некоторой мере Python / Go.

Инструментальный язык. Язык, на котором вы сможете быстро писать себе полезные утилиты, быстро разруливать сопутствующие рабочие задачи. Я бы сказал, что в качестве такового удобен Python. Если надо анонимизировать базу данных с прода и передать в QA… или наваять скрипт раскатки сервера… или демона, раз в час сбрасывающего на почту статистику… В общем, писать такое на Java или C++ кажется несколько избыточным.

Языки чтения. Их вы должны знать на уровне уверенного чтения. Дело в том, что софт в мире написан не только на вашем базовом. При активном изучении / интеграции софта, фреймворков, библиотек, алгоритмов и т.д. вы столкнётесь с C, C++, Python, Java, Go (особенно те, кто по горло в инфраструктуре), JavaScript и т.д. И вовсе не с романтичными позывами что-то улучшить или исправить, но узнать, какого фига всё падает, если вообще запускается. А для этого надо залезть в чужие исходники и обнаружить там проблему (или не обнаружить, потому наконец-то посмотреть на свой код внимательнее).

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

  • Java научит вас вместо программирования коллекционировать классы и интерфейсы – ООП курильщика;
  • Swift объяснит, что обратная совместимость никому не нужна;
  • Go покажет, как заурядный язык с одной важной особенностью может выстрелить в сообщество;
  • JavaScript поможет понять, почему фронтендеры вот такие;
  • C++ – тысяча и один способ суицида.

Минута петросянства всё. Ясно, что в каждом есть интересное и кому-то нужное, иначе эти языки не были бы десятилетиями в продакшенах (кроме молодых, но). Из современных обязательных к ознакомлению считаю языки с функциональной парадигмой. Здорово помогает писать код на других языках чище.


Очевидно, уровни владения языками будут отличаться. Великолепно знать их все действительно не надо, у вас не наберётся столько воробьёв для стрельбы по ним из пушек. Примерное распределение вот такое:

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

Это не займёт у вас всю жизнь. Для многих языков хватает прочитать 100..300 страниц, чтобы добавить их в копилку кругозора или чтения. Для некоторых и вовсе меньше, почитайте [Bruce Tate. Seven Languages in Seven Weeks. Pragmatic Bookshelf, 2010] или [Bruce Tate. Seven More Languages in Seven Weeks. Pragmatic Bookshelf, 2014].

И даже если вы эдакий утилитарный прагматичный молоток вместо человека, не понимающий, зачем знать / уметь что-то, что не приносит денег прям вот сейчас, вам всё равно всё это надо. В этом году у меня был день, в котором:

  • писал приложение (Java);
  • читал исходный код Nginx (C);
  • читал код модуля для Nginx (Lua);
  • писал скрипт переработки данных (Python);
  • просматривал исходники фронтов (JavaScript).

Сегодня:

  • изучаю модуль (C);
  • переписываю его (C++);
  • прикручиваю к Node.js (JavaScript);
  • попутно примеряюсь прикручивать альтернативно (Erlang).

Придерживайся я стратегии «всё знать невозможно[, потому ну нафиг знать ещё и вот это]», ну, тоже был бы при работе, но выбора в жизни у меня точно было бы меньше.


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