Если Вы настойчиво хотите попасть в команду разработчиков компилятора или в «мир Дикого Запада» — то смело выбирайте и учите топовый язык программирования из TIOBE и лучше всего: на уровне его спецификации. А если серьезно, то сейчас в отрасли все так запутанно с логикой и выводами, столько маркетинга и воды, что самая выигрышная стратегия — включить свои собственные мозги и сделать экспресс-переоценку технических ценностей, к которым мы так привыкли. В посте я постараюсь максимально ясно сориентировать начинающих свою карьеру разработчиков по рискам выбора технологий и сделать правильные и далеко (далеко-далеко) идущие выводы.
Дети отличаются от взрослых пониманием слова «ответственность». К сожалению, далеко не все дети — взрослеют вовремя, а некоторые — так и умирают в памперсе. Ничего страшного тут нет — кроме одного: дети в команде программистов заставляют других очень сильно страдать, особенно когда сроки горят и релиз близко: либо внезапно обделываются посреди опенспейса, либо требуют соску во время мозгового штурма предметной области с представителями клиента.
Взрослые отличаются от детей пониманием ключевого принципа 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) то постепенно открываются глаза на реальную картину вещей, ибо:
И черт с ним, с рефакторингом :-) Жить-то веселее стало (я надеюсь разработчик, поддерживающий мой код, не узнает, где я живу). В этом лагере вы часто встретите множество жизнерадостных людей совершенно разных специальностей, кроме «программирования на ассемблере», умеющих, тем не менее, очень быстро и эффективно, в 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 году» к чертовой матери:
Дальше, выберите область задач, которыми вам будет интересно заниматься, например веб или машинное обучение и:
Допустим, Вам интересно машинное обучение… Поздравляю! С одной стороны находится академическая теория — но из нее Вы должны вытащить суть по матстатистике и линейной алгебре и ни в коем случае не зависать на многомесячных курсах (сойдете, поверьте мне, с ума, если вы не математик, а гуманитарий — причем незаметно для себя). С другой стороны нужно научиться быстро писать полезный код и решать задачку в 5-15 строк. Да, можно все написать на C лет через 10 000, поэтому Вы смотрите на опыт коллег и выбираете, правильно, python, в котором на данную тему море библиотек и готовых решений. Вы посвящаете изучению python пару выходных — больше там нечего учить, язык очень прост (а в дебри мы договорились не лезть, ибо время-деньги).
Дополнительно еще почитайте про суть numpy, pandas, scikit-learn и, если прямо глаза горят, то Keras и вперед, делать проекты. Но можно пойти по другому пути, долгому, трудному и ведущему к личной святости и социальной бедности (поймете через 3 года суть алгоритма, продавая газеты в электричке, но может это такой, особый путь) — начать реализовывать алгоритмы самостоятельно, с ручным управлением памятью, или внедрить более тяжеловесное решение и зарыться в коде на месяцы. Неправильно выбранный инструмент — ключ к бессонным ночам и бесцельно потраченному времени — избегайте сложности всеми способами.
Неправильно выбранный инструмент, даже самый распиаренный, даже бесплатно в подарок, пускай даже теоретически все умеющий в перспективе — может угробить вам проект, провалив все сроки. Минимизируйте этот риск как только можете и не можете.
Итого, друзья, мы убедились с вами, что никто не знает, как программировать правильно и успешно, даже мы, разработчики :-) Конкуренция парадигм программирования и технологий все сильнее возрастает, голова пухнет, а свободного времени становится все меньше. Поэтому наиболее выигрышной стратегией начинающего свою карьеру разработчика является — выпить баночку прохладного пива, расслабиться и:
И всегда помните, что время, особенно свободное — ценный ресурс и от нас самих зависит, куда его инвестировать. Удачи всем и хорошего настроения!
Вы уже повзрослели или пока еще нет?
Дети отличаются от взрослых пониманием слова «ответственность». К сожалению, далеко не все дети — взрослеют вовремя, а некоторые — так и умирают в памперсе. Ничего страшного тут нет — кроме одного: дети в команде программистов заставляют других очень сильно страдать, особенно когда сроки горят и релиз близко: либо внезапно обделываются посреди опенспейса, либо требуют соску во время мозгового штурма предметной области с представителями клиента.
Взрослые отличаются от детей пониманием ключевого принципа 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
- получать от программирования удовольствие и согревать им ваших коллег!
И всегда помните, что время, особенно свободное — ценный ресурс и от нас самих зависит, куда его инвестировать. Удачи всем и хорошего настроения!