[Перевод] Я программист, и я тупой

fb506f98ea39be2df3d827e9e9be44bd

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

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

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

Внешние зависимости я ввожу по минимуму (в идеале вообще обхожусь без них). Проектирую модули с понятными API (и не употребляю слово «понятный» в том значении, которое ему придает Роберт Мартин), но почти никогда не перевожу их в микросервисы. Пользуюсь JSON-over-HTTP и ни в коем случае не GraphQL. Я не пожалел времени на то, чтобы изучить SQL, и активно его использую. Для устойчивости применяю самые базовые паттерны: таймауты, автоматические выключатели и обратное давление.

Стараюсь сводить количество компонентов ПО к минимуму. В идеале только само приложение, SQLite или PostgreSQL для хранения данных, а также Docker, приправленный shell, для развертывания. Nginx/HAProxy — по мере необходимости. Никаких API-шлюзов, никакого сегментирования, никаких распределенных кэшей, никаких очередей сообщений, никаких NoSQL/NewSQL/Graph/всевозможных баз данных, никакого обнаружения сервисов, никакой федерации, никакой ориентации на облако, никаких лучших практик уровня FAANG.

Чтобы разобраться в legacy-коде, я рисую графики зависимостей и диаграммы последовательности. Оставляю комментарии, чтобы напомнить себе в будущем, почему та или иная функция делает то, что делает, или зачем нужна определенная if-ветвь. Составляю документацию, стараясь сделать ее лаконичной и простой для чтения. Пишу примеры — очень много примеров. Некоторые из них даже интерактивные.

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

© Habrahabr.ru