Как я стал лучшим программистом

Translated into:ua

Это перевод статьи, оригинал которой здесь

Несколько человек на React Conf меня спросили о том, как стать лучшим программистом. Почему-то люди видят во мне продвинутого программиста, которого стоит послушать. И я подумал, что есть смысл описать мою "модель мышления", которой я придерживался годами, занимаясь программированием.

Немного обо мне: мне 32, и у меня 10 лет опыта работы. До недавнего времени я не всегда был уверен в том, что я делал. Даже сейчас я периодически сомневаюсь в чем-то. Дело в том, что это чувство неуверенности не пропадает со временем. Поэтому старайтесь игнорировать его, просто продолжайте кодить и набираться опыта.

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

Найдите людей, которые вдохновляют вас, но не делайте из них идолов

Было много людей, которых я уважал. Я многое изучил, просто доверяя их мнению и разбираясь с вещами, над которыми они работали. Как правило, такие люди очень продуктивные, выдающиеся и вдохновляющие. Найдите таких людей и позвольте им вдохновлять и учить вас.

Но убедитесь, что вы не сделаете из них кумиров. Человеку довольно легко показаться устрашающим из своего Твиттера, но, если вы посмотрите на него и на то, как он работает в реальной жизни, вы увидите, что он обычный человек. Он так же пишет код и экспериментирует, как и мы. Не доверяйте слепо людям. Если вы с чем-то не согласны, то обсудите это с человеком и вынесите что-то полезное из этого разговора. Некоторые мои самые полезные разговоры начинались таким образом.

В моем Emacs конфиге бардак. Я не знаю, почему у меня не работает автокомплит для OCaml. Я не автоматизирую работу и мне приходится рыться в истории консоли, чтобы найти нужную мне команду. Вначале я пишу ужасный код. Я храню данные в глобальных переменных до тех пор, пока я не пойму, что мне надо. Самые опытные программисты используют хаки постоянно. Главное, что вы заканчиваете работу.

Не преуменьшайте значимость своей работы

Новички в программировании склонны думать, что их работа не очень важна, потому что они новички. Я думаю, что некоторые отличные идеи исходят от новичков, которые видят возможности оптимизации для существующих технологий. А те, кто уже сформировал свое видение, просто не видят эти улучшения.

Ваша работа важна, несмотря ни на что. В худшем случае, если ваша идея не сработала, то комьюнити будет иметь представление, почему эта идея не сработала. (Замечание комьюнити: то, насколько мы станем доброжелательными к новичкам, зависит от нас.)

Не чувствуйте себя обязанными работать постоянно

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

Большая часть того, что выходит каждый день, является уже известными идеями, пересказанными другими словами. По-настоящему революционные идеи возникают раз в несколько лет. По этой теме есть хороший доклад под названием Hammock Driven Development

Игнорируйте бессмысленные вещи

Один из быстрых путей стать лучше - это игнорировать бессмысленные вещи, которые не сильно улучшат ваши навыки. Другими словами, “мудро используйте свое время”. Не так уж много времени в одном дне, и если вы будете тратить это время на более осмысленные вещи, то вы скоро увидите большую разницу.

Что такое “бессмысленные вещи”? Это зависит от вас, но я приведу примеры, по моему мнению, бессмысленных вещей. Это синтаксис языка, API библиотеки, конфигурация build tools. Например, изучение синтаксиса нового ES7 JS не улучшит вас как программиста настолько, насколько может улучшит изучение работы компилятора. Применять в работе библиотеку, которая решает такую же задачу, но с другим API, не очень-то интересно. Все это, конечно, важно, но я рекомендую проводить больше времени, изучая глубже основы, которые будут полезны на протяжении многих лет.

Вот вопрос, который я люблю задавать: проводите ли вы бОльшую часть своего времени, делая код красивей? Если да, то я рекомендую не фокусироваться на этом. Все равно ваш код изменится со временем. Лучше сфокусироваться на фундаментальных проблемах и хорошенько подумать над слоями и абстракциями вашего приложения. После того, как вы успешно справитесь с ними, вы можете потратить немного времени на вылизывание кода. (Это же и относится к принципу DRY (Don’t repeat yourself). Не беспокойтесь о нем сильно, можете спокойно дублировать).

