Задать вопрос
  • Как понять микросервисы?

    @deliro
    Как понять микросервисы?

    Прочитать соответствующую книгу (а лучше ещё парочку про DDD или хотя бы посмотреть этот доклад)

    Затем ответить на несколько вопросов:
    1. Почему вы решили, что микросервисы что-то вам дадут?
    2. Есть ли у вас настоящие причины для микросервисной архитектуры? (А именно: зоопарк технологий с невозможностью написать 99% на одном языке; более тысячи разработчиков; сложность выкатки монолита в виде часов прогонов CI/CD — тестов, билда, деплоя, стопоров выкатки в виде кучи проблем из-за разработчиков; вы такие же большие как гугл, убер, амазон и т.п.). Или вам просто нравится модное слово "микросервисы"?

    Не получится создать хорошую микросервисную архитектуру без умения создать хороший модульный монолит. В этом случае вы получите не только все проблемы плохого монолита: высокая связанность, каскадные падения, долгий CI/CD; но и все проблемы микросервисов: их надо оркестрировать (у вас же есть команда, которая будет поддерживать инфраструктуру?); каждому микросервису нужно своё CI/CD (и хорошее); сеть может (и будет) лагать и обрываться; длительность запросов увеличится на порядок(ки) (особенно если выбрать какой-нибудь JSON-RPC over HTTP); нужно предусмотреть failover strategy (например, идемпотентные ретраи. Вы же уже знаете про correlation id, саги и что делать, если прилетел network error на запрос в другой сервис "списать 10 баксов"?) и circuit breakers; трейсы и логи, которые не пришлось бы искать по сотням .log файлов от каждого сервиса; бизнес-логика расползётся по разным микросервисам и нарушит SRP (пофиг, что нарушит, важнее то, что это починить будет сильно сложнее). Список можно продолжать долго.
    Ответ написан
    11 комментариев
  • Переход с Angular на React. Тренд или нет?

    @msdosx86
    Реакт это библиотека, а Ангуляр - это целый фреймворк. Если вы работаете в сфере энтерпрайза, то легче выбрать ангуляр, так как в нём уже есть то, что нужно для создания архитектуры огромного веб приложения и для поддержки кода в дальнейшем. Когда же огромные приложения начинают писаться на реакте, то это выглядит как мешанина из кучи npm пакетов (тот же редакс, санки, аксиос, флоу, реакт-роутер). Не спорю, что на реакте тоже можно большие приложения создавать, но для этого потребуется больше усилий (при одинаковых знаниях фреймворков). Почему? Да потому что в ангуляре с тайпскриптом и архитектурой, которую ангуляр навязывает разработчикам, можно применять классические паттерны проектирования, которые до этого применялись в классических языках типа джавы или c#. Их в обычном js'е тоже можно применять, но толку от этого не много, так как классические паттерны завязаны на ООП и статической типизации. Зачем нужны паттерны? Для поддержания кода. У нас в компании проекты поддерживаются по несколько лет (знаю проекты, которые поддерживаются уже больше 5 лет) и на проект подключают других людей. Кого то убирают, кого то подключают. И когда нужно поддерживать код, то тут тайпскрипт и архитектура ангуляра в самый раз позволяет всё это делать безболезненно (при условии, что код пишут хорошо). Весь этот, не побоюсь слова, "высер", который написал коллега выше, в сторону ангуляра обусловлен тем, что у ангуляра порог вхождения выше, чем у остальных фреймворков. И поэтому людям кажется, что там происходит какая-то магия. И получается, что люди не понимают, что там происходит и жалуются, что слишком сложно, но зато в реакте всё просто. В реакте действльно всё намного проще. Чтобы писать на реакте вам в принципе хватит знаний es6. Чего не скажешь про ангуляр. Ибо там тайпскрипт и rxjs, который просто понять не получится, надо изрядно постараться, чтобы начать думать потоками и как с ними работать. Но когда ты начинаешь понимать как работает rxjs, как работает сам ангуляр (change detection например), то становится просто невообразимо легко писать код. Весь хейт в сторону ангуляра из-за того, что фронтенда изначально не существовало как такового. Ведь был пхп и он прекрасно работал с хтмл. Потом появились шаблонизаторы и jquery. Всё это делалось бекендерами и фронтенда как такового не было. И потом появились фреймворки типа ангуляра, которые бОльшую часть логики взяли на себя и бекенд превратился в REST API. Фронтенд не был сложным, Ангуляр значительную часть логики взял на себя и тем самым усложнил фронтенд, поэтому те, кто привыкли формочки верстать, не могут осилить эти тонны абстракций. На каком нибудь фрилансе или средних проектах нет смысла в ангуляре, поэтому там и используются реакт и вью, ну и жиквери, куда ж без него. А если проект уровня 50-100К долларов, то тут ни о каких жиквери речи нет.
    Ответ написан
    4 комментария
  • Как вы освоили шаблоны проектирования?

    dmitry_pavlov
    @dmitry_pavlov
    World-class .NET freelance contractor (remotely)
    Когда начался бум и восторг вокруг концепции паттернов проектирования, выкрики "GoF рулит!" и так далее, я озадачился тем, чтобы понять, что за шум?

    По своей сути - паттерны - это обычные шаблоны проектирования. Заимствовано у обычных архитекторов (те, которые зданиями занимаются). Суть проста. В работе архитектора есть задачи, которые удобно решать одним или несколькими проверенными способами.

    По аналогии в проектировании софта имееются свои архитектурные вопросы вроде разбиения приложения на компоненты/модули, организации зависимостей между ними, распределение функциональных обязанностей и т.п. Как ловко подметили авторы книжки из этой банды четырех (The "Gang of Four") в нашей индустрии можно также выделить некоторе количество типовых шаблонов, проверенных на практике, чтобы тем самым не наступать на уже обойденные другими грабли.

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

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

    К изучению паттернов я дам такие советы:

    1) Прочтите пару книжек, чтобы понять, что это за зверь и с чем его едят. Можно взять одну из вариаций книжки GoF или какие-то производные для вашего стека разработки - познакомиться с основными популярными шаблонами. Сразу после этого я посоветовал бы прочесть книжку "Горький вкус Java" (Брюс Тейт) - она про анти-паттерны. Это чтобы понять обратную сторону их использования. Мне понравилась и уберегла думаю от многих проблем. То что на примере Java - неважно. Речь идет о шаблонах, так что представителям других стеков (к которым отношусь и я) будет просто понять все равно.

    2) Постарайтесь осознать, доводилось ли вам сталкиваться в работе раньше с чем-то, что является или могло бы легко стать одним из шаблонов. Где получалось применить концепт верно, а где из-за этого только проблемы были.

    3) В новых проектах, держите в голове полученные по шаблонам знания - вдруг пригодятся.

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

    Я даже пожалуй посоветовал бы подойти к освоению айтишной архитектурной мудрости с другой стороны - со стороны нефункциональных требований или так называемых "-ilities" - их много. Тут вот описаны 7 штук. А вообще их десятки.

    Среди прочих - такие как maintainability (простая поддержка кода), scalability (масштабируемость), extensibility (расширяемость), availability (устойчивость ) и тп. Если, проектируя свое приложение, вы задумываетесь об этих "илитях" и стараетесь их обеспечить в необходимом проекту объеме, то, как правило, ваше приложение будет иметь отличную архитектуру. При этом шаблоны проектирования в ней появятся лаконично сами собой.

    Поскольку идея использовать шаблоны - это попытка опытных программных инженеров дать десяток готовых рецептов менее опытным, чтобы пока они не научились варить "вкусную кашу", они не варили уж что-то совсем несъедобное. :) Учитесь "готовить", разбирайтесь в -ilites :) и все будет хорошо
    Ответ написан
    6 комментариев