"Ordinary" people could use those tools to make useful things. We seem to have gone backwards from there.
What was different about those systems?
They were integrated usage environments. Batteries included. In FoxPro, you got:
- built-in database
- built-in documentation
- built-in UI for editing data
- built-in UI for editing schema
- windowed environment (even in DOS)
- oh yeah and a scripting language
This was first and foremost a usable environment immediately. "Development" was an advanced usage.Emacs is this way. Smalltalk is this way. What they get is that programming languages are useless by themselves.
Contrast with now: the apps we build involve wiring together a database from here, a compiler from there, just figuring out how you're going to make pieces communicate and finally, you know, get something on the screen. Sure, there's an upside to composing systems a la carte. But the learning curve is far more prohibitive.
(Also, those xBASE systems just will not die. Just this morning I got an email question about a system that's been in service for 25 years now. How many of today's apps do you think will still be used (indeed, sold!) in 2043?)
Though apparently, it doesn't have lexical closures: https://news.ycombinator.com/item?id=16981170
Because as you say, grammar and semantics (aka language) are not enough.
Hence why when I analyse how suitable a programming language is for a given project, I always consider the whole ecosystem, and not how easy it is do FP, immutability or whatever is cool this year.
It's crazy to me that even the tools that are trying to capture this space today have not managed to beat the usability of that.
E.g. tools like Airtable are great as long as you're trying to do something simple, but then you hit their limits, and suddenly the step up in complexity to do what you need is too large. Whereas with tools like dBase you could start with "just" a database with the default entry, and the steps up to gradually build up to a full application were small in comparison.
It pains me a lot of the time to see people basically try to reinvent tools we had in the 80's and do it poorly because they're just not aware of the lessons of those systems.
I had the good fortune to be able to work with xBase languages (predominantly CA-Clipper) when I began programming. I made software for retail outlets: pos, inventory, accounts, all the jazz. The most memorable thing to me was the Phone Directory we shipped with it. It did one thing right: `set filter to cSearch $ upper( rtrim( ltrim( name + phone ) ) )`. This is a case-insensitive regex match over both name and phone. Customers used it all the time, and they held that db close to their hearts. It was 50 lines of code written in an afternoon and just worked ever after.
Creating a phone directory with that affordance is a lot of work today. However user interfaces are different today. 80s DOS text mode only had a keyboard input, a 16-color palette, 80 columns over 25 rows, and just text, text, text. Modern web UI is event-driven, has millions of colors, works across screen sizes, and is networked by default.
Though with this essential complexity, there is so much accidental complexity. It shouldn't be this hard to build software. The essence of a double-entry bookkeeping software 30 years ago is the same as one we build today. A new framework is probably not the answer. New languages (or old giants) and formal systems might be. Ballerina, Unison, Dark, Ur/Web, Elm, Reason and so on.