Yes!
Any problem can be viewed from multiple perspectives.
Some views are more fruitful than others.
How do you know which views to use?
You don’t. Experts, Senior Architects, Senior Engineers know which views to use.
How do Experts know this?
1. Trial-and-error over the years.
2. Apprenticing with Experts who preceded them.
Can a machine figure out which views are the best?
No.
A machine cannot figure out which views are the best. Only an Expert can tell you which views to use. A machine is but a tool. An expert can specify which knobs to put on a machine and how much to turn each knob to achieve the most fruitful perspectives, but, the machine can’t figure out how to do this by itself.
The 2022++ computer medium is like a piece of paper and a pencil. In the right hands it can convey a great deal of meaning.
In fact, 2022++ computers allow humans - for the first time?- to explore and visualize issues in 4 dimensions - x/y/z/t. Paper and pencil and clay tablets forced humans to collapse 4D concepts down to 2D for the sake of the written notation.
How does all of this manifest itself in Software and Programming?
For starters, we might use multiple languages for any problem. Nano-languages - I call them SCNs (Solution Centric Notations).
Examples:
• one view of computers is “everything is a byte” - the notation is C
• one view of computers is “everything is a string” - the notation is Perl, Icon, SNOBOL, Tcl/Tk, etc.
• one view of computers is “everything is a browsable web page” - the notation is HTML
• one view of software is “everything is a hierarchical wrapper” - the notation is Smalltalk (OO)
• one view of software is “everything is a function” - the notation is FP, Lambda Calculus, etc.
• one view of software is “everything has state” - the notation is StateCharts, Actors
• one view is that “history matters, sequencing matters” - the notation is state machines - the anti-notation for this is functional notation, which outright discards history
• one view of programming is “everything is a sequential set of functions” - the notation is FP and written mathematics
• one view of programming is “everything is an asynchronous Component” - the notation is FBP, Actors, UNIX shell pipelines, ė[^eh], etc.
[^eh]: I happen to be interested in exploring the rathole of asynchronous, pluggable Components. I am exploring a notation/functionality/IDE/... that I call ė. I think that I have isolated some sub-atomic particles of concurrency and call the main one “0D”.
Conclusion:
Don’t try to guess, let the Experts tell you which Views to use.
How?
Find a way to allow Experts to create views - SCNs - quickly (in minutes instead of in years).
Recursive Q: what is a fruitful view of the problem of how to let Experts create SCNs easily and quickly? A: Create multiple grammars to drape multiple syntaxes over various paradigms, let Experts reach into a toolbox to let them pull out and use bits and pieces of useful functionality.
Suggestion:
1. use Ohm-JS for creating syntaxes
2. use Lisp as the toolbox[^js]
3. use debuggers, honed by Experts over the years[^debuggers]
4. build software as pluggable Components[^0d]
[^js]: Aside: if you have an allergy to using Lisp, I have found that JavaScript and Python work acceptably, too, as toolbox languages (except for their pesky syntaxes)
[^debuggers]: After all, the Experts in debugging have determined - by trial-and-error, and, by listening to customer demands, and, by learning from others - what works best when debugging and what doesn’t work when debugging.
[^0d]: 0D, IMO, is the secret sauce of Componentizing software
LispWorks is a better debugger than SBCL. SBCL is a better debugger than VSCODE. Iterative design is better than waterfall design. Debugging is a better way to design something than just inventing all of it in one fell swoop without a debugger and without iteration. Optimization should be applied only after-the-fact to a working design (i.e. eschew “premature optimization”). Type checking mainly helps when optimizing (it attempts to guarantee that the optimized code faithfully represents the original design, but, it gets in the way of free-thinking during Design).
Ohm-JS is better than PEG. PEG is better than Language Theoretical compiler generators (e.g. YACC, LR(k), etc., etc.).
Lisp and Assembler share common traits:
• expression language
• easy to bolt pieces together to make bigger pieces
• Assembler pieces are arranged as lines of text
• Lisp pieces are arranged as recursive trees of Atoms and trees (tree is also known as list)
• lack of pesky syntax (you don’t want your toolbox language to have an opinion about which syntax/view you need to be using).
Maybe there are other languages that have these traits? I don’t know. OTOH Lisp (and Assembler) has been around for looong time and Experts have tuned it to be a good toolbox. And, I am comfortable with Lisp.
FP has been around a loooong time, too, in the form of written mathematics. In fact, Lisp was based on mathematical notation. Computer hardware goes beyond what can easily be described using written mathematics, e.g. history (sequencing, DAWs, iMovie, robotics, blockchain protocols, IoT, etc.), mutation (RAM), asynchonosity (non-von-Neumann architectures), etc.
It should be noted that FP is simply one notation that can be fruitfully used to describe computer programming. There are other notations that fruitfully describe non-FP aspects of computers better than FP can describe them.
Claiming that one notation is The Best notation is a common human behaviour. It is so common, that it has been given a name - “fad”.
IMO, it is fruitless to continue inventing new languages and amazing features as one-shot deals. We need to invent new ways to invent new languages quickly (i.e. in minutes). We need to solve problems by inventing multiple SCNs (nano-languages) for the various views of problems. We need to use multiple SCNs to solve little sub-problems, then bolt the solutions together into larger solutions.
Recursively.