Инженерный лидер Карл собрал список статей, которые в шутку называет «обязательным чтением» для своей команды. Большинство материалов подобраны за важные мысли о создании хорошего софта. Некоторые пункты просто подкрепляют его мнение: ORM — зло, а фронтенд должен быть простым. Спорить можно, но польза будет.
Про практики кода: сложность — главный враг. Опасно сразу убирать дублирование и сводить код в одно место; надо понимать, когда этого делать не стоит, особенно чтобы отбиваться от кодинг-агентов, которые хотят везде создать «единый источник истины». Когда проект становится слишком сложным, прогресс резко останавливается. Разделение ответственности и куча хелперов конфликтуют с принципом Locality of Behavior: поведение кода должно быть очевидным из самого модуля. Спекулятивные фичи «на будущее» — почти всегда плохая идея. Если данные обязаны обладать свойством, лучше закодировать его в типе: ошибки всплывут на компиляции, а не в рантайме.
Платформенное: у Безоса стоит поучиться тому, как открывать возможности сервиса другим командам программно, хотя заставлять всех следовать его правилам не надо. Фронтенд: состояние часто хранят отдельно от HTML, но правильнее держать его прямо в разметке и выводить разрешённые действия оттуда. Это близко к исходной идее REST. При переходе с бэка на React люди пишут императивно, с кучей state и side effects. А надо декларативно: описывать, что получить на выходе. Современный React построен на функциональном стиле, каждый компонент — функция. useMemo и useCallback — самые неправильно используемые хуки, статья объясняет, где они реально нужны. Полезно понять модель HTML, чтобы использовать браузер как задумано, а не считать разметку неудобным легаси.
Базы данных: Карл — сертифицированный ненавистник ORM. Они соблазняют на старте, но потом дают проблемы с производительностью; OpenAI в статье про масштабирование Postgres советует проверять SQL, который генерируют ORM. В подборке есть лучший анти-ORM текст и более краткий технический разбор. Про PostGIS нужно понять тип geography. Когда база тормозит, полезно знать EXPLAIN и EXPLAIN ANALYZE. Пагинация через LIMIT и OFFSET замедляется на больших объёмах — есть альтернативы.
Async: многие учат asyncio на ходу и делают блокирующие вызовы внутри async-функций; документация объясняет, что происходит под капотом. Боб Найстром показывает, что у async-систем есть фундаментальные ограничения, а не просто нехватка скилла. Ещё одна статья обещает сэкономить сотни часов на разборе данных из интернета.
Книги: The Design of Everyday Things — про дизайн как предугадывание потребностей, а не украшательство; Designing Data-Intensive Applications — отличное введение в базы данных; Crafting Interpreters учит писать интерпретатор на Java, потом на C, а лучше переписать его на другом языке — автор использовал Rust. Category Theory for Programmers — жёсткая, но лучшая вводная в теорию категорий. The Mythical Man-Month вышла в 1975-м, но с ростом ИИ-инструментов главы вроде «Аристократия и демократия в системном дизайне» стали только актуальнее.