{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Дима пишет | Дмитрий Смотров: заметки с тегом архитектура_кода",
    "_rss_description": "backend python fastapi django rabbitmq kafka postgresql sqlalchemy",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/dimasmotrov.ru\/tags\/arhitektura-koda\/",
    "feed_url": "https:\/\/dimasmotrov.ru\/tags\/arhitektura-koda\/json\/",
    "icon": "https:\/\/dimasmotrov.ru\/pictures\/userpic\/userpic@2x.jpg?1718470292",
    "authors": [
        {
            "name": "Дима Смотров",
            "url": "https:\/\/dimasmotrov.ru\/",
            "avatar": "https:\/\/dimasmotrov.ru\/pictures\/userpic\/userpic@2x.jpg?1718470292"
        }
    ],
    "items": [
        {
            "id": "31",
            "url": "https:\/\/dimasmotrov.ru\/all\/cena-arhitektury\/",
            "title": "Неявные последствия выбора архитектуры",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/dimasmotrov.ru\/pictures\/image-16.png\" width=\"295\" height=\"1086\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Фото специально размыто, коммерческая тайна и все такое :)<\/div>\n<\/div>\n<p>Последний раз писал апишку почти год назад. Сейчас временно моя команда раскидалась на помощь другим, я пошел помогать в старую команду и сел запиливать базовые CRUD операции, тыкать в аналитиков палкой, требуя спецификации к входным и выходным схемам, в темпе вальса мокать апишку, чтобы фронты могли потестить свою верстку и все такое. Типичное крудошлепство, почти отдых, за исключением того, что сервис совсем новый, только в CI закинута болванка сервиса, чтобы можно было деплоится, и все.<\/p>\n<p>Наши сервисы имеют слоистую архитектуру с кучей другой паттернов: адаптеры, репозитории для запросов в хранилище, команды и запросы(привет CQRS), unit of work для обеспечения транзакционности действий в системе, агрегаты, сервисы, билдеры на сервисы и билдеры на модели, все еще на интерфейсах, чтобы тестировать удобно было... Чтобы реализовать ручку, нужно реализовать 5-6 интерфейсов и реализаций. Ситуация, как в тех бородатых анекдотах про реализацию чего-угодно в Java: сначала напишите фабрику, а если фабрика уже есть — напишите абстрактную фабрику. Пришлось вспоминать, как вообще все эти сущности между собой должны дружить.<\/p>\n<p>Понятно, что вернувшись через год к типу задач, реализация которых подразумевает кучу всего, нужно будет переключить мозги, но по моему мнению, если ты возвращаешься к своему проекту и вообще не понимаешь, что тут и как работает — это либо ты сильно все упростил, либо сильно перемудрил. Причем с первым разобраться сильно проще, чем со вторым, на мой взгляд.<\/p>\n<p>Отсюда два вывода:<br \/>\n1) Настраивайте себе шаблонизаторы, когда у вас устоявшиеся подходы.<br \/>\n2) Если ваш сервис предполагает, что про его разработку забудут на полгода-год(на моей памяти есть такой сервис для получения курса валют), есть смысл писать его проще — в плоских структурах и куче if-ов быстрее разобраться(да-да, рубрика «Вредные советы»). Опять же если не написана совсем жесть, тогда земля пухом 🔫.<\/p>\n<p>💻 Всем доброй ночи, а я пошел запиливать себе шаблоны  наконец-то, ибо те 30 файликов на скрине ПРа меня утомили. Это кстати реализация Create операции, с тестами...<\/p>\n",
            "date_published": "2025-07-11T11:19:58+03:00",
            "date_modified": "2025-07-11T11:19:54+03:00",
            "tags": [
                "архитектура_кода",
                "Разработка"
            ],
            "image": "https:\/\/dimasmotrov.ru\/pictures\/image-16.png",
            "_date_published_rfc2822": "Fri, 11 Jul 2025 11:19:58 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "31",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/dimasmotrov.ru\/pictures\/image-16.png"
                ]
            }
        },
        {
            "id": "27",
            "url": "https:\/\/dimasmotrov.ru\/all\/o-ciklah\/",
            "title": "Замена циклов",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/dimasmotrov.ru\/pictures\/image-13.png\" width=\"1280\" height=\"630\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/dimasmotrov.ru\/pictures\/image-14.png\" width=\"1280\" height=\"316\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/dimasmotrov.ru\/pictures\/image-15.png\" width=\"1280\" height=\"364\" alt=\"\" \/>\n<\/div>\n<p>Есть вещи из моей практики C++ программиста(кроме статической типизации), по которым я скучаю.<br \/>\nНапример по алгоритмам из стандартной библиотеки.<\/p>\n<p>Вот на примере кусок кода все из той же Chromium OS, который двигает панели.<\/p>\n<p>На первом скрине исходный код, на втором и третьем результат рефакторинга. Вариант на третьем скрине использует обобщенный бинарный алгоритм поиска, за счет чего более хорош по сложности, но суть не в этом.<\/p>\n<p>Суть в очень красивом, по моему мнению, и лаконичном подходе с использованием обобщенного программирования или дженериков в простонародье. Насильно все к ним приводить не стоит, но уместное использование сильно режет количество кода. Меньше кода — меньше <a href=\"\"><a href=\"https:\/\/dimasmotrov.ru\/all\/menshe-znaesh-krepche-spish\/\">https:\/\/dimasmotrov.ru\/all\/menshe-znaesh-krepche-spish\/<\/a> потенциального места для ошибок<\/a>.<\/p>\n<p>В питонячьей среде дженерики тоже есть, но вот аналога stl нет, да и не будет его. А мест, где нужно итерироваться по коллекциям, тьма. Пишем for дальше, что поделать 💻<\/p>\n",
            "date_published": "2025-05-28T21:57:41+03:00",
            "date_modified": "2025-05-28T21:57:39+03:00",
            "tags": [
                "архитектура_кода",
                "Разработка"
            ],
            "image": "https:\/\/dimasmotrov.ru\/pictures\/image-13.png",
            "_date_published_rfc2822": "Wed, 28 May 2025 21:57:41 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "27",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/dimasmotrov.ru\/pictures\/image-13.png",
                    "https:\/\/dimasmotrov.ru\/pictures\/image-14.png",
                    "https:\/\/dimasmotrov.ru\/pictures\/image-15.png"
                ]
            }
        },
        {
            "id": "26",
            "url": "https:\/\/dimasmotrov.ru\/all\/menshe-znaesh-krepche-spish\/",
            "title": "Меньше знаешь — крепче спишь",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/dimasmotrov.ru\/pictures\/image-12.png\" width=\"1280\" height=\"151\" alt=\"\" \/>\n<\/div>\n<p>Фраза спорная, но в написании кода помогает: несколько раз за последние 2 недели ловил себя на смешной ошибке, когда автодополнением кода вставлял имя не той переменной, которое требовалось.<\/p>\n<p>В моем случае ошибки относительно безобидные — несколько раз в логи вместе поля computer_uid я писал просто uid. В будущем это явно бы могло сыграть со мной злую шутку, если бы пришлось решать проблему на стороне клиента.<\/p>\n<p>Причем подобные ошибки достаточно легко пропустить, а допустить их можно много раз в одном блоке кода.<\/p>\n<p>Можно себя обезопасить, задав себе вопрос: а не слишком ли много знает этот кусочек кода\/класс\/подпрограмма?<\/p>\n<p>Если много — то уберите лишний контекст, дайте ровно столько данных, сколько нужно. Дадите больше данных — можете их криво использовать.<\/p>\n<p>Интересно, почему в MISRA или NASA стандартах для надежного C кода, который должен стабильно работать в автомобилях и на луне, нет подобного пункта.<\/p>\n<p>Отберите у себя возможность ошибки, как родители отбирали у вас провод от компьютера в детстве💻<\/p>\n",
            "date_published": "2025-05-28T21:55:11+03:00",
            "date_modified": "2025-05-28T21:54:58+03:00",
            "tags": [
                "архитектура_кода",
                "Разработка"
            ],
            "image": "https:\/\/dimasmotrov.ru\/pictures\/image-12.png",
            "_date_published_rfc2822": "Wed, 28 May 2025 21:55:11 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "26",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/dimasmotrov.ru\/pictures\/image-12.png"
                ]
            }
        }
    ],
    "_e2_version": 4134,
    "_e2_ua_string": "Aegea 11.3 (v4134)"
}