Недавно я закончил читать «Философию проектирования программного обеспечения», и во второй главе она исследует тему сложности программного обеспечения.
Книга «Философия проектирования программного обеспечения» дает практическое определение сложности:
«Сложность — это все, что связано со структурой программной системы, что затрудняет ее понимание и модификацию».
Другими словами, сложность может принимать разные формы и не обязательно иметь какое-либо отношение к производительности: ваш код может быть производительным, но при этом оставаться сложным
В этой статье я хотел бы поделиться некоторыми ключевыми определениями и идеями из книги. Но сначала давайте представим себе обычную ситуацию, в которой вы, вероятно, уже бывали…
Давайте окунемся в ужасную историю, которую многие из вас, вероятно, пережили или еще ждут.
Все началось с простого приложения для управления задачами CRUD. Код был чистым, модульным и простым в обслуживании. Команда разработчиков была довольна, и система отлично работала для первых клиентов.
Проблемы начались, когда отдел продаж продал систему крупной компании, заявив, что в ней есть интеграция с календарем, уведомления по электронной почте и потрясающий генератор отчетов. После завершения продажи эти функции необходимо было быстро реализовать.
Интеграция календаря: Команде пришлось интегрироваться с Календарем Google и Outlook. Разные разработчики реализовали решения, что привело к противоречивым подходам.
Уведомления по электронной почте: Следующими были добавлены уведомления по электронной почте. Один разработчик использовал конкретную библиотеку, а другой создал собственное решение. Смешанные подходы сделали код запутанным.
Генератор отчетов: Для генератора отчетов разработчики использовали различные технологии: PDF-файлы, экспорт в Excel и интерактивные информационные панели. Отсутствие единого подхода превратило обслуживание в кошмар.
Растущая сложность: Каждая функция разрабатывалась изолированно и быстро, что приводило к зависимостям между функциями. Разработчики начали создавать «быстрые исправления», чтобы все работало, увеличивая сложность и связанность системы.
Разработка программного обеспечения не происходит в вакууме; на него влияют различные внутренние и внешние факторы. Мы все были или будем в такой ситуации.
Потом начались проблемы:
Очевидно, что теперь у нас сложная система.
Теперь давайте «проанализируем» эту сложность, чтобы ее было легче выявить и смягчить.
Ну, «смягчить» означает:
"Чтобы сделать менее тяжелым, серьезным или болезненным; облегчить."
Я считаю, что сложность часто присуща коду. Некоторые вещи сложны по своей природе. Ваша роль как разработчика заключается не только в создании кода, который компьютер сможет эффективно выполнять, но и в создании кода, с которым смогут работать будущие разработчики (включая вас в будущем).
«Управление сложностью — это суть компьютерного программирования».
— Брайан Керниган
Автор упомянутой книги утверждает, что сложность обычно проявляется тремя способами, которые мы рассмотрим здесь.
Усиление изменений происходит, когда, казалось бы, простое изменение требует изменений во многих разных местах.
Например, если владелец продукта запрашивает поле «приоритет» или «дата завершения», а ваши сущности тесно связаны, сколько изменений вам нужно будет внести?
Когнитивная нагрузка — это объем знаний и времени, необходимый разработчику для выполнения задачи.
Итак, представьте такой сценарий: к команде присоединился новый разработчик, ему поручили исправить ошибку в генераторе отчетов. Чтобы выполнить эту задачу, разработчику необходимо:
Это классический сценарий «невозможно оценить», где задача может получить один балл или восемь — лучше бросьте D20 и отреагируйте соответствующим образом.
Неизвестное неизвестное — это когда ты не знаешь того, чего не знаешь.
Это худшее проявление сложности, потому что вы можете изменить то, что не следует, и все сломается.
Пример: разработчик изменил код отправки электронной почты, добавив новое уведомление, не зная, что это повлияет на генератор отчетов, который зависел от этой функции. Это вызвало серьезные проблемы у клиентов, иллюстрируя наихудшую форму возникающей сложности.
Увидев ужасную историю и три основных симптома, давайте посмотрим, что вызывает сложность.
Зависимости необходимы в программном обеспечении и не могут быть полностью устранены. Они позволяют различным частям системы взаимодействовать и функционировать вместе. Однако зависимости, если ими не управлять должным образом, могут значительно усложнить задачу.
Зависимость существует, когда код невозможно понять или изменить изолированно, что требует рассмотрения или изменения связанного кода.
Неясность возникает, когда важная информация не очевидна. Это может затруднить понимание кодовой базы, что приведет к увеличению когнитивной нагрузки и риску возникновения неизвестных неизвестных.
Неясность возникает, когда важная информация не очевидна.
Поскольку это происходит постепенно, легко подумать: «Только в этот раз это не будет иметь значения». Но при накоплении исправление одной или двух зависимостей не будет иметь большого значения.
«В разработке программного обеспечения все является компромиссом».
— Я не помню автора
Я мог бы написать множество правил, стратегий и фреймворков, которые вы, вероятно, уже видели в Интернете, о том, как избежать сложности: SOLID, шаблоны проектирования, YAGNI, KISS и т. д.
Однако вы можете объединить их все в один руководящий принцип (как упоминалось в книге «Программист-прагматик»). «Легко ли изменить то, что я реализую?» Если ответ отрицательный, то вы, вероятно, увеличиваете сложность.
Простота изменения кода упрощает обслуживание, снижает когнитивную нагрузку на разработчиков, делает систему более адаптируемой и менее подверженной ошибкам.
Спасибо!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3