When I got my first development job, I started out scribbling relational algebra on scrap paper and then translating it to SQL. I got faster and faster until I could think in SQL.
A lot of people who want/need to understand the broad strokes of a database and how to query it effectively don't need to understand the deep, deep under-pinnings, and (unless you approach it cautiously) diving into it all will be actively counter-productive.
People who don't understand relational theory can't write SQL to save their lives.
I've seen schemas that literally made me scream.
I think the same applies to algorithms and data structures, e.g. red-black trees from the Cormen are literally std::map.
Perhaps the ideal order to learn in would be practical, theoretical, practical (applied theoretical), though that's just a gut feeling.
I'm thinking you may have a third variable problem here; people who write sucky SQL tend not to have spent a lot of time thinking about how to write non-sucky SQL. People who write non-sucky SQL have. The former has nearly zero chance to have been exposed to relational theory...the latter has a non-zero chance to have been. Correlation /= causation and all that, and the actual causative variable is time spent learning how to write non-sucky SQL.
Source?
From anecdotal experience, I've seen countless developers write reasonably acceptable SQL without even knowing relational algebra exists in the first place.
Like a musician who can't read sheet music.
I'm afraid that the converse might be true too, so I consider this to be a negative point for Access.
For example, differentiation by itself is just pushing symbols around according to some arbitrary-seeming rules. It's not until I did physics that its purpose made sense. I studied calculus for years, and it never "clicked" for me, and I forgot most of it promptly. Then in just a semester of physics where I was applying it in the context of complicated problems, it suddenly felt like second-nature. I had to basically re-learn all of it from scratch, but with the context of my physics problems it was so easy!
I've had similar experiences teaching programming to junior staff. Anything you talk about in isolation goes in one ear and out the other. They have to encounter the problem in something larger that they are solving for the solution to make sense and motivate them to learn.
An example is string-escaping. E.g.: how do you represent the quote symbol in a quoted string? This seems trivial, but it trips up everyone when they are getting started. I mean literally everyone. So okay, I make sure to cover it in like... lesson #1 or #2 because string literals are everywhere, and escaping is common. Every single time, the people that sat through that lesson will ask me a week later to help me fix as program that has a literal like 'O'Brian' in it, and they can't figure out why it's broken. But once I show them that they should have used 'O''Brian' or 'O\'Brian', it all makes sense to them and they memorise the technique.
That book was totally great. Even if you got lost in the math reading the last formal part you understood what was going on.
"Here's what we're aiming for, and here's why it matters" should be the introduction, setting the scene and establishing the flow, but then you introduce the various blocks-that-will-be-built and start working up to them in the stepped fashion.
Trying to think of a good example reminds me of a puzzle game; and how sometimes the contrived puzzles in such games can be obtuse or phrased poorly because they really don't want to give away the answer.
The example should start with an unsolvable problem, then simplify aspects to make it more of an estimation model; which is a useful skill as well.
I feel even more strongly about this for mathematics and computer science: you cannot strip away the context of a technique/idea/concept, and hope to have people understand why it's useful. For example, I'm currently self-teaching myself mathematics. Calculus and its techniques (integration, differentiation, solving PDEs/ODEs, whatever) are easy -- when you understand the context: physical mechanics. Strip that away and what do you get? Symbols and equations that have zero meaning in the real world. It's effectively indistinguishable from GPT-3 text -- it's utter nonsense that doesn't make any sense unless you've already learned the concepts somewhere else, and can piece together what the hell the author is trying to get across (sometimes, the author doesn't even know, but pretends to know!).
Same with probability and statistics. I cannot understand the sheer myopia needed to completely strip away probability from its gambling context: how does this benefit learners? I wasn't able to teach myself these things from regular stats & prob books, because it's schizophrenic gibberish without any context -- without even a single example of a practical application, much less "why is this useful? Why was this brought into the world? Why are you using Brownian Motion for actions of living things???" And then I picked up some theory of gambling books, and lo and behold everything makes sense. There is no cruft. There are no "gotchas" where you need to slam your head against the desk, and force yourself through the problems for it to "click"; everything just clicks because you understand why a certain technique or concept exists, and where it's applicable.
In short, the original context that lead to the creation of a certain technique/concept is enough of a "stage" to teach it; anything more abstract and you're cutting through bone.
> Once the students have absorbed those ideas, then you start combining the initial building blocks into more complex ideas
This is rarely implemented in a comprehensive way.
I think we're making progress though - we know how to be more effective, but it's a slow process to get there. Mastery of a subject does not necessarily include mastery of how to effectively teach it, and we need to start treating the 'education' bit of 'tech education' as an important and separate element requiring expertise.
When you're teaching something new, you want to be able to isolate that concept/technique and focus in on it. A simplified example, or a question with strict parameters, both allow the student(s) to concentrate on the key idea.
If you want to teach someone about SELECT in SQL, for example, it's useful to abstract away the database setup for that particular lesson. It's also useful to use a simplified database concerned with familiar entities, so that SELECT remains the focus rather than one new element of many.
Of course, these simplified examples shouldn't be used in isolation. Instead, you should have a number of them, eaching illustrating/assessing some small point or idea. Once the students have absorbed those ideas, then you start combining the initial building blocks into more complex ideas, just as you'd take a tiered approach when testing software; start with unit tests, then build up.
Effective education moves in steps.