KAN`ский блог Мысли вслух…
  • Июн
    1

    Фундаментальный подход к программной архитектуре: паттерны, свойства, проверенные методы (часть 1. Основы)

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

    Глава 1. Введение
    Назовите четыре главные особенности, определяющие архитектуру программного обеспечения.
    1. **Доступность**: Архитектура ПО должна быть такой, чтобы все пользователи могли получить доступ к необходимым функциям и данным. Все компоненты системы должны быть организованы в такие образы, чтобы пользователи могли легко найти нужное им информация или функцию.
    2. **Устойчивость**: Архитектура ПО должна быть способная изменяться, чтобы удовлетворить постоянно меняющиеся требования к системе. Она не должна зависеть от конкретной технологии или инструментария разработки.
    3. **Масштабируемость**: Архитектура ПО должна быть способная обрабатывать увеличение объема данных и пользователей без потери производительности системы.
    4. **Отказоустойчивость**: Архитектура ПО должна быть способная работать в случае отказа какого-либо компонента или части системы, что позволяет восстановить функционирование системы.
    — Визуальное представление системы.
    — Определение границ и интерфейсов между компонентами.
    — Управление изменениями в системах, основанных на временной шкале.
    — Взаимодействие системы с другими системами.

    Чем архитектурное решение отличается от принципа проектирования?
    Архитектурное решение и принцип проектирования имеют различные характеристики, но оба влияют на процесс разработки системы.
    Архитектурное решение — это описание архитектурного стиля, который будет использоваться для проектирования и организации системы. Он включает в себя все аспекты архитектуры, такие как компоненты, интерфейсы, данные и процессы. Архитектор должен учитывать эти различия при проектировании системы для ее соответствия требованиям.
    Напротив, принцип проектирования — это общий подход к разработке и организации системы. Он предоставляет набор указаний и рекомендаций для архитекторов о том, как создавать различные компоненты и интерфейсы в системе. Принцип проектирования может включать элементы организации кода, паттерны проектирования, архитектурные стили и другие принципы.
    В результате, архитектурное решение — это конкретное решение для создания системы, а принцип проектирования — это общий подход к ее разработке и организации. Они оба влияют на процесс разработки, но архитектурное решение используется для определения конкретной структуры системы, а принцип проектирования — для предоставления общих указаний и рекомендаций.
    — Архитектура не зависит от конкретной технологии, а основная цель — предоставить представление системы. Принцип проектирования же может иметь специфические требования к используемым технологиям.
    — Архитектура предлагает высокоуровневое представление системы, включая её компоненты и взаимодействие между ними. Принцип проектирования же предоставляет более детальное описание процесса разработки конкретной части системы.
    — Архитектура не зависит от конкретного времени, а принцип проектирования — от него.

    Перечислите восемь основных ожиданий от работы архитектора.
    1. Архитектор должен быть в курсе последних тенденций и стандартов в своей области.
    2. Он должен иметь хорошую команду, которая поможет ему в работе и создаст условия для творческого мышления.
    3. Архитектор должен быть способен определять основные архитектурные свойства системы, которые будут влиять на ее функциональность и производительность.
    4. Архитектор должен быть способен оценивать требования пользователей и проектировать систему, которая будет удовлетворять этим требованиям.
    5. Архитектор должен иметь гибкость в своей работе, чтобы быстро реагировать на изменения и нестандартные ситуации.
    6. Архитектор должен быть способен планировать проектирование системы с учетом всех его элементов, включая технические, организационные и финансовые аспекты.
    7. Архитектор должен быть способен влиять на проектирование системы путем установки принципов архитектурного мышления, которые будут использоваться во время разработки.
    8. Архитектор должен быть способен влиять на проектирование системы путем установки принципов архитектурного мышления, которые будут использоваться во время разработки.

    Что гласит Первый закон архитектуры программного обеспечения?
    Первый Закон Архитектуры Программного Обеспечения гласит, что архитектура ПО должна быть простой и понятной для людей, которые будут использовать его. Это означает, что архитектор должен придерживаться принципов простоты и понятия, а также учитывать возможность упрощения архитектуры путем ее модуляции.

    Глава 2. Архитектурное мышление
    В чем отличие между архитектурой и процессом разработки?
    — Архитектура представляет высокоуровневое представление системы, включая её компоненты и взаимодействие между ними. Процесс разработки — это более детальное описание процесса разработки конкретной части системы.
    — Архитектура не зависит от конкретной технологии, а процесс разработки может иметь специфические требования к используемым технологиям.
    — Архитектура предлагает представление системы на временную шкалу, процесс разработки — это пространственная иерархия изменений в коде.
    Перечислите три уровня пирамиды знаний и приведите пример для каждого из них.
    Пирамида знаний состоит из трех основных уровней, которые можно разделить следующим образом:
    1. **Знакомое** (Known): Это основа пирамиды, представляет известные и неизвестные вещи, о которых человек знает или уже встречался с этим вопросом. В этот уровень можно попадать из любого другого уровня пирамиды.
    2. **Неизвестное** (Unknown): Это следующий уровень, представляет вещи, о которых человек не знает и для которых есть возможность научиться.
    3. **Незнание** (Ignorance): Это самый высокий уровень, представляет вещи, о которых человек не знает ничего и для которых нет возможности научиться.

    Например:
    — В пирамиде знаний об информатике, известное может быть «как работа с компьютером», а неизвестное — «как установить Windows». Незнание будет представлять «что такое компьютер» и «что такое операционная система».
    — В пирамиде знаний о физике, известное может быть «как работает электрон», а неизвестное — «как устроен мир». Незнание будет представлять «что такое электрон» и «что такое мир».
    — В пирамиде знаний о биологии, известное может быть «как растут растения», а неизвестное — «как устроены организмы». Незнание будет представлять «что такое растение» и «что такое организм».

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

    2. Уровни пирамиды знаний можно представить следующим образом:
    — 1 уровень: технические знания (как использовать определенные инструменты или языки программирования)
    — 2 уровень: архитектурное мышление (как компоненты взаимодействуют друг с другом, как организовать систему так, чтобы она работала эффективно)
    — 3 уровень: управленческие знания (как принимать решения в организации, как объединять разных специалистов для достижения общей цели)

    Примеры для каждого из этих уровней:
    — 1 уровень: «Как использовать GitHub?»
    — 2 уровень: «Что такое MVC и почему он важен для веб-приложения?»
    — 3 уровень: «Каким образом мы можем снизить задержки в нашей команде, если все будут работать над общими проектами?»

    3. Архитектор должен знать широту технического кругозора, чтобы понять, как различные компоненты и инструменты могут работать друг с другом. Если он не знает всех подробностей, то может принимать неправильные решения или выпускать продукт, который не будет хорошо работать. Архитектор также должен знать глубину технических знаний, чтобы понять, каким образом он может использовать эти знания для создания продукта или решения.

    Назовите несколько способов, как можно поддерживать широту технического кругозора, оставаясь при этом практикующим архитектором.
    1. Участие в митапах и конференциях: Присоединяйтесь к мероприятиям, где можно познакомиться с последними тенденциями в архитектуре и разработке программно-аппаратного решения. Это поможет вам углубиться в знаниях и получить новые возможности для проектирования систем.
    2. Участие в группе разработки: Если компания предоставляет возможность участия в группах разработки, это может быть отличным способом для архитекторов углубиться в детали реализации проектов.
    3. Обучение и развитие: Постоянное обучение поможет вам получить новые знания, а также понимать более сложные архитектурные шаблоны и принципы.
    4. Стажировки: В некоторых компаниях можно получить возможность проработать в команде разработки, что может помочь углубиться в работе архитекторами и понять, как все элементы собираются вместе.
    5. Участие в проектах: Если компания предоставляет возможность участия в проектах, можно получить практический опыт и понять, как все элементы собираются вместе.
    6. Становление лидера: Если возможно, становитесь лидером архитектурного движения компании. Это может помочь вам увидеть сквозь все стороны и понять, какие шаги следует предпринять для достижения целей проекта.

    Глава 3. Модульность
    Что означает термин «коннасценция»?
    «Коннасценция» — это понятие, которое используют в архитектуре для описания отношений между различными компонентами системы. Оно часто связано с конфигурируемыми модульностями, которые позволяют изменять и настраивать функциональность системы в зависимости от необходимого уровня услуг.
    В контексте архитектурного подхода к модульности, «коннасценция» может означать способность системы самостоятельно выбирать и настраивать компоненты для обеспечения необходимого уровня услуг.

    В чем разница между статической и динамической коннасценцией?
    Различие между статической и динамической коннассенцией заключается в способе определения типов переменных.
    Статическая коннассенция (Static Typing) — это вид программирования, где тип переменной указывается при ее объявлении и не может быть изменен после этого. В статической коннассенции все переменные имеют известный, фиксированный тип во время компиляции.
    Динамическая коннассенция (Dynamic Typing) — это вид программирования, где тип переменной определяется во время выполнения программы и может меняться после объявления. В динамической коннассенции тип переменных определяется во время исполнения программы, что делает ее гибкой, но может привести к ошибкам времени выполнения.
    В статической коннассенции тип переменной уже известен во время компиляции и не меняется после этого, что делает ее более безопасной, но может привести к ограничению гибкости.
    В динамической коннассенции тип переменной определяется во время исполнения программы и может меняться в ходе работы, что делает ее более гибкой, но может привести к ошибкам времени выполнения.

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

    К какой коннасценции она относится: к статической или к динамической?
    Коннасценция, также известная как «коннективити», относится к процессу взаимодействия между объектами системы. Он определяет способ их связи и зависит от времени выполнения программы.
    Статическая коннасценция (Static Connectivity) относится к процессу, когда объекты системы статически определяют свои связи во время компиляции. Это означает, что эти связи известны и не меняются в ходе работы программы.
    Динамическая коннасценция (Dynamic Connectivity) относится к процессу, когда объекты системы динамически определяют свои связи во время выполнения программы. Это означает, что эти связи могут меняться во время работы программы.
    Коннасценция типа (Type Connectivity) относится к процессу определения и использования объектов системы по типу, а не по значению. Это означает, что объекты могут быть разных типов, но все они будут иметь возможность взаимодействовать друг с другом.
    В контексте вашей книги «Structured Design…», автор указал на различие между статической и динамической коннективити. Статическая коннективити ограничена известными связями во время компиляции, а динамическая — нет.
    В книге также указано, что выбор между статической и динамической коннективити зависит от конкретной ситуации и требований системы.

    Какая форма коннасценции самая сильная? Какая форма коннасценции самая слабая?
    Специалисты computer science определили несколько уровней связности, перечисленных далее от наиболее сильной до наиболее слабой:
    Функциональная связность: Все части модуля взаимосвязаны, а в модуле содержится все необходимое для его функционирования.
    Последовательная связность: Взаимодействие двух модулей, где выходные данные одного становятся входными данными другого.
    Коммуникационная связность: Два модуля формируют коммуникационную цепочку, где каждый производит действия над информацией и/или вносит свой вклад в некий результат. Например, добавляет запись в базу данных и создает сообщение электронной почты на основе этой информации.
    Процедурная связность: Два модуля выполняют код в определенном порядке.
    Временная связность Связность модулей возникает на основе временных зависимостей. Например, у многих систем имеется перечень, казалось бы, не связанных между собой составляющих, которые должны быть проинициализированы в ходе начального запуска системы; эти разные задачи имеют временную связность.
    Логическая связность: Данные внутри модулей связаны не функционально, а логически. Рассмотрим, к примеру, модуль, занимающийся преобразованием информации из текста, сериализованных объектов или потоков. Операции связаны, но функционально они совершенно разные. Типичный пример этого типа связности присутствует практически в каждом проекте Java в виде пакета StringUtils, представляющего собой группу статических методов, работающих с данными типа String, но в остальном совершенно не связанных друг с другом.
    Случайная связность: Элементы в модуле ничем не связаны, кроме того что находятся в одном и том же исходном файле. Это наименее желательная форма связности.

    Что предпочтительнее иметь в кодовой базе: статическую или динамическую коннасценцию?
    Статическая и динамическая типизация — это два разных подхода к программному коду, каждый из них имеет свои плюсы и минусы. В зависимости от контекста и целей проекта, один может быть предпочтительнее другого.
    1. Статическая типизация:
    — Преимущества: Компилятор проверяет все операции во время компиляции, что позволяет обнаружить ошибки раньше времени и предоставить большой уровень защиты от непредвиденного поведения.
    — Минусы: Может быть дополнительной нагрузкой для компилятора, и он может влиять на производительность, так как необходимо проверить все операции.
    2. Динамическая типизация:
    — Преимущества: Уменьшает общую нагрузку компилятора и повышает производительность, так как проверка типов выполняется во время исполнения.
    — Минусы: Может быть более трудно обнаружить ошибки и предоставить меньшую защиту от непредвиденного поведения, чем статическая типизация.
    В зависимости от вашей целевой аудитории и контекста проекта, вы можете предпочитать один подход перед другим. В большинстве случаев, динамическая типизация используется по умолчанию в языках с динамической типизацией (таких как Python), а статическая типизация — в языках со статической типизацией (таких как C++, Java).

    Глава 4. Основные свойства архитектуры
    Каким трем критериям должен соответствовать атрибут, чтобы считаться архитектурным свойством?
    Архитектурное свойство должно соответствовать трем критериям, чтобы считаться его частью:
    1. **Объективность**: Архитектурные свойства должны быть определены и оценены объективно, без привязки к личному мнению или предпочтениям.
    2. **Определение**: Архитектурное свойство должно иметь ясно заданное определение, которое может быть проверено и доказано.
    3. **Согласованность**: Архитектурные свойства должны соответствовать общим принципам, установленным в организации или общепринятых стандартах.
    Эти три критерия помогают определить, какие атрибуты могут быть архитектурными свойствами и позволяют создавать общую базу для всех дискуссий о системе.

    В чем разница между явным и неявным свойством? Приведите пример каждого из них.
    1. Явное свойство — это свойство, которое указывается в исходном коде программы и может быть изменено или прочитано во время выполнения программы. Например, если мы создаем класс с полем «name», то это явное свойство, которое можно установить и получить через методы getter и setter.
    2. Неявное свойство — это свойство, которое не указывается в исходном коде программы, а определяется во время её выполнения. Например, размер массива или объекта, который мы создаем на основе класса.
    3. Эксплуатационные свойства — это свойства, которые характеризуют процесс работы программы в конкретном окружении. Например, операционная система или версия компилятора.
    4. Структурные свойства — это свойства, которые характеризуют структуру программы в целом. Например, язык программирования или архитектура системы.
    5. Сквозные свойства — это свойства, которые характеризуют процесс работы программы в целом. Например, время выполнения или память, занимаемая программой.

    Приведите пример эксплуатационных свойств.
    1. Система в намеченных пользователем целях – это система, которая была разработана для достижения определенного результата или цели. В контексте проектирования архитектуры, такие системы могут включать в себя программное средство, которое помогает пользователю достичь своих целей.
    2. Явное и неявное свойства – это два типа характеристик системы, которые можно определить или оценить. Явные свойства (explicit properties) — это те, которые пользователи видят и могут изменить в графическом интерфейсе программной среды. Например, цвет шрифта или размер окна. Неявные свойства (implicit properties) — это те, которые пользователи не видят, но могут затронуть в процессе работы с программой. Например, скорость обработки данных или уровень достоверности результата.
    3. Эксплуатационное свойство – это характеристика системы, которая определяет ее возможности для пользователей в процессе использования. Например, система может иметь эксплуатационное свойство «производительность», которое оценивается как скорость обработки данных или время отклика пользователя.
    4. Структурное свойство – это характеристика системы, определяющая ее внутреннее устройство и организацию. Например, система может иметь структурное свойство «структура базы данных», которое описывает способ хранения информации в ней.
    5. Сквозное свойство – это характеристика системы, которая не относится к ее основному функционалу и может быть изменена независимо от других частей системы. Например, система может иметь сквозное свойство «время работы», которое не зависит от внутреннего устройства базы данных, но определяется ее состоянием и нагрузкой.

    Приведите пример структурных свойств.
    Пример структурного свойства может быть представлен следующими характеристиками архитектурной системы:
    1. Модульность — система разделена на независимые части, каждая из которых выполняет определенную функцию и может быть отдельно развита и тестирована.
    2. Иерархия — системные модули организованы в виде древовидной структуры, где корень является основной функцией, а остальные части — подмодулями этого корня.
    3. Абстракция — системные модули представлены в виде общих концептов или интерфейсов, скрывая детали реализации.
    4. Подключаемость — система может быть расширена путем подключения дополнительных модулей без необходимости изменять основной код системы.
    5. Изоляция — каждый модуль может существовать независимо от других, и внешним воздействиям на него не мешает работать остальная часть системы.
    6. Повторное использование — часто создаваемые модули можно использовать повторно в других проектах, упрощая процесс разработки и облегчая поддержку системы.

    Приведите пример сквозных свойств.
    Сквозное свойство в архитектуре означает, что элемент системы может быть изменен независимо от других компонентов. Например, если у нас есть система управления пользователями и системой бронирования гостиницы, то свойство сквозное может быть полезным в случае, когда мы хотим изменить политику бронирования. Если это свойство будет сквозным, то изменения в политике бронирования не потребуются нижестоящими компонентами системы (пользователями и гостиницами), а также могут быть использованы для других целей.

    class UserManagementSystem:
    def __init__(self):
    self.booking_policy = BookingPolicy()

    def change_booking_policy(self, new_policy):
    # Изменение политики бронирования без изменения других компонентов системы
    self.booking_policy = new_policy

    class BookingPolicy:
    def __init__(self):
    self.max_days_advance = 30 # Максимальное количество дней вперед, на которое можно забронировать

    В данном случае `change_booking_policy` является сквозным свойством. Оно может быть изменено независимо от других компонентов системы, и это не потребует изменений нижестоящими в стеке компонентов.

    Какое архитектурное свойство важнее: доступность или производительность?
    Архитектурные свойства, такие как доступность и производительность, имеют разное значение в зависимости от контекста использования.
    В целом, архитектор может считать, что доступность является важнее для многих систем, так как она обеспечивает возможность использования продукта людьми. Однако в некоторых случаях производительность может быть важной характеристикой системы, например для реального времени приложений или для обеспечения достаточно высоких скоростей работы.
    В зависимости от конкретной ситуации и целей использования системы, одно из этих свойств может быть важнее для других.
    Например, в системах с низкими требованиями к ресурсам (например, простых графических приложений) производительность может не иметь существенного значения и можно было бы переоценить доступность.
    В случае с системами высокого уровня защиты (например, криминалистических программах), производительность может иметь большой вес, а доступность может быть не так важна.
    В общем случае, архитектор должен учитывать и другие факторы при проектировании программно-аппаратного решения, включая требования к производительности, безопасности, требования к данным, масштабируемости и др.

    Глава 5. Выбор архитектурных свойств
    Почему рекомендуется ограничивать количество обязательно поддерживаемых архитектурных свойств (с названиями, оканчивающимися на -ость )?
    Причина 1: Эффективность и быстродействие
    Одним из ключевых принципов архитектуры программного обеспечения является обеспечение того, чтобы система могла удовлетворять высоким требованиям без ущерба для производительности или результативности. Если архитектор решит поддерживать больше, чем необходимо, это может привести к ненужной сложности и потенциальным «узким местам» в производительности системы.
    Причина 2: Реальные ограничения
    В реальности системы часто ограничены физическими ресурсами, такими как мощность оборудования, пропускная способность сети или количество пользователей. Если архитектор решит поддерживать больше, чем необходимо, в итоге может получиться система, которая не сможет эффективно справляться с этими ограничениями в реальном мире.
    Причина 3: Затраты и время
    Внедрение дополнительных функций или свойств может увеличить затраты на разработку и обслуживание. Кроме того, на их внедрение и тестирование уходит больше времени. Если архитектор решит поддерживать больше, чем необходимо, в итоге может получиться система, которая будет неэффективной с точки зрения затрат или будет медленно разрабатываться и обслуживаться.
    Причина 4: Гибкость и масштабируемость
    В архитектуре программного обеспечения гибкость и масштабируемость часто рассматриваются как два важных свойства. Поддерживая больше, чем необходимо, архитектор может ограничить способность системы адаптироваться к изменениям требований или масштабироваться, чтобы справляться с возросшими нагрузками.

    Верно ли, что большинство архитектурных свойств берется из бизнес-требований и пожеланий заказчиков?
    Да вы правы. Большинство архитектурных свойств основаны на бизнес-требованиях и требованиях клиентов. Они направляют разработку системы для удовлетворения конкретных потребностей бизнеса. Однако могут быть некоторые аспекты, которые прямо не указаны в требованиях, но все равно могут быть важны для архитектуры. Например, если магазин продает сэндвичи, ему может потребоваться учитывать потенциальные свойства, такие как часы пик или спрос клиентов на особые товары. Архитектор должен тщательно проанализировать каждое из этих бизнес-требований, чтобы определить необходимые архитектурные свойства.

    Если бизнес-стейкхолдеры заявляют, что важнее всего — время выхода на рынок (например, внедрение новых функций или релиз исправленной и обновленной версии ПО), то какие архитектурные свойства необходимо поддерживать?
    1. Архитектурные свойства, которые оканчиваются на -ость (например, масштабируемость, доступность, устойчивость), характеризуют функциональное поведение системы. Они определяют, какими образом эти свойства можно изменить или управлять в процессе разработки и эксплуатации.
    2. Неверно. Большинство архитектурных свойств, которые характеризуют функциональное поведение системы, могут быть изменены или управляемы в процессе разработки и эксплуатации. Однако, не все архитектурные свойства должны быть основаны на функциональном поведении системы. Например, свойство устойчивости может быть основано на возможности системы выдерживать непредвиденные изменения или сбои.
    3. Архитектор ПО должен учитывать время, когда стейкхолдер проекта может быть самым эффективным в своей области — например, при планировании релизов или разработке нового функционала. Однако, если стейкхолдер отвечает, что конкретная функция была нужна вчера, архитектор ПО должен понимать, что это может указывать на проблемы с планированием или реализацией.
    4. Архитектурные свойства определяются контекстом проекта и могут быть основаны на различных факторах, таких как среды развертывания, бизнес-факторы, техническая культура компании, установленные сроки и мастерства разработчиков. Архитектор ПО должен учитывать эти факторы при планировании проекта и определении архитектурных свойств.

    В чем разница между масштабируемостью и адаптируемостью?
    Различие между масштабируемостью и адаптируемостью в контексте программирования означает, что масштабируемость указывает на способность системы расти или изменять свой размер, основываясь на потребности. Она связана с возможностью добавления нового функционального уровня в систему без необходимости изменить ее существующий код.
    Адаптируемость, на другом конце этой шкалы, связана с возможностью системы менять свои функции в соответствии с новыми требованиями или условиями. Она не предполагает расширения размера системы, а предоставляет возможность ее изменять для удовлетворения нового потребления.
    В контексте программирования, масштабируемая система может быстро расти и обработать больше данных, а адаптируемая система может менять свои функции в соответствии с новыми требованиями.

    Вы узнали, что ваша компания планирует слияния и поглощения для существенного расширения клиентской базы. О каких архитектурных свойствах следует побеспокоиться?
    Архитектура вашей компании планирует слияния и поглощения для существенного расширения клиентской базы. Основными архитектурными свойствами, которые следует беспокоиться, могут быть:
    1. Масштабируемость: Ваша компания должна способна расти и увеличивать свою клиентскую базу вместе с ростом потенциальных клиентов.
    2. Взаимодействие между сервисами: Архитектура должна быть такой, чтобы различные компоненты системы могли взаимодействовать друг с другом без необходимости знать о конкретной реализации.
    3. Отказоустойчивость: Архитектура должна быть такой, чтобы система могла функционировать в случае отказа каких-либо компонентов.
    4. Управление ресурсами: Ваша компания планирует использование различных ресурсов на уровне предприятия, и архитектура должна обеспечить эффективное управление этими ресурсами.
    5. Бизнес-процессы: Архитектура должна быть такой, чтобы она могла поддерживать различные бизнес-процессы и не мешала им работать.
    6. Интерфейсы: Архитектура должна обеспечить удобное взаимодействие с пользователем, а также с другими системами.
    7. Безопасность: Ваша компания планирует использование различных технологий для защиты информации и данных, и архитектура должна обеспечить эту безопасность.

    Глава 6. Измерение параметров архитектурных свойств и управление их соблюдением
    Почему цикломатическая сложность является в архитектуре таким важным показателем для анализа?
    Цикломатическая сложность, как и многие другие метрики, играет важную роль в процессе анализа архитектуры. Она помогает оценить сложность кода, определить его модулярность и понять, как различные части системы взаимодействуют друг с другом.
    Цикломатическая сложность может быть использована для оценки уровня сложности кода, определения его модулярности и понимания взаимодействия различных частей системы. Это помогает в распределении работ между разработчиками, а также в планировании ресурсов для проекта.
    Также цикломатическая сложность может быть использована для идентификации зон с высокой степенью сложности, которые могут потребовать большего времени на анализ и улучшение.
    В конце концов, цикломатическая сложность является одним из основных инструментов для диагностики проблем в архитектуре кода и помогает понять ее состояние.

    Что такое архитектурная функция пригодности? Как такие функции могут использоваться для анализа архитектуры?
    Архитектурная функция пригодности — это мера, которая показывает, как хорошо система может отвечать заданным требованиям и ожиданиям пользователей. Она используется для оценки архитектуры системы в контексте ее функционального приспособления к различным типам работ, например, разработка, тестирование, эксплуатация и поддержка.
    Архитектурная функция пригодности может использоваться для анализа архитектуры системы различными способами:
    1. Оценка ее в контексте определенного сценария работы — например, оценивая качество системы при разработке или тестировании новой функции.
    2. Проверка соответствия архитектуры реальным требованиям — например, проверяя, что система может выполнять все запрошенные пользователями действия без необходимости изменять ее структуру.
    3. Предсказание производительности системы при различных нагрузках — например, используя функцию пригодности для прогнозирования времени выполнения операции или количества ресурсов, необходимое для обработки определенного уровня нагрузки.
    4. Определение точки перехода — например, определяя, какой уровень функциональности системы достаточно для завершения проекта или релиза.
    5. Выбор архитектурного стиля — например, выбирая между различными подходами к организации данных и логики приложения, чтобы найти тот, который лучше всего соответствует заданному уровню производительности, масштабируемости и другим архитектурным свойствам.

    Приведите пример функции пригодности для оценки степени масштабируемости архитектуры.
    def suitability_function(architecture):
    # Оцениваем степень масштабируемости архитектуры
    scalability = architecture['scalability']

    # Оцениваем степень производительности архитектуры
    performance = architecture['performance']

    # Оцениваем уровень отказоустойчивости архитектуры
    fault_tolerance = architecture['fault_tolerance']

    # Оцениваем степень безопасности архитектуры
    security = architecture['security']

    # В зависимости от полученных оценок возвращаем функцию пригодности
    if scalability > 8 and performance > 7 and fault_tolerance > 9 and security > 8:
    return "Высокая"
    elif scalability > 6 and performance > 5 and fault_tolerance > 7 and security > 6:
    return "Средняя"
    else:
    return "Низкая"

    Пример функции пригодности для оценки степени масштабируемости архитектуры. В данном случае мы используем простой подход, основанный на сравнении значений архитектурного свойства с определенными порогами. Более сложные методы могут быть использованы для более точного анализа степени масштабируемости архитектуры, учитывая множество факторов.

    Каков самый важный критерий какого-либо архитектурного свойства, на основании которого у архитекторов и разработчиков есть возможность создавать функции пригодности?
    Самым важным критерием для архитектурного свойства, которое позволит создавать функции пригодности, является его масштабируемость. Масштабируемая архитектура предполагает гибкость в обработке различного объема данных и трафика, что позволяет удовлетворить бизнес-требованиями без необходимости изменения архитектуры.

    Глава 7. Область действия архитектурных свойств
    Что такое архитектурный квант и почему он так важен?
    Архитектурный квант — это абстрактное представление системы, которое определяет ее основную структуру и функциональность. Он служит как инструмент для описания архитектурного стиля и способа организации кода на части.
    Архитектурный квант таков важен, поскольку он определяет основное поведение системы и ее функциональность. Он помогает в определении базового уровня архитектурного стиля и способа организации кода на части.
    Например, архитектурный квант может быть использован для описания системы как высоконагруженной (highly concurrent), так и распределенной (distributed). В первом случае, архитектурный квант может определять способ организации кода для обработки множества одновременных запросов. Во втором случае, архитектурный квант может указывать на использование распределенной архитектуры и способ организации кода для обработки большого объема данных.
    В целом, архитектурный квант — это абстрактное представление системы, которое помогает в определении основного стиля и способа организации кода на части. Он служит как инструмент для описания функциональности системы и ее архитектурной структуры.

    Предположим, что система состоит из единственного пользовательского интерфейса с четырьмя независимо развернутыми сервисами, каждый из которых содержит собственную отдельную базу данных. Сколько квантов будет в системе, один или четыре? Почему?
    В зависимости от того, как система разделена на сервисы и базы данных, количество квантов может быть одним или четырем.
    Если каждый из сервисов имеет собственную отдельную базу данных и не использует общие ресурсы, то в системе будет четыре кванта.
    Если же все эти сервисы совместно используют одну и ту же базу данных, то система может представлять собой один квант. В таком случае, административная часть системы будет управляться отдельно от клиентских сервисов и не будут разделены на отдельные кванты.
    Ответ зависит от конкретной архитектуры системы, которая определяет, как эти различные части (пользовательский интерфейс, сервисы и базы данных) взаимодействуют друг с другом.

    Предположим, что в системе имеется административная часть, управляющая статическими справочными данными (например, каталогом товаров и данными по складу), и клиентская часть, управляющая размещением заказов. Сколько должно быть квантов в этой системе и почему? Если вы полагаете, что должно быть несколько квантов, могут ли административный квант и клиентский квант иметь общую базу данных? Если да, то в каком кванте она должна находиться?
    Количество кубитов, необходимых в этой системе, зависит от сложности и требований вашего конкретного приложения. Однако общая оценка может быть следующей:
    Статические справочные данные. Эти данные, скорее всего, будут храниться в базе данных или аналогичной структуре, которая может эффективно обрабатывать операции чтения. Объем информации здесь будет зависеть от того, насколько подробными вы хотите, чтобы эти данные были (например, каталоги продуктов и сведения о запасах). Если статические эталонные данные велики, для них может потребоваться больше кубитов, чем если бы они были меньше.
    Размещение заказа: потенциально это может включать в себя сложный набор операций, которые необходимо выполнять последовательно или одновременно. Количество требуемых здесь кубитов будет зависеть от того, как будут реализованы эти операции, и от ресурсов, доступных для параллельной обработки.
    Административная часть: если существует административная часть, управляющая статическими справочными данными, ей также может потребоваться определенный объем вычислительной мощности для эффективного управления и обновления этих данных.
    Таким образом, без конкретной информации о требованиях и архитектуре вашей системы трудно указать точное количество необходимых кубитов. Однако приведенные выше пункты должны дать вам общее представление о том, сколько кубитов может потребоваться в каждой части вашей системы.
    —-
    В данной системе может потребоваться определенное количество квантов, основываясь на различных компонентах и операциям, которые будут в ней использованы.
    1. Административная часть: В этой части может потребоваться для управления статическими справочными данными, такими как каталог товаров и данные о складе. Для доступа к этим данным может потребоваться определенное количество операций чтения (чтобы получить информацию) и записи (чтобы изменить или обновить информацию).
    2. Клиентская часть: Эта часть отвечает за размещение заказов. Для этих операций может потребоваться определенное количество квантов, таких как создания нового заказа, обновления существующего заказа и удаления заказа.
    3. Система истории заказов: Для получения исторических данных о заказах (последние шесть месяцев) может потребоваться определенное количество квантов, чтобы обработать эти запросы и вернуть необходимую информацию.
    4. Оркестрация запросов: Оркестратор может быть ответственным за управление всеми входящими запросами, направленными к системе. Он должен уметь распределять эти запросы между различными компонентами системы и возвращать результаты в соответствии с поставленной задачей.
    Таким образом, количество квантов может быть определено как сумма всех операций, необходимых для обработки различных типов запросов и событий в системе.

    Глава 8. Компонентно-ориентированное мышление
    Мы определяем компонент как строительный блок приложения, то есть то, из чего делается приложение. Компонент, как правило, состоит из группы классов или исходных файлов. Как компоненты обычно проявляются в приложении или сервисе?
    Компоненты представляют собой основные строительные блоки для архитектуры программного обеспечения, то есть их можно считать частями приложения. Они чаще всего состоят из групп классов или исходных файлов, но в некоторых случаях они могут быть представлены другими формами.
    Компоненты обычно проявляются во время разработки приложения или сервиса следующим образом:
    1. **Метод или функция класса точки входа**: Архитекторы и другие специалисты, такие как разработчики, обычно предлагают метод или функцию класса точки входа для подключаемого компонента.
    2. **Создание на этапе компиляции и/или во время выполнения**: Подключаемый компонент может быть создан либо на этапе компиляции, либо во время выполнения приложения.
    3. **Формирование списка требований**: Создаваемая система формирует список требований к нему.
    4. **Определение требований командой разработчиков**: Требования определяются командой разработчиков во время процесса разработки ПО.
    Все эти способы помогают в определении компонентов и позволяют не попасть в ту или иную западную ситуацию.

    В чем разница между техническим и предметным разбиением? Приведите пример каждого из них.
    1. Контекст разделения в приложении или сервисе зависит от конкретной организации, продукта или услуги. В большинстве случаев техническое разбиение используется для организации кода и архитектуры системы, а предметное — для разделения функционала на основе бизнес-правил.
    2. Техническое разбиение (также известное как «логическое» или «структурное») делится на уровнями, которые представляют собой отдельные компоненты системы. Они могут быть классами, функциями, модулями или другими подобными единицами в зависимости от конкретной архитектуры и языка программирования. Например, в системе для управления библиотекой может быть разбиение на модули «пользователи», «книги» и «выдача книг».
    Предметное разбиение (также известное как «философское») делится на основе бизнес-правил. Он представляет собой физические объекты, которые могут иметь отношения друг к другу в системе. Например, в системе для управления библиотекой может быть разбиение на предметы «пользователь», «книга» и «выдача книги».
    3. Преимуществом предметного разбиения является его гибкость. Оно позволяет легко изменять функциональный набор системы без необходимости менять код, а также упрощает тестирование и отлаживание, так как одно изменение может повлиять на множество других компонентов.
    4. Техническое разбиение выгоднее предметного при условии, если у вас уже есть определенная архитектура системы и необходимо разделить функционал на основе этой архитектуры. Предметное разбиение выгоднее технически, когда ваш продукт или услуга имеет сложную бизнес-логику и необходимо разделить функционал на основе этой логики.

    В чем преимущество предметного разбиения?
    Преимущество предметной декомпозиции состоит в том, что она позволяет провести более детальный и структурированный анализ изучаемой проблемы или системы. Разбивая сложную систему на более мелкие и более управляемые компоненты, становится легче выявить и понять взаимосвязи между ними, что может привести к лучшим решениям и принятию решений.

    При каких обстоятельствах техническое разбиение будет выгоднее предметного?
    1. В приложении или сервисе можно разделить функциональными блоками, основанными на техническом и предметном разбиении.
    2. Техническое разбиение — это процесс разделения системы на отдельные части, которые можно установить, обновлять или заменять независимо друг от друга. Например, в приложении может быть техническое разбиение по разделу пользователей и управлению ролями. Предметное разбиение — это процесс разделения системы на части, которые связаны между собой в конкретной предметной области. Например, в приложении для учета товаров может быть предметное разбиение по разделу продуктов и категорий.
    3. Преимуществом предметного разбиения является его гибкость. Он позволяет изменять функциональность системы в соответствии с требованиями конкретной предметной области без необходимости менять основной код системы.
    4. Техническое разбиение будет выгоднее, если требуется изменить или заменить отдельную часть системы независимо от других частей. Например, для обновления интерфейса пользователя без изменения основной бизнес-логики. Предметное разбиение будет выгоднее, если требуется изменить функциональность системы в соответствии с конкретной предметной области. Например, для учета товаров в интернет-магазине.
    5. Вернемся к сценарию 1. Для проекта, который требует большого уровня связанности между модулями (например, система управления контентом), техническое разбиение может быть недостаточно. В таком случае предметное разбиение может потребоваться для обеспечения нужной функциональности и выполнения конкретных требований проекта.
    6. Бирюмочность (создание системы, которая может быстро меняться) и адаптируемость (возможность системы взаимодействовать с другими системами) — это основные характеристики архитектурного подхода. В техническом разбиении бирюмочность и адаптируемость могут быть высокой, но может потребоваться больше времени для создания и тестирования отдельных частей системы. В предметном разбиении бирюмочность и адаптируемость могут быть меньшими, но это позволяет более гибко решать конкретные задачи.
    7. В любом случае, для определения типа разбиения в архитектуре на основе пространства достаточно посмотреть на требования к системе и понять, какие части будут чаще всего изменяться.

    Что такое «Западня сущности»? Почему следование этому антипаттерну считается неудачным подходом к идентификации компонента?
    Использование концепции «Западня сущности» (Вестминстерской сущности) в разработке программного обеспечения относится к тенденции переоценивать важность определенного компонента или модуля, часто за счет других, не менее важных компонентов. Этот антипаттерн считается неудачным, поскольку может привести к непониманию того, как различные компоненты взаимодействуют и зависят друг от друга.

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

    Когда при идентификации ключевого компонента можно выбирать подход, основанный на рабочем потоке, а не на подходе актор — действие?
    Подход, основанный на рабочем потоке, следует выбирать в следующих ситуациях:
    1. Сложные и многозадачные процессы: Когда система должна обрабатывать сложные последовательности действий или параллельные задачи, которые требуют координации и оркестрации.
    2. Централизованное управление процессами: Если требуется централизованный контроль и отслеживание выполнения бизнес-процессов, например, для соблюдения нормативных требований или внутренней политики компании.
    3. Интеграция нескольких систем: Когда необходимо интегрировать несколько систем или сервисов и обеспечить согласованность данных и процессов между ними.
    4. Масштабируемость и гибкость: При необходимости легко изменять или расширять бизнес-процессы без значительных изменений в архитектуре системы.
    5. Мониторинг и отладка: Когда важен детализированный мониторинг процессов, возможность отслеживать состояния рабочих потоков и быстро диагностировать проблемы.
    Подход на основе рабочего потока позволяет сосредоточиться на управлении последовательностью шагов и их взаимосвязями, что делает его более подходящим для задач с вышеописанными характеристиками по сравнению с актор-ориентированным подходом.

    No Comments

Comments are closed.