| Simplicity == lack of nuance | simple | anti-simple | comment |
| Parameter List | anti-simple | SEND() is sufficient | |
| Return Value | anti-simple | SEND() is sufficient | |
| Exceptions | anti-simple | SEND() is sufficient | |
| CALL / RETURN | anti-simple | leaves breadcrumbs on stack aka dynamic call chain Aka hidden state |
|
| Conflating control flow with data structuring | anti-simple | OOP does not handle control flow well (in an encapsulated manner) |
|
| Composition | simple | ||
| Inheritance | anti-simple | ||
| Scalability | needs simplicity | ||
| Synchronicity built on top of parallelism | simple | ||
| Multi-tasking built on top of parallelism | simple | ||
| Multi-Tasking built on top of synchronicity | anti-simple | ||
| Time Sharing | anti-simple | ||
| Scapple | simple | ||
| FreeMind | anti-simple | asks what kind of diagram, before jotting down thought(s) | |
| TL;DR | another way of saying not-simple | ||
| Complexity | another way of saying not-simple | ||
| One-line manual / one-page manual / docs | simple | ||
| More than one-page manual | anti-simple | ||
| Dependencies | anti-simple | ||
| Make | anti-simple | accommodates dependencies | |
| Data Structures | anti-simple | ||
| Optimization | anti-simple | ||
| Single parameter stack | anti-simple | ||
| A Stack for every Type | simpler | ||
| A Stack for input | simpler | ||
| A Stack for output | simpler | ||
| Multiple Return Values | anti-simple | SEND() will do SEND() covers more cases |
|
| Hierarchy | simplification | ||
| Encapsulation | simplification | ||
| RY | simple | Repeat Yourself | |
| DRY | anti-simple | Don't Repeat Yourself Could be handled automatically by Common-expression elimination Good for maintenance, hard for users |
|
| Single syntax for writing and reading Code | anti-simple | ||
| Global variables | anti-simple | ||
| Global Functions | anti-simple | ||
| Global Types | anti-simple | ||
| Global message passing | anti-simple | ||
| Message-passing in hierarchical manner | simple | ||
| Scoping variables | simple | ||
| FP | simple | but too restrictive | |
| Diagrams | simple | ||
| Visual Programming using pixels | anti-simple | ||
| Atom | simple | ||
| Molecule | anti-simple | ||
| Cat | simple | ||
| Cat -v | anti-simple | ||
| Compile-time vs. Runtime | anti-simple | should be a continuum | |
| Static Type Checking vs. Dynamic Type Checking | anti-simple | should be a continuum | |
| Typeless | simple | for the user | |
| Typeful | anti-simple | for the user | |
| Pragma | anti-simple | symptom of non-simple Design | |
| 4-Banger Calculator | simple | ||
| Scientific Calculator | anti-simple | ||
| Calculator App on Computer | anti-simple | ||
| VisiCalc, Excel, et al. | simple | ||
| PLs (Programming Languages) | anti-simple | ||
| Back door with paddle | simple | ||
| Back door with bar | anti-simple | see "Design of Everyday Things" https://www.amazon.ca/Design-Everyday-Things-Revised-Expanded/dp/0465050654 |
|
| Everything is an Object | anti-simple | ||
| Everything is a Relation | anti-simple | ||
| Everything is a Type | anti-simple | ||
| Splitting Data Design from Control Flow Design | simple | ||
| Creating Data Structures at Compile Time | anti-simple | premature optimization Could use processor to create data structures at runtime |
|
| One app on one cpu | simple | ||
| Design using multiple paradigms | can be simpler esp. With encapsulation | ||
| Design using a single paradigm | anti-simple | ||
| OO | simple | for data design | |
| OO | anti-simple | for control-flow design | |
| State | simple | with Harel StateCharts | |
| CASE statement on type | anti-simple | use OO for this | |
| CASE statement on Control-Flow | anti-simple | use Harel StateCharts for this | |
| CASE statement for splitting data | anti-simple | use if-then-else for this | |
| CASE statement | anti-simple | (should we get rid of CASE?) | |
| LOOP | anti-simple | doesn’t work well for describing distributed computing | |
| Recursion | anti-simple | doesn’t work well for describing distributed computing | |
| Multi-tasking with Time Sharing | not simple | useful only for operating systems | |
| Multi-tasking without Time Sharing | simple | closures provide the effect of “separate stacks” | |
| Full Preemption | anti-simple | only a few instances where it is needed: Windows / MacOS / Linux / etc. |
|
| Modal Dialogs | anti-simple | epicycle induced by synchronous mind-set force-fits asynchronous concepts into synchronous paradigm |
|
| Thread Safety | anti-simple | replace with one processor for each App | |
| Priorities | anti-simple | use hardware priorities with caution | |
| Essential Complexity | anti-simple | too often used as an excuse for non-simple design | |
| Denotational Semantics | anti-simple | ||
| Peter Lee's treatment of Denotational Semantics | simple | Lee applies Divide and Conquer technique to Make D.S. work in passes aka the opposite of everything-at-once https://www.amazon.ca/Realistic-Compiler-Generation-Peter-Lee/dp/0262121417 |
|
| UNIX pipes | simple | ||
| UNIX pipes in Operating Systems Only | anti-simple | Pipes should be built into every PL | |
| FP function pipes | pipes can do more than just chaining call/return together | ||
| Textual representation of pipes | anti-simple | restricts outputs to only what can be expressed as text use diagrams & DaS - Diagrams as Syntax (not pixels) |
|
| Silver Bullet | there are many - not one - silver bullets | ||
| Solving a Problem | simple | ||
| Generalizing a Problem | anti-simple | ||
| APIs | anti-simple | ||
| Plugging earphones into a phone | simple | ||
| LOOP ... EXIT WHEN ... | simple | more than one exit-when clause can be used | |
| LOOP ... FOR ... and all other variants of LOOP | anti-simple | ||
| Single inheritance | anti-simple | better than what we had | |
| Multiple inheritance | simple | eschew fitting everything into a single taxonomy Eschew fitting everything into a single paradigm |
|
| Hardware IC | simple | ||
| Software Library Component | anti-simple | uses only one paradigm: "everything is synchronous" | |
| Structured Programming | simple | ||
| Scoping | simple | ||
| Flat <anything> | simple | simple for user | |
| Flat <anything> | anti-simple | when scaling is required | |
| Declarative | sometimes simple but not always | ||
| Backtracking | sometimes simple but not always | ||
| LOAD() | simple | ||
| ASDF (Make, etc.) | anti-simple | Band-aid for dependency-driven design | |
| Cache | anti-simple | ||
| Spaghetti Architecture | anti-simple | ||
| Refactoring | anti-simple | symptom of spaghetti architecture | |
| Embedding Architecture into Code | anti-simple | ||
| Code is Architecture | anti-simple | ||
| Using existing PLs for Architecture | anti-simple | Computer/Software Architecture needs its own language | |
| PLs with + (& other operators) | anti-simple | PLs should have as few operations as needed by a specific solution |
|
| S/SL | simple | ||
| YACC | anti-simple | ||
| S/SL semantic language | simple | beautifully simple | |
| handles to data | simple | encapsulates data | |
| indirection | simple | ||
| Drakon | simple | ||
| FBP | simple | ||
| CL (Common Lisp) | anti-simple | wonderful assembly language | |
| Human Interface (Raskin) | simple | https://www.amazon.ca/Humane-Interface-Directions-Designing-Interactive/dp/0201379376 | |
| Window Scrolling Focus vs Typing Focus | anti-simple | window focus should mean that the window gets next keystroke and/or next mouse-wheel event Found in MacOS and Ubuntu Gnome |
|
| Cascading Menus | anti-simple | requires precision | |
| Configurability | anti-simple | ||
| Single Syntax for Writing and Reading | anti-simple | e.g. in CL ")" is overloaded - "end if" ... "end let" etc... Writing Code is a different activity than reading Code |
|
| Cognitive Load | anti-simple | ||
| Knowledge of data structure wired into Code | anti-simple | e.g. knowing that something is a List in CL (except at the lowest levels) Use OO for this |
|
| Finding atomic components to a solution | Hard to do, but simplifies Design e.g. atoms for parsing |
||
| DRY | anti-simple | reserve for maintenance engineering | |
| Programmer (concept of) | anti-simple | split into separate fields such as: (a) Architect (b) Engineer (c) Production Engineer (d) Maintenance Engineer (e) Test Engineer (create tests & modify design for better testing) (f) Coder (g) Testing & Q/A |
|
| semi-colon in syntax | anti-simple | ||
| comma in syntax | anti-simple | ||
| scoping | simple | same as "hierarchy" | |
| parameters | anti-simple | flat | |
| return value | anti-simple | Flat too restrictive |
|
| von Neumann paradigm | simple | but limited | |
| von Neumann paradigm | anti-simple | for concurrency | |
| von Neumann paradigm | anti-simple | for parallel | |
| von Neumann paradigm | anti-simple | for distributed | |
| Everything is von Neumann | anti-simple | ||
| computers | simple | but parallel | |
| consciousness | simple | but limited | |
| autonomous nervous system | parallel |