Искренне поздравляю @vladik_kh !!! 🎉🍾
https://learning.oreilly.com/library/view/balancing-coupling-in/9780137353514/
Монументальный, титанический труд, который под силу только Настоящему Титану! Дейкстра современности!
Книга уже признана такими авторитетами, как Gregor Hohpe, который в восторге от неё!
Это даже не луч света в темном царстве спагетти-кода. Это настоящий прожектор путеводного маяка в океане архитектуры!
https://learning.oreilly.com/library/view/balancing-coupling-in/9780137353514/
Монументальный, титанический труд, который под силу только Настоящему Титану! Дейкстра современности!
Книга уже признана такими авторитетами, как Gregor Hohpe, который в восторге от неё!
Это даже не луч света в темном царстве спагетти-кода. Это настоящий прожектор путеводного маяка в океане архитектуры!
O’Reilly Online Learning
Balancing Coupling in Software Design: Universal Design Principles for Architecting Modular Software Systems
Learn How Coupling Impacts Every Software Design Decision You Make--and How to Control It If you want to build modular, evolvable, and resilient software systems, you have to get... - Selection from Balancing Coupling in Software Design: Universal Design…
🍾42👍15🔥6❤1👏1😱1
Forwarded from Заметки на инженерных полях
Заметки на полях. Инженерное.
Нашёл интересный доклад на ютубе и украл к себе.
Это очень старая тема, но в разработке ПО пока не слишком развитая. Разбор доклада чутка попозже добавлю)
Нашёл интересный доклад на ютубе и украл к себе.
Это очень старая тема, но в разработке ПО пока не слишком развитая. Разбор доклада чутка попозже добавлю)
YouTube
Balancing Coupling in Software Design - Vladik Khononov, DOIT International | Craft Conference 2022
This talk was recorded at Craft Conference 2022. Vladik Khononov from DOIT International spoke about Architecture, Coupling, Design, Microservices and DDD. We are used to treating coupling as the necessary evil. Hence, we aim to break systems apart into the…
👍11
Forwarded from Vlad
Это не самая удачная запись. Здесь лучше:
https://youtu.be/6indW7BSGZI?si=EZvt-9PjkaQjsWzg
Запись расширенной версии доклада есть с ddd europe 2023
https://youtu.be/6indW7BSGZI?si=EZvt-9PjkaQjsWzg
Запись расширенной версии доклада есть с ddd europe 2023
🔥4👍1
Forwarded from Архитектура ИТ-решений
На сайте EventStoreDB нашел транскрипт легендарного выступления Грега Янга, случившегося 10 лет назад. В виде текста оно воспринимается немного иначе. Чем-то похоже на известный 50-страничный CQRS Documents
Знаете что меня удивляет? Несмотря на обилие инфы вокруг этой темы, в ней, почему-то, всегда остается возможность добавить еще что-то новое. В том-же блоге Event Store ряд актуальных заметок, но и не только. В общем - залезаем все глубже в кроличью нору
Знаете что меня удивляет? Несмотря на обилие инфы вокруг этой темы, в ней, почему-то, всегда остается возможность добавить еще что-то новое. В том-же блоге Event Store ряд актуальных заметок, но и не только. В общем - залезаем все глубже в кроличью нору
www.kurrent.io
Trannoscript of Greg Young's Talk at Code on the Beach 2014: CQRS and Event Sourcing
Greg Young gave this important talk at Code on the Beach 2014. It's one of the seminal explanations of Event Sourcing and CQRS.
🔥2
Forwarded from Архитектура ИТ-решений
В материалах TheOpenGroup опубликованы не только файл с описанием и archimate-моделью учебного кейса ArchiSurance Case Study, но и сформированная при помощи Archi web-версия модели для этого кейса(правда немного кривая, как и сам Model Exchange File примера)
Начинать смотреть вот с этой вкладки: https://pubs.opengroup.org/architecture/case-study-models/archisurance-html/?view=id-45418
Не знаю, выложили недавно или же я раньше просто не обращал внимание, но непременно воспользуюсь в своем курсе про модели корпоративной архитектуры
Начинать смотреть вот с этой вкладки: https://pubs.opengroup.org/architecture/case-study-models/archisurance-html/?view=id-45418
Не знаю, выложили недавно или же я раньше просто не обращал внимание, но непременно воспользуюсь в своем курсе про модели корпоративной архитектуры
🔥3👍1
Forwarded from Денис Бесков написал
про старших и ведущих
видимо последнее наиболее масштабное нормирование в этой теме в России закончилось в 1998 году с выпуском
Квалификационного справочника должностей руководителей, специалистов и других служащих
что там среди прочего написано, в пункте 7:
про старшего
т.е. старший или руководит кем-то или руководит участком работ (что бы это ни значило).
про ведущего
т.е. ведущий — это не возможно руководитель, а совершенно точно руководитель.
видим, что никакой такой современной пурги, когда человек поработал 3 года без руководства и стал «ведущим аналитиком» без функций управления, в принципе не предполагалось. это же нам показывает лингвистический тест: «если старший — то над кем?» «если ведущий — то кого?»
также интересно отдельно взглянуть на описание Аналитика, а заодно понять что такое «1-я квалификационная категория», об этом дальше
видимо последнее наиболее масштабное нормирование в этой теме в России закончилось в 1998 году с выпуском
Квалификационного справочника должностей руководителей, специалистов и других служащих
что там среди прочего написано, в пункте 7:
про старшего
Применение должностного наименования «старший» возможно при условии, если работник наряду с выполнением обязанностей, предусмотренных по занимаемой должности, осуществляет руководство подчиненными ему исполнителями.
Должность «старшего» может устанавливаться в виде исключения и при отсутствии исполнителей в непосредственном подчинении работника, если на него возлагаются функции руководства самостоятельным участком работы.
Для должностей специалистов, по которым предусматриваются квалификационные категории, должностное наименование «старший» не применяется. В этих случаях функции руководства подчиненными исполнителями возлагаются на специалиста I квалификационной категории.
т.е. старший или руководит кем-то или руководит участком работ (что бы это ни значило).
про ведущего
Должностные обязанности «ведущих» устанавливаются на основе характеристик соответствующих должностей специалистов.
Кроме того, на них возлагаются функции руководителя и ответственного исполнителя работ по одному из направлений деятельности предприятия, учреждения, организации или их структурных подразделений либо обязанности по координации и методическому руководству группами исполнителей, создаваемыми в отделах (бюро) с учетом рационального разделения труда в конкретных организационно-технических условиях.
Требования к необходимому стажу работы повышаются на 2-3 года по сравнению с предусмотренными для специалистов I квалификационной категории. Должностные обязанности, требования к знаниям и квалификации заместителей руководителей структурных подразделений определяются на основе характеристик соответствующих должностей руководителей.
т.е. ведущий — это не возможно руководитель, а совершенно точно руководитель.
видим, что никакой такой современной пурги, когда человек поработал 3 года без руководства и стал «ведущим аналитиком» без функций управления, в принципе не предполагалось. это же нам показывает лингвистический тест: «если старший — то над кем?» «если ведущий — то кого?»
также интересно отдельно взглянуть на описание Аналитика, а заодно понять что такое «1-я квалификационная категория», об этом дальше
👍6🔥2
Если почитать внимательно оригинальную статью "Pattern: Backends For Frontends" by Sam Newman, то в главе "General Perimeter Concerns" можно заметить, что он рекомендует размещать BFF после "generic perimeter concerns, such as authentication/authorisation or request logging". Т.е. после "Gateway Offloading pattern".
Проблема в том, что конструктивно "Gateway Offloading pattern" и "Gateway Routing pattern" реализуются на практике одним и тем же решением, например, KrakenD.
В свою очередь, "Gateway Routing pattern" решает проблему "the client must be updated when services are added or removed."
Vlad Khononov возлагает на api-gateway еще и функции "Anticorruption layer":
💬 "Anticorruption layers implemented using an API gateway can be consumed by multiple downstream bounded contexts." (для frontend это особенный вопрос).
Таким образом, получается, что размещение BFF за API-Gateway будет противодействовать назначению API-Gateway в устранении связанности между API микросервисов и их внешними клиентами.
Другой аргумент заключается в том, что BFF нуждается в агрегации, а не наоборот.
Ну и в таком случае он не сможет решать проблему "causing the backend to become a bottleneck in the development process."
Выгдядит так, что BFF должен располагаться, всё-таки, перед api-gateway. Какие существуют еще аргументы или контр-аргументы?
Проблема в том, что конструктивно "Gateway Offloading pattern" и "Gateway Routing pattern" реализуются на практике одним и тем же решением, например, KrakenD.
В свою очередь, "Gateway Routing pattern" решает проблему "the client must be updated when services are added or removed."
Vlad Khononov возлагает на api-gateway еще и функции "Anticorruption layer":
💬 "Anticorruption layers implemented using an API gateway can be consumed by multiple downstream bounded contexts." (для frontend это особенный вопрос).
Таким образом, получается, что размещение BFF за API-Gateway будет противодействовать назначению API-Gateway в устранении связанности между API микросервисов и их внешними клиентами.
Другой аргумент заключается в том, что BFF нуждается в агрегации, а не наоборот.
Ну и в таком случае он не сможет решать проблему "causing the backend to become a bottleneck in the development process."
Выгдядит так, что BFF должен располагаться, всё-таки, перед api-gateway. Какие существуют еще аргументы или контр-аргументы?
👍4💯1
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Если почитать внимательно оригинальную статью "Pattern: Backends For Frontends" by Sam Newman, то в главе "General Perimeter Concerns" можно заметить, что он рекомендует размещать BFF после "generic perimeter concerns, such as authentication/authorisation…
Как мне удалось выяснить, я не первый кто об этом задумался. KrakenD потому и использует декларативное описание в формате JSON, чтобы он мог выполнять в т.ч. и функции BFF силами команды разработки клиентского приложения.
💬 Desktop and mobile interfaces usually compete in requirements, and the backends keep growing to fit both types of usage. Every frontend team will work in different data views to display the content, and the backend team becomes a bottleneck as it must fulfill the frontend team’s needs. In many cases, the same type of information (or view) will require different response formats and response errors for each consumer, making your backend developers spend a lot of time developing this logic. And many meetings and time making the different frontend dev teams get on the contract agreement!
# How the BFF works
KrakenD implements the BFF pattern with aggregation, allowing your frontend teams to define precisely the information you want to retrieve from the different services and how to deal with the errors.
The client receives:
- Exactly the data it needs, and no more.
- The information for a use case is taken from a single call
- Aggregated information containing all involved services
- Optionally, stub static data when there’s missing information
- Separation of concerns
- Decoupling: Do not have to worry very much about the backend changing or evolving
-- https://www.krakend.io/docs/design/backend-for-frontend/
💬 Desktop and mobile interfaces usually compete in requirements, and the backends keep growing to fit both types of usage. Every frontend team will work in different data views to display the content, and the backend team becomes a bottleneck as it must fulfill the frontend team’s needs. In many cases, the same type of information (or view) will require different response formats and response errors for each consumer, making your backend developers spend a lot of time developing this logic. And many meetings and time making the different frontend dev teams get on the contract agreement!
# How the BFF works
KrakenD implements the BFF pattern with aggregation, allowing your frontend teams to define precisely the information you want to retrieve from the different services and how to deal with the errors.
The client receives:
- Exactly the data it needs, and no more.
- The information for a use case is taken from a single call
- Aggregated information containing all involved services
- Optionally, stub static data when there’s missing information
- Separation of concerns
- Decoupling: Do not have to worry very much about the backend changing or evolving
-- https://www.krakend.io/docs/design/backend-for-frontend/
KrakenD - Open source API Gateway
Backend-for-Frontend (BFF) Design Pattern
Discover how to leverage the Backend-for-Frontend (BFF) design pattern with KrakenD API Gateway to optimize frontend-backend communication
👍1👎1🔥1
В процессе обсуждения в чате канала ко мне в библиотеку попала новая книга "Джедайские техники конструктивного общения" Александра Орлова.
Там была одна метафора, которая заставила меня задуматься:
💬 Что делает кирпичную стену прочной? Идеальная геометрия каждого кирпичика или смесь, скрепляющая их между собой? Если вы видели, как делают кирпичную кладку, то легко можете представить, как получается ровная и прочная стена, несмотря на далекую от идеала точность изготовления отдельных кирпичей.
На первый взгляд кажется, что это утверждение противоречит приводимому мною ранее утверждению о том, что "Важно не объединение людей само по себе, а те принципы, на которых оно основано." Когда возникает противоречие, то это говорит о том, что что-то упущено из зоны внимания рассмотрения. И это что-то хорошо демонстрируется этой картинкой. Насколько важна прочность этой стены, если она не в состоянии осуществлять возложенные на неё функции?
Там была одна метафора, которая заставила меня задуматься:
💬 Что делает кирпичную стену прочной? Идеальная геометрия каждого кирпичика или смесь, скрепляющая их между собой? Если вы видели, как делают кирпичную кладку, то легко можете представить, как получается ровная и прочная стена, несмотря на далекую от идеала точность изготовления отдельных кирпичей.
На первый взгляд кажется, что это утверждение противоречит приводимому мною ранее утверждению о том, что "Важно не объединение людей само по себе, а те принципы, на которых оно основано." Когда возникает противоречие, то это говорит о том, что что-то упущено из зоны внимания рассмотрения. И это что-то хорошо демонстрируется этой картинкой. Насколько важна прочность этой стены, если она не в состоянии осуществлять возложенные на неё функции?
👍3🔥1💯1
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
В процессе обсуждения в чате канала ко мне в библиотеку попала новая книга "Джедайские техники конструктивного общения" Александра Орлова. Там была одна метафора, которая заставила меня задуматься: 💬 Что делает кирпичную стену прочной? Идеальная геометрия…
@BorisRomanov развидел то, что упустил я - важна не стена, а фундамент! Именно о фундаменте говорится здесь:
💬 "Важно не объединение людей само по себе, а те принципы, на которых оно основано."
Автором этого утверждения является Фидель Кастро. А он умел создавать высокоэффективные команды.
Когда его группа (вместе с Эрнесто Че Геварой) из 82 голодных, изнеможённых человек добралась вброд до берегов Кубы, - их поджидали 35000 вооружённых солдат, танки, 15 судов береговой охраны, 10 военных кораблей, 78 истребителей и транспортных самолётов. И они победили. Они осуществили одно из самых немыслимых изменений в истории человечества.
На собственном примере они доказали слова "Шарль де Голль":
💬 "Исторический фатализм существует для трусов. Смелость и счастливый случай не раз меняли ход событий. Этому учит нас история. Бывают моменты, когда воля нескольких человек сокрушает все препятствия и открывает новые дороги".
P.S.: Был в моей жизни момент, когда я серьезно готовился к партизанским действиям, потому что вероятность неизбежности этого была очень высокой. Именно тогда я и познакомился с опытом кубинских партизан и революционеров. Это фразу я прочёл 10 лет назад, и она навечно врезалась в мою память.
💬 "Важно не объединение людей само по себе, а те принципы, на которых оно основано."
Автором этого утверждения является Фидель Кастро. А он умел создавать высокоэффективные команды.
Когда его группа (вместе с Эрнесто Че Геварой) из 82 голодных, изнеможённых человек добралась вброд до берегов Кубы, - их поджидали 35000 вооружённых солдат, танки, 15 судов береговой охраны, 10 военных кораблей, 78 истребителей и транспортных самолётов. И они победили. Они осуществили одно из самых немыслимых изменений в истории человечества.
На собственном примере они доказали слова "Шарль де Голль":
💬 "Исторический фатализм существует для трусов. Смелость и счастливый случай не раз меняли ход событий. Этому учит нас история. Бывают моменты, когда воля нескольких человек сокрушает все препятствия и открывает новые дороги".
P.S.: Был в моей жизни момент, когда я серьезно готовился к партизанским действиям, потому что вероятность неизбежности этого была очень высокой. Именно тогда я и познакомился с опытом кубинских партизан и революционеров. Это фразу я прочёл 10 лет назад, и она навечно врезалась в мою память.
👍3🔥2😢1
Forwarded from Denis Migulin
Это точно не первая статья, искал как-то для митапа инфу.
На несколько месяцев раньше статья Phil Calçado, про его опыт в SoundCloud, где вводится сам термин BFF. По крайней мере я не нашёл более ранних упоминаний. https://philcalcado.com/2015/09/18/the_back_end_for_front_end_pattern_bff.html
А за 3 года до этого (2012) статья Netflix, где без введения термина BFF тем не менее очень подробно разбираются предпосылки к этому паттерну и немного об их реализации. Вполне возможно, что Netflix, с их ~800 типами клиентов, были действительно первыми, кто реально столкнулся с такой проблемой в масштабах.
https://netflixtechblog.com/embracing-the-differences-inside-the-netflix-api-redesign-15fd8b3dc49d
На несколько месяцев раньше статья Phil Calçado, про его опыт в SoundCloud, где вводится сам термин BFF. По крайней мере я не нашёл более ранних упоминаний. https://philcalcado.com/2015/09/18/the_back_end_for_front_end_pattern_bff.html
А за 3 года до этого (2012) статья Netflix, где без введения термина BFF тем не менее очень подробно разбираются предпосылки к этому паттерну и немного об их реализации. Вполне возможно, что Netflix, с их ~800 типами клиентов, были действительно первыми, кто реально столкнулся с такой проблемой в масштабах.
https://netflixtechblog.com/embracing-the-differences-inside-the-netflix-api-redesign-15fd8b3dc49d
Medium
Embracing the Differences : Inside the Netflix API Redesign
We have moved to a new, fully customizable API
👍1🔥1
Причина, по которой Microsoft Reference Application eShopOnContainers выбрал Envoy (взамен Ocelot) в качестве api-gateway, заключается в поддержке gRPC и WebSocket:
The reference microservice application eShopOnContainers is currently using features provided by Envoy to implement the API Gateway instead of the earlier referenced Ocelot. We made this design choice because of Envoy's built-in support for the WebSocket protocol, required by the new gRPC inter-service communications implemented in eShopOnContainers.
-- https://learn.microsoft.com/en-us/dotnet/architecture/microservices/multi-container-microservice-net-applications/implement-api-gateways-with-ocelot
Как я выяснил, KrakenD поддерживает их только в Enterprise версии.
Из полностью свободных аналогов с поддержкой gRPC и WebSocket выделяются Envoy и Apisix.
Какому решению (из перечисленных или сторонних) вы отдаете предпочтение? Интересуют решения, позволяющие работать как с кубиком, так и без него.
The reference microservice application eShopOnContainers is currently using features provided by Envoy to implement the API Gateway instead of the earlier referenced Ocelot. We made this design choice because of Envoy's built-in support for the WebSocket protocol, required by the new gRPC inter-service communications implemented in eShopOnContainers.
-- https://learn.microsoft.com/en-us/dotnet/architecture/microservices/multi-container-microservice-net-applications/implement-api-gateways-with-ocelot
Как я выяснил, KrakenD поддерживает их только в Enterprise версии.
Из полностью свободных аналогов с поддержкой gRPC и WebSocket выделяются Envoy и Apisix.
Какому решению (из перечисленных или сторонних) вы отдаете предпочтение? Интересуют решения, позволяющие работать как с кубиком, так и без него.
Docs
Implementing API Gateways with Ocelot - .NET
Learn how to implement API Gateways with Ocelot and how to use Ocelot in a container-based environment.
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Причина, по которой Microsoft Reference Application eShopOnContainers выбрал Envoy (взамен Ocelot) в качестве api-gateway, заключается в поддержке gRPC и WebSocket: The reference microservice application eShopOnContainers is currently using features provided…
Какой api-gateway предпочитаете?
Anonymous Poll
4%
Apache Apisix
28%
Envoy
6%
Ocelot
13%
KrakenD CE
3%
KrakenD EE
8%
Kong Open Source
1%
Kong Enterprise
1%
Kong Konnect
22%
Kubernetes Gateway API
30%
Другой (напишу в комментариях)
Коллеги, если кто-то ищет проверенного высококвалифицированного специалиста по DDD, микросервисам, Clean Architecture на Golang - обращайтесь ко мне в личку, пока кандидатура не ушла. Имеет успешный практический опыт лида, программиста, архитектора и глубокую теоретическую подготовку. Его не нужно обучать и после него не нужно переделывать.
Единственное ограничение - работа из-за границы, платежи на зарубежный счет. Не налоговый резидент (но гражданин) РФ.
Не дешевый, но очень выгодный. Ручаюсь.
Единственное ограничение - работа из-за границы, платежи на зарубежный счет. Не налоговый резидент (но гражданин) РФ.
Не дешевый, но очень выгодный. Ручаюсь.
🔥10👍4❤2👎1
Идет мужик по лесу, смотрит - другой мужик лес рубит топором.
- Что делаешь?
- Лес рублю.
- Бензопила же рядом лежит. Возьми её - быстрее будет.
- Я не умею ею пользоваться.
- Инструкция лежит же рядом. Возьми, прочитай.
- Мне некогда - лес рубить надо.
К чему я вспомнил этот анекдот? Состояние кода может замедлить разработку более, чем на порядок, и продолжать замедлять по экспоненте.
В процессе программирования программист вводит символы с клавиатуры не более 10% времени (зачастую - не более 1% времени). Остальное время он читает существующий код и борется со сложностью.
Плохой код пишется одним программистом, однократно, не более 10% времени. А читается он всеми программистами команды, многократно, постоянно, более 90% времени программирования. Т.е. однократно написанный одним программистом плохой код будет замедлять всю команду более 90% её времени.
Таким образом, фраза "некогда писать правильно" является самообманом. Если у команды медленный темп разработки, то он более чем на 90% времени вызван медленным чтением и затрудненным пониманием написанного ранее кода. Именно поэтому скорость разработки деградирует обычно в геометрической прогрессии.
Самообманом является и фраза "потом исправим". Как сказал Randy Shoup, если у вас нет времени сделать это правильно, то с чего вы взяли, что у вас будет время сделать это дважды? Тем более, что потом скорость разработки будет ниже, а напряжение - выше.
Количество введенных символов слабо коррелирует со скоростью разработки. Например, ребята, увлекающиеся спортивным прохождением кат по программированию, заметили, что используя TDD они пишут в разы больше объем кода, но проходят каты процентов на 10% быстрее, чем без ТДД.
Все просто - используя TDD, появляется слабосвязанный код (иначе его сложно было бы протестировать), который легче читать и понимать.
Но я сейчас не об этом. А о том, что для того, чтоб писать высокоэффективный код, нужно обладать определенными знаниями.
Я вспоминаю, когда я начал работать с литературой по Software Design, то мой код начал существенно преображаться. Мой старый код вызывал у меня стыд. Я взял паузу в программировании Open Source проектов и засел за книжки. Я понимал, что лучше "прочесть инструкцию к бензопиле", нежели продолжать "рубить топором" то, что потом все-равно переделывать.
К тому моменту я уже начал немного разбираться в том, чем хороший код отличается от плохого. И я хотел, чтоб то же самое испытал мой товарищ, который продолжал "рубить топором" и не находил времени на прочтение "инструкции к бензопиле".
Хороший код отличается простотой, и выполняет главный императив разработки - управление сложностью. Но хороший код не спасает от еще одной сложности, про которую недавно написал @BorisRomanov (начиная отсюда). На эту же тему писал Егор Толстой и даже сам E. Dijkstra:
💬 "Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better."
—Edsger W. Dijkstra, 1984 On the nature of Computing Science (EWD896)
Менеджмент не сможет оценить качество кода, если не обладает соответствующим образованием. Но менеджмент рано или поздно заметит разницу в темпах разработки между вашей командой и другими командами, и начнет доверять вам больше. Если, разумеется, у вас хватит выдержки дотянуть до этого момента. Тут главное - взобраться на горку.
Труднее обстоит дело, когда вы не можете передавать знания команде личным примером, например, на позиции лида или архитектора. Для менеджмента ваши "инструкции к бензопиле" - просто отвлекание команды "от рубки леса". Возникает дилемма: спасать менеджмент от самого себя, вопреки его воле, понимая, что он никогда это не оценит, или же проявить внешний конформизм, осознавая, что
💬 "Те компании, которые не осознают, что знания являются средством производства более важным, чем земля, труд или капитал, постепенно умрут и никогда не поймут, что их погубило."
—Ларри Прусак
Хотелось порассуждать дальше, но закончилось место. Ладно, потом...
- Что делаешь?
- Лес рублю.
- Бензопила же рядом лежит. Возьми её - быстрее будет.
- Я не умею ею пользоваться.
- Инструкция лежит же рядом. Возьми, прочитай.
- Мне некогда - лес рубить надо.
К чему я вспомнил этот анекдот? Состояние кода может замедлить разработку более, чем на порядок, и продолжать замедлять по экспоненте.
В процессе программирования программист вводит символы с клавиатуры не более 10% времени (зачастую - не более 1% времени). Остальное время он читает существующий код и борется со сложностью.
Плохой код пишется одним программистом, однократно, не более 10% времени. А читается он всеми программистами команды, многократно, постоянно, более 90% времени программирования. Т.е. однократно написанный одним программистом плохой код будет замедлять всю команду более 90% её времени.
Таким образом, фраза "некогда писать правильно" является самообманом. Если у команды медленный темп разработки, то он более чем на 90% времени вызван медленным чтением и затрудненным пониманием написанного ранее кода. Именно поэтому скорость разработки деградирует обычно в геометрической прогрессии.
Самообманом является и фраза "потом исправим". Как сказал Randy Shoup, если у вас нет времени сделать это правильно, то с чего вы взяли, что у вас будет время сделать это дважды? Тем более, что потом скорость разработки будет ниже, а напряжение - выше.
Количество введенных символов слабо коррелирует со скоростью разработки. Например, ребята, увлекающиеся спортивным прохождением кат по программированию, заметили, что используя TDD они пишут в разы больше объем кода, но проходят каты процентов на 10% быстрее, чем без ТДД.
Все просто - используя TDD, появляется слабосвязанный код (иначе его сложно было бы протестировать), который легче читать и понимать.
Но я сейчас не об этом. А о том, что для того, чтоб писать высокоэффективный код, нужно обладать определенными знаниями.
Я вспоминаю, когда я начал работать с литературой по Software Design, то мой код начал существенно преображаться. Мой старый код вызывал у меня стыд. Я взял паузу в программировании Open Source проектов и засел за книжки. Я понимал, что лучше "прочесть инструкцию к бензопиле", нежели продолжать "рубить топором" то, что потом все-равно переделывать.
К тому моменту я уже начал немного разбираться в том, чем хороший код отличается от плохого. И я хотел, чтоб то же самое испытал мой товарищ, который продолжал "рубить топором" и не находил времени на прочтение "инструкции к бензопиле".
Хороший код отличается простотой, и выполняет главный императив разработки - управление сложностью. Но хороший код не спасает от еще одной сложности, про которую недавно написал @BorisRomanov (начиная отсюда). На эту же тему писал Егор Толстой и даже сам E. Dijkstra:
💬 "Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better."
—Edsger W. Dijkstra, 1984 On the nature of Computing Science (EWD896)
Менеджмент не сможет оценить качество кода, если не обладает соответствующим образованием. Но менеджмент рано или поздно заметит разницу в темпах разработки между вашей командой и другими командами, и начнет доверять вам больше. Если, разумеется, у вас хватит выдержки дотянуть до этого момента. Тут главное - взобраться на горку.
Труднее обстоит дело, когда вы не можете передавать знания команде личным примером, например, на позиции лида или архитектора. Для менеджмента ваши "инструкции к бензопиле" - просто отвлекание команды "от рубки леса". Возникает дилемма: спасать менеджмент от самого себя, вопреки его воле, понимая, что он никогда это не оценит, или же проявить внешний конформизм, осознавая, что
💬 "Те компании, которые не осознают, что знания являются средством производства более важным, чем земля, труд или капитал, постепенно умрут и никогда не поймут, что их погубило."
—Ларри Прусак
Хотелось порассуждать дальше, но закончилось место. Ладно, потом...
👍24🔥14❤2💯1
Forwarded from Денис Бесков написал
Что такое настоящий бизнес-анализ, как я это вижу
Опишу линейно, хотя там есть несколько циклов:
1. Взять первичный запрос, сформулировать в виде проблемы, также если у инициатора есть видение решения, тоже сформулировать
2. Определить, о каком участке бизнеса идёт речь, построив модель контекста
3. Построить онтологию и модель деятельности на этом участке
4. Выявить организационные роли в окружении участка бизнеса и их интересы, оценки текущей реализации интересов
5. Построить проблемное месиво и структурировать его через причинно-следственные связи (дерево текущей реальности), найти корневые причины, экономически измерить ущерб, наносимый последствиями
6. Построить дерево будущей реальности, выйдя на целевые эффекты
7. Сформулировать ограничения на решение
8. Из интересов оргролей сформулировать требования к решению
9. Разработать несколько вариантов решений, для каждого оценить стоимость и риски
10. Обосновать выбор конкретного решения
11. Принять участие в заказе, реализации и приёмке решения
12. Оценить эффект от решения, соотнести его с плановым
#бизнес_анализ
Опишу линейно, хотя там есть несколько циклов:
1. Взять первичный запрос, сформулировать в виде проблемы, также если у инициатора есть видение решения, тоже сформулировать
2. Определить, о каком участке бизнеса идёт речь, построив модель контекста
3. Построить онтологию и модель деятельности на этом участке
4. Выявить организационные роли в окружении участка бизнеса и их интересы, оценки текущей реализации интересов
5. Построить проблемное месиво и структурировать его через причинно-следственные связи (дерево текущей реальности), найти корневые причины, экономически измерить ущерб, наносимый последствиями
6. Построить дерево будущей реальности, выйдя на целевые эффекты
7. Сформулировать ограничения на решение
8. Из интересов оргролей сформулировать требования к решению
9. Разработать несколько вариантов решений, для каждого оценить стоимость и риски
10. Обосновать выбор конкретного решения
11. Принять участие в заказе, реализации и приёмке решения
12. Оценить эффект от решения, соотнести его с плановым
#бизнес_анализ
👍9🔥1🤔1
Случайно наткнулся на видео, в котором Александр Покрышкин рассуждает о лидерстве, об инструкциях и менеджменте, о роли теории, об искусстве побеждать. О том, как побеждать в условиях, когда инструкции и менеджмент препятствуют победе.
Когда-то я услышал фразу, что заяц не может научить охотиться. Сегодняшний рынок знаний переполнен всяким хламом о лидерстве от зайцев. Поэтому, я всегда читал в первоисточнике тех людей, лидерские способности которых не вызывают сомнений. Особый интерес вызывает путь тех людей, которые выбились в лидеры не благодаря природным способностям, а вопреки им. Взять, например, Ивана Кожедуба:
"В начале военной карьеры Ивана Никитовича преследовали неудачи, его даже чуть было не перевели на пост оповещения. Только заступничество командира полка майора И. Солдатенко помогло ему остаться в полку. Свою первую победу летчик одержал в ходе 40-го боевого вылета, сбив немецкий пикировщик."
—"Кожедуб Иван Никитович" / Киселев О. Н.
Раз уж затронул тему лидерства, то нелишне было бы в очередной раз упомянуть книгу "Becoming a Technical Leader" by Gerald M. Weinberg.
Кстати, глава о лидерстве в этой книге начинается со слов Лао Цзы:
If you are a good leader,
Who talks little,
They will say,
When your work is done,
And your aim fulfilled,
"We did it ourselves."
- Lao Tse
А так же книгу "Дао Лидера" Джона Хейдера, которая является современной интерпретацией "Дао Де Цзин" Лао Цзы и учит лидерству на основе диалектической философии. Ну и подборку по лидерству от "Harvard Business Review".
Когда-то я услышал фразу, что заяц не может научить охотиться. Сегодняшний рынок знаний переполнен всяким хламом о лидерстве от зайцев. Поэтому, я всегда читал в первоисточнике тех людей, лидерские способности которых не вызывают сомнений. Особый интерес вызывает путь тех людей, которые выбились в лидеры не благодаря природным способностям, а вопреки им. Взять, например, Ивана Кожедуба:
"В начале военной карьеры Ивана Никитовича преследовали неудачи, его даже чуть было не перевели на пост оповещения. Только заступничество командира полка майора И. Солдатенко помогло ему остаться в полку. Свою первую победу летчик одержал в ходе 40-го боевого вылета, сбив немецкий пикировщик."
—"Кожедуб Иван Никитович" / Киселев О. Н.
Раз уж затронул тему лидерства, то нелишне было бы в очередной раз упомянуть книгу "Becoming a Technical Leader" by Gerald M. Weinberg.
Кстати, глава о лидерстве в этой книге начинается со слов Лао Цзы:
If you are a good leader,
Who talks little,
They will say,
When your work is done,
And your aim fulfilled,
"We did it ourselves."
- Lao Tse
А так же книгу "Дао Лидера" Джона Хейдера, которая является современной интерпретацией "Дао Де Цзин" Лао Цзы и учит лидерству на основе диалектической философии. Ну и подборку по лидерству от "Harvard Business Review".
🔥10👍2🤣1
Forwarded from ROSTMEO
Media is too big
VIEW IN TELEGRAM
В этот день 6 марта 1913г родился советский легендарный лётчик-ас, Александр Покрышкин 🫡
Фильм "Хозяин неба" (1985г)
Фильм "Хозяин неба" (1985г)
🔥6
emacsway-log: Software Design, Clean Architecture, DDD, Microservice Architecture, Distributed Systems, XP, Agile, etc.
Случайно наткнулся на видео, в котором Александр Покрышкин рассуждает о лидерстве, об инструкциях и менеджменте, о роли теории, об искусстве побеждать. О том, как побеждать в условиях, когда инструкции и менеджмент препятствуют победе. Когда-то я услышал…
💬 The more I struggled against becoming a leader, the more I was setting my own direction—and the more I was becoming a leader.
💬 Whenever I want to learn about something, I arrange to teach a course on the subject. After I've taught the course enough to learn something, I write a book.
💬 Leaders are leaders of change – change in other people, change in working groups, and change in organizations. Above all, leaders are leaders of change in themselves. To become a leader, you have to understand how change happens; yet it's difficult to see change in yourself.
-- "Becoming a Technical Leader" by Gerald M. Weinberg.
💬 Whenever I want to learn about something, I arrange to teach a course on the subject. After I've taught the course enough to learn something, I write a book.
💬 Leaders are leaders of change – change in other people, change in working groups, and change in organizations. Above all, leaders are leaders of change in themselves. To become a leader, you have to understand how change happens; yet it's difficult to see change in yourself.
-- "Becoming a Technical Leader" by Gerald M. Weinberg.
👍6🔥1
Z-lib позволяет создавать персонализированный бот.
💬 Bot is a fast and convenient way to download books. And now our users can get and configure their own personal bot. To do this visit our library website > Edit Profile or click on the bot icon at the bottom of the website page.
https://news.1rj.ru/str/zlibrary_official/6
💬 Bot is a fast and convenient way to download books. And now our users can get and configure their own personal bot. To do this visit our library website > Edit Profile or click on the bot icon at the bottom of the website page.
https://news.1rj.ru/str/zlibrary_official/6
Telegram
Z-Library Official 📚
Our recent updates (January):
🔹Personal Telegram bot
Bot is a fast and convenient way to download books. And now our users can get and configure their own personal bot. To do this visit our library website > Edit Profile or click on the bot icon at the…
🔹Personal Telegram bot
Bot is a fast and convenient way to download books. And now our users can get and configure their own personal bot. To do this visit our library website > Edit Profile or click on the bot icon at the…
🔥6