Цельнометаллический программист¶
«В моей школе ... нет ни врат, ни тайных принципов. В пяти положениях меча нет никакого внутреннего смысла».
Миямото Мусаси, «Книга пяти колец».
Оглавление — очертим примерный круг вопросов, в которых должен ориентироваться современный программист.
Python¶
Сегодня Python, без сомнения, язык программирования номер один. Оставаясь практически безальтернативным вариантом для AI/ML и одним из основных игроков на поле бэкенда/CLI, Python зачастую проигрывает в некоторых категориях, уступая, например, по скорости работы C++, а по удобству манипулирования многопоточностью Golang'у, но относительная простота синтаксиса, богатство библиотек, радушность комьюнити и общая «юзер-френдли» инфраструктура языка перевешивают имеющиеся недостатки.
«Вторая программа» на Python, список относительно простых Python-проектов для начинающих программистов с последовательно нарастающей сложностью.
Вопросы для собеседования Python программиста. Вопросы по возможности отранжированны по вероятности появления на собеседовании, самые частые варианты идут первыми.
Golang¶
Go не является ни «волшебной палочкой», ни «серебряной пулей», как иногда его пытаются презентовать фанаты. Даже Google, создатель Go, отнюдь не переводит безоглядно все свои сервисы на Go, до сих пор широко используя C++.
Но — есть сферы (и их немало), которым Go соответствует почти идеально. Golang изначально разрабатывался как многопоточный язык и возможность разделения программы на несколько потоков не была заложена позже, как, например, в Python или в C++, а была заложена с самого начала. На мой взгляд, оптимальное местоположение Golang на карте современных языков программирования — быстрый, масштабируемый бэкенд, утилизирующий мощности облака, условно говоря, на 95 %. С одной стороны, Golang не дотягивает до 99 %, подвластных C++, но ускоряет разработку и менее требователен к квалификации программиста; с другой стороны, уверенно обгоняет бэкенд, написанный на Python.
Дистилляция возможностей языка и избавление от синтаксического сахара привело к тому, что так долго, но безуспешно декларировал Python («должен существовать один — и, желательно, только один — очевидный способ сделать это») и, как следствие, к истончению когнитивной прослойки между разработчиком и конкретными решаемыми проблемами.
Сеть¶
Стек TCP/IP — сетевая модель передачи цифровых данных.
Сетевая модель OSI — еще одна попытка найти общий сетевой знаменатель.
Архитектура ПО¶
При оценке архитектуры стоит исходить из простого, прозаического соображения — лучше та архитектура, которая минимизирует расходы на разработку программного обеспечения и максимизирует эффективность программиста. Чем меньше (в разумных пределах) корова кормлена и чем больше она доена, тем лучше коровник.
При оценке суммарной стоимости разработки кода не следует забывать про жизненный цикл ПО, поэтому какой-нибудь быстрый наколенный MVP с неясными перспективами не зазорно сделать более «грязным», чем софт с уже наработанной пользовательской базой и сформированным планом развития. Но, разумеется, при этом надо держать в голове стратегию перехода из состояния «грязно и быстро» в «чистенько и надолго», не исключающей после одобрения концепции рынком возможности выкинуть весь уже написанный код на помойку.
Как метко подметил Роберт Мартин в «Чистой архитектуре», каждая парадигма программирования ничего нам не даёт и не разрешает, но ровно наоборот — отнимает и ограничивает. Структурное программирование отнимает у нас оператор goto, объектно-ориентированное программирование отбирает возможность косвенной передачи управления (иными словами, запрещает указатели на функции), функциональное программирование накладывает ограничение на присваивание.
Каждый архитектурный принцип делает примерно то же самое, только в мини-масштабе — не так жестко, как парадигмы, но всё же в той или иной мере ограничивает свободу действий программиста, формуя код по заранее одобренному лекалу и преследуя всё ту же цель — уменьшить расходы, поднять эффективность.
Но, прежде чем примерить описанные ниже архитектурные принципы к той конкретной программе, которую вы сейчас разрабатываете, вспомните Закон Старджона, шутливый, но не лишенный здравого смысла: «90 процентов чего угодно — ерунда». Применительно к сфере разработки ПО это звучит примерно так: «90 процентов программ являются достаточно простыми и их можно разработать, и разработать хорошо, не очень озабочиваясь архитектурными принципами».
Чистая архитектура. К архитектуре ПО относится множество разноплановых понятий разного калибра, включая, например, относительную мелочь, вроде правил именования переменных (особенно на этом настаивает DDD, Domain-Driven Design). Чистая же архитектура относится к фундаментальным, макро-архитектурным принципам, задавая направление всей дальнейшей разработке.
SOLID — самый известный набор рекомендаций для проектирования ПО на базе ООП.
CQRS — принцип разделения запросов и команд.
CI/CD¶
GitHub Actions — автоматизация рутинных действий при обновлении репозитария на GitHub.
Go to English version of this page.
codifycamera.com © CC BY-NC-SA 4.0 2024 — ∞ Михаил Емельянов, war4one@gmail.com