Ответы пользователя по тегу Проектирование программного обеспечения
  • Какой open source проект на node.js выбрать как эталон для архитектуры и стиля?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    До этого поделайте лабы на nodeschool.io и у меня на https://github.com/HowProgrammingWorks
    Потом изучайте исходный код ноды для вникания в стиль: https://github.com/nodejs/node/tree/master/lib и уж потом проект.
    Ответ написан
  • Высоконагруженные системы, каковы принципы разработки?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Про cgi, python, php, apache нужно сразу забыть. Лучше забыть и про http и вебсокеты. А смотреть на C/C++, node.js, Go, in-memory базы данных, TCP сокеты.
    Ответ написан
  • Будет ли целесообразным в БД MySQL пол хранить в виде строки?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Великий секрет архитектуры программирования заключается в том, что 0 для женского и 1 для мужского.
    Ответ написан
  • Куда двигаться профессионально?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Чтобы расти, нужно разувериться в уже усвоенном, разрушить его, отвергнуть все эти концепции и выстроить их заново. Критически подойти к тому, что было взято из авторитетных книг и статей, даже к тому, что было добыто опытом из собственных проектов.

    Полезно поднять старых авторов, потому, что все уже было в веках, например, "Заметки по структурному программированию" Дейкстра и "Алгоритмы + структуры данных = программы" Вирта. Послушать лекции таких людей, как Александр Степанова:
    "Преобразования и их орбиты"
    Часть 1 https://youtu.be/QmuMHtbO4ug и Часть 2 https://youtu.be/uCGifwlgAQg
    "Наибольшая общая мера последние 2500 лет"
    Часть 1 https://youtu.be/Dx1MZh6KYCk и Часть 2 https://youtu.be/zqETgaYxlt0

    Полезно приступить к новой сложно задаче, принципиально другой. Вот Вы занимались веб-сервисами, а возьмите проект, в котором это не подходит, где нужна связь, основанная на UDP протоколе или RPC, и с поддержкой состояния (STATEful) соединения между клиентом и сервером через шину событий или различные конструкции паттернов комуникации, см. ZeroMQ zguide.zeromq.org/page:all Если занимались корпоративными системами, то возьмите промышленную автоматизацию, она разрушит Вашу уверенность в железобетонных подходах. Если занимались вебом, то возьмите распределенные вычисления или системное программирование.

    Перейти к новым парадигмам, например к функциональному программированию, реактивному, манадам и т.д. Если привыкли делать все по накатанной, то можно перейти от программирования к метапрограммированию и придется все переосмыслить. Тут мои статейки по этому поводу: habrahabr.ru/post/137446 и habrahabr.ru/post/227753

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

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Тут мой ответ по связанной теме: Как составить план проектирования проекта?
    А кроме того, хочу отметить, что начинать проект с дизайна (если Вы имеете в виду дизайн пользовательского интерфейса) это в большинстве случаев очень плохая практика. Проект нужно начинать с концепции, а потом переходить к информационной модели, потом к структурам данных (как в базе, так и в памяти) и уже потом только понятно, что на экране будет делаться. Исключение могут составлять игры, электронные книги, анимационные, интерактивные и подобные произведения, которые являются в большей степени произведением визуального искусства, чем программным продуктом. Из средств проектирования посмотрите разные реализации UML и RUP (Rational Unified Process), например Rational Rose. Вот, посмотрели, и понравилось - берите, а стало страшно - значит это Вам не нужно. Это для проектов крупных и очень крупных. Что точно нужно, так это уметь рисовать ER-диаграммы на бумажке карандашом, архитектуру модулей программной системы и железную инфраструктуру для развертывания. На большинство вопросов, которые Вы задаете, ответы можно дать только относительно конкретного проекта. Иногда нужны автоматизированные средства проектирования, иногда они не нужны и все можно сделать в уме и сэкономить время. Это очень зависит от задачи и опыта. Но что определенно, так не следует разводить лишней бюрократии,
    Ответ написан
  • Repository или CQRS?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Вот так всегда, очаровались красивой идеей, где-то что-то понравилось, руки чешутся применить... А нужно оно или не нужно... Отталкивайтесь от того, что хотите сделать, а Вы об этом так и не рассказали, и уже потом можно переходить к тому, какую парадигму выбрать, потом выбирать паттерны, фреймворки, библиотеки (но лучше как можно меньше их конечно). Вот для чего Вам CQRS? Что он будет решать и почему без него не лучше? Вы не сможете ответить на эти вопросы если не будете идти от задачи. А потом так и выходит: "что не напишу - все контроллер выходит, это наверно потому, что я все время думаю о контроллерах" )))
    Ответ написан
  • Как построить приложение клиент-серверной архитекутры?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Клиент может быть как браузерное, так и оконное приложение (например на C#, Java, но это уже редко используется, разве что в тех случаях, когда клиентское приложение должно локально взаимодействовать с API операционной системы или оборудованием и должно выводить такую графику, как браузерное приложение не может, например в некоторых играх, где нужно плотно работать с видеокартой, а из браузера ее не достать), а браузерное приложение - тут уж в любом случае JavaScript. Если оконное, то хватит и IP для связи (пишем IP и порт в конфиг), а браузерное - гораздо удобнее его открывать через доменное имя будет. Между клиентом и сервером Вам нужно будет обмениваться данными, для этого нужно выбрать: протокол и формат сериализации. Независимо от того, будет ли клиент браузерный или оконный протокол лучше всего брать HTTP (его можно проксировать и масштабировать, к такому API потом проще будет обращаться из других приложений, когда понадобиться развитие системы). Но обычный HTTP это односторонний поток запросов от клиента к серверу, а может оказаться, что для задачи нужно и обратный поток, от сервера к клиенту, например, чтобы передавать события, которые происходят на сервере, если их вызвали другие пользователи или серверные задачи. Для трансляции событий нужен протокол с установлением соединения, т.е. такой, где связь поддерживается долгое время и сервер может прислать сообщение без запроса, т.е. чтобы клиенту не довелось каждые 2 секунды переспрашивать сервер, нет ли уже каких-то данных. Для этого подойдет SSE (Server-Sent Events) это расширение HTTP протокола, но он односторонний, от сервера к клиенту, а клиент все свои запросы отдельно должен присылать, делая HTTP GET/POST запросы. Можно так же использовать WebSocket, он двусторонний, и через него можно устроить обмен данными в обе стороны, но SSE гораздо проще в реализации и я советую именно его. Теперь нужно организовать API на сервере, я для этого советую Node.js, это мой выбор, а причины я поясняю тут habrahabr.ru/post/204958 Ну и выбрать СУБД, из реляционок рекомендую PostgreSQL www.postgresql.org а из объектных (документных) MongoDB https://www.mongodb.org/ Ну и если все компоненты подходят, то вот мой сервер приложений, в котором я уже все это собрал habrahabr.ru/post/247543
    Ответ написан
  • Архитектура проекта для инвестора?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Ну... в Вашем случае, главное, чтобы инвестор не читал Тостер, а архитектуру можно сделать и после завершения проекта ))) А вообще моя лекция по архитектуре для ноды (но в ней есть много общих вопросов и полезных мыслей): https://youtu.be/Try7lmWikao И на Хабре есть специальный раздел "Анализ и проектирование систем" где проскакивают статьи по архитектуре, как например: habrahabr.ru/post/204958 Нарисуйте связь компонентов системы СУБД-сервер-клиент (трехзвенка, или больше компонентов, если есть), нарисуйте уровни по ISO/OSI, слои абстракций, дайте спецификацию API. Вот тут есть я даю расширенный план проектирования, он должен помочь: Как составить план проектирования проекта?
    Ответ написан
  • Как составить план проектирования проекта?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Идея/концепция к проектированию не относится, это отдельный предварительный этап. Для проектов побольше, и в общем случае, проектирование включает такие шаги, многие из которых, конечно, можно пропустить или сократить до минимума, если задача не сложная:
    1. Системный анализ и изучение предметной области
    2. Формирование требований к разрабатываемой системе
    3. Архитектуная задача, которая сводится к простой формуле: разделять, называть и связывать подсистемы
    3.1. Декомпозиция сложных задач
    3.2. Слои (построение слоев абстракций)
    3.3. Планирование топологии системы, программной и серверной инфраструктур
    3.4. Решение вопроса интеграции подсистем, программные интерфейсы, контракты и связывание
    3.5. Интеграция с унаследованными приложениями
    3.6. Минимизация изменений, для случаев, когда постоянно происходят изменения в предметной области
    4. Выбор инструментов решения
    4.1. Выбор парадигм программирования и языков
    4.2. Выбор технологий и платформ
    4.3. Выбор моделей данных, алгоритмов и библиотек
    4.4. Выбор топологий и протоколов
    4.5. Выбор паттернов программирования
    5. Предварительные исследования
    5.1. Проверка гипотез, эксперименты
    5.2. Изучение особенностей технологий
    5.3. Прототипирование
    6. Задачи обеспечения надежности
    6.1. Планирование безопасности и защиты от несанкционированного доступа
    6.2. Планирование отказоустойчивости
    6.3. Планирование мер по обслуживанию системы в режиме эксплуатации
    6.4. Задачи высоких нагрузок, балансировки и масштабирования, если таковые предполагаются
    7. Организация процесса разработки
    7.1. Жизненный цикл программной системы
    7.2. Конвенции кода, соглашения и стандарты
    7.3. Оценка необходимых временных и финансовых ресурсов для разработки системы
    7.4. Календарный план
    7.5. Анализ и минимизация рисков, выявление слабых мест технологий и коллектива
    7.6. Закрепление принципов управления процессом разработки и корректировки задания в процессе
    8. Сборка технического задания из результатов всех предыдущих пунктов
    Ответ написан
  • В каких ситуациях используется шаблон фабрика в Javascript?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Вот три основных способа использования фабрик в JavaScript:

    Фабрика объектов
    // Объявление фабрики объектов
    function Idiot(name) {
      return { name: name };
    }
    // создание экземпляра объекта
    var idiot1 = Idiot('Bill');
    console.dir(idiot1);

    Фабрика классов
    // Объявление фабрики классов
    function PhilosophySchool(schoolName) {
      return function Philosopher(name) {
        return { name: name, school: schoolName };
      };
    }
    
    // Создание класса
    var Stoicism = PhilosophySchool('Stoicism');
    var philosopher = Stoicism('Marcus Aurelius');
    console.dir(philosopher);

    Фабрика прототипов
    // Объявление базового прототипа
    function Engineer(specialization) {
      this.specialization = 'Software';
    };
    
    Engineer.prototype.getName = function() {
      return this.specialization + ' engineer ' + this.name; 
    }
    
    // Объявление фабрики
    function University(specialization) {
      function factoryConstructor(name) {
        this.name = name;
      };
      factoryConstructor.prototype = new Engineer(specialization);
      return factoryConstructor;
    }
    
    // Создание конструктора инженеров-программистов
    SoftwareEngineer = University('Software');
    
    // Создание экземпляра инженера-программиста
    var alex = new SoftwareEngineer('Alex');
    console.dir(alex.getName());
    Ответ написан
  • Какова архитектура крупных приложений на низкоуровневых языках?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    ООП это не архитектура, а парадигма. Скорее всего Вы хотели спросить, какие есть паттерны проектирования в парадигмах процедурного и структурного программирования. Перечислю кратко: модули (структурные блоки, библиотеки, часто построенные в иерархическую систему при помощи dependency injection), интерфейсы (наборы экспортируемых функций, которые видны снаружи модуля), шаблоны (функции, абстрагированные от типов данных, при помощи которых парадигма обобщенного программирования позволяет порождать типизированные реализации), слои (как ни странно, но до ООП тоже были абстракции, они реализовывались при помощи принципа разделения модулей на слои, т.е. группы модулей, реализующие более низкоуровневые или более высокоуровневые задачи, программирование обычно начинается с самого высокого слоя абстракций, из него можно использовать только вызовы на 1 слой ниже, но не на 2 слоя, т.е. нельзя смешивать абстракции и пропускать слои, обращаясь, грубо говоря, от нажатия кнопки сразу к кластеру на диске), заглушки (должны Вам должны быть известны, это функции и модули без реализации, необходимые чтобы запускать и отлаживать еще не дописанную программу, они могут выводить вызовы к ним на экран или в логи, а состоять только из возврата правдоподобных но не настоящих данных). Так же есть много паттернов структур данных, которые тоже очень сильно упрощают жизнь, если выбрать определенную их реализацию для своего проекта и придерживаться принципа однородности структур данных, например, не использовать две разные реализации двусвязных списков в одной программе (или модуле). Структуры данных вполне заменяют объекты, более того, работают они несравнимо быстрее, не создают проблемы неоднозначности моделирования, как в ООП например, когда Вы не можете решить, где должен находиться метод "сесть" у "жопы", у "стула" или у их общего контейнера "мир", в котором это происходит. Распространенные структуры данных: набор полей, список (в т.к. односвязный, двусвязный, циклический и т.д.), стек, дерево (тоже может быть от односвязного до пятисвязного с вариациями), множество, очередь, ассоциативный массив и хеш-таблица. Все, устал писать, рекомендую почитать Дэйкстру, Вирта, Кнута. А смириться с отсутствием ООП может помочь занятная статья в стиле холиварного срача: blogerator.ru/page/oop_why-objects-have-failed
    Ответ написан
  • Как программировать опросы, анкеты?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Разумных вариантов миллиарды. А идиотских еще больше. Это как спросить, как лучше сделать автомобиль? Если бы был ответ на это вопрос, то была бы одна марка и одна модель.
    Я бы советовал сделать описание вопросов на JSON, загружать эти данные со страницей или отдельным запросом, а потом рендерить на клиенте HTML из данных.
    [
      { question: "Как Вас зовут?", type: "input" },
      { question: "Существует ли истина?", type: "select", answers: ["да", "нет"] },
      { question: "Как возможна справедливось?", type: "select", answers: ["легко", "трудно", "ни как"] }
    ]

    Еще посмотрите React, чтобы узнать как нужно и Angular, чтобы узнать как не нужно, поколупайте разные клиентские шаблонизаторы. Нужно набраться опыта, чтобы спроектировать это лучьше других.
    Ответ написан
  • В чем отличие сервисной шины предприятия(ESB) от брокеров сообщений (например RabbitMQ)?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    ESB это обычно API в сервисной архитектуре, это RPC или REST, но принцип - атомарный вызов и получение ответов в виде кусков данных, это диалог в стиле клиент-сервер. А вот MQ - это совсем другое, это шины сообщений, тут вообще не происходит диалога в стиле запрос-ответ, а обмен данными происходит по принципу очередей сообщений, которые распределяются между каналами обработки (используется для масштабирования). По сути MQ - это реализация СМО (системы массового обслуживания), по которым можно найти много теории и которые уже давно широко используются в автоматизации технологических процессов на производстве, для транспорта и перевозок, в других сферах. RabbitMQ я не использовал, а про ZeroMQ могу сказать, что это гораздо больше, чем MQ. ZeroMQ - это не только шина событий, но и множество других паттернов обмена данными, как запрос-ответ, публикация-подписка и т.д. Посмотрите полный список этих паттернов: zguide.zeromq.org/page:all Из них можно собирать различные коммуникационные конфигурации. Шины сообщений и броккеры могут использоваться для построения ESB, но как одна из вспомогательных технологий.
    Ответ написан
  • В чём разница между проектированием и архитектурой?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Если коротко, то архитектура - это смесь науки и искусства, а проектирование - это смесь технологий и дизайна.

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

    Что есть архитектура?

    Это архитектурная задача:
    • Выделить и назвать модули, построить связи
    • Скомпоновать подсистемы в систему

    Выбор идей и инструментов:
    • Парадигмы, стандарты, модели данных
    • Технологии, фреймворки, паттерны
    • Модели взаимодействия модулей
    • Выбор топологии
    • Протоколы и форматы данных

    Задача интеграции:
    • Стыковка модулей еще до их разработки
    • Определить внешние интерфейсы (связи)

    Что есть проектирование?

    Инженерная задача:
    • Планирование и детализация модулей
    • Спецификация модулей, компонентов, вплоть до классов, методов и функций
    • Моделирование данных (ООП или структуры памяти)
    • Разрабока ER-моделей и структур БД
    • Оптимизация

    Задача моделирования:
    • Сделать прототип, макет, пилотный или пробный экземпляр
    • Математическое моделирование
    • Тестирование и апробация моделей
    • Проверка идей и алгоритмов
    • Нагрузочное тестирование

    Задачи эксплуатации:
    • Подготовка системы к эксплуатации
    • Внедрение
    • Инженерная поддержка
    Ответ написан
  • К какому классу можно отнести описанную систему?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Тут есть задача максимально отвязать оборудование от ПО. Конечно, ПО должно знать о структуре и возможностях оборудования, но эти знания можно обобщить и разработать специализированный язык-посредник, т.е. метаязык для формального описания протоколов (программных интерфейсов) устройств. При чем, синтаксические конструкции свои делать не нужно, лучше взять синтаксис, для которого уже разработаны распространенные и оптимизированные парсеры, например JSON. Таким образом, ПО будет знать не интерфейс оборудования, а языка описания этого интерфейса. Точнее, обобщенные элементы интерфейса, каждому из которых поставлены в соответствие обобщения более высокого порядка: команда (процедура, метод), параметр, датчик, измерение, и т.д. В этом метаязыке можно предосмотреть не только декларативные конструкции описательного характера, но и активные, включив в него скрипты например на JavaScript, которые могут описывать алгоритмы работы с теми же структурами, которые метаязык и описывает. Из декларативной части можно динамически строить и пользовательский интерфейс и связывать его с формированием конкретных команд, отправляемых в устройство. Более подробне описать не могу, т.к. не знаю специфики Ваших задач. О метапрограммировании можно кое-что почитать тут: habrahabr.ru/post/227753 и тут: habrahabr.ru/post/137446 ну может еще вот тут: habrahabr.ru/post/154891
    Ответ написан
  • Есть ли инструменты для разработки архитектуры проекта?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Комплексное решение Rational Rose - www-03.ibm.com/software/products/ru/ratirosefami Для баз данных есть хорошие инструменты ErWin, BpWin - erwin.com Еще есть Visual Paradigm www.visual-paradigm.com но его я не пробовал. Думаю, что должны быть и другие альтернативы, можно гуглить по словам UML, RUP, software architecture modeling tools. Практически все они сводятся к UML диаграммам из которых потом можно скомпилировать скелет приложения, структуру каталогов и файлов, зачатки документации, заголовки библиотек, и т.д.
    Ответ написан
  • Как придумывать осмысленные имена для классов?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Какое крутое признание, это действительно уникально что Вы понимаете, что в этом что-то не так. Большинство разработчиков что не сделают, все контроллером зовут. Я думаю, что нужно больше читать и развивать словарный запас, кругозор и сознание, даже не обязательно англоязычную литературу, научно-техническая лексика по большей части интернациональна. Читать можно конечно и статьи в научно-популярных журналах и художественную литературу, но мне ближе и я советую ученых, программистов и философов: Дональд Кнут, Гради Буч, Декарт, Кант, Марк Аврелий, Лао Цзы, Спиноза, Паскаль, Платон, Аристотель, Мамардашвили, Пятигорский, Шантидева, Рассел, Хомский, Норберт Винер, Глушков, Канторович, Лебедев, фон Берталанфи, Уильям Эшби, Дейкстра, извините, если кого не вспомнил, кто вот первый вдруг на ум пришел.
    Ответ написан
  • Программная архитектура: что почитать?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Может будет интересно посмотреть видео с моего доклада на JSLab в Одессе https://youtu.be/Try7lmWikao и слайды от доклада отдельно: www.slideshare.net/tshemsedinov/nodejs-architecture
    Ответ написан