Совет инженера с многолетним опытом за плечами

Я проработал много лет в этой индустрии, и мне нравится думать, что этот опыт чего-то стоит. И я считаю, что это чего-то стоит, если его можно применить к современным проблемам. Тридцать лет назад, если бы существовал Medium, я мог бы написать популярное руководство по созданию связного списка на C. Если бы я написал что-то подобное сегодня, у меня были бы пустые глазницы для зрителей. Мир изменился, и мне пришлось измениться вместе с ним. Поэтому мне нужно вкратце изложить суть того, что остается постоянным - вещей, которые никогда не меняются.

Обычно мне нравится писать статьи с практическими рекомендациями, которые решают конкретную проблему с работающим кодом для ее резервного копирования. Я также вижу здесь много мнений, часто мало что оправдывающих, кроме мнения автора. Меня действительно не волнует, какой язык программирования или редактор / IDE лучше. Если я собираюсь писать мнение, то не для того, чтобы ранжировать предпочтения. Речь идет о тех крошечных зернышках истины, которые можно раскрыть в любых обстоятельствах. Речь идет об универсальной философии программирования, которая всегда поможет вам от начала до конца с минимальными усилиями.

Некоторые проблемы невозможно решить

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

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

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

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

Не просто учись как - узнай почему

Любой может изучить новую методологию, но, не понимая ее цели, часто ею злоупотребляют.

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

Программы по-прежнему работают одинаково, шаги выполняются последовательно один за другим. Но методологии позволяют нам описывать и организовывать эту последовательность и позволяют писать для нас все больше и больше кода. Объектно-ориентированное программирование позволяет нам думать о поведении и состоянии и способствует инкапсуляции состояния (я больше не верю в полиморфизм - он создает больше сложности, чем уменьшает). Функциональное программирование позволяет нам определять цепочки функций, которые точно передают состояние, которое эволюционирует. В обоих случаях государство - это демон, которого мы пытаемся заставить вести себя хорошо.

Это касается не только методологий, но и шаблонов. Я знал многих программистов, которые не утруждали себя изучением большего, чем несколько шаблонов, а затем применяли их повсеместно. Часто с плачевными результатами. Знайте свои выкройки и как их применять. Определите паттерны, которые вы видите, которые не входят в канон, и подумайте, как вы можете повторно использовать их в будущем. И, конечно же, знать ужасные антипаттерны и запахи кода.

Учить новые языки

Меня не волнует, сколько у вас опыта в Java. Если вы не знаете хотя бы трех или четырех других языков, подозреваю ваше любопытство.

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

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

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

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

Знай, что происходит вокруг тебя

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

Одно из моих любимых выражений - «писать программы несложно; создавать продукты сложно ». Изучите сложную часть, и вы будете незаменимы. Когда производительность приложения замедляется и вы замечаете, что в производственной базе данных неправильно выровнен побитовый кеш, вы станете героем дня.

И не просто изучайте всесторонне - узнавайте всю широту знаний. Если ваша компания использует MySQL, изучите его хорошо, но также узнайте о MariaDB и Cassandra. Изучите различные очереди сообщений и обратные прокси. Если вы работаете над серверной частью, узнайте о передней части - и наоборот. Узнайте о контейнерах и их оркестровке.

Программист - это не только программирование. Если вы хотите попасть в топ-10%, вы должны знать, как работают все части и как все они играют вместе.

Самое главное, что речь идет не о написании максимального количества кода, а о написании минимального количества кода при сохранении работающей программы. Для меня величайшим достижением в этой сфере деятельности является то, что хранитель склепа, работающий над вашим старым кодом, хотел бы пригласить вас выпить.