Here's a really interesting discussion about this quote and the idea behind the above: https://softwareengineering.stackexchange.com/questions/1631...
As a backend dev myself, I totally agree with it, but I think when we're developing full blown apps we should have the end user in mind and focus on their experience using our app more than on adopting data-driven UI design.
If you want to get fancy, you can use Mirage JS [1] to emulate network requests with mock data.
First design the data. This will tell you how this part of the solution integrates with what everybody else is doing, and will make very obvious some problems that otherwise you may only discover after the system is mature into usage.
Then design the UX and users processes. Programmers get to design only half of those, but both have to be set at the same time.
Then you can do everything else.
And yes, letting an ORM dictate migrations guides people into a completely wrong sequence.
The frontend requirements can help define what api's are required but if you treat your database as dumping tables you limit what your data can do.
You add can add and remove indexes at any point. If you made a bad decision or no decision you would add those when more information is available.
With regard to migrations though, I tend to disagree. Code is very easy to manage in version control, so the migration files are merely the data structure represented in code. I love migrations and they've vastly changed the way I work.
The data model is the thing that stays more invariant in an app, and you can start with that:
https://github.com/Qbix/architecture/wiki/Internet-2.0
But a centralized database is not the future. Client-first web apps are:
https://qbix.com/blog/2020/01/02/the-case-for-building-clien...
So your data will be stored client-side and synced, with Dat or MaidSAFE or IPFS etc.
I agree, though I generally reduce this question to, "what is the shape of my data?".
Thats how I know I'm on the right path. I start to organize the data and new things that appear fit naturally into what I've already discovered.
This is the epitome of organic design because you are simply the conduit between the truth and a schema definition. If you force yourself to not be clever and just interpret what you've found, your database model will be solid.
Can you talk about how you figure this part out? As you imply, this seems like it is your actual first step, not designing the database.
There's all the stuff that comes before actually doing that, generally, though not always, the feature is driven by some front-end requirement and may have accompanying product specification and possibly even UX designs. But I try to take those and think about what the domain concept being addressed is, rather than the shape of the data the front-end requires. Almost always the front-end and requirements will change through iteration so I find that purely mapping the FE concepts directly to the data-structure is less robust than taking a step back and thinking about the actual data without consideration for the proposed front-end design. Though the front-end can still inform aspects of the database at this stage it should only provide minor optimizations to the schema through indexes or normalization choices.
I suppose in part it's taking a domain-driven design approach and making the first step encoding the domain in the database. It has been my experience that many headaches in applications I encounter could have been avoided if the constraints had been enforced against the data at the persistence level rather than assuming the application level code will handle it correctly.
I definitely agree that when possible it is very useful to enforce important constraints in the database.
Anything else is ephermal.
History is littered with millions of enterprise software that can't beat the simplicity of a spreadsheet or the flexibility and efficiency of a unix command line
I'm a backend dev who does quite a bit of frontend though I deeply dislike the current state of frontend (bring back Webforms)
For me it all starts with the database, always. Code, ux, network is all ephemeral. The schema, the invariants and the data are forever. (this is also why I think microservices are often the wrong approach, you're solving a code problem at the expense of the data)
I've been thinking about the concept of code as pipes for data and the (incorrect) emphasis we place on code. This is why something like MongoDB never clicked for me, code is worthless without the data it operates on and ensuring the quality of that data takes priority over anything.
Of course you need to know roughly what the data will be used for and approaching it database first can result in some nasty surprises if the requirements change, but the rest of the code will rot and be replaced far sooner than the database. Given the churn on frontend the schema in the database will probably see 5 front end frameworks come and go.
Edit: having written this I realised this is also why I don't like or understand letting your ORM handle database migrations. The code is built on top of a dependable database, letting it inform the design of the database is completely the wrong way round, in my opinion.