@Kartik Agaram It's hard to answer that without enumerating all the zillions of ways that previous systems have failed 🙂!
But I think there are a few major categories of requirements, without which a system will fail at being a
widely accessible, general purpose visual programming language. So put another way, the topic is "what does a system need in order to hit the mark of doing for programming what GUIs did for all other software in the 80's and 90's?"
-
Node and wire.
- This is the current best way to visually represent general proceduralism. I'm convinced of this after spending over 11 years working with mature tools of this form, and seeing how successfully they're used by non-technical artists. There might be a better way to visually present proceduralism, but if there is, I'm fairly certain it hasn't been invented yet. Wizards and Scratch-clones are common approaches which are clearly, inescapably inferior.
-
Domain agnostic.
- No one would use a programming language that only allows images as a data type (for example), or only 2D tables— they would be niche tools. We probably wouldn't even call them programming languages. But this is the state of affairs for almost all existing node-and-wire tools. It needs to be possible to operate on any kind and shape of data.
-
Extensible / complete.
- It must be possible to process things in ways the language designers didn't anticipate or explicitly design for. In fact, there cannot be
any kinds of processing that are impossible to express; the test for this is "Turing completeness". No one would use a programming language if it had a fixed set of functions, and you couldn't add any more. Also, the Turing completeness needs to be usable and purposefully designed— "accidental" Turing completeness doesn't count!
-
Closed.
- The expressiveness, flexibility, and extensibility of the system needs to be fully expressible
within the system. Imagine if, in Python, the moment you needed to iterate something, you had to leave Python and write a C++ plugin— No one would use it, and as a programming language, it would barely be useful. Sadly almost every node-and-wire tool, if it is extensible, is not closed. (Allowing extensibility into other systems is permitted, but it must not be
necessary in order to express all possible kinds of processing). Many systems fail on this count by making a second, internal system which is not visual— i.e., exposing a textual DSL or even an entirely different (ubiquitously textual) programming language. Note that the external system being "nested" in the presentation of the main system does not constitute the main system being "closed"! For many/most users, crossing that barrier into the outer system is difficult enough that it is equivalent to the external system simply not existing, and the functionality sequestered within being unattainable.
-
Functional.
- This arises from the necessity of node-and-wire. Node and wire systems which model something other than expression composition (like control flow, e.g.), or where nodes have effects on each others' operation that aren't represented by wires, are (fatally) too confusing to reason about.
-
Well-designed UX.
- There is a lot of room for creativity inside the space of this requirement, but many systems fail to get there at all. Some of them fail very badly indeed (e.g.
https://lynxtool.com/labview-unfriendly.jpg▾
). Many visual effects node-and-wire systems (like Nuke, for example) have mature and well-designed UI (though there is still much room for innovation or improvement), but fail on basically all of the remaining bullets.