All blogs / Software / engineering practice
Programming Simplicity
programmingsimplicity.substack.com
Exploring simplicity in programming. Click to read Programming Simplicity, by Paul Tarvydas, a Substack publication with hundreds of subscribers.
- Posts
- 412 from 14 Jun 2024 to 26 Oct 2026
- Posting
- weekly (121 in the last year)
- Kind
- personal blog
- Feed
- https://programmingsimplicity.substack.com/feed
2026 99
- Good Software Is More Than Just Correct Code
- What Makes Programming Simpler?
- Three Tiers of Programming a Device
- Text vs. Visual Notations
- Why Diagrams and DPLs?
- Why T2T?
- Stop Writing What Diagrams Can Generate
- First Principles Thinking - 5 Whys Approach
- The Synchronous Straitjacket
- C Port of PBP Kernel
- AI Slop vs. Artistry
- TDPL, BUPL, and the Trade-Off We Never Revisited
- Experiment — Projectional Viewer
- Simplicity Is in the Eye of the Beholder
- Macros With OhmJS
- Skipping With OhmJS
- Preventing the Collapse of Civilization
- Opinions About Compiler Building
- Stop Confusing Languages With Compilers
- Simplification and Two Kinds of Code
- Implementing The Experimental ST Meta-Syntax
- Experiment - Separating Architecture From Code
- Languages That Stretch Your DI Capabilities and Imagination
- Five Whys for Software Component Isolation
- The Parts Based Programming Kernel
- Separating Architecture From Implementation
- Concurrency (Part 2 of 2)
- Concurrency (Part 1 of 2)
- Repeating Architectural Patterns
- AI Is No Code
- Anti Assimilation
- The Hardware Changed. The Software Didn’t.
- Software Development Has a Brainstorming Problem
- One Language To Rule Them All
- We Painted Ourselves Into a Corner
- Words
- Computation vs. The Arrow of Time
- Concurrency Is Not Parallelism
- FDD - Failure Driven Development
- Ideas for Porting PBP to Go
- Forth Haiku Compendium
- You Already Know PBP
- The Limits of Mathematical Computation Applied to Physical Hardware
- From State Machine Diagram to Python
- Source Code Control Doesn’t Need to Store Source Code
- Understanding Smallness and Speed
- Some Thoughts About The Computing Historian Recovering Ideas We Threw Away
- Y2K: When Code Became Archaeology
- LLMs as Design Recovery Engines
- Jail-Breaking Parser Technology (A Slight Return)
- Flow
- Structured Software Architecture
- Little Language Case Study - Generating Code for Simple State Machines
- The Case for Composable Notations (6 of 5) - WIP - Notations in Progress
- The Case for Composable Notations (5 of 5) UNIX Already Showed Us the Way
- The Case for Composable Notations (4 of 5) Ease of Expression Is the Whole Point
- The Case for Composable Notations (3 of 5) State Isn’t The Enemy
- The Case for Composable Notations (2 of 5) The Restrictions That Came With the Cow
- Working on Rewriting the Preoptimizer Preopt.ohm
- The Wrong Spherical Cow - First Principles of Parts Based Programming
- The Case for Composable Notations (1 of 5) The Spherical Cow We Forgot We Were Riding
- Multiple Notations In A Single Project
- Drafting Rules for Node-and-Wire Diagrams
- Architectural Portability
- Who Am I and Why Should You Care?
- What I’ve Learned From Forth Haiku Thus Far
- Macros Don’t Belong In a Language
- Staged Computation: Whittling Down Source Code with t2t
- Scalable vs. Spaghetti Architecture
- Are We Really Better Than Sketchpad?
- Encapsulation Is Not Enough
- Forth Haiku GPU and CPU Pipelines
- Forth Haiku Optimizer
- DRY is Overrated
- Already Existing External Protocols
- Generate Kernels, Not More Code
- There Is Only One Programming Language
- Compilation Using Two Stage Code Emission
- Pond’ring Fan-Out and Fan-in
- DIY Forth - Forth Haiku Analysis Part 2
- DIY Forth - Forth Haiku Analysis Part 1
- Do We Need a New Programming Language for the AI Era?
- Why Your Operating System is Still Trapped in 1960
- Why Are Functions Less Reliable Than Hardware?
- Everything Is Not a Function (And Your CPU Knows It)
- Make Programming Distributed and Asynchronous Again
- Make Programming Fun Again
- Why Modern Software Is So Bloated: We Forgot There Are Many Ways to Program
- Brusselator - Pond’ring Aloud
- Error Messages Are Lying to You (And That’s Okay for Machines)
- Layered Abstraction
- What’s Inside a Hard Disk?
- Operating Systems: A Solution to a Self-Inflicted Problem
- LEGO Block Software
- When Parallel Isn’t Really Parallel
- Jail-breaking Parser Technology
- What is Programming?
- Stop Digging and Start Building: Why We Need LEGO Parts, Not Deeper Type Systems
- PBP Black Box Abstraction, Ports, Fan-out, Fan-in
2025 191
- Fundamentals of Compilers
- PBP-LLM: Automated Problem Discovery Using Language Models
- The Function Trap: Why Your Favourite Abstraction Is Sabotaging Your Code
- AOT vs. JIT Type Checking
- Crossing the Great Divide From Difficult to Easy
- Hundreds of Threads
- Evidence In Support of Visual Programming
- Viewing Forth
- The Deployment Delusion: How Software Learned to Stop Worrying and Love the Bug
- We Lost Something: 1970s REPLs Were Better Than Modern Development Environments
- The Problem With Global Variables
- Program Design and Engineering
- Show Don’t Tell
- How C Accidentally Locked Programming Into a Single Paradigm
- Complexity
- On Diagrammatic Syntax
- Syntax Is Cheap. Paradigms Matter.
- Message Passing in PBP vs. Erlang
- Why Distributed Systems Need Better Text Parsing
- The Hidden Gem in S/SL: Why Dataless Languages Matter
- Forth-ish
- PBP Kernel Portability
- Why Every Language Is Really an Interpreter (And Why That’s Actually Good)
- Efficient Function Nesting
- Simple Assembler and Simple CPUs First
- What Was UNIX V1 Written In?
- The Spherical Cows of Programming
- Rethinking Memory Assumptions in Algorithm Design
- Failure Driven Design
- How I Execute Diagrams As Code
- Portability
- The AST Trap: How Compiler Design Mirrors Software Bloat
- Hardware Stockholm Syndrome
- The Marketing of C
- Software Footprints
- How To Use Parts Based Programming - PBP
- Thoughts About the Actor Model
- C Compiler
- Little Networks
- Biological Thinking vs. Synchronous / Sequential Thinking
- Recursive, Asynchronous Layering: What Shell Scripts Teach Us About Program Architecture
- Simplicity
- We’ve Always Done It This Way
- The Point of Programming
- Programming: The Good Parts
- Various Programming Paradigms
- PBP Part Basics
- Type Checking Continued
- Type Checking is a Symptom, Not a Solution
- What UNIX Pipelines Got Right (And How We Can Do Better)
- Pond’ring CPUs
- New Syntax For Recursion
- WIP Experiment With LLM Code Snippet Language
- Example of Simplicity - Rebol 2.7 GUI System
- Protocols and Synchronization
- The Illusion of Concurrency II
- The Illusion of Concurrency
- Towards Asynchronous Programming Workflows and Languages
- De-Spaghettifying Control Flow
- Diversifying Programming Workflow
- Growing System Size
- Procedures, Subroutines, Functions
- Silicon and Parallelism
- Sequencing and Order
- State Machines and State Explosion
- Homebrew Computer Archaeology
- Experimenting With Opcodes of Tomorrow III
- The Opcodes of Tomorrow Part II
- Random Language Design Thoughts
- Compiling Comments
- Coroutines and Threads and Multi-processing
- Scheme To Javascript Demo
- The Wonders of State
- CRT Basics
- On Options For Programming
- Programming and Macros in 2025
- Structure Sharing in Lisp vs. Other Programming Languages
- Enumerate Every Case
- The Opcodes of Tomorrow
- Ten Cent CPUs
- Lisp Source Code
- Modernizing Program Compilation
- Scheme to Javascript in PBP - Live Debugging Session
- Prolog Related References
- Stifling of Imagination
- Using Existing PLs as Assembly Languages
- String Interpolation Continued
- Solution Centric Programming
- Thoughts on Hindrances to Asynchronousity
- Massive Parallelism
- Understanding CPUs From First Principles
- On Programming Paradigms
- Low Level Programming
- Bad Smells In Our Programming Workflow
- FP, Programming and CPUs
- Beyond Functions - Understanding Control Flow as Program Orchestration
- Sheet Music vs. FP
- One Paradigm to Rule Them All
- Purpose of Programming Languages
- Subroutines vs. Functions
- Tree-Oriented Programming Instead of Line-Oriented Programming
- FP Is Not Data Flow
- Taming the Code Jungle: A Structured Approach to Preventing Software Sprawl
- Two Syntaxes For Every Language
- String Interpolation
- Two Key Concepts in Programming
- Excerpt - How To De-Bloatify Using Current Programming Languages
- Musings on Software Simplicity
- Custom Programming Languages and Better IDEs
- On Bloatware
- Failure Driven Development
- Software Development Phases
- Programming Is Multi-Paradigmatic
- Systems Programming
- Dropping the Cottage Industry Mindset for Programming
- Memory Is Just An Array Of Bytes
- Notations
- Vms
- Is Sector Lisp Small Only Due To Assembler Tricks?
- Programming Meme
- One Language To Rule Them All Syndrome
- LLM-Based Programming
- New Programming Language Design - Part 2 Pond’ring Aloud [WIP]
- New Programming Language Design - Pond’ring Aloud [WIP]
- Remics - The Study of the Fundamentals of Reprogrammable Machines
- Enhancing Programming With Parts Based Programming
- Multiprocessing
- Why Full Preemption?
- Software LEGO® Blocks
- Notes Regarding Diagrams as Syntax
- Simple Ohm Grammar
- Before and After C
- Forks In The Road
- Mental Agility Jams for Programming
- Types Are Unnecessary
- The Problem With Function Call Coupling
- Linear Logic - Pond’ring Aloud
- Modern Programming Issues
- Parsing
- Towards PBP / 0D for Bash - Pond’ring Aloud
- Lisp Macros - Pond’ring Aloud
- Data Model nano-DSL (“SCN”)
- Transistors as Logic Gates
- Logic Gate Basics Using Transistors
- How A Transistor Makes A Logic Inverter
- On REPLs
- Composing Multi-Node Systems
- PUSM - Programming Using the SICP Method
- Programming Language Sizes
- SEXP Syntax in Ohm
- Readability - Human vs. Machine
- The Best Programming Language
- How Did We Get Here?
- On Reasoning About Time, Sequencing and Ordering
- On Programming Using Non-Gutenberg Syntax
- DI and Readability
- Structured Message Passing
- State Explosion
- Thinking About Timing Issues
- Subroutines are not Functions
- Coroutine Secrets
- Rethinking Programming For The 2020s
- Origins of Multitasking and Coroutines
- Simplicity vs. Functional Programming
- More Thoughts About Pipelines vs. Functions
- Function Chains vs. Pipelines
- Layering
- On Structured Message Passing
- FEXPRs And The Invention Of Lisp Macros
- Of Interest
- Extreme Decoupling
- Divide and Conquer vs. Cognitive Loading
- Concurrency and Strip Shredding
- Functions and Pipes
- Statechart Programming Languages
- Simplicity
- On Modernizing Cartridge Based Applications
- Whence Bloat?
- JVM vs Lisp Eval
- Practical Parallelism
- Async vs. Sync
- Forward Into The Past
- XML vs Lisp
- Pond’ring Aloud: Writing Articles, Blog Posts (Part 3)
- Escaping Function-Based Programming
- Pond’ring Aloud: Writing Articles, Blog Posts (Part 2)
- Pond’ring Aloud: Writing Articles, Blog Posts
- The Future of Programming
- Towards Diagram Compilation
- Secrets of Part-Based Programming
- Understanding Pattern Matching
2024 122
- Experiments With LLVM
- Understanding Cache Coherence
- Understanding Computers
- Async and Await in Synchronous Languages are not Asynchronous
- Closures Are State Machines
- How Gutenberg Harmed Math
- Oscilloscopes and Hand-held Calculators
- The Art of Minimalism in Design: Why Less is More
- The Version Control Dilemma: Why Git Falls Short for Software Designers
- Design Engineering vs. Production Engineering
- Diagrams to Generate and Run Python Code
- Building A DSL - Example RT to Common Lisp
- 2024-12-12-Building A DSL - Example DSL That Generates Python Code
- Building A DSL (References and Video)
- Text-Based Portability
- Concurrency Ain’t Concurrent
- Thoughts on Nova vs. Ceptre
- Combining Prolog and Javascript into a Programming Language
- RT - Now What?
- RT Transpiler
- Peephole Optimization Example
- Writing a Compiler in 2024
- 2024-05-26-Experiment: Mapping a DSL onto Python in Sketches
- Reprogrammable Electronic Machines
- Writing A JSON Parser Using T2T in Only 2.5 Hours
- Compilers vs. Interpreters
- Small C
- Building Software Using Black Boxes
- Environment Affects Thought
- Programming Language Workbench - Beginnings
- C Doubly-Linked List Rough-In
- Building a REPL in 2024
- Using JSON Instead of STDOUT
- Yet More About Single-Paradigm And Multi-Paradigm Thinking And The Function-Based Paradigm’s Unsuitability For Expressing Concurrency
- Synchronous Execution of Code
- Single-Paradigm vs. Multi-Paradigm Thinking (Slight Return)
- Experiment With A Simple REPL For A DPL
- Capturing Iterative Design Thoughts
- Visual Programming
- Experiments With Drawware
- Multiple Input Ports, Only One Input Queue
- Beginning to Work On a REPL for Drawware
- Single-Paradigm vs. Multi-Paradigm Thinking
- The Future of Programming
- Programming Substrates IMO
- Thinking About DaS REPLs
- Parental Authority (2)
- Parental Authority (2)
- Layering Code
- ASCII Addiction
- Towards A Better/Richer IDE
- Testing
- Towards a Better REGEX
- The One True Programming Language
- Tree Current Node Brainstorming
- Control Flow is Not Data
- Towards an Ideal Development Workflow
- Beliefs That Adversely Affect the State of Programming
- Functional Programming is Letting Us Down
- Experiments With a Python Indenter
- Programming Is Too Complicated
- Experimenting With Whitespace In Identifiers
- Using Space-Skipping While Preserving Whitespace in Strings and Comments
- Why Do We Use Whitespace To Separate Identifiers in Programming Languages?
- Experiments With Text to Text Transpilation
- Upgrading Our Programming Paradigm
- Peeking Behind the Curtain
- Using Many Nano-DSLs
- Computational Thinking Run Amok
- Function Entanglement vs Structured Message Passing
- Character Grids vs Overlapping
- Capt. Grace Hopper on Future Possibilities: Data, Hardware, Software, and People, 1982
- Quality Assurance
- Processes vs Closures
- Preemption and Time-Sharing
- Questioning Whether Code Is Data
- Alternate Syntaxes v Old Fashioned Approaches
- Drawing Code
- Why Do We Use Text For Programming Languages?
- Syntactic Overloading of =
- Call Return Spaghetti
- Program Comprehension
- Towards Metrics for Refactoring
- Swing Thoughts About Programming
- On Parsing
- Software Dark Matter
- 2024-08-03-Functional vs. Function-Based Thinking and Mono-paradigmatic Programming
- 2024-08-02-Anatomy of a Function Call
- 2024-08-01-What’s The Problem?
- 2024-07-30-Diagram Compiler Status
- 2024-07-30-Blog URL Correction
- 2024-07-22-Paradigms For Thinking About Problems And Programs
- 2024-07-22-Compiling Diagrams to Code
- 2024-07-22-Secret of Using Diagrams as Code
- 2024-07-19-Why Do We Need Operating Systems?
- 2024-07-17-Rhetorical Questions
- 2024-07-17-Thinking About The Game Of Pong In Hardware And Software
- 2024-07-07-Can Software Be Chunked And Layered?
- What’s Wrong With The Function-Based Paradigm?
- Message Ordering - Simple Case Study
- Subroutines Are Not Functions
- Programming Languages Are Essentially The Same
- Structured Message Passing
- Fan-out and Abstraction and A Single Input Queue
- Example Message Flow
- Devising Specific Notations
- Towards Scheme to Python Transpilation
- Good Enough
- Computers Are Not Printing Presses
- Subroutines Are Not Functions
- Asynchrony - Little Networks
- Structured Message Passing
- Routing 101 Part 1
- 2024-06-26-Exploring Technique and Notations for Augmenting DX
- 2024-06-26-Programming Baggage
- 2024-06-24-Complexity Elision Pyramid
- 2024-06-23-Ceptre Overview
- 2024-06-15-Failure Driven Development
- 2024-06-15-Not Standing On The Shoulders Of Giants
- 2024-06-14-Connections are Triples
- 2024-06-14-Smallness
- Coming soon