На чём программируете? — На чём угодно
2014-02-06
Друг недавно спросил меня, как выучить JavaScript, и действительно ли практика является достаточным условием для того, чтобы изучить ЯП.
Ответ: да, нужно практиковаться. Питер Норвиг говорил, что для того, чтобы стать хорошим программистом, нужно десять лет. Особо талантливым, возможно, хватит и девяти с половиной лет.
Разделяй и властвуй
Прежде всего необходимо определить для себя разницу между изучением конкретного языка программирования и целью стать действительно хорошим программистом. Изучение информационных технологий и принципов разработки программного обеспечения имеет крайне мало общего с изучением синтаксиса и стандартных библиотек определённого языка. Язык программирования — это лишь инструмент, в отличие от настоящих языков, которые являются средством общения (чёрт бы побрал гипотезу Сепира-Уорфа). Ведь изучить способы эксплуатации рентгеновского аппарата ещё не значит стать специалистом-радиологом, а умение работать в Excel не сделает из вас статистика.
На тех собеседованиях, которые я проходил прежде, мне практически никогда не задавали вопросы о стандартных библиотеках и синтаксисе («Как вы закрываете сокеты в С?»). Никого это не волнует, ведь вы всегда можете найти ответ на этот вопрос в учебнике. Большинство вопросов касалось абстракций, совсем немного — алгоритмов («Как бы вы убрали связи между этим визуальным модулем и базой данных?»).
Хорошим программистам легко даётся изучение новых языков, поскольку им известны общие принципы их построения. Я бы выделил три школы языков программирования (эта типизация отличается от классической, но работает в реальном мире).
Первая — это популярные (я бы даже сказал, попсовые) языки вроде JavaScript, Go, Ruby, Python, Java, C#, C++ и C. Синтаксис таких языков уходит корнями в императивность ALGOLа 50-х годов: он тяжеловесен и вызывает желание выстрелить себе в ногу.
Вторая школа — это диалекты Лиспа вроде Scheme и Clojure. Основное отличие Lisp от чего бы то ни было — его гомоиконнность, то есть возможность программировать язык в самом языке. Такие языки мощнее и выразительней популярных языков, поэтому, скажем для Scheme-программиста освоить Python будет легче, чем питонисту — Scheme. Да чего там говорить, статическая линковка Go была реализована в Lisp и Smalltalk ещё тридцать лет назад.
Третья школа — это функциональные языки программирования (языки типа Haskell, OCaml и Erlang). Эти языки ухудшают дизайн программы, зато исполняются на большинстве машин. Категория функциональных языков зачастую кажется мощнее лиспоподобных, именно поэтому Haskell-программист с лёгкостью освоит Clojure.
Я стараюсь не разделять языки по их объекто-ориентированности, поскольку ООП — это всего лишь способ обобщения и абстракции связей между различными компонентами системы. ООП может использоваться в любом языке, но на языках вроде Java и Ruby это сделать проще (да, даже в олдскульном C объектно-ориентированное программирование вполне реализуемо). Советую не тратить время на узкоспециализированные языки вроде SQL, Matlab или R, поскольку они прививают дурные привычки. Оставьте их на потом. Нет ничего хуже, чем R- или Python-программист, который в своей жизни не написал ни строчки на Clojure или Haskell.
Если вы хотите вырасти как программист, вам нужно изучить историю и структуры различных школ программирования. Всё уже когда-то происходило, и обязательно повторится в будущем. И ещё: чем ближе тот язык, который вы изучаете, находится к третьей школе программирования, тем быстрее вы осознаете саму суть программирования.
Да, и последний вопрос: какими проектами вы занимаетесь, помимо основного? Если вы ответили «Я программирую только на работе» или «Я читаю код на GitHub» — вы никогда не станете хорошим программистом.
Перевод: Люся Ширшова. Спасибо статье на Medium.