What if the most intricate creations in our world were built from the simplest elements, hidden just beneath the surface?
In this post, I explore how complex creations emerge from simple building blocks, using two specific examples—languages and programming. This is about combinational creativity, not all creativity.
Building Blocks of Language
At the heart of language are core components: words, sounds, phonemes, morphemes, graphemes, letters, characters, grammar, syntax, tone, pitch, body language. These building blocks form the foundation for producing language. On their own, they seem minor, but when combined, they produce rich, complex expressions.

This brings us to the concept of productivity. Despite a limited number of building blocks, we can generate an unlimited number of new utterances, phrases, and ideas. It's a powerful example of how something as simple as letters and sounds can be used to build the vast complexity of language.
Language, in this sense, is a creative process: combining simple, fundamental elements to create something new and expressive. This is creativity at its core—just as programming turns simple inputs into diverse outpus.
Building Blocks of Programming
When programming, I'm pressing keys on my keyboard. Each key has a letter or symbol on it, and each keypress creates the corresponding character on my screen. On their own, these symbols are basic, but combining them into words, expressions, and statements creates meaningful instructions to the computer. For example, conditional statements like if-else or loops like while and for allow me to control the flow of logic, creating functions that achieve specific tasks.

At a higher level, functions and algorithms can combine in infinite ways and evolve into software systems. Like with language, the fundamental building blocks of programming—characters, symbols, and syntax—are simple at first, but their power comes from how they're combined to achieve complex objectives. With a few core principles, you can build virtually anything.
Programming, in this sense, is a creative process: assembling simple elements in innovative ways to create something new and expressive. The creativity lies not just in understanding the parts, but in combing them in a ways that solve problems and create value.
The Creative Process Through Building Blocks
flowchart TD A[Language] --> B[Words, Grammar, Sounds, etc.] C[Programming] --> D[Characters, Syntax, Logic, etc.] B --> E[Combine Elements] D --> E[Combine Elements] E --> F[Complex Creations] F --> G[Creative Solutions]
What seems simple on the surface often conceals the creative energy and building blocks behind it. In language, programming, work, or life, complex creations emerge from combining elements and connecting ideas. Mastering these fundamentals unlocks unlimited creative potential.
Where This Breaks
A finite set of rules plus a valid combination does not automatically equal creativity. Noam Chomsky's perfectly grammatical sentence captures this:
Colorless green ideas sleep furiously.
This sentence is perfectly grammatical, and combines building blocks to create something, but is it creative? Yes and no. Yes, because it was a novel utterance at the time Chomsky created it. No, because novelty alone isn't the bar. The combination has to mean something, or connect ideas in a way that's useful, surprising, or true.
Grammar guarantees a sentence is possible, but doesn't guarantee it's worth creating.
The same gap shows up in code. You can combine perfectly valid syntax into a function that compiles and runs, but still leaks its underlying complexity the moment it receives unexpected input (Joel Spolsky's Law of Leaky Abstractions).
flowchart TD A[Valid combination] --> B{Passes surface check?} B -->|Language: grammatical| C[Colorless green ideas sleep furiously] B -->|Code: compiles and runs| D[Function handles expected input] C --> E{Means something?} D --> F{Handles unexpected input?} E -->|No| G[Not creative, just possible] F -->|No| H[Leaks complexity, not complete] E -->|Yes| I[Creative] F -->|Yes| I
Naming your building blocks explicitly before combining them produces better output than instinct alone. Check in 6 months from when you're reading this: did it hold?
