<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Статьи]]></title>
    <link>https://habr.com/ru/users/jdev/publications/articles/</link>
    <description><![CDATA[Хабр: статьи пользователя jdev]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Wed, 22 Jul 2026 13:13:06 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      
        
    
    <item>
      <title><![CDATA[Учимся читать SQL SELECT]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/919028/</guid>
      <link>https://habr.com/ru/articles/919028/?utm_campaign=919028&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/dc3/c6a/8e4/dc3c6a8e45e658da611ff2c7ad8881d8.png" /><p>Я  отчётливо помню, как сидел на втором курсе на лабах по БД и долго и  мучительно методом научного тыка подбирал порядок слов в SELECT-запросе с  GROUP BY, чтобы он вернул нужный <s>мне</s> преподу результат. Потому что я не понимал, как работает SELECT, хотя был прилежным (на программистских курсах) студентом, ходил на все лекции и делал лабы за себя и пару "тех парней".</p><p>Двадцать лет спустя, когда я встал по ту сторону баррикад и начал сам вести лабы по БД, я столкнулся с той же самой проблемой уже у своих студентов. И, так как за двадцать лет я всё-таки понял, как работает SELECT, то придумал для них способ объяснения, который работает хорошо (в моей  практике).</p> <a href="https://habr.com/ru/articles/919028/?utm_campaign=919028&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Tue, 17 Jun 2025 05:45:06 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[SQL]]></category><category><![CDATA[Базы данных]]></category>
      <category><![CDATA[SQL]]></category><category><![CDATA[реляционные субд]]></category><category><![CDATA[реляционная модель]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Вам не нужна Чистая архитектура. Скорее всего]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/888428/</guid>
      <link>https://habr.com/ru/articles/888428/?utm_campaign=888428&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/bd7/88f/749/bd788f749177ce6958168051af0e194e.jpg" /><p>Сейчас среди Java/Kotlin команд распространено применение Чистой (ака Гексагональной, ака Луковой&nbsp;— Clean, Hexagonal, Onion) архитектуры для&nbsp;разработки бакэндов прикладных приложений (да и Android‑приложений тоже). Однако это семейство архитектур в&nbsp;контексте прикладной разработки зачастую не&nbsp;даёт никаких преимуществ, а&nbsp;только привносит&nbsp;лишние церемонии и тем самым замедляет её.</p><p>В&nbsp;этом посте я подробно разбираю, почему, на&nbsp;мой взгляд Чистая архитектура не&nbsp;является лучшим выбором по&nbsp;умолчанию для&nbsp;прикладных приложений, и кратко рассказываю об&nbsp;альтернативной архитектуре (спойлер: <span class="habrahidden">Промышленная функциональная архитектура</span>), которую использую в&nbsp;качестве дефолтной последние 3&nbsp;года и пока что&nbsp;доволен.</p><p>Но&nbsp;перед тем как&nbsp;перейти к&nbsp;Чистой архитектуре, сначала надо разобрать принцип инверсии зависимостей (Dependency Inversion Principle, DIP).</p><p></p> <a href="https://habr.com/ru/articles/888428/?utm_campaign=888428&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Thu, 06 Mar 2025 08:33:14 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[Качество кода]]></category><category><![CDATA[Проектирование и рефакторинг]]></category><category><![CDATA[Функциональное программирование]]></category><category><![CDATA[ООП]]></category><category><![CDATA[Программирование]]></category>
      <category><![CDATA[DIP]]></category><category><![CDATA[чистая архитектура]]></category><category><![CDATA[функциональная архитектура]]></category><category><![CDATA[абстракция]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Структурный дизайн. Древний секрет простого и быстрого кода]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/jugru/articles/858418/</guid>
      <link>https://habr.com/ru/companies/jugru/articles/858418/?utm_campaign=858418&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/5be/80d/2c1/5be80d2c19156f897d8cddcee8d6e6c3.png" /><p>Я пишу коммерческий код с 2005&nbsp;года и с 2014&nbsp;года ищу способ систематически писать хороший код.</p><p>В&nbsp;рамках этих поисков я изучил всю популярную&nbsp;литературу о&nbsp;хорошем коде и его дизайне&nbsp;— от&nbsp;«Чистого кода» Анкл Боба до&nbsp;«DDD» Эрика Эванса. Однако все популярные подходы в&nbsp;значительной степени субъективны: они не&nbsp;дают объективного и последовательного судьи, который&nbsp;бы решал, какой код лучше.</p><p>Например, в&nbsp;чистом коде я до&nbsp;сих пор не&nbsp;знаю способа за&nbsp;конечное время дать ответ на&nbsp;вопрос «Сколько уровней абстракции в&nbsp;этой функции?». А&nbsp;если взять DDD&nbsp;— то я до&nbsp;сих пор не&nbsp;знаю способа, который&nbsp;бы позволял стабильно и за&nbsp;конечное время находить границы между ограниченными контекстами (прошу прощения за&nbsp;каламбур) или&nbsp;агрегатами.</p><p>Эта неопределённость ведёт к&nbsp;длительным дискуссиям на&nbsp;ревью и в&nbsp;голове разработчика о&nbsp;том, какой из&nbsp;способов является наилучшим для&nbsp;решения задачи. А&nbsp;после этих дискуссий, каждый из&nbsp;участников (включая того дилетанта в&nbsp;собственной голове) остаётся при&nbsp;своём мнении.</p><p>Отчаявшись научиться писать стабильно хороший объектно‑ориентированный код, в 2016&nbsp;году я пошёл в&nbsp;сторону функционального программирования и архитектуры. Там с&nbsp;детерминированностью&nbsp;было получше: если в&nbsp;коде нет побочных эффектов (ввода‑вывода, оператора присваивания и чтения глобальных переменных)&nbsp;— то код хороший, если есть&nbsp;— плохой. Однако как&nbsp;затащить в&nbsp;коммерческий проект и, главное, собственную голову свободные монады и их интерпретаторы&nbsp;— я так и не&nbsp;понял.</p><p>Поэтому в 2020&nbsp;году поиски своего Святого Грааля я продолжил в «эзотерических» и древних книгах. Одной из&nbsp;таких книг стал «Структурный дизайн» Ларри Константина. И в&nbsp;этой книге я, наконец, нашёл простой и понятный принцип, который лёг в&nbsp;основу моего текущего подхода к&nbsp;проектированию и кодированию, и для&nbsp;которого можно&nbsp;быстро и однозначно дать ответ, соответствует&nbsp;ли тот или&nbsp;иной кусочек кода этому принципу или&nbsp;нет.</p><p>В&nbsp;этом посте я даю краткий экскурс в&nbsp;идею сбалансированной формы системы из&nbsp;структурного дизайна и рассказываю на&nbsp;примере трёх кейсов о&nbsp;результатах применения этой идеи в&nbsp;моей коммерческой практике.</p> <a href="https://habr.com/ru/articles/858418/?utm_campaign=858418&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Fri, 22 Nov 2024 08:50:57 GMT</pubDate>
      <dc:creator><![CDATA[jdev (JUG Ru Group)]]></dc:creator>
      <category><![CDATA[Блог компании JUG Ru Group]]></category><category><![CDATA[Качество кода]]></category><category><![CDATA[Функциональное программирование]]></category><category><![CDATA[Проектирование и рефакторинг]]></category><category><![CDATA[Конференции]]></category>
      <category><![CDATA[структурный дизайн]]></category><category><![CDATA[функциональное программирование]]></category><category><![CDATA[функциональная архитектура]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[ФП виновно в снижении стоимости программ. Вот мои доказательства, господа присяжные заседатели]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/772730/</guid>
      <link>https://habr.com/ru/articles/772730/?utm_campaign=772730&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/146/0f8/dec/1460f8decdd5968a7b3ca3c98b4013ed.png" /><p>Среди особенностей моего подхода к разработке у моих заказчиков, коллег и студентов наибольшее сопротивление вызывает использование Spring Data JDBC, а не [Spring Data] JPA (де-факто стандарта работы с БД на платформе Java).</p><p>Изначально я собирался писать пост "Почему не JPA", но немного подумав понял, что ответ умещается в одно предложение: потому что JPA по своей природе (persistence context и dirty checking) не поддерживает неизменяемую модель данных - неотъемлемую часть функционального стиля программирования, который, в свою очередь, является неотъемлемой частью моего подхода к разработке. И это объективный факт.</p><p>Почему для себя я выбрал ФП, а не "нормальное" императивное программирование? На этот вопрос также можно ответить одним предложением: потому что функциональный стиль помогает мне снижать стоимость разработки для бизнеса и делать руководителей проектов счастливыми.</p><p>Уверен, многие не согласятся с истинностью утверждения "применение функционального стиля ведёт к снижению стоимости разработки". Поэтому я пока буду называть его Гипотезой и приведу факты, доказывающие её истинность.</p><p></p> <a href="https://habr.com/ru/articles/772730/?utm_campaign=772730&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Какие ваши доказательства?</a>]]></description>
      
      <pubDate>Thu, 09 Nov 2023 04:28:50 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[Программирование]]></category><category><![CDATA[Качество кода]]></category><category><![CDATA[Проектирование и рефакторинг]]></category><category><![CDATA[Функциональное программирование]]></category>
      <category><![CDATA[функциональное программирование]]></category><category><![CDATA[неизменяемые структуры]]></category><category><![CDATA[архитектура]]></category><category><![CDATA[стоимость разработки]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Рациональный подход к декомпозиции систем на модули или микросервисы. Практика]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/jugru/articles/733206/</guid>
      <link>https://habr.com/ru/companies/jugru/articles/733206/?utm_campaign=733206&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/59f/448/24f/59f44824f70b0675bde864a8d891fc5d.png" /><p>В своём <a href="https://habr.com/ru/companies/jugru/articles/731424/">прошлом посте</a> я рассказал теорию своего подхода к декомпозиции систем на модули. Теперь пришло время проверить её на практике.</p><p><a href="https://play.google.com/store/apps/details?id=ru.ngtrans.camp">Кэмп</a> - реальный проект, который стоил семизначную сумму для заказчика, выполнялся командой из 12 человек (включая двух бакэндеров) и сейчас запущен в промышленную эксплуатацию. Суммарно на выполнение проекта было затрачено 5500 человеко/часов, из которых 950 - на бакенд.</p> <a href="https://habr.com/ru/articles/733206/?utm_campaign=733206&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Что из этого получилось?</a>]]></description>
      
      <pubDate>Fri, 05 May 2023 08:44:42 GMT</pubDate>
      <dc:creator><![CDATA[jdev (JUG Ru Group)]]></dc:creator>
      <category><![CDATA[Блог компании JUG Ru Group]]></category><category><![CDATA[Проектирование и рефакторинг]]></category><category><![CDATA[Конференции]]></category><category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[проектирование]]></category><category><![CDATA[декомпозиция]]></category><category><![CDATA[дизайн]]></category><category><![CDATA[диаграмма эффектов]]></category><category><![CDATA[эргономичный подход]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Рациональный подход к декомпозиции систем на модули или микросервисы]]></title>
      <guid isPermaLink="true">https://habr.com/ru/companies/jugru/articles/731424/</guid>
      <link>https://habr.com/ru/companies/jugru/articles/731424/?utm_campaign=731424&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/5e6/620/cd7/5e6620cd72bf27e35e889219eb43a300.png" /><p>Чего от разработки ПО хотят разработчики, продакты и владельцы бизнеса?</p><p>Одного и того же - побольше дофаминчика (гормон счастья), поменьше кортизольчика (гормон стресса). Притом источники и дофамина, и кортизола у них одни и те же. Дофамин вырабатывается, когда фичи выпускаются в срок и без багов, а кортизол - когда сроки срываются и вылазят баги и регрессии. Бизнесу будет ближе финансовая версия — срыв сроков и баги очевидным образом приводят к увлечению стоимости разработки. Что приводит к выбросу кортизола уже у владельцев.</p> <a href="https://habr.com/ru/articles/731424/?utm_campaign=731424&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Как обеспечить высокий уровень дофамина?</a>]]></description>
      
      <pubDate>Fri, 28 Apr 2023 09:14:06 GMT</pubDate>
      <dc:creator><![CDATA[jdev (JUG Ru Group)]]></dc:creator>
      <category><![CDATA[Блог компании JUG Ru Group]]></category><category><![CDATA[Конференции]]></category><category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[декомпозиция]]></category><category><![CDATA[проектирование]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Подходы к декомпозиции бэкендов информационных систем]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/683456/</guid>
      <link>https://habr.com/ru/articles/683456/?utm_campaign=683456&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/b01/c83/e24/b01c83e247e318ca6ecf14140492672e.png" /><p>Количество классов в реализации даже небольшой программы на один человеко-месяц исчисляется десятками. В средних программах на несколько человеко-лет счёт идёт уже на тысячи. А человек может одновременно оперировать 7-ю +/- 2 объектами. Поэтому все нетривиальные программы требуют декомпозиции своей реализации на более крупные блоки, чем классы - я буду называть такие блоки пакетами.</p><p>Сейчас наиболее распространены два основных подхода к декомпозиции систем: пакетирование по слоям и техническим аспектам (далее просто "по слоям" для краткости) и пакетирование на основе предметной области (представленное группой вариантов: пакетирование по фичам, пакетирование по компонентам, ограниченные контексты и пакетирование по агрегатам из предметно-ориентированного дизайна (DDD))</p><p>Однако ни один из этих подходов мне не подошёл в полной мере и я изобрёл…​ объектно-ориентированный подход к декомпозиции систем. Точнее, я изобрёл простую методику выполнения декомпозиции, а потом понял, что на выходе она даёт штуки обладающие свойствами объекта.</p><p>Но обо всём по порядку - сначала я рассмотрю критерии оценки подходов, распространённые подходы и почему они мне не подошли. А закончу пост представлением методики выполнения объектно-ориентированной декомпозиции.</p><p></p> <a href="https://habr.com/ru/articles/683456/?utm_campaign=683456&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Sun, 21 Aug 2022 23:31:25 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[Качество кода]]></category><category><![CDATA[Проектирование и рефакторинг]]></category><category><![CDATA[ООП]]></category>
      <category><![CDATA[декомпозиция]]></category><category><![CDATA[ооп]]></category><category><![CDATA[проектирование]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Абстрактные войны: public interface IAbstraction против абстракции]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/675314/</guid>
      <link>https://habr.com/ru/articles/675314/?utm_campaign=675314&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/826/40e/01e/82640e01ec7e846a1e1f74235ee60177.jpg" /><p>Почти 30 лет назад в классической книге по шаблонам проектирования  Design Patterns: Elements of Reusable Object-Oriented Software, авторы  сформулировали один из самых известных, но недопонятых принципов в  истории программирования:</p><p>Program to an interface, not an implementation.</p><p>— Erich Gamma et. al, Design Patterns: Elements of Reusable Object-Oriented Software</p><p>Зачем "программировать в интерфейсы"?</p> <a href="https://habr.com/ru/articles/675314/?utm_campaign=675314&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Давайте разбираться</a>]]></description>
      
      <pubDate>Wed, 06 Jul 2022 04:35:15 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[Программирование]]></category><category><![CDATA[Качество кода]]></category><category><![CDATA[Проектирование и рефакторинг]]></category><category><![CDATA[ООП]]></category>
      <category><![CDATA[абстракция]]></category><category><![CDATA[интерфейсы]]></category><category><![CDATA[инверсия зависимостей]]></category><category><![CDATA[Java]]></category><category><![CDATA[Kotlin]]></category><category><![CDATA[spring framework]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Диаграмма эффектов: пример построения]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/671226/</guid>
      <link>https://habr.com/ru/articles/671226/?utm_campaign=671226&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/5d4/6fe/da3/5d46feda346c91c0f7131c948ff9b306.png" /><p>Ведущие разработчики (ака техлиды, тимлиды, архитекторы) встречаются с целым рядом нетривиальных вопросов:</p><p>1) Как оценить трудоёмкость задачи?</p><p>2) Как обеспечить низкую сцепленность системы?</p><p>3) В каком порядке реализовывать части системы и как эффективно распараллелить работу?</p><p>4) И ключевой вопрос - а что вообще надо сделать-то?</p><p>Я для поиска ответов на эти вопросы использую диаграмму эффектов. Чтобы научить этому и свою команду, в этом посте я подробно описал процесс создания диаграммы эффектов своего последнего коммерческого проекта.</p><p></p> <a href="https://habr.com/ru/articles/671226/?utm_campaign=671226&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Wed, 15 Jun 2022 06:54:33 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[Анализ и проектирование систем]]></category><category><![CDATA[Программирование]]></category>
      <category><![CDATA[Диаграмма эффектов]]></category><category><![CDATA[эргономичный подход]]></category><category><![CDATA[проектирование систем]]></category><category><![CDATA[оценка трудозатрат]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Диаграмма эффектов: спецификация v0.0.2]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/667446/</guid>
      <link>https://habr.com/ru/articles/667446/?utm_campaign=667446&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/0cd/91c/2a7/0cd91c2a70e5025063aa700750e8e704.png" /><p>Идентичность информационной системы определяется тем, как она взаимодействует с внешним миром. Что, где и когда она сохраняет и запрашивает; что, куда и когда отправляет. Это я называю наблюдаемым поведением.</p><p>Можно переписать приложение с  Java на Haskell, сменить слоёную архитектуру на шестиугольную,  реляционную базу данных заменить документной, а пользовательский  интерфейс перевести с серверной генерации HTML на React Native - если  наблюдаемое поведение системы останется неизменным, то это будет просто  очередная версия всё той же системы. Если же кардинально изменить её взаимодействие с внешним миром, то это  будет уже другая система.</p><p>Именно на основании наблюдаемого  поведения конечные пользователи выносят суждения о корректности работы  программы. Даже для того, чтобы оценить корректность результата сложного  вычисления, пользователю в первую очередь надо, чтобы правильно сработал  механизм отображения этого результата.</p><p>При всей значимости наблюдаемого поведения я не знаю ни одного общепринятого инструмента для его проектирования и визуализации. Поэтому изобрёл свой - диаграмму эффектов.</p> <a href="https://habr.com/ru/articles/667446/?utm_campaign=667446&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">А при чём здесь эффекты?</a>]]></description>
      
      <pubDate>Tue, 24 May 2022 04:52:52 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[Анализ и проектирование систем]]></category>
      <category><![CDATA[эргономичный подход]]></category><category><![CDATA[проектирование]]></category><category><![CDATA[эффекты]]></category><category><![CDATA[диаграмма]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Эргономичный подход к разработке информационных систем v1.0M1]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/660845/</guid>
      <link>https://habr.com/ru/articles/660845/?utm_campaign=660845&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/f3e/966/1c3/f3e9661c3be719207ebcf95ba5d8d6bf.jpeg" /><p>... или как писать программы, которые приносят больше положительных эмоций.</p><p>Работу над Эргономичным подходом я начал весной 2020 года. Причиной тому стал возврат к работе над стандартными для экосистемы Spring-а проектами после четырёхлетнего перерыва.</p><p>На контрасте с работой над своими проектами, я особенно остро ощутил уже забытые чувства раздражения от избыточной трудоёмкости решения задач и страха внести регрессию. Уже тогда я понимал, что причины и того и другого кроются во многих широко распространённых практиках - пакетировании по слоям, <a href="https://ru.wikipedia.org/wiki/%D0%A1%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9_%D0%B3%D1%80%D0%B0%D1%84" rel="noopener noreferrer nofollow">связном графе</a> анемичных JPA-сущностей, глобальном компонент скане, тестах на моках. В своих проектах я делал это как-то по-другому, но именно "как-то" - каждый раз уникальным образом на основе интуиции.</p><p>Для того чтобы вытащить эту интуицию наружу и сначала систематизировать собственную работу, а потом научить других делать так же и систематизировать работу команды, я начал писать книгу.</p><p></p> <a href="https://habr.com/ru/articles/660845/?utm_campaign=660845&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">И вот что у меня получилось...</a>]]></description>
      
      <pubDate>Tue, 19 Apr 2022 01:50:05 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[Я пиарюсь]]></category>
      <category><![CDATA[программирование]]></category><category><![CDATA[методология разработки]]></category><category><![CDATA[фп]]></category><category><![CDATA[оод]]></category><category><![CDATA[tdd]]></category><category><![CDATA[проектирование систем]]></category><category><![CDATA[spring]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Агрегаты]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/660599/</guid>
      <link>https://habr.com/ru/articles/660599/?utm_campaign=660599&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/2e8/afd/f4b/2e8afdf4b3ceaff3d6b3be5ac21a95f8.png" /><p>Я считаю, что именно агрегаты из Domain-Driven Design лежат в основе поддерживаемых информационных систем. Однако эта концепция малоизвестна за пределами DDD-сообщества и довольно сложна для понимания, поэтому я решил написать очередной пост посвящённый агрегатам. В основном для чтобы структурировать собственное понимание агрегатов и создать "методичку" для своих команд, но и широкой общественности, я надеюсь, этот пост тоже может быть полезен.</p><p></p> <a href="https://habr.com/ru/articles/660599/?utm_campaign=660599&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Что такое агрегат?</a>]]></description>
      
      <pubDate>Wed, 13 Apr 2022 01:40:55 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[Анализ и проектирование систем]]></category><category><![CDATA[ООП]]></category><category><![CDATA[Функциональное программирование]]></category><category><![CDATA[Хранение данных]]></category>
      <category><![CDATA[ddd]]></category><category><![CDATA[агрегат]]></category><category><![CDATA[проектирование]]></category><category><![CDATA[моделирование данных]]></category><category><![CDATA[информационные системы]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Многоликий принцип единственности ответственности]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/565158/</guid>
      <link>https://habr.com/ru/articles/565158/?utm_campaign=565158&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/e30/d5b/d0e/e30d5bd0e0438de4e39a4bce7a0ef9cd.png" /><p><em>Принцип единственности отвественности? Что именно вы имеете ввиду?</em></p> <a href="https://habr.com/ru/articles/565158/?utm_campaign=565158&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Tue, 29 Jun 2021 02:19:11 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[Программирование]]></category><category><![CDATA[Анализ и проектирование систем]]></category><category><![CDATA[ООП]]></category>
      <category><![CDATA[solid]]></category><category><![CDATA[srp]]></category><category><![CDATA[oop]]></category><category><![CDATA[ood]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Почему следует избегать использования JPA/Hibernate в продакшене]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/551902/</guid>
      <link>https://habr.com/ru/articles/551902/?utm_campaign=551902&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/c01/fc4/e42/c01fc4e42cf1bd112c29d778c50fc0e1.png" /><p>JPA безусловно самая распространённая технология работы с базами данных на платформе Java. Но она же и наименее пригодна для разработки быстрых и поддерживаемых систем. В этой статье я расскажу почему JPA лучше не использовать в продакшене и что можно использовать вместо неё.</p> <a href="https://habr.com/ru/articles/551902/?utm_campaign=551902&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Fri, 16 Apr 2021 08:11:11 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[Java]]></category><category><![CDATA[ООП]]></category>
      <category><![CDATA[jpa]]></category><category><![CDATA[hibernate]]></category><category><![CDATA[spring data]]></category><category><![CDATA[orm]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Упрощаем работу с русскими текстами в Sublime Text 3 + Vintage]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/321776/</guid>
      <link>https://habr.com/ru/articles/321776/?utm_campaign=321776&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<p>Если вы недавно начали: 1) пользоваться Sublime Text и/или 2) пользоваться плагином Vintage и/или 3) редактировать много текста на русском (или наоборот английском) языке с использованием ST3+Vintage, то скорее всего уже почувствовали какая боль связана с командами назначенными на символы пунктуации — &quot;$&quot;, &quot;;&quot;, &quot;.&quot;, &quot;,&quot;, &quot;&quot;&quot; и т.п. В небольшой заметке под катом я хочу предложить вам пару костылей, которые помогают эту боль в значительной степени облегчить.</p> <a href="https://habr.com/ru/articles/321776/?utm_campaign=321776&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 14 Feb 2017 07:41:52 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[VIM]]></category>
      <category><![CDATA[sublime text 3]]></category><category><![CDATA[vintage]]></category><category><![CDATA[vim]]></category><category><![CDATA[cyrillic]]></category><category><![CDATA[кириллица]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Физика Robocode]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/147956/</guid>
      <link>https://habr.com/ru/articles/147956/?utm_campaign=147956&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Данный материал изначально был подготовлен в качестве раздела статьи <a href="http://habrahabr.ru/post/147947/">“Первые шаги в Robocode”</a>, но я решил вынести его, т.к. он значительно увеличивал размер и без того большой первоначальной статьи и не является базовым и необходимым для осуществления первого шага. Если вы сразу заинтересовались вторым шагом или постепенно доросли до него, то прошу под кат.<br/>
 <a href="https://habr.com/ru/articles/147956/?utm_campaign=147956&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 17 Jul 2012 10:25:02 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[Разработка игр]]></category><category><![CDATA[Java]]></category><category><![CDATA[Спортивное программирование]]></category>
      <category><![CDATA[Robocode]]></category><category><![CDATA[обучение]]></category><category><![CDATA[физическая модель]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Первые шаги в Robocode]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/147947/</guid>
      <link>https://habr.com/ru/articles/147947/?utm_campaign=147947&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Я пишу эту статью по просьбам в комментариях к статье <a href="http://habrahabr.ru/post/147741/">“Как я стал чемпионом Robocode”</a> и продолжая начатое в ней дело по привлечению внимания к Robocode русскоговорящих разработчиков. Robocode — это игра для программистов, в которой задача заключается в разработке системы управления танком. Для затравки приведу несколько роликов, чтобы показать о чём вообще пойдёт разговор:<br/>