Копайтесь в исследованиях прошлых лет

Если вы в восторге от какой-то идеи, то очень заманчиво сразу же сесть и работать над ней. Но не спешите с этим, а лучше сделайте беглый поиск по тому, как другие люди уже реализовали эту идею или решили какую-то проблему. Несколько дней, проведенных за исследованием какой-то проблемы, всегда меняют способ, которым я буду решать эту проблему.

Научиться читать научную документацию — это ценный навык. Есть много документов, которые используют код вместо математики, и их не так сложно читать. В такой документации за последние 30 лет скопилось огромное количество знаний. Если вы научитесь извлекать знания из этой документации, то вы станете лидером мнений.

Наглядный пример Prettier. Я знал, что я хочу сделать, но не знак, как. После небольшого поиска я нашел этот документ. Почитав его пару дней, я точно знал, как реализовать мою идею. Спустя неделю у меня уже было рабочее приложение с базовым набором функций. Если бы я не прочитал тот документ, я бы потратил намного больше времени на имплементацию.

Если вы ищите научную документацию, то вот этот репозиторий будет хорошим стартом - Papers We Love

Возьмитесь за большой проект. Выйдите из зоны комфорта

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

Я искренне ненавижу ситуацию, когда я не могу решить какую-то сложную проблему. Это неприятно. Я знаю, что мне придется много искать и изучать прежде, чем я смогу подобраться к решению. Но всегда в результате я становлюсь лучше как программист.

Начните с изучения нового языка. Это самый эффективный способ вывести вас из привычного вам состояния и увидеть вещи в новом свете. Самым лучшим, что я сделал как молодой программист, было изучение Scheme. Это довольно простой язык, заставляет вас писать все в функциональном стиле и помогает понять, как работает код. Те несколько лет, которые я провел, изучая Scheme, до сих пор приносят пользу. Мой взгляд на код кардинально изменился. (Я даже назвал свою компанию Shift Reset LLC в честь shift/reset команд из Scheme)

Вот еще несколько вещей, которые я бы порекомендовал сделать. Это то, что имело большое влияние на мою карьеру программиста. Большинство из этого до сих пор приносит пользу и помогает мне разобрать и понять какую-то идею. Вам не обязательно делать все это, чтоб стать хорошим программистом. Есть много других вещей, которые помогут улучшить себя, но приведенные ниже идеи - это то, что помогло мне.

Выучите С - только основы. Мне кажется, довольно ценно понимать, почему все жалуются на него.

Напишите компилятор - наверное, самый лучший способ чему-то научиться и выйти из зоны комфорта. Посмотрите на the super tiny compiler.

Выучите макросы - посмотрите на Scheme, Lisp или Clojure(Script). Макросы действительно повлияют на то, как вы видите код.

SICP - SICP это старая книга, которая, по-моему, до сих пор актуальна (некоторые люди с этим не согласны). Она не требует много знаний в области программирования, и она описывает процесс построения компилятора от простого к сложному. И еще одна книга, которая мне очень нравится, рассказывает подробно о компиляторах - Lisp In Small Pieces

Разберитесь в continuations - Continuations это механизм управления выполнением кода на низком уровне. Scheme - это единственный язык, в котором реализован этот механизм. И хотя вы не будете использовать их в продакшене, они помогут вам изменить понимание того, как работает управление потоками. Я написал пост, где попытался объяснить их.

По возможности, посмотрите на новый язык программирования - Вам стоит изучать другие языки программирования, независимо от того, что вы делаете. Я бы порекомендовал вам любой из этих: Clojure, Rust, Elm, OCaml/Reason, Go или Scheme. Каждый их них имеет уникальные особенности, которые помогут вам узнать другой способ мышления.