tgoop.com »
United States »
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc. » Telegram Web
Как любил повторять один известный исторический деятель - «короче», «яснее». Вот это видео очень хорошо демонстрирует этот принцип:
https://vt.tiktok.com/ZS62A4GXs/
Примерно так же должен изъясняться и архитектор. Обратите внимание на отсыл к Закону Миллера в этом видео, и на акцент на визуализацию.
https://vt.tiktok.com/ZS62A4GXs/
Примерно так же должен изъясняться и архитектор. Обратите внимание на отсыл к Закону Миллера в этом видео, и на акцент на визуализацию.
TikTok
TikTok · Сергей
615.9K likes, 9262 comments. Check out Сергей’s video.
👍4🤣1
Forwarded from Денис Бесков: умные мысли и несколько своих
Мартин Фаулер, международный эксперт по программной инженерии, начал свою публичную просветительскую деятельность с книги Analysis Patterns 1997-го года.
При этом как ни удивительно, книга интересна и актуальна до сих пор и для разработчиков и для архитекторов и для системных аналитиков.
Можно сказать, что книга прошла почти незамеченной в широкой профессиональной среде, в частности, никогда не переводилась на русский язык.
Андрей Гордиенков решил исправить это досадное обстоятельство и подготовил собственную версию перевода.
https://habr.com/ru/articles/872598/
Вступление
1.1 Концептуальные модели
1.2 Мир шаблонов
1.3 Шаблоны в этой книге
1.4 Концептуальные модели и реинжиниринг бизнес-процессов
1.5 Шаблоны и фреймворки
1.6 Использование шаблонов
Часть 1. Аналитические шаблоны
2. Ответственность
3. Наблюдения и измерения
4. Наблюдения для корпоративных финансов
5. Обращение к объектам
6. Инвентаризация и учет
7. Использование моделей учета
8. Планирование
9. Торговля
10. Производные контракты
11. Торговые пакеты
Часть 2. Поддерживающие шаблоны
12. Слоёная архитектура для ИС
13. Фасады приложения
14. Подходы для моделирования типов
15. Шаблоны ассоциации
16. Послесловие
Часть 3. Приложения
А. Техники и обозначения
В. Таблица паттернов
C. Краткая справка по диаграммам
При этом как ни удивительно, книга интересна и актуальна до сих пор и для разработчиков и для архитекторов и для системных аналитиков.
Можно сказать, что книга прошла почти незамеченной в широкой профессиональной среде, в частности, никогда не переводилась на русский язык.
Андрей Гордиенков решил исправить это досадное обстоятельство и подготовил собственную версию перевода.
https://habr.com/ru/articles/872598/
Вступление
1.1 Концептуальные модели
1.2 Мир шаблонов
1.3 Шаблоны в этой книге
1.4 Концептуальные модели и реинжиниринг бизнес-процессов
1.5 Шаблоны и фреймворки
1.6 Использование шаблонов
Часть 1. Аналитические шаблоны
2. Ответственность
3. Наблюдения и измерения
4. Наблюдения для корпоративных финансов
5. Обращение к объектам
6. Инвентаризация и учет
7. Использование моделей учета
8. Планирование
9. Торговля
10. Производные контракты
11. Торговые пакеты
Часть 2. Поддерживающие шаблоны
12. Слоёная архитектура для ИС
13. Фасады приложения
14. Подходы для моделирования типов
15. Шаблоны ассоциации
16. Послесловие
Часть 3. Приложения
А. Техники и обозначения
В. Таблица паттернов
C. Краткая справка по диаграммам
Хабр
«Аналитические шаблоны» на русском
Всем привет! С помощью этой статьи хочу поделиться результатами своей работы по переводу книги Мартина Фаулера "Analysis Patterns". Все оригинальные части книги и диаграммы переведены, всё готово для...
🔥15
Рассчитывал на Locust, но обнаружил, что asyncio там не поддерживается и его поддержка пока не предвидится.
Нашелся нагрузочный микро-движок, который выручил: https://molotov.readthedocs.io/
Нашелся нагрузочный микро-движок, который выручил: https://molotov.readthedocs.io/
GitHub
Asyncio support · Issue #1251 · locustio/locust
Follow up of #924 and #1079. Is your feature request related to a problem? Please describe. Sometimes one needs to simulate an asynchronous user behavior. Hatching more users does not solve the pro...
👍2🔥2
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Какая основная решаемая задача при создании фейкера объема данных? На мой взгляд, это обеспечение планов запросов к БД, близких к реальным. И здесь основную роль играет воспроизводение селективности индексов. Грубо говоря, если селективность на проде известна…
После двух лет забвения по причине личных обстоятельств, наконец-то возвращаюсь к привнесению общественно-профессиональной пользы.
17 января совместно с командой закончил работу над созданием нагрузочного фреймворка для микросервисов, аналоги которого мне неизвестны (иначе я бы их применил).
Началось все с создания генератора объема фейковых данных (см. здесь и здесь) для микросервисов, который воспроизводил бы селективность индексов как в целевой системе.
При этом все зависимые объекты создаются автоматически, а вероятностная распределенность их внешних ключей соответствует селективности индексов целевой системы.
Поддерживаются композитные ключи (первичные и внешние). Вероятностная распределенность поддерживается как для композитного ключа целиком, так и для составляющих его ключей.
Поддерживается логика многоступенчатого создания агрегата (black-box), когда агрегат возможно привести в необходимое состояние только серией запросов через public API.
Скажу честно, что я не смог бы этого сделать, не будь за моими плечами четырех собственноручно написанных ORM на четырех разных языках программирования и пяти фейкеров. Полученный опыт оказался бесценным.
Конечно, писать свой ORM архитектору может и нет практической необходимости, но в чем я сейчас твердо убежден, так это в том, что успешность архитектора немыслима без нагрузочных fitness-functions. А там практические навыки применения PoEAA оказываются на вес золота, независимо от того, создаете ли вы ORM или генератор фейковых данных. И наивно полагать, что эта задача посильна рядовому программисту. Если вдруг где-то специалисты с такими навыками и засиделись на позиции программиста, то будьте уверены - долго они на этой позиции в такой компании не задержатся. Это к вопросу о том, должен ли уметь архитектор в код.
Вскоре мы обнаружили, что полученный генератор данных можно использовать и для нагрузочных тестов. Адаптировали его для работы с публичным API (вместо прямого доступа к БД), сделали поддержку multiprocess.
Интегрировали его с нагрузочным движком molotov. Изначально рассчитывали на Locust, но обнаружили, что asyncio там не поддерживается и его поддержка пока не предвидится. Позже я узнал от @nkhitrov, что решение все-таки есть.
Потом мы обнаружили, что полученное решение можно без труда использовать для Out-of-process Component (Acceptance) Testing.
Таким образом, нам удалось сделать тестовый фреймворк (на Python), который позволяет одновременно и генерировать фэйковые объемы данных, включая автоматическое создание всех зависимых объектов, и создавать нагрузочные скрипты, и выполнять component out-of-process tests.
Теперь хотим завернуть его в Gherkin, чтобы fitness-functions в нем описывать. И добавить декларативное описание моделей посредством YAML-file.
Свои функции он уже выполняет. На текущий момент исходный код проприетарен. В перспективе возможно его раскрытие (обсуждается с владельцем кодовой базы) или оказание услуг нагрузочного тестирования сторонним ИТ-компаниям.
Работаем!
17 января совместно с командой закончил работу над созданием нагрузочного фреймворка для микросервисов, аналоги которого мне неизвестны (иначе я бы их применил).
Началось все с создания генератора объема фейковых данных (см. здесь и здесь) для микросервисов, который воспроизводил бы селективность индексов как в целевой системе.
При этом все зависимые объекты создаются автоматически, а вероятностная распределенность их внешних ключей соответствует селективности индексов целевой системы.
Поддерживаются композитные ключи (первичные и внешние). Вероятностная распределенность поддерживается как для композитного ключа целиком, так и для составляющих его ключей.
Поддерживается логика многоступенчатого создания агрегата (black-box), когда агрегат возможно привести в необходимое состояние только серией запросов через public API.
Скажу честно, что я не смог бы этого сделать, не будь за моими плечами четырех собственноручно написанных ORM на четырех разных языках программирования и пяти фейкеров. Полученный опыт оказался бесценным.
Конечно, писать свой ORM архитектору может и нет практической необходимости, но в чем я сейчас твердо убежден, так это в том, что успешность архитектора немыслима без нагрузочных fitness-functions. А там практические навыки применения PoEAA оказываются на вес золота, независимо от того, создаете ли вы ORM или генератор фейковых данных. И наивно полагать, что эта задача посильна рядовому программисту. Если вдруг где-то специалисты с такими навыками и засиделись на позиции программиста, то будьте уверены - долго они на этой позиции в такой компании не задержатся. Это к вопросу о том, должен ли уметь архитектор в код.
Вскоре мы обнаружили, что полученный генератор данных можно использовать и для нагрузочных тестов. Адаптировали его для работы с публичным API (вместо прямого доступа к БД), сделали поддержку multiprocess.
Интегрировали его с нагрузочным движком molotov. Изначально рассчитывали на Locust, но обнаружили, что asyncio там не поддерживается и его поддержка пока не предвидится. Позже я узнал от @nkhitrov, что решение все-таки есть.
Потом мы обнаружили, что полученное решение можно без труда использовать для Out-of-process Component (Acceptance) Testing.
Таким образом, нам удалось сделать тестовый фреймворк (на Python), который позволяет одновременно и генерировать фэйковые объемы данных, включая автоматическое создание всех зависимых объектов, и создавать нагрузочные скрипты, и выполнять component out-of-process tests.
Теперь хотим завернуть его в Gherkin, чтобы fitness-functions в нем описывать. И добавить декларативное описание моделей посредством YAML-file.
Свои функции он уже выполняет. На текущий момент исходный код проприетарен. В перспективе возможно его раскрытие (обсуждается с владельцем кодовой базы) или оказание услуг нагрузочного тестирования сторонним ИТ-компаниям.
Работаем!
Telegram
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Какая основная решаемая задача при создании фейкера объема данных?
На мой взгляд, это обеспечение планов запросов к БД, близких к реальным. И здесь основную роль играет воспроизводение селективности индексов.
Грубо говоря, если селективность на проде известна…
На мой взгляд, это обеспечение планов запросов к БД, близких к реальным. И здесь основную роль играет воспроизводение селективности индексов.
Грубо говоря, если селективность на проде известна…
🔥22👍13❤6👎2🤔1
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
После двух лет забвения по причине личных обстоятельств, наконец-то возвращаюсь к привнесению общественно-профессиональной пользы. 17 января совместно с командой закончил работу над созданием нагрузочного фреймворка для микросервисов, аналоги которого мне…
Может кому-нибудь пригодится для Out-of-process Component (Acceptance) Testing:
https://github.com/litestar-org/polyfactory
Спектр задач закрывает эта библиотека, конечно, неширокий. Для применения в нагрузке ей не хватает поддержки вероятностной распределенности значений. Но для своих целей пользу принести может.
https://github.com/litestar-org/polyfactory
Спектр задач закрывает эта библиотека, конечно, неширокий. Для применения в нагрузке ей не хватает поддержки вероятностной распределенности значений. Но для своих целей пользу принести может.
GitHub
GitHub - litestar-org/polyfactory: Simple and powerful factories for mock data generation
Simple and powerful factories for mock data generation - litestar-org/polyfactory
❤2👍2🔥2
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
После двух лет забвения по причине личных обстоятельств, наконец-то возвращаюсь к привнесению общественно-профессиональной пользы. 17 января совместно с командой закончил работу над созданием нагрузочного фреймворка для микросервисов, аналоги которого мне…
Добавил поддержку Gherkin для реализации Fitness-Functions в Performance Framework. Теперь описание Fitness-Function выглядит примерно так:
Реализация подобного сценария посредством behave с использованием Performance Framework занимает всего 40 строк кода (половина из которых - это пустые строки и переносы строк для форматирования). Все зависимые объекты в БД создаются автоматически с сохранением селективности индексов целевой системы (включая индексы внешних ключей зависимых объектов). Подробная статистика запросов накапливается на сервере статистики. В перспективе, при наличии благоприятной возможности, может быть добавлена поддержка декларирования вероятностной распределенности зависимых объектов и проиндексированных значений непосредственно в Gherkin-спецификации.
Материала по этой теме накопилось на полноценный доклад (если даже не на целую книгу). Подумаю об этом.
Scenario: Some object endpoint name
Given SUT with 10000000 objects
When 100 processes created 10000 objects each
Then average RPS is greater than 1000
And error rate is less than 5%
Реализация подобного сценария посредством behave с использованием Performance Framework занимает всего 40 строк кода (половина из которых - это пустые строки и переносы строк для форматирования). Все зависимые объекты в БД создаются автоматически с сохранением селективности индексов целевой системы (включая индексы внешних ключей зависимых объектов). Подробная статистика запросов накапливается на сервере статистики. В перспективе, при наличии благоприятной возможности, может быть добавлена поддержка декларирования вероятностной распределенности зависимых объектов и проиндексированных значений непосредственно в Gherkin-спецификации.
Материала по этой теме накопилось на полноценный доклад (если даже не на целую книгу). Подумаю об этом.
Telegram
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Кратко о fitness functions. Любое приложение всегда стремится к энтропии. Как говорил известный в ИТ-индустрии Gregor Hohpe:
💬 It’s almost like enterprise IT is subject to the Second Law of Thermodynamics, which concludes that the entropy in an (isolated)…
💬 It’s almost like enterprise IT is subject to the Second Law of Thermodynamics, which concludes that the entropy in an (isolated)…
🔥10🤔3👍2
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Может кому-нибудь пригодится для Out-of-process Component (Acceptance) Testing: https://github.com/litestar-org/polyfactory Спектр задач закрывает эта библиотека, конечно, неширокий. Для применения в нагрузке ей не хватает поддержки вероятностной распределенности…
Eще несколько решений, способных облегчить Out-of-process Component (Acceptance) Testing:
- https://schemathesis.readthedocs.io/
- https://hypothesis.readthedocs.io/
- https://github.com/python-jsonschema/hypothesis-jsonschema
- https://pypi.org/project/hypothesis-sqlalchemy/
- https://dredd.org/
- https://schemathesis.readthedocs.io/
- https://hypothesis.readthedocs.io/
- https://github.com/python-jsonschema/hypothesis-jsonschema
- https://pypi.org/project/hypothesis-sqlalchemy/
- https://dredd.org/
👍5🔥2
💬 "Наука есть достояние общее, а потому справедливость требует не тому отдать наибольшую научную славу, кто первый высказал известную истину, а тому, кто сумел убедить в ней других, показал её достоверность и сделал её применимой в науке."
-- Д.И.Менделеев
👍8🔥5
Forwarded from Системный сдвиг
Сколько вы знаете способов передачи данных на клиент по инициативе сервера?
В комментариях к предыдущему посту отмечают, что GraphQL не совсем верно упоминать рядом с Websockets, это вещи разного уровня. Давайте разберемся, и вспомним все варианты отправки данных с на клиент в тот момент, когда их решил отправить сервер.
Я насчитал 6 (добавляйте, если знаете ещё):
1. Long polling — обычный http-запрос, но сервер дает ответ только в тот момент, когда у него появились/изменились данные. Если данные не появились до истечения таймаута, соединение разрывается, но клиент тут же его восстанавливает. После получения ответа соединение тоже восстанавливается.
2. WebHooks — по сути, обратный вызов http. Серверу каким-то образом нужно сообщить адрес эндпоинта клиента и код события, по наступлении которого нужно этот эндпоинт вызвать. Сообщить можно через настройки, а можно через специальное API. В терминах языков программирования — это callback. Когда на сервере произойдет событие, он вызовет ваш эндпоинт.
3. WebSockets — отдельный протокол, первоначальное соединение устанавливается через http, в котором клиент передает хедер upgrade, и дальше уже происходит переключение протокола, и общение идёт через websocket — полнодуплексный канал между клиентом и сервером, где они оба могут пересылать друг другу сообщения (текстовые или бинарные). Очевидные кейсы: чат, многопользовательская игра, совместное редактирование документа/картинки. Отличается от других асинхронных способов получения данных тем, что соединение полнодуплексное — клиент может отправлять данные в том же соединении.
4. Server-Sent Events (SSE) — почему-то редко вспоминают, но это штука, похожая на long polling, только сервер может пересылать несколько порций данных сразу в одном соединении. И это тоже http! Клиент при этом указывает специальный тип контента: text/event-stream (если шлет в веб-браузер) и application/stream+json (если шлет в другой клиент, не в браузер).
5. HTTP/2 streams — бинарный протокол, на базе которого работает gRPC. HTTP/2 в принципе построен на понятии потока, в котором клиент что-то запрашивает, а сервер что-то шлет в ответ... Так что идея полнодуплексного обмена появляется почти автоматически — почему бы серверу в том же потоке не слать данные по собственной инициативе.
6. HTTP/3, который QUIC — примерно то же, что и HTTP/2 — на уровне использования приложением, все различия внутри: он на основе UDP, а не TCP, что дает ряд преимуществ, в основном в скорости. Подробнее про HTTP разных версий можно почитать тут. В двух словах — борьба идет за число открытых соединений с сервером: в HTTP/1.0 соединение обрывается после каждого ответа сервера, в HTTP/1.1 появился заголовок keep-alive, сохраняющий TCP соединение, в HTTP/2 много соединений TCP от клиента к серверу объединили в одно, а в HTTP/3 вообще перешли на UDP, в котором вообще нет сложного процесса установки соединений.
Разобраться со всеми этими технологиями бывает сложновато, поэтому низкоуровневые протоколы пакуют в инструменты более высокого уровня абстракции — типа того же GraphQL или разнообразных API в браузере (streams API, fetch API, WebTransport) — про которые программисты уже не думают, как они внутри устроены, а просто ими пользуются.
На самом деле, внутри GraphQL либо WebSocket, либо multipart subscriptions over HTTP (ещё один способ, похожий на SSE — когда мы устанавливаем соединение по http, сервер говорит, что будет отдавать multipart/mixed контент, а потом начинает эти части клиенту отдавать по мере появления/изменения).
А стримминг в gRPC работает по технологии HTTP/2 или HTTP/3, это тоже обертка.
Что в этом для аналитиков? А вот что: кажется, всё идёт к тому, что стили API (REST или RPC) будут больше логическими, а не технологическими. При высокой интенсивности обмена между системами будет просто открываться канал, в котором они будут обмениваться сообщениями, а уж будут эти сообщения устроены вокруг операций с ресурсами, или вокруг вызова функций, или это будет поток сообщений в стиле event-driven — это на логическом уровне будет разбираться приложение.
В комментариях к предыдущему посту отмечают, что GraphQL не совсем верно упоминать рядом с Websockets, это вещи разного уровня. Давайте разберемся, и вспомним все варианты отправки данных с на клиент в тот момент, когда их решил отправить сервер.
Я насчитал 6 (добавляйте, если знаете ещё):
1. Long polling — обычный http-запрос, но сервер дает ответ только в тот момент, когда у него появились/изменились данные. Если данные не появились до истечения таймаута, соединение разрывается, но клиент тут же его восстанавливает. После получения ответа соединение тоже восстанавливается.
2. WebHooks — по сути, обратный вызов http. Серверу каким-то образом нужно сообщить адрес эндпоинта клиента и код события, по наступлении которого нужно этот эндпоинт вызвать. Сообщить можно через настройки, а можно через специальное API. В терминах языков программирования — это callback. Когда на сервере произойдет событие, он вызовет ваш эндпоинт.
3. WebSockets — отдельный протокол, первоначальное соединение устанавливается через http, в котором клиент передает хедер upgrade, и дальше уже происходит переключение протокола, и общение идёт через websocket — полнодуплексный канал между клиентом и сервером, где они оба могут пересылать друг другу сообщения (текстовые или бинарные). Очевидные кейсы: чат, многопользовательская игра, совместное редактирование документа/картинки. Отличается от других асинхронных способов получения данных тем, что соединение полнодуплексное — клиент может отправлять данные в том же соединении.
4. Server-Sent Events (SSE) — почему-то редко вспоминают, но это штука, похожая на long polling, только сервер может пересылать несколько порций данных сразу в одном соединении. И это тоже http! Клиент при этом указывает специальный тип контента: text/event-stream (если шлет в веб-браузер) и application/stream+json (если шлет в другой клиент, не в браузер).
5. HTTP/2 streams — бинарный протокол, на базе которого работает gRPC. HTTP/2 в принципе построен на понятии потока, в котором клиент что-то запрашивает, а сервер что-то шлет в ответ... Так что идея полнодуплексного обмена появляется почти автоматически — почему бы серверу в том же потоке не слать данные по собственной инициативе.
6. HTTP/3, который QUIC — примерно то же, что и HTTP/2 — на уровне использования приложением, все различия внутри: он на основе UDP, а не TCP, что дает ряд преимуществ, в основном в скорости. Подробнее про HTTP разных версий можно почитать тут. В двух словах — борьба идет за число открытых соединений с сервером: в HTTP/1.0 соединение обрывается после каждого ответа сервера, в HTTP/1.1 появился заголовок keep-alive, сохраняющий TCP соединение, в HTTP/2 много соединений TCP от клиента к серверу объединили в одно, а в HTTP/3 вообще перешли на UDP, в котором вообще нет сложного процесса установки соединений.
Разобраться со всеми этими технологиями бывает сложновато, поэтому низкоуровневые протоколы пакуют в инструменты более высокого уровня абстракции — типа того же GraphQL или разнообразных API в браузере (streams API, fetch API, WebTransport) — про которые программисты уже не думают, как они внутри устроены, а просто ими пользуются.
На самом деле, внутри GraphQL либо WebSocket, либо multipart subscriptions over HTTP (ещё один способ, похожий на SSE — когда мы устанавливаем соединение по http, сервер говорит, что будет отдавать multipart/mixed контент, а потом начинает эти части клиенту отдавать по мере появления/изменения).
А стримминг в gRPC работает по технологии HTTP/2 или HTTP/3, это тоже обертка.
Что в этом для аналитиков? А вот что: кажется, всё идёт к тому, что стили API (REST или RPC) будут больше логическими, а не технологическими. При высокой интенсивности обмена между системами будет просто открываться канал, в котором они будут обмениваться сообщениями, а уж будут эти сообщения устроены вокруг операций с ресурсами, или вокруг вызова функций, или это будет поток сообщений в стиле event-driven — это на логическом уровне будет разбираться приложение.
👍15❤1
Forwarded from Системный сдвиг
Есть такое модное понятие, применительно к медиа —фактчекинг. То есть, поиск и проверка источников. У аналитика это должно срабатывать на уровне рефлекса: кто-то сказал — нужно проверить и найти подтверждение, что это действительно так. Особенно интересно бывает найти нормативный документ, и увидеть, что практика с ним серьёзно расходится.
И у меня этот рефлекс часто срабатывает в обычной жизни. Иногда находится прекрасное.
Вот из недавнего: чуть ли не в каждой статье про важность soft-skills (особенно от HR-ов или edTech-ов) встречается фраза, причём дословно:
"Ученые из Гарварда, Стэнфорда и Фонда Карнеги выяснили, что «гибкие навыки» — это 85% успеха человека в профессии, жесткие составляют только 15%."
Её, кажется, первым запустил РБК, а потом все стали друг у друга перепечатывать.
Интересно, что такое исследование действительно существует! Но есть нюанс — это исследование 1918 года! Не опечатка — 1918, более 100 лет назад. В исследовании американским инженерам задавали вопрос: что им больше всего помогает при выполнении проектов? И они отвечали, что твердость характера. Такой вот софт-скилл. Другие упоминаемые качества: ясность суждений, производительность, понимание людей и широта знаний. Такой набор, а не то, что сейчас под софт-скиллами понимается — типа, быть милым, эмпатичным и поддерживать нетворкинг.
То есть, с одной стороны, любопытно, что исследования эти ведутся ещё с XIX века (в том журнале есть ссылки и на исследования 1880-х годов), но неужели нет более свежих работ? И правда ли мы сейчас собираемся опираться на опыт американских инженеров времён Первой мировой? Впрочем, качества-то перечислены полезные.
И у меня этот рефлекс часто срабатывает в обычной жизни. Иногда находится прекрасное.
Вот из недавнего: чуть ли не в каждой статье про важность soft-skills (особенно от HR-ов или edTech-ов) встречается фраза, причём дословно:
"Ученые из Гарварда, Стэнфорда и Фонда Карнеги выяснили, что «гибкие навыки» — это 85% успеха человека в профессии, жесткие составляют только 15%."
Её, кажется, первым запустил РБК, а потом все стали друг у друга перепечатывать.
Интересно, что такое исследование действительно существует! Но есть нюанс — это исследование 1918 года! Не опечатка — 1918, более 100 лет назад. В исследовании американским инженерам задавали вопрос: что им больше всего помогает при выполнении проектов? И они отвечали, что твердость характера. Такой вот софт-скилл. Другие упоминаемые качества: ясность суждений, производительность, понимание людей и широта знаний. Такой набор, а не то, что сейчас под софт-скиллами понимается — типа, быть милым, эмпатичным и поддерживать нетворкинг.
То есть, с одной стороны, любопытно, что исследования эти ведутся ещё с XIX века (в том журнале есть ссылки и на исследования 1880-х годов), но неужели нет более свежих работ? И правда ли мы сейчас собираемся опираться на опыт американских инженеров времён Первой мировой? Впрочем, качества-то перечислены полезные.
👍10😁1
Forwarded from Архитектура ИТ-решений
🧐Вон Вернон, написавший известную красную книжку про DDD Реализация методов предметно-ориентированного проектирования (а потом и зеленую книжку с подзаголовком Самое основное), пару месяцев назад запустил видеоблог под названием Design Accelerator
Недавнее видео Publishing Events From Legacy показалось мне примечательным. С технической точки зрения вы вряд ли узнаете в нем что-то новое. Но вот то, что DDD появляется в контексте модернизации унаследованных приложений, кажется мне интересным фактом. Похоже, мы возвращаем к дискуссии про Monolith First
Недавнее видео Publishing Events From Legacy показалось мне примечательным. С технической точки зрения вы вряд ли узнаете в нем что-то новое. Но вот то, что DDD появляется в контексте модернизации унаследованных приложений, кажется мне интересным фактом. Похоже, мы возвращаем к дискуссии про Monolith First
YouTube
Design Accelerator: Publishing Events From Legacy
How can you systematically modularize a legacy Big Ball of Mud system?
Please Like! ❤️ and Subscribe! 🔔 Thanks, it helps a lot.
This tutorial discusses what might seem impossible—publishing Domain Events out of the legacy system and some available options…
Please Like! ❤️ and Subscribe! 🔔 Thanks, it helps a lot.
This tutorial discusses what might seem impossible—publishing Domain Events out of the legacy system and some available options…
👍11🤔2
Forwarded from Архитектура ИТ-решений
Пару недель назад у Ivar Jacobson появилась бумага с названием Use-Case 3.0 и даже прошел вебинар (запись можно посмотреть здесь)
Я напомню, что концепция Use-Case 2.0 была о том, как организовать итерационную инкрементальную разработку посредством разделения сложного варианта использования на ломтики (slices) (Почитать можно здесь)
Что принципиально нового принесла версии 3.0 я пока так и не разобрался. Но, несмотря на это, варианты использования à la Alistair Cockburn/Ivar Jacobson остаются полезным способом описания сложных сценариев взаимодействия между системами/сервисами и разного прочего поведения
Я напомню, что концепция Use-Case 2.0 была о том, как организовать итерационную инкрементальную разработку посредством разделения сложного варианта использования на ломтики (slices) (Почитать можно здесь)
Что принципиально нового принесла версии 3.0 я пока так и не разобрался. Но, несмотря на это, варианты использования à la Alistair Cockburn/Ivar Jacobson остаются полезным способом описания сложных сценариев взаимодействия между системами/сервисами и разного прочего поведения
👍7
Forwarded from Архитектура ИТ-решений
📃 BABOK Guide уже много лет не обновлялся. Зато на днях появилась вторая версия The Business Analysis Standard. Скачать стандарт можно по ссылке выше ☝️, при желании, предварительно зарегистрировавшись здесь
🔖 Что поменялось (сжатый анонс от авторов):
- Оптимизирован язык для более легкого понимания и навигации
- Области знаний реорганизованы в соответствии с BABOK Guide. Согласована терминология стандарта и руководства
- Стили документа приведены в соответствие со стандартами ISO
- Для быстро ознакомления со стандартом добавлен общий обзор
- Новые и расширенные разделы: ценность и результаты (outcomes and value), организационные соображения, улучшения и проработка идей
🖇 Как всё это связано с архитектурой решений. В какой-то момент IIBA стал максимально широко трактовать бизнес-анализ, захватив заметный кусок solution architectгure. Вряд ли это правильно, но зато, пока у солюшенов нет своего стандарта, в какой-то мере, можно воспользоваться стандартом аналитиков (а не только стандартами архитекторов предприятия)
🔖 Что поменялось (сжатый анонс от авторов):
- Оптимизирован язык для более легкого понимания и навигации
- Области знаний реорганизованы в соответствии с BABOK Guide. Согласована терминология стандарта и руководства
- Стили документа приведены в соответствие со стандартами ISO
- Для быстро ознакомления со стандартом добавлен общий обзор
- Новые и расширенные разделы: ценность и результаты (outcomes and value), организационные соображения, улучшения и проработка идей
🖇 Как всё это связано с архитектурой решений. В какой-то момент IIBA стал максимально широко трактовать бизнес-анализ, захватив заметный кусок solution architectгure. Вряд ли это правильно, но зато, пока у солюшенов нет своего стандарта, в какой-то мере, можно воспользоваться стандартом аналитиков (а не только стандартами архитекторов предприятия)
🔥5👍2
Может кому-нибудь пригодится:
- https://github.com/mishudark/eventhus
[UPDATE]:
- https://github.com/andrewwebber/cqrs
- https://github.com/looplab/eventhorizon
- https://github.com/AleksK1NG/Go-EventSourcing-CQRS/tree/master/pkg/es
- https://github.com/mishudark/eventhus
[UPDATE]:
- https://github.com/andrewwebber/cqrs
- https://github.com/looplab/eventhorizon
- https://github.com/AleksK1NG/Go-EventSourcing-CQRS/tree/master/pkg/es
GitHub
GitHub - mishudark/eventhus: Go - CQRS / Event Sourcing made easy - Go
Go - CQRS / Event Sourcing made easy - Go. Contribute to mishudark/eventhus development by creating an account on GitHub.
🔥5
Forwarded from Архитектура ИТ-решений
ℹ️ В прошлом году неожиданно обновилось до 4 версии руководство по программной инженерии SWEBOK (The Guide to the Software Engineering Body of Knowledge) Предыдущая версия руководства была выпушена в 2014, а первая версия появилась в 2004.
🆕 Еще более неожиданным является то, что к 15 областям знаний, описанным в SWEBOK ранее, добавились три новых: Software Engineering Operations, Software Security и (сюрприз-сюрприз) Software Architecture. При этом область знаний Software Design, существовавшая в предыдущей версии, тоже сохранилась.
⬇️ Загрузить руководство можно по ссылке выше. Русскоязычный обзор новой версии SWEBOK можно почитать в журнале Открытые системы. СУБД
🆕 Еще более неожиданным является то, что к 15 областям знаний, описанным в SWEBOK ранее, добавились три новых: Software Engineering Operations, Software Security и (сюрприз-сюрприз) Software Architecture. При этом область знаний Software Design, существовавшая в предыдущей версии, тоже сохранилась.
⬇️ Загрузить руководство можно по ссылке выше. Русскоязычный обзор новой версии SWEBOK можно почитать в журнале Открытые системы. СУБД
❤8👍2
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Инструменты принятия решений: https://untools.co #Management
🔹https://dialog.guide/ - Как подготовить и принять
бизнес-решение в команде. Библиотека алгоритмов.
Thanks to @vec650
бизнес-решение в команде. Библиотека алгоритмов.
Thanks to @vec650
Практики и алгоритмы для эффективного принятия бизнес-решений в команде
Система поддержки принятия бизнес-решений. Узнайте, как подготовить и принять решение в команде с помощью лучших бизнес-практик и алгоритмов.
🔥7👍2❤1
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Eще несколько решений, способных облегчить Out-of-process Component (Acceptance) Testing: - https://schemathesis.readthedocs.io/ - https://hypothesis.readthedocs.io/ - https://github.com/python-jsonschema/hypothesis-jsonschema - https://pypi.org/project/hypothesis…
Как я делаю fitness-functions для микросервисов. Мой способ ориентирован на системы среднего размера.
Самым существенным оказался, вероятно, вопрос о том, должны ли performance fitness functions тестировать сервис в изоляции или систему целиком?
Однозначного ответа в литературе отыскать не удалось. Даже в оригинальной книге "Building Evolutionary Architectures" ограничились известной фразой "It depends!"
Sam Newman советует оба варианта:
Некоторые аргументы в пользу изолированного тестирования:
- "Load Testing And Microservices Architecture" by Gatling Author
- "Isolate Performance Testing for each Microservice: Part 7" By Brice Dardel
- "Performance Testing of Microservices" by Niranjan Limbachiya
Я склоняюсь к тестированию на обоих уровнях. Поскольку целью fitness functions является улучшение ("селекционирование") архитектурных качеств системы, то команде разработки более удобными могут оказаться изолированные тесты.
Для описания требований я использую Behave. Для любителей Pytest может подойти Pytest-BDD.
Поскольку за прообраз fitness-functions был взят стандарт породы, то это значит, что требование может быть желаемым (целевым) или в пределах допустимого отклонения (допустимого диапазона изменчивости). Поэтому, помечаю их соответственно тэгами
@fitness-function.performance.target и
@fitness-function.performance.acceptable.
Таким образом, запуск тестов можно осуществить или для допустимых, или для целевых требований. Получается что-то типа:
Продолжение.
Who Writes Fitness Functions? <...> In general, architects write fitness functions as they determine the objective measures for important architecture characteristics.
-- Building Evolutionary Architectures, by Neal Ford, Patrick Kua, and Rebecca Parsons
Самым существенным оказался, вероятно, вопрос о том, должны ли performance fitness functions тестировать сервис в изоляции или систему целиком?
Однозначного ответа в литературе отыскать не удалось. Даже в оригинальной книге "Building Evolutionary Architectures" ограничились известной фразой "It depends!"
Sam Newman советует оба варианта:
As with functional tests, you may want a mix. You may decide that you want performance tests that isolate individual services, but start with tests that check core journeys in your system. You may be able to take end-to-end journey tests and simply run these at volume.
-- "Building Microservices. Designing Fine-Grained Systems" 2nd edition by Sam Newman
Некоторые аргументы в пользу изолированного тестирования:
- "Load Testing And Microservices Architecture" by Gatling Author
- "Isolate Performance Testing for each Microservice: Part 7" By Brice Dardel
- "Performance Testing of Microservices" by Niranjan Limbachiya
Я склоняюсь к тестированию на обоих уровнях. Поскольку целью fitness functions является улучшение ("селекционирование") архитектурных качеств системы, то команде разработки более удобными могут оказаться изолированные тесты.
Для описания требований я использую Behave. Для любителей Pytest может подойти Pytest-BDD.
Поскольку за прообраз fitness-functions был взят стандарт породы, то это значит, что требование может быть желаемым (целевым) или в пределах допустимого отклонения (допустимого диапазона изменчивости). Поэтому, помечаю их соответственно тэгами
@fitness-function.performance.target и
@fitness-function.performance.acceptable.
Таким образом, запуск тестов можно осуществить или для допустимых, или для целевых требований. Получается что-то типа:
@fitness-function.performance.acceptable
Scenario: Some object endpoint name
Given SUT with 10000000 objects
When 100 processes created 10000 objects each
Then average RPS is greater than 1000
And error rate is less than 5%
@fitness-function.performance.target
Scenario: Some object endpoint name
Given SUT with 30000000 objects
When 100 processes created 10000 objects each
Then average RPS is greater than 1000
And error rate is less than 5%
Продолжение.
Telegram
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Кратко о fitness functions. Любое приложение всегда стремится к энтропии. Как говорил известный в ИТ-индустрии Gregor Hohpe:
💬 It’s almost like enterprise IT is subject to the Second Law of Thermodynamics, which concludes that the entropy in an (isolated)…
💬 It’s almost like enterprise IT is subject to the Second Law of Thermodynamics, which concludes that the entropy in an (isolated)…
👍5❤3🔥2⚡1
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Как я делаю fitness-functions для микросервисов. Мой способ ориентирован на системы среднего размера. Who Writes Fitness Functions? <...> In general, architects write fitness functions as they determine the objective measures for important architecture characteristics.…
Как я делаю fitness-functions для микросервисов. Продолжение. Начало здесь.
По хуку before_scenario() (или before_tag()) создается дамп изначального состояния БД (если он не был создан ранее) утилитой pg_dump в многопоточном режиме, с использованием аргументов:
--jobs=n, где n - количество ядер процессора, len(os.sched_getaffinity(0));
--format=directory (требуется для параллельного дампа);
--clean;
Composition Pattern отлично подошел для создания дампов баз данных нескольких микросервисов.
При необходимости, созданная директория с дампом архивируется и сохраняется в хранилище (тут есть разные варианты сохранения дампов между запусками тестов, от монтирования удаленной директории до отправки архива в S3).
По хуку after_scenario() (или after_tag()) дамп изначального состояния БД восстанавливается утилитой pg_restore так же в многопоточном режиме, с использованием аргументов:
--jobs=n
--clean
Некоторые коллеги из других компаний восстанавливают БД на уровне файлов PGDATA тестируемого сервиса. Работает быстрее, но менее универсально.
При исполенении шага "Given SUT with 10000000 objects" проверяется наличие актуального предзаполненного дампа БД для указанного объема данных и производится или его восстановление, или его создание путем генерации фэйковых данных. С целью сокращения времени генерации, я генерирую данные непосредственно в БД, хотя можно и через Public API сервиса. Для генерации используется собственный performance framework, позволяющий воспроизвести селективность индексов целевой системы. Коробочные решения мне неизвестны, но за основу можно взять:
- https://hypothesis.readthedocs.io/en/latest/strategies.html
- https://github.com/litestar-org/polyfactory
На следующем шаге создаем нагрузку. Я использую тот же собственный performance framework, который автоматически определяет создавать ли зависимый объект или реиспользовать ранее созданный в соответствии с заданной вероятностной распределенностью. Коробочные решения мне опять же неизвестны, но за основу можно взять:
- https://schemathesis.readthedocs.io/
Если используется JS (например, при использовании K6), то имеет смысл обратить внимание на:
- https://dredd.org/
Для изоляции сервиса можно использовать Mountebank, WireMock или Mockintosh (на Python), pytest-httpserver. На PyPi достаточно много реализаций mock-серверов. Вплоть до стандартного http.server. Некоторые из них позволяют генерировать данные на основе OpenAPI спецификации. На JS имеет смысл посмотреть в сторону Prism. См. так же OpenAPI Generator (docs), Swagger Codegen (HOWTO).
Для относительно небольших систем нагрузочный движок можно не использовать вообще, ограничившись простой многопоточностью multiprocessing.Pool.map().
В некоторых случаях подойдет минималистичный нагрузочный движок molotov.
Для крупных систем потребуется распределенный нагрузочный движок. Locust можно запускать как библиотеку (пример). О том, как подружить Locust и asyncio, см. здесь. K6, Gatling, JMeter можно запускать через субпроцессинг.
Результат каждого запроса записывается в Graphite или в Prometheus для детализированного анализа.
Используя Gherkin, удалось совместить хранение спецификаций как функциональных, так и нефункциональных требований. При этом функциональные требования в Gherkin формате очень хорошо ложатся на EventStorming диаграмму.
[UPDATE]: см. также:
- https://allurereport.org/docs/behave/
- https://allurereport.org/docs/pytestbdd/
По хуку before_scenario() (или before_tag()) создается дамп изначального состояния БД (если он не был создан ранее) утилитой pg_dump в многопоточном режиме, с использованием аргументов:
--jobs=n, где n - количество ядер процессора, len(os.sched_getaffinity(0));
--format=directory (требуется для параллельного дампа);
--clean;
Composition Pattern отлично подошел для создания дампов баз данных нескольких микросервисов.
При необходимости, созданная директория с дампом архивируется и сохраняется в хранилище (тут есть разные варианты сохранения дампов между запусками тестов, от монтирования удаленной директории до отправки архива в S3).
По хуку after_scenario() (или after_tag()) дамп изначального состояния БД восстанавливается утилитой pg_restore так же в многопоточном режиме, с использованием аргументов:
--jobs=n
--clean
Некоторые коллеги из других компаний восстанавливают БД на уровне файлов PGDATA тестируемого сервиса. Работает быстрее, но менее универсально.
При исполенении шага "Given SUT with 10000000 objects" проверяется наличие актуального предзаполненного дампа БД для указанного объема данных и производится или его восстановление, или его создание путем генерации фэйковых данных. С целью сокращения времени генерации, я генерирую данные непосредственно в БД, хотя можно и через Public API сервиса. Для генерации используется собственный performance framework, позволяющий воспроизвести селективность индексов целевой системы. Коробочные решения мне неизвестны, но за основу можно взять:
- https://hypothesis.readthedocs.io/en/latest/strategies.html
- https://github.com/litestar-org/polyfactory
На следующем шаге создаем нагрузку. Я использую тот же собственный performance framework, который автоматически определяет создавать ли зависимый объект или реиспользовать ранее созданный в соответствии с заданной вероятностной распределенностью. Коробочные решения мне опять же неизвестны, но за основу можно взять:
- https://schemathesis.readthedocs.io/
Если используется JS (например, при использовании K6), то имеет смысл обратить внимание на:
- https://dredd.org/
Для изоляции сервиса можно использовать Mountebank, WireMock или Mockintosh (на Python), pytest-httpserver. На PyPi достаточно много реализаций mock-серверов. Вплоть до стандартного http.server. Некоторые из них позволяют генерировать данные на основе OpenAPI спецификации. На JS имеет смысл посмотреть в сторону Prism. См. так же OpenAPI Generator (docs), Swagger Codegen (HOWTO).
Для относительно небольших систем нагрузочный движок можно не использовать вообще, ограничившись простой многопоточностью multiprocessing.Pool.map().
В некоторых случаях подойдет минималистичный нагрузочный движок molotov.
Для крупных систем потребуется распределенный нагрузочный движок. Locust можно запускать как библиотеку (пример). О том, как подружить Locust и asyncio, см. здесь. K6, Gatling, JMeter можно запускать через субпроцессинг.
Результат каждого запроса записывается в Graphite или в Prometheus для детализированного анализа.
Используя Gherkin, удалось совместить хранение спецификаций как функциональных, так и нефункциональных требований. При этом функциональные требования в Gherkin формате очень хорошо ложатся на EventStorming диаграмму.
[UPDATE]: см. также:
- https://allurereport.org/docs/behave/
- https://allurereport.org/docs/pytestbdd/
GitHub
GitHub - litestar-org/polyfactory: Simple and powerful factories for mock data generation
Simple and powerful factories for mock data generation - litestar-org/polyfactory
👍6🔥3❤1⚡1🤣1
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Шикарная статья для тех, кто намерен использовать PostgreSQL JSONB для хранения Агрегатов: "Борьба с TOAST или будущее JSONB в PostgreSQL" - https://habr.com/ru/company/oleg-bunin/blog/646987/ Статья является продолжением статьи "Проклятье TOAST и с каким…
Pattern Specification можно реализовать парой строчек кода, в случае использования JSONB поля для хранения агрегата, путем применения jsonpath.
Для реализации метода IsSatisfiedBy подойдет, например,
- https://jsonpath2.readthedocs.io/en/latest/
А для компиляции спецификации в SQL достаточно использовать нативные функции:
- https://www.postgresql.org/docs/current/functions-json.html#FUNCTIONS-SQLJSON-PATH
О классической реализации для сравнения см. здесь:
- https://dckms.github.io/system-architecture/emacsway/it/ddd/grade/domain/specification.html
Для реализации метода IsSatisfiedBy подойдет, например,
- https://jsonpath2.readthedocs.io/en/latest/
А для компиляции спецификации в SQL достаточно использовать нативные функции:
- https://www.postgresql.org/docs/current/functions-json.html#FUNCTIONS-SQLJSON-PATH
О классической реализации для сравнения см. здесь:
- https://dckms.github.io/system-architecture/emacsway/it/ddd/grade/domain/specification.html
PostgreSQL Documentation
9.16. JSON Functions and Operators
9.16. JSON Functions and Operators # 9.16.1. Processing and Creating JSON Data 9.16.2. The SQL/JSON Path Language 9.16.3. SQL/JSON Query Functions …
🔥4