Пролог: когда читал статью ниже, то по ходу дела возникали мысли, которыми хотел в итоге поделиться. И этих мыслей набралось столько, что пришлось написать свою отдельную статью 😄 И так-с…
Привез вам немножко лонгрида (там внутри статьи есть ссылки на другие связанные статьи, поэтому чтиво множиться в ширь еще больше):
➡️ https://www.spicyweb.dev/the-great-gaslighting-of-the-js-age/
Пересказывать не буду, т.к. лучше прочувствовать боль автора самому, но посыл такой - часто молодые (и не только) разработчики добровольно становятся заложниками одной/малого количества технологии (в статье на примере React) и считают ее идеалом/будущим/[любое восхитительное прилагательное]. Изучать что-то отличное от идеала у них большого желания нет и даже считают это вредным.
Проблема глубокая и может относится не только к React и не только к вебу, а к вообще любой любимой разработчиком технологии. Вкусовщина - очень плохое (и даже в некоторой степени губительное) качество разработчика. Да, могут быть технологии, которые ближе к сердцу, но они не должны влиять на объективность при принятии решений. Оценка и выбор конечных технологий должны идти от требований, сроков и уровня команды (в порядке важности).
Лично я сторонник мнения, что программист в первую очередь должен разбираться в общих принципах и подходах - это нужно для профессионализма, а уже конкретные технологии, как React - это нужно “для души”. Общие принципы и подходы не зависят от того, где их применять - веб, десктопная, мобильная, IoT, низкоуровневая и даже аппаратная разработка. В этом ценность такого программиста - огромная скорость адаптации к изменениям, а разработка ПО одна из наиболее динамичных сфер.
Но что значат эти “общие принципы и подходы”?
Общие принципы и подходы
Это все те знания и принципы, которые наработаны лучшими умами за десятки лет разработки ПО и множество раз подтверждены на практике. Это тема огромная и охватить ее за небольшой пост нереально, но путь к началу погружения можно попробовать дать. Ниже привел основные направления для развития в порядке сложности усвоения и обширности материала. Так же добавил наиболее полезные ссылки на соответствующую литературу для начала погружения.
1. SOLID DRY KISS for YAGNI
Если кто-то увидел в этом предложении бессмысленность, не знает кто такая девушка Yagni и зачем ее вообще целовать, то не переживайте. Каждое слово - аббревиатура принципа разработки. Изучайте их по отдельности и это будет огромный буст вас, как профессионала. Основной обобщенный посыл фразы - структуризация, однозначность и четкость написанного кода.
Краткий список литературы, где можно подробнее изучить данные принципы:
SOLID - тут в первую очередь нужно идти к книгам Роберта Мартина, т.к он ввел данный термин в обиход, а конкретнее:
Agile Principles, Patterns, and Practices in C# - отличная книга. Не смотрите, что она для С# - приведенные примеры и пояснения универсальны для любого языка. Про SOLID в книге отдельная секция, где разжевывается каждая буква. Книга достойна быть прочитана от начала до конца - концепции и идеи, описанные в ней, фундаментальны и не зависят от языка и платформ.
DRY - аналогичная ситуация, в первую очередь идем к книге, которая ввела термин:
The Pragmatic Programmer: From Journeyman to Master - не устаревающая классика. Книга практическая, книга философская. Взгляд на программирование, как на искусство, где из тебя делают прекрасного и тонкого художника. То что нужно для профессионала дела.
KISS / YAGNI - тут лучше всего обращаться к книгам по чистоте кода.
Refactoring: Improving the Design of Existing Code
Clean Code: A Handbook of Agile Software Craftsmanship -
обе книги являются справочниками рецептов для изменения вашего кода в лучшую
сторону. Не со всеми “рецептами” нужно соглашаться, но посылы у книг правильные
и нужные, поэтому они по праву считаются классикой. Если где-то увидите
книги-“аналоги”, то скорее всего будет написано тоже самое только другими
словами, поэтому лучше начинать именно с этих двух.
И пару книжечек, которые нельзя отнести к конкретному принципу, но концептуально про них же:
Code Complete: A Practical Handbook of Software Construction - для начинающих (да и не только) программистов маст хэв. Приучает с первых шагов к хорошему и правильному. Не всё в этой книге может нравиться, не совсем хочется соглашаться, но так и должно быть. Она учит самостоятельности и выработке собственного стиля и чувства прекрасного.
A Philosophy of Software Design - книга не для начинающих, но для ищущих новых взглядов на разработку и построение систем. Книга - микс различных тем, поэтому можно читать только секции, которые заинтересуют. Взгляд автора на некоторые вопросы не сходится с Фоулером, например, но это отлично - чем больше различных мнений, тем большим ваш кругозор. Наша цель сделать из вас профессионала, а он никогда не зациклен на одном мнении.
2. Data Structures and Algorithms / «Структуры данных и алгоритмы»
Знание структур данных и алгоритмов помогает писать эффективный, лаконичный и понятный другим программистам код. С изучением структур и алгоритмов заметите, как будет приходить осознание и понимание работы технологий и инструментов, которые используете каждый день. Информация начнет раскладываться по полочкам сознания. К слову, при устройстве на работу в компании уровня FAANG - это маст хэв, а ребята бесполезные знания требовать не будут.
По структурам и частично алгоритмам есть бесплатный и крайне удачный курс на платформе Stepik (тыц). Но в целом, конкретно тут тот самый случай, когда лучший способ изучения - это практика. Для этого прекрасно подходит LeetCode или его аналоги. Обычно, на данных сервисах есть список разнообразных задач из практики на алгоритмистику и структуры данных с возможностью оценки вашего решения и с пояснением наилучшего для решаемой задачи.
Из книг подсказать что-то сложно, т.к их бесчисленно много, но для меня самыми полезными были:
Algorithms Illuminated - цикл книг и видео по алгоритмам (книги внизу сайта). Достаточно хорошо пояснена математическая база основных алгоритмов. Книги построены как справочник, поэтому можете выбирать нужный алгоритм и изучать конкретно его (только в первой части еще есть вводный экскурс в общую математику алгоритмистики). Часть алгоритмов охвачены в рамках курса на Stepik, который выше.
Introduction to Algorithms - сразу проговорю, что книга сложная и не для чтения перед сном, а скорее для сна 😀 Но настолько детальной книги по алгоритмам, их созданию и математической оценке, наверно, нет. Если алгоритмы нужны как часть общих знаний, то данная книга будет избыточной, пожалуй.
3. Design Patterns / «Паттерны (шаблоны) проектирования»
Многие слышали, но далеко не все используют. А зря, ведь это готовые решения типовых задач, которые пришли проверку временем и бесконечным числом программистов. Паттерны абстрактны, поэтому применимы вне зависимости от языка программирования и его парадигмы. Да, паттернов много, все и не упомнить, но это и не нужно. Воспринимайте паттерны как справочник с ответами на общие вопросы, но который нужно хотя раз пробежать глазами, чтобы вообще быть в курсе какие вопросы есть и какие готовые ответы предлагают. На практике из ходовых вам нужно знать штук 7-10.
Design Patterns: Elements of Reusable Object-Oriented Software - вечная классика, неповторимый оригинал. Все основные паттерны сформулированы и задокументированы в этой книге. Возможно слишком строгая и формальная, поэтому ниже несколько более осовремененные варианты:
Agile Principles, Patterns, and Practices in C# - книгу уже рекомендовал выше, но тут есть отдельная секция с основными и наиболее “рабочими” паттернами.
Refactoring.Guru - очень удобный сайт, если нужно быстро вспомнить нужный паттерн. С картинками, примерами и отсылками на другие паттерны. То что нужно для повседневного использования.
Patterns.dev - справочник паттернов написанных на JavaScript и частично на React.
4. Software Architecture and Design или «Архитектурные шаблоны/паттерны»
Любой написанный код - это малая часть чего-то более крупного. И видеть это крупное как раз помогут знание и понимание различных архитектурных стилей и дизайнов. Вот microservices, DDD, EDD и т.п. как раз терминология данного слоя. Изучать можно бесконечно, т.к. слой фактически включает в себя знания предыдущих, а так же знания, чтобы видеть как вообще собирать из разрозненных частей ваше конечное приложение. Книг множество, информации в интернете еще больше. Из того, что было полезно мне:
Fundamentals of Software Architecture: An Engineering Approach
Software Architecture: The Hard Parts
Building Evolutionary Architectures: Automated Software Governance -
книги открыл для себя случайно, но содержимое в них оказались бесценным. Книги
рассказывают что же такое архитектура систем и роль архитектора в жизни проекта.
Написаны очень живо и интересно, тут большое количество полезных примечаний из
повседневной рабочей жизни разработчиков и архитекторов, книги подскажут как
превратить ваш проект в хорошо-поддерживаемый и рабочий продукт. Так же, есть
справочник готовых архитектурных решений с детализацией как и где применять. В
общем, отличное чтиво.
Clean Architecture: A Craftsman’s Guide to Software Structure and Design - хорошая, живая книга. Может не такая фундаментальная, как хотелось бы, но вынести полезное можно. Люблю авторский стиль Мартина, поэтому не мог не добавить 🙂
Patterns of Enterprise Application Architecture - книга-справочник по готовым архитектурным решениям от Фоулера. Решения узкоприменимые, но от этого не становяться плохими. Частично перекликаются с блогом Фоулера, за которым тоже стоит следить и читать.
Implementing Domain-Driven Design - полное погружение в DDD. На сегодня одна из главных концепций в построении систем, и данная книга в этом поможет. DDD будет всплывать в рамках изучения многих архитектурных решений. Книга приземленная и практичная, хорошо раскрывает что такое DDD. Автор расскажет почему ваше виденье построения архитектуры должно вестись глазами бизнеса и как превращать вашу архитектуру в то, которое решает задачи бизнеса.
В контексте DDD стоит упомянуть книгу Domain-Driven Design: Tackling Complexity in the Heart of Software, т.к это первоисточник самого термина, но слог автора может быть суховат и строг.
systemdesign.one - прекрасный блог по системному дизайну. Тут найдете разбор дизайна и архитектуры самых высокограженных приложений в мире. Больше количество примеров и паттернов. Отличный ресурс для углубления в тему.
Заключение
Постарался охватить все сферы фундаментальных знаний программиста. Книги общеизвестные и общепризнанные, возможно, новых тайтлов или откровений для себя вы не нашли. Поэтому, буду очень благодарен, если поделитесь ссылками на любые материалы, которые произвели на вас сильное впечатление и принесли реальную пользу. Надеюсь информация оказалась полезной и буду очень благодарен, если поделитесь данным текстом с коллегам и знакомым программистам 🙏