Архив автора

Сложность программного проекта является комбинацией его системной (essential, имманентной) и случайной (accidental, ненужной) сложности.

Системная сложность проистекает из самой природы решаемой проблемы и не может быть уменьшена применением каких-либо методов или практик. Из-за нее сложность разрабатываемого приложения будет пропорциональна сложности моделируемой предметной области. Например, в системе, осуществляющей продажи, будет обязательно присутствовать функция биллинга, что составляет имманентную сложность, тогда как конкретное решение и возникающие проблемы с его реализацией и поддержкой — случайная сложность.

(далее…)

Всегда приятно начинать новый проект. Простые классы, четкие границы, ясная архитектура — все логично и красиво. Новая функциональность добавляется легко и быстро.

Идет время, проект развивается, поступают новые требования. Но приходит день, когда вы обнаруживаете в коде что-то плохое. Кто-то срезал угол и сделал небольшой костыль. Бывает, что вы сами делаете что-то на скорую руку, честно вставляя в код “todo” — просто потому, что эта функциональность нужна для ближайшего релиза, а времени сделать все правильно нет. “Это технический долг, который мы обязательно исправим после очередного релиза, но сейчас надо выдать версию” — произносим мы при этом.

Нет ничего более постоянного, чем временное — очень справедливые слова. Чаще всего бывает, что дальше технический долг будет только нарастать. Так же, как обслуживание долга в банке требует выплаты процентов, наличие технического долга забирает свой процент. Мы платим за это увеличивающейся сложностью внесения изменений, нарастающей неочевидностью и нелогичностью модели, изчезающим энтузиазмом команды.

В определенный момент становится понятно, что история повторилась и у нас в руках очередной “большой ком грязи”. Что же делать и можно ли этого избежать?

(далее…)

размер не важенНа днях в эксплуатацию была запущена первая версия системы, построенной на микросервисной архитектуре, в разработке которой мы приняли участие.

Данный подход в последнее время набирает популярность и, как многие популярные подходы, сопровождается громкой шумихой. Понимание реальных плюсов и проблем появляется, если опробовать его на практике. Мы попробовали и хотели бы поделиться полученным опытом.

Микросервисы предлагают новый подход к разработке больших систем. В противовес господствующей в настоящее время “монолитной” архитектуре, когда вся система реализована в единой базе кода, работает с одной большой базой данных и разворачивается как одна единица, микросервисный подход предлагает разделить систему на набор взаимодействующих подсистем. При этом, каждая подсистема (микросервис) развивается отдельно от остальных, не имеет с ними общей базы кода, работает со своими данными, в рамках собственной БД и отдельно разворачивается в выделенном контейнере.

Естественный вопрос, который возникает — как разделить набор функций системы на обособленные куски, пригодные для вынесения в подсистемы и до какого размера следует производить дробление?

(далее…)

На днях Google представил свой новый амбициозный проект. Wave (Волна) — по словам его главного разработчика Ларса Расмуссена, это то, как могла бы выглядеть электронная почта, будь она изобретена сегодня. На самом деле, Волна — органичное объединение трёх таких различных способов коммуникации людей как e-mail, IM(ICQ и т.п.) и Wiki.
(далее…)