Ответы пользователя по тегу Проектирование программного обеспечения
  • Как научиться декомпозировать задачи?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Во-первых, слово "не охота" не совместим с уровнем "мастер своего дела". Возможно, потому и начальство кричит... Как правило, когда процесс разработки выстроен и понятен всем заинтересованным лицам, крика значительно меньше, и разработчики появляются тоже в соответствии с планом, не раньше.
    Во-вторых, план - это живой постоянно изменяющийся инструмент руководителей, причём с разных сторон. Заказчик/подрядчик/субподрядчик/ещё кто-то. Если план понятный и "живой", постоянно актуализируемый, то кричать никто не будет - времени нет, надо свои задачи всем делать. А вот если план делают "для галочки", то крика всегда много.
    В-третьих, распараллелить нельзя только жёстко последовательные задачи. Причина - либо технологическая (нельзя данные залить, пока база не создана), либо ограничения ресурсов (дядя Ваня зальёт данные, когда ему компьютер настроят). Всё остальное решается декомпозицией задач с получением понятных промежуточных результатов. SMART ваше всё.
    В-четвёртых, да, план должен быть основан на принятых технических решениях. Иногда эти решения при реализации (и даже позже!) признаются неверными, и приходится перепроектировать систему, и тогда нужно менять план работ. Это нормально и даже неизбежно, особенно для сложных систем. Но тут уже в плане нужно предусматривать работы по управлению рисками, а в самой системе надо предусматривать такие решения, которые позволят изолировать проблемные места и не допустить, чтобы ошибки проектирования или изменения требований не привели к слишком высоким затратам.
    Итого, что крик стоит, и что разработчики ждут - это прямые последствия ошибок планирования и отношения к плану. Не ошибается тот, кто ничего не делает. Вы хорошо знаете аналитику, поэтому с детализацией требований вопросов нет. Но надо развиваться в технологиях, в особенностях процессов разработки, в особенностях управления проектом. Тогда планы будут более реалистичными. Но ещё надо перестать смотреть на план как одну из стадий "водопада". План меняется всё время, планирование продолжается от начала и до конца проекта минимум, а чаще - в течение всего жизненного цикла системы. Тогда и нервы у всех участников работ лишний раз никто не полоскает.
    И ещё про детализацию. Задача длительностью 4 часа сильно отличается от задачи длительностью 5 часов. Потому что первую задачу можно выполнить, не отвлекаясь, один раз "войдя в творческий поток". А задачу длиннее 4 часов исполнитель без отвлечений не выполнит никогда (в смысле 95% случаев, остальные 5% - тоже с разрывом "потока" и исключительно на своей самодисциплине). Итого, 5-часовая задача сразу превращается в 6-8 часовую. Фокус-фактор выше 65% не бывает. Так что декомпозируйте задачи так, чтобы они реально были исполнимыми в указанные сроки.
    Ответ написан
    Комментировать
  • Как смоделировать пошаговый бизнес-процесс в приложении?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    По-хорошему нужен движок для моделирования и контроля бизнес-процессов. С учётом их версионирования. На Java в своё время пользовался Alfresco Activity ( https://www.alfresco.com/products/business-process... ). Есть comunity-редакция. В .NET есть WWF ( https://msdn.microsoft.com/en-us/library/jj684582.aspx ), но я сам им не пользовался.
    Ответ написан
    1 комментарий
  • Когда использовать микросервисы, а когда database join?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Первый подход требует постоянной доступности внешнего стороннего сервиса. Без этого работать не будет совсем. Я бы делал кэш нужных данных в своей системе, обновляемый с заданной периодичностью клиентом, подключающимся к сервису на стороне ФИАС (лезть в БД, особенно чужую, напрямую не комильфо). Плюс такого кэша в том, что ваша система будет работать независимо от того, доступен ли источник данных на стороне ФИАС, или нет. Ещё один плюс - слой абстракции от внутренней инфраструктуры ФИАС: сервис будет меняться гораздо реже структуры БД. Дополнительно можно контролировать версии передаваемых данных.

    А дальше - полёт фантазии. Кроме указанных вариантов можно рассмотреть ещё несколько решений. Например, по расписанию в БД заполнять некоторую таблицу-"витрину" нужного формата, из которой уже напрямую отдавать данные куда угодно. Такое решение удобно, если построение "витрины" происходит долго из-за объёмов данных. Заранее готовите данные и потом моментально отдаёте.
    Ответ написан
    Комментировать
  • SOLID. Dependency inversion. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций. Что имеется ввиду под "детали"?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Роберт Мартин в своё время говорил по этому поводу, что не должно быть зависимостей от конкретных классов, а связи должны вести на абстрактный класс или интерфейс. Считайте, что "детали" - суть конкретная реализация, а "абстракция" - это некая выделенная основа, необходимая и достаточная для определения связи.
    Ответ написан
  • Какой самый лучший путь развития до архитектора ПО?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Architecture Skills Framework
    Грубый перевод таблиц был здесь: Что должен знать и уметь архитектор
    Ответ написан
    Комментировать
  • Какую литературу почитать о стандартных решениях в веб-приложениях для бизнеса?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Есть хорошая книжка, которая может служить и учебником, и справочником. "Руководство Microsoft по проектированию архитектуры приложений, 2 издание" (download.microsoft.com/documents/rus/msdn/%D1%80%D...).
    Если закрыть глаза на рекомендации по использованию именно технологий Microsoft, то будет вполне целостная картина того, как решаются самые разные вопросы проектирования, от самого верхнего уровня до деталей реализации. Рассматриваются, в том числе, и вопросы, связанные с реализацией web-приложений и сервисов, причём в общем контексте enterprise-системы.
    Ответ написан
    Комментировать
  • Какой ваш оптимальный набор паттернов?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Я отношусь к паттернам проще. Паттерн - это некий компонент архитектуры (логической, физической, поведения и т.п.), который я как архитектор могу многократно применять при работе над архитектурой системы. Есть компоненты, которые известны всем, и есть те, которые нужны только мне вследствие специфики разрабатываемых мной систем. Я могу объединять неколько паттернов в один, могу дорабатывать существующий паттерн до нужной мне кондиции, могу что-то сделать совсем своё.

    Некоторые из общеизвестных Вы перечислили. Ещё можно посмотреть, например, здесь: Catalog of Patterns of Enterprise Application Arch.... Возможно, многие из этих паттернов Вы тоже используете, только не называли их в своём вопросе. Но со временем, возможно, у Вас накопятся собственные наработки.
    Ответ написан
    Комментировать
  • Как избавится от дублирования кода?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Я бы создал класс AbstractClass, чтобы CommonClass и ConcreteClass1 наследовались от него. ConcreteClass2 должен наследоваться от ConcreteClass1. В AbstractClass вынес бы из CommonClass те члены, которые должны быть общими для всех классов. Всё.
    Ответ написан
    Комментировать
  • Как реализовать архитектуру масштабируемого Websocket сервера?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Мы аварийные ситуации отслеживаем мониторингом. Как только сервер отваливается, мы обрабатываем соответствующее событие (в Вашем случае, как я понял, это будет коррекция данных). Скорость реакции зависит от того, как быстро мониторинг узнает о сбое. В любом случае есть некоторое время, когда клиенты могут получить устаревшую информацию.

    Сбои бывают разные. Крах процесса, крах ОС, отказы оборудования. Тут нужен определённый анализ угроз для Вашей системы. Мониторинг должен отрабатывать все критические ситуации.

    Ещё одним возможным решением может быть поднятие нового сервера из горячего резерва, который возьмёт на себя работу с данными "погасшего" сервака. Но это минуты отсутствия реакции сервера...
    Ответ написан
    Комментировать
  • Как получить доступ к объекту А содержащего объект Б из объекта Б?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Всё просто. Делаете класс для объекта А. Затем - класс для объекта Б. В классе Б объявляете поле a типа А. В классе А - поле b типа Б. Изначально при создании экземпляра класса А ссылка на объект класса Б в поле b будет пустой (null). При создании экземпляра класса Б его поле a со ссылкой на объект класса А тоже будет содержать пустое значение null. Пусть для объекта А задан метод Link, который в качестве параметра получает ссылку на объект класса Б. Внутри этого метода можно присвоить полю A.b указанную ссылку на объект Б, а затем полю Б.а можно присвоить ссылку на объект А, метод Link которого был вызван.

    Объект Б можно создавать в конструкторе объекта А, тогда там же задавайте значения полям.

    Аналогично, можно в классе А задать поле типа массив объектов Б. При внесении нового объекта в массив можно задавать ссылку на А в поле Б.a.
    Ответ написан
    Комментировать
  • Проектирование архитектуры классов модели. Какой из двух вариантов выбрать?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Класс "Заказ" может иметь указатель на экземпляр класса "Заказчик" (в случае ООП это будет ссылка на объект). Каждый "Заказчик" может иметь список "Заказов" (массив указателей на сделанные им заказы).

    "Заказ" должен быть композицией нескольких составных частей - "работ", каждая из которых должна иметь указатель на исполнителя, а "Исполнитель" может иметь массив указателей на "работы", которые ему назначены.

    При таком исполнении не нужно смотреть все заказы, чтобы выявить относящиеся к данному заказчику. И не нужно отдельно выбирать работы для исполнителя. Вы же работаете с классами, а не с таблицами БД: тут логика несколько иная. Реляционные БД основаны на теории множеств, а не на теории взаимосвязанных объектов.
    Ответ написан
    Комментировать
  • Как реализовать сценарий транзации?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Вы не смотрели класс TransactionScope? https://msdn.microsoft.com/ru-ru/library/system.tr...(v=vs.110).aspx
    Ответ написан
    Комментировать
  • Программная архитектура: что почитать?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Мартин Фаулер. Архитектура корпоративных программных приложений. - Пер. с англ. — М.: Издательский дом "Вильяме", 2006.

    Руководство Microsoft по проектированию архитектуры приложений. 2-е издание. - Microsoft Patterns & Practices Team, 2010.

    Анализ требований и создание архитектуры решений на основе Microsoft .NET - Microsoft, Русская редакция, 2004.
    Ответ написан
    Комментировать
  • Есть ли инструменты для разработки архитектуры проекта?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Sparx Enterprise Architect
    Ответ написан
    Комментировать
  • Вопрос тем, кто недавно читал книгу Боба Мартина - "методика гибкой разработки на c#".?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Ищите реализацию метода Change(e); Этот метод производит изменения и сохраняет результат.
    Ответ написан
  • К какому классу можно отнести описанную систему?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Боюсь, не смогу дать чёткого решения проблемы, слишком мало данных. Но может, мой опыт пригодится.

    В своё время делал комплексную систему безопасности. Это был коробочный продукт, при мне выпустили 4 версии. В системе требовалось привязать кучу оборудования: видеокамеры, считыватели, СКУД, сканеры документов и прочую снедь. Проблему решили просто: были созданы унифицированные абстрактные классы под каждый класс оборудования: для сканеров (получение сканов документов), под СКУД (информация о проходах), под считыватели (события чтения карт, билетов, биометрии), под камеры (получение видео и фотоизображений), под системы распознавания изображений... Абстрактные классы имели абстрактные методы для получения входных данных и реализацию методов дальнейшей обработки информации, соответствующих данному классу устройств. Реализация конкретных классов для конкретных моделей устройств была вытащена в плагины, которые подцеплялись динамически.

    Мы всегда знали, какие устройства поддерживаем, и делали под них соответствующие плагины. Интерфейсы и абстрактные классы переделывать было не нужно, они не менялись. Допустим, было несколько считывателей: магнитные карты нескольких типов, билеты со штрих-кодом, отпечатки пальцев... Но они все были нужны, чтобы выполнить одну функцию: опознать владельца предъявленного идентификатора. Поэтому реализация плагина была для каждого устройства своя, а вот интерфейс его взаимодействия с ядром системы - один на все устройства.
    Ответ написан
    Комментировать
  • С чего начинать проектировать приложение?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Предположим, что с будущей функциональностью Вы определились. Тогда Вы точно знаете, кто или что будет поставлять данные, и кто/что будет их потреблять.

    Теперь выясните, кто будет обращаться к вашей системе, чтобы передать или забрать данные, а к чему будет обращаться Ваша программа. Те системы или пользователи, которые обращаются к программе сами, нарисуйте схематически на листе бумаги вверху. Те, к которым будет обращаться программа (включая БД), - снизу.

    Теперь нарисуйте под каждым нарисованным сверху субъектом прямоугольник с названием UI или API - это интерфейсы, к которым будет обращаться пользователь или внешняя управляющая система. Иногда UI тоже может обращаться к API. Объедините все прямоугольники с UI одним контуром и обзовите слоем UI. Объедините все прямоугольники с API и обзовите слоем сервисов.

    Для систем, нарисованных снизу, укажите компоненты, которые будут отвечать за доступ к этим системам. Объедините все эти компоненты одним контуром и обзовите слоем доступа к данным.

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

    Теперь справа нарисуйте несколько длинных прямоугольников снизу доверху и написшите в них: логирование, конфигурация, мониторинг производительности, обработка исключений и что-то ещё, что является общей инфраструктурой (или сквозной функциональностью) для всех слоёв вашей программы.

    Получите логическую архитектуру. Разбросайте слои по серверам - получите физическую архитектуру.

    А дальше - детально прорабатывайте каждый маленький квадратик. Всё.
    Ответ написан
    2 комментария