Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Проектирование — это когда чувствуешь, а не как...

Проектирование — это когда чувствуешь, а не какие-то там циферки, Николай Хитров, PythoNN

Avatar for Sobolev Nikita

Sobolev Nikita

September 21, 2025
Tweet

More Decks by Sobolev Nikita

Other Decks in Programming

Transcript

  1. Николай Хитров Спикер, тимлид, душнила, jsonоукладчик, бЛоГеР
 Рассказываю как писать

    enterprise 
 на python за пинту пива Делаю митапы и конференции Работаю в Точке, отвечаю за сервис управления задолженностями Кто я? 

  2. О чем доклад Чем мы можем померить качество кода Чем

    чаще пользуются 
 или не пользуются 
 ❶ ❷
  3. Для кого Кто хочет в архитектуру кода, 
 но не

    умеет выбирать между решениями Кто обмазан техдолгом и не знает, откуда начать разгребать Кто любит цифры и не любит людей ❶ ❷ ❸
  4. У вас есть телеграм ботик. 
 Простой такой, мемы раз

    в сутки присылает вы его поднимете на одном сервере?
  5. У вас есть телеграм ботик. 
 Простой такой, мемы раз

    в сутки присылает вы его поднимете на одном сервере?  а может лучше на двух серверах?
  6. У вас есть телеграм ботик. 
 Простой такой, мемы раз

    в сутки присылает вы его поднимете на одном сервере?  а может лучше на двух серверах?  и в разных стойках?

  7. У вас есть телеграм ботик. 
 Простой такой, мемы раз

    в сутки присылает вы его поднимете на одном сервере?  а может лучше на двух серверах?  и в разных стойках?  и в разных дата центрах? 

  8. а как же заложиться на будущее? вдруг на него нагрузка

    вырастет? или вдруг сервер ляжет 
 и че нам тогда делать? 
 Но почему?
  9. Арендовать один VDS 
 за 1к рублей Арендовать три VDS

    
 по 1к рублей за штуку Купить «малинку»
 и поставить дома
 ❶ ❷ ❸
  10. Арендовать один VDS 
 за 1к рублей Арендовать три VDS

    
 по 1к рублей за штуку Купить «малинку»
 и поставить дома Купить «мощный» сервер 
 и поставить дома 
 
 ❶ ❷ ❸ ❹
  11. Арендовать один VDS 
 за 1к рублей Арендовать три VDS

    
 по 1к рублей за штуку Купить «малинку»
 и поставить дома Купить «мощный» сервер 
 и поставить дома Купить N «мощных» серверов 
 и арендовать помещение

 
 
 ❶ ❷ ❸ ❹ ❺
  12. Арендовать один VDS 
 за 1к рублей Арендовать три VDS

    
 по 1к рублей за штуку Купить «малинку»
 и поставить дома Купить «мощный» сервер 
 и поставить дома Купить N «мощных» серверов 
 и арендовать помещение

 
 
 Купить N «мощных» серверов, арендовать помещение 
 и нанять одного админа
 
 ❶ ❻ ❷ ❸ ❹ ❺
  13. Арендовать один VDS 
 за 1к рублей Арендовать три VDS

    
 по 1к рублей за штуку Купить «малинку»
 и поставить дома Купить «мощный» сервер 
 и поставить дома Купить N «мощных» серверов 
 и арендовать помещение

 
 
 Купить N «мощных» серверов, арендовать помещение 
 и нанять одного админа Купить N «мощных» серверов, арендовать помещение 
 и нанять M админов
 
 
 ❶ ❻ ❼ ❷ ❸ ❹ ❺
  14. Арендовать один VDS 
 за 1к рублей Арендовать три VDS

    
 по 1к рублей за штуку Купить «малинку»
 и поставить дома Купить «мощный» сервер 
 и поставить дома Купить N «мощных» серверов 
 и арендовать помещение

 
 
 Купить N «мощных» серверов, арендовать помещение 
 и нанять одного админа Купить N «мощных» серверов, арендовать помещение 
 и нанять M админов … и нанять одного HR 
 
 
 ❶ ❻ ❼ ❽ ❷ ❸ ❹ ❺
  15. Арендовать один VDS 
 за 1к рублей Арендовать три VDS

    
 по 1к рублей за штуку Купить «малинку»
 и поставить дома Купить «мощный» сервер 
 и поставить дома Купить N «мощных» серверов 
 и арендовать помещение

 
 
 Купить N «мощных» серверов, арендовать помещение 
 и нанять одного админа Купить N «мощных» серверов, арендовать помещение 
 и нанять M админов … и нанять одного HR … нанять двух HR
 
 
 
 ❶ ❻ ❼ ❽ ❾ ❷ ❸ ❹ ❺
  16. Арендовать один VDS 
 за 1к рублей Арендовать три VDS

    
 по 1к рублей за штуку Купить «малинку»
 и поставить дома Купить «мощный» сервер 
 и поставить дома Купить N «мощных» серверов 
 и арендовать помещение

 
 
 Купить N «мощных» серверов, арендовать помещение 
 и нанять одного админа Купить N «мощных» серверов, арендовать помещение 
 и нанять M админов … и нанять одного HR … нанять двух HR … построить HR департамент 
 

 
 ❶ ❻ ❼ ❽ ❾ ❿ ❷ ❸ ❹ ❺
  17. Cognitive Complexity • 
 • 


 • каждый оператор это

    
 +1 балл сложности за вложенность докидывается еще несколько с учетом глубины за else тоже накидывают, 
 но без учета вложенности if process_order(order):
 if order.is_valid(): # +1 for 'if'
 if order.has_discount(): # +2 for nested 'if'
 if order.customer.is_premium(): # +3 for nested 'if'
 apply_premium_discount(order)
 else: # +1 for 'else'
 apply_standard_discount(order)
 else: # +1 for 'else'
 if order.is_expedited(): # +2 for nested 'if'
 process_expedited(order)
 else: # +1 for 'else'
 process_standard(order)
 else: # +1 for 'else'
 log_invalid_order(order) 
 https://redirect.sonarsource.com/doc/ cognitive-complexity.html 

  18. Halstead Программа — набор токенов из операндов (данных) и операторов

    (действий) 
 Словарь программы 
 (Program Vocabulary) n = + Длина программы 
 (Program Length) N = + n1 n2 N1 N2 
 n1 — уникальных операторов — уникальных операндов — всего операторов — всего операндов 
 n2 N1 N2
  19. Halstead Формула объема умственных усилий для понимания программы Объем (Volume):

    V = *log2( ) N n N — длина программы — минимальное количество 
 бит для кодирования “словаря” 
 n
  20. Maintainability Index

 
 MI = MAX(0, (171 — 5.2*ln( )

    — 0.23* — 16.2*ln( ))*100/171) 
 HV LoC Cycl. Complexity Коэффициенты как-то подбирали эмпирически для C++ в 90-ых В «новой» версии формулы сделали нормализацию от 0 до 100 В оригинальной было кол-во комментариев, но потом выкинули 

  21. Несмотря на «магические» константы из прошлого 
 все еще пользуемся

    этими формулами ❶ Итого про метрики сложности функций 

  22. Несмотря на «магические» константы из прошлого 
 все еще пользуемся

    этими формулами Не скажут, что кусок кода идеальный, но скажут, 
 что он хуже другого куска ❶ ❷ Итого про метрики сложности функций 

  23. Несмотря на «магические» константы из прошлого 
 все еще пользуемся

    этими формулами Не скажут, что кусок кода идеальный, но скажут, 
 что он хуже другого куска Могут приврать, но если использовать сразу несколько, точность повышается ❶ ❷ ❸ Итого про метрики сложности функций 

  24. Несмотря на «магические» константы из прошлого 
 все еще пользуемся

    этими формулами Не скажут, что кусок кода идеальный, но скажут, 
 что он хуже другого куска Могут приврать, но если использовать сразу несколько, точность повышается Удобно задавать границу, когда уже ну совсем ну точно ну 100% это плохо  
 ❶ ❷ ❸ ❹ Итого про метрики сложности функций 

  25. Depth of Inheritance Tree (DIT): Глубина дерева наследования.
 Слишком глубокое

    наследование усложняет понимание потока выполнения Вариантов. Довольно. Много.
  26. Depth of Inheritance Tree Number of Children (DIT): Глубина дерева

    наследования.
 Слишком глубокое наследование усложняет понимание потока выполнения (NOC): Количество непосредственных подклассов 
 Высокий NOC может указывать на неправильное использование наследования Вариантов. Довольно. Много.
  27. Depth of Inheritance Tree Number of Children Response For a

    Class (DIT): Глубина дерева наследования.
 Слишком глубокое наследование усложняет понимание потока выполнения (NOC): Количество непосредственных подклассов 
 Высокий NOC может указывать на неправильное использование наследования (RFC): Все методы, которые могут быть вызваны 
 из методов класса Вариантов. Довольно. Много.
  28. Depth of Inheritance Tree Number of Children Response For a

    Class Weighted Method per Class (DIT): Глубина дерева наследования.
 Слишком глубокое наследование усложняет понимание потока выполнения (NOC): Количество непосредственных подклассов 
 Высокий NOC может указывать на неправильное использование наследования (RFC): Все методы, которые могут быть вызваны 
 из методов класса (WMC): Сумма сложностей всех методов класса 
 Чаще всего считается как просто количество методов. Высокий WMC — 
 признак «Божественного объекта» Вариантов. Довольно. Много.
  29. Depth of Inheritance Tree Number of Children Response For a

    Class Weighted Method per Class Lack of Cohesion in Methods (DIT): Глубина дерева наследования.
 Слишком глубокое наследование усложняет понимание потока выполнения (NOC): Количество непосредственных подклассов 
 Высокий NOC может указывать на неправильное использование наследования (RFC): Все методы, которые могут быть вызваны 
 из методов класса (WMC): Сумма сложностей всех методов класса 
 Чаще всего считается как просто количество методов. Высокий WMC — 
 признак «Божественного объекта» (LCOM): Измеряет, насколько методы класса связаны через использование полей
 Высокий LCOM — признак того, что класс, возможно, стоит разделить 
 Вариантов. Довольно. Много.
  30. Lack of Cohesion in Methods (LCOM) 
 Кол-во методов без

    пар 
 на один атрибут показывают, что методы 
 надо разносить 
 в отдельные классы Не стоит использовать 
 на классах без поведения, логики. Например, DTO 

  31. l = 1/(1+1) = 0,5 1st Complex service 
 One

    More service 
 2nd 
 l = 1/(1+1) = 0,5 
 Не очень 
 стабильный l = 7/(3+7) = 0,7 
 Мега стабильный l = 0 

  32. За каждый публичный метод класса +1 балл Каждая зависимость через

    конструктор 
 или прямой вызов в методе добавляет вес 
 этой зависимости 
 Заменим количество на веса 

  33. Веса зависимостей = 31
 Веса методов = 3 
 1st


    [34] Complex service
 [31] 2 3 4 4 4 4 5 One More service
 [3] 2nd
 [5] Веса зависимостей = 0
 Веса методов = 3 
 Веса зависимостей = 26
 Веса методов = 5 
 Веса зависимостей = 3
 Веса методов = 5 

  34. Вес класса = кол-во публичных методов + вес зависимостей 


    Визуализация зависимостей классов 
 кружки – классы
 стрелки – зависимости
 цвет = сложность 



  35. Слои приложения Количество слоев определяется сложностью проекта: •

 •
 никаких

    слоев 
 просто пишем код в лоб 
 как угодно Transactional script 
 контроллеры + все остальное • 

 •
 трехзвенная, гексагональная — представление
 — логика
 — хранение данных DDD, чистая архитектура — представление
 — логика приложения
 — логика домена
 — инфраструктура (адаптеры)
  36. Сложность бизнес логики и уникальное преимущество разделяют поддомены на 3

    типа 
 core generic generic/
 supporting 
 supporting Business logic complexity 
 Business differentiation 

  37. •



 •

 •


 •
 По типам доменов можно определить, какие

    вещи требуют больше сил 
 и внимание, а какие можно отдать «под заказ» Можно использовать формулу стабильности классов Можно заметить, что тип зависимости-поддомена влияет на стабильность 
 и учесть это в формуле Кол-во неправильно направленных зависимостей можно использовать 
 при оценке техдолга
  38. Многие штуки можно конвертировать 
 в цифры, но далеко не

    все из них 
 полезны в использовании Нет никакого смысла тратить силы 
 на вылизывание до идеальных цифр — 
 но полезно знать, где есть проблемные места Если метрика не помогает в прогнозировании пути к своей цели — смело выкидывайте ее, 
 она для вас бесполезна