Представьте себе, что вам нужно что-то запрограммировать. Какой-то продукт или фичу. С чего же начать?
Ну понятно, что сначала надо вытрясти все требования, продумать user stories. Этап конечно важный, но в данном случае речь не об этом, пропустим. Будем считать, что первые требования уже собраны и надо браться за непосредственно разработку. Итак, что теперь?
Обычно в таких случаях говорят: ну надо сделать архитектуру. Без архитектуры никуда. Но что именно под этим подразумевается? И обычно дальше под этим подразумевают что-то типа: надо разбить программу на модули. Надо продумать иерархию классов. А какие будут сервисы. А какие интерфейсы. А давайте применим вот этот паттерн. Наверное, с этого и надо начинать?
А вот нифига.
Вообще говоря, любая программа - это всего навсего инструмент по перелопачиванию данных. Данные на входе, данные на выходе. Данные где то хранятся. По сути то.
А все остальное - это по большому счету не более чем синтаксический сахар вокруг шестеренок, пережевывающих данные. Все эти классы, иерархии, модули, паттерны и даже целые парадигмы. Все оно ненастоящее, невесомая бумажная обертка для красоты и удобства.
Вот и получается, что данные первичны и начинать надо с них.
- Где происходит ввод данных?
- Где отображаются?
- Какие у нас есть еще данные и где они живут?
- А какое у них время жизни и кто отвечает за их удаление?
- Как обеспечивается корректное состояние данных?
- Есть ли дублирующиеся данные? А точно ли оно надо и нельзя ли без? Если нельзя, то как обеспечить синхронность?
- Где какие данные нужны? Как они попадают из точки A в точку B? Какова логистика системы?
- Что с потоками? Какие потоки что могут трогать и почему от этого ничего не сломается?
Это в общем то основное - разложить данные по полочкам и обеспечить их корректность. После этого обернуть данные в сахарные обертки уже несложно. Это конечно тоже важно, но все-таки вторично.