Как методично обдумывать вопросы проектирования системы?

Как методично обдумывать вопросы проектирования системы?
Как методично обдумывать вопросы проектирования системы? - dada_design @ Unsplash

Я работаю над своим первым большим проектом по проектированию систем на работе, впервые в своей карьере. В прошлом, когда я работал над большими системами, я всегда работал с кем-то еще, поэтому я не отвечал за дизайн, я просто понимал сделанный выбор и указывал на потенциальные плюсы/минусы в конкретных вещах. Здесь мой менеджер поставил передо мной расплывчатую задачу и попросил придумать полный дизайн системы.

Теперь проблема не особенно «сложная», на самом деле это довольно распространенная проблема, но у каждого дизайна есть свои особенности, которые в моем случае мне нужно обойти. Кроме того, хотя на высоком уровне дизайн, который я придумал, имеет смысл, я сразу начинаю сомневаться, будет ли он работать на основе более мелких деталей.

Например, я думаю про себя: «Хорошо, если я перенесу эти необработанные события в хранилище временных рядов, мы сможем выполнить X и Y», «О нет, если язык запросов временных рядов не поддерживает такого рода функции. , то мы не сможем сделать Z". Или «Мне нужны данные в этой структуре, но инструменты потоковой передачи, которые у нас есть, не будут легко поддерживать подобное преобразование в самом конвейере. Означает ли это, что мы обрабатываем пакетную обработку после сохранения?»

По сути, мне сложно самостоятельно спроектировать полную систему e2e, не запутавшись и не столкнувшись с проблемами типа «если эта деталь неверна, система не будет работать». Мне интересно, как более опытные люди думают о проблемах проектирования системы, не увязая в деталях.

Не ожидайте, что из расплывчатого описания проблемы возникнет точный проект системы. Описание проблемы должно быть конкретным, чтобы получить качественное решение. Задавайте лучшие вопросы, получайте лучшие ответы.

Итеративный дизайн существует для решения расплывчатых, неконкретных проблем. Он состоит из создания небольших быстрых прототипов (а иногда и небольших быстрых бумажных прототипов), демонстрации прототипа заинтересованным сторонам, получения обратной связи и доработки прототипа до тех пор, пока дизайн не удовлетворит ожидания заинтересованных сторон, какими бы они ни были. На этом этапе прототип воплощает дизайн.

Не пытайтесь быть ясновидящим; вы не сможете предугадать все возможные варианты развития проблемы. Пусть заинтересованные стороны скажут вам, какие характеристики системы наиболее важны для них, и адаптируйте свой проект к этим ожиданиям.

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

  1. Разбивайте большие проблемы на более мелкие, легко усваиваемые, которые могут быть обработаны отдельными классами или методами.

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

  3. Используйте уже существующие архитектурные решения, такие как MVVM.

  4. Безжалостно рефакторить, чтобы ваш код оставался чистым, простым и понятным.

  5. Поймите масштаб вашей проблемы. Большие проблемы требуют более сложной архитектуры.

Естественно, чем больше у вас опыта в написании кода, тем лучше работает этот процесс.


LetsCodeIt, 6 января 2023 г., 02:19

Похожие посты

Обработка многих видов работ параллельно, но последовательно для каждого вида работКаково определение «доступности»?Лучшие практики для связывания, связывания или абстрагирования похожих, но разных объектов вместеГранулярность микросервиса: Следует ли вообще разбивать сервис на более мелкие сервисы с общей базой данных?Архитектура пула воркеров с разной сложностью задач и размерами ящиковКак я могу эффективно сравнить файл CSV с базой данных?Является ли это правильным механизмом для двухсторонней передачи данных?Как достигается конечная согласованность между устройствами в реальном времени?Разработка системы управления заказами и диспетчеризации для курьеровПроблемы шардирования по user_id на Facebook/Instagram: неравномерное распределение данных, ограниченное пространство для пользователя, недоступные фотографии, высокая задержка