Об изучении новых языков программирования.
На заре карьеры наткнулся на книгу The Pragmatic Programmer и бросил ее после совета изучать по одному ЯП каждый год.
Бросил, чтобы выполнить рекомендацию! 2018-тый год, 3 года опыта, Java и Kotlin за пазухой. Нужно было наверстывать упущенное.
К настоящему моменту успел поработать с разной степенью погруженности со следующими языками: Scheme, Clojure, Dart, Python, Fennel, TypeScript, Go.
Хочу поделиться наблюдениями и рекомендациями.
1. Параллельно с языком надо учиться чему-то еще
- Так для меня Scheme был языком введения в Computer Science (прочел и проработал SICP).
- Изучая Clojure, научился делать backend, frontend и full-stack (очень удобно шарить кодовую базу).
- Dart был введением в кросплатформенные фреймворки. Боль при выходе новых версий дарта позволила понять, за что так ценят обратную совместимость в Java.
- С Fennel научился конфигурировать локальный сетап (1300 коммитов в дотфайлах).
- Читая книжки по Go, реализовал на нём интерпретатор (книга), компилятор (книга 2), и оркестратор (книга).
2. Сам язык должен чему-то учить.
- Scheme показал, что если ЯП гомоиконичен, то на нём можно выразить всё, на что хватит воображения. Это намного сильнее, чем DSL в Kotlin. Что любопытно, грамматику самого Scheme можно описать на салфетке.
- Clojure закрепил многое, чему научил Scheme, а также познакомил с STM, персистентными структурами данных, ad hoc и subtype полиморфизмом в одном (multimethods), ленивостью. Научился писать на ЯП, который навязывает иммутабельность и ссылочную прозрачность.
- Главная находка в лиспах (Clojure, Scheme, Fennel) — REPL. REPL — это не консоль, как в Python или JS, а способ модифицировать запущенную программу прямо из редактора кода (даже если программа запущена на удаленном сервере). Обратная связь от разработки снижается до миллисекунд. Не знаю языков, кроме Лиспов, которые имеют настолько же мощный REPL.
• Отсутствие выбора в Go — это лучший выбор. Когда все проблемы решаются одним способом, то разработчики — вместо споров — решают задачи.
3. Крайности позволяют охватить весь спектр (штанга Насима Талеба).
Идея в том, что изучение максимально высокоуровневого языка (Lisp или Haskell) и низкоуровневого (вроде C или Zig) позволяет покрыть всё посередине.
Пример: пишешь на языке с нестрогой (слабой) статической типизацией (С) — выбирай язык со сторогой динамической типизацией (Lisp или Haskell). Плаваешь в терминах — читай Ликбез по типизации.
~8 лет назад я зашел со стороны высокоуровневых языков с динамической типизацией. После Scheme/Clojure по плану был C, но я сбился с пути. Сейчас взялся за Rust, чтобы навесить блинов на другой конец штанги. За новогодние праздники прорешал rustlings и пробежался по rust lang book. Pattern matching, обработка ошибок, стектрейсы и мощь компилятора впечатлили. Осталось только что-то на расте написать.
Резюме: изучайте языки, которые того стоят 🙂
Post #124
1.45K