<ul>
<li><a href="http://www.youtube.com/watch?v=dqHmp_kMz-U">http://www.youtube.com/watch?v=dqHmp_kMz-U</a> — Дуэль</li>
<li><a href="http://www.youtube.com/watch?v=eqlPbtO3rQY">http://www.youtube.com/watch?v=eqlPbtO3rQY</a> — Дуэль</li>
<li><a href="http://www.youtube.com/watch?v=zx7xFJiBGZQ">http://www.youtube.com/watch?v=zx7xFJiBGZQ</a> — Схватка, &gt;2 роботов, каждый за себя</li>
<li><a href="http://www.youtube.com/watch?v=EJPskFGvGi8">http://www.youtube.com/watch?v=EJPskFGvGi8</a> — Схватка, стоит обратить внимание на робота Portia (бирюзовый) — это один из лучших бойцов в этой категории</li>
</ul><br/>
<br/>
 <a href="https://habr.com/ru/articles/147947/?utm_campaign=147947&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Tue, 17 Jul 2012 09:53:44 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[Разработка игр]]></category><category><![CDATA[Java]]></category><category><![CDATA[Спортивное программирование]]></category>
      <category><![CDATA[Robocode]]></category><category><![CDATA[введение]]></category><category><![CDATA[туториал]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Как я стал чемпионом Robocode]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/147741/</guid>
      <link>https://habr.com/ru/articles/147741/?utm_campaign=147741&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[Я — <a href="http://robowiki.net/wiki/User:Jdev" rel="nofollow noopener noreferrer">Jdev</a>, автор Robocode-бота <a href="http://robowiki.net/wiki/Tomcat" rel="nofollow noopener noreferrer">Tomcat</a>, который в ноябре/декабре 2011 года был Королём Премьер Лиги общего зачёта Robocode (<a href="http://robowiki.net/wiki/RumbleArchives:RoboRumble_20111107" rel="nofollow noopener noreferrer">пруф</a>) без единого поражения, сейчас занимает 3-е место из 911 в процентном зачёте и является героем моего повествования. В этой статье я рассказываю о своём шестилетнем пути к победе.<br> <a href="https://habr.com/ru/articles/147741/?utm_campaign=147741&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Fri, 13 Jul 2012 10:52:47 GMT</pubDate>
      <dc:creator><![CDATA[jdev]]></dc:creator>
      <category><![CDATA[Java]]></category><category><![CDATA[Разработка игр]]></category>
      <category><![CDATA[Robocode]]></category><category><![CDATA[чемпион]]></category><category><![CDATA[Премьер лига]]></category>
    </item>
  

  

  

	
  

  

  

      

      

      

    
  </channel>
</rss>
