🧠 Complexity

Click for wisdom

Common questions

Who wrote these programming quotes?

Software engineers, computer scientists, and authors — Linus Torvalds, Rich Hickey, Robert C. Martin (Uncle Bob), Donald Knuth, Kent Beck, Martin Fowler, Alan Kay, John Carmack, Grace Hopper, Brian Kernighan, Sandi Metz, Dan Abramov, Kelsey Hightower, and books like the Pragmatic Programmer, Code Complete, the Gang of Four, and Domain-Driven Design. Each quote is attributed inline.

How are the quotes categorized?

Each quote is tagged: Complexity, Testing, Career, Code Quality, APIs, Frontend, Mindset, Debugging, or Performance. The category badge on the card tells you at a glance whether a quote is about architecture, refactoring, or career advice.

Are these quotes sourced?

Yes. Every quote is attributed to a named author and many link back to the original blog post, talk, paper, or book.

Is this free? Are there ads?

Free. No ads, no sign-up, no email gate. Static HTML hosted on GitHub Pages.

Can I browse the full archive?

Yes — scroll past the card to see every quote on this page, grouped by author, with source links. The randomizer above is for serendipity; the archive below is for browsing.

Full archive of every quote on this page

This archive lists all 213 programming-wisdom quotes available on this page, grouped by author. Each quote is attributed; many link back to the original talk, blog post, or book.

Agile Manifesto (1)

Alan Kay (5)

  • The best way to predict the future is to invent it.
    Alan Kay (Mindset)
  • Simple things should be simple, complex things should be possible.
    Alan Kay (Code Quality)
  • Most software today is very much like an Egyptian pyramid with millions of bricks piled on top of each other, with no structural integrity, but just done by brute force and thousands of slaves.
    Alan Kay (Code Quality)
  • The computer revolution hasn't started yet.
    Alan Kay (Mindset)
  • Perspective is worth 80 IQ points.
    Alan Kay (Mindset)

Brian Kernighan (4)

  • Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
    Brian Kernighan (Debugging)
  • Controlling complexity is the essence of computer programming.
    Brian Kernighan (Complexity)
  • Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it?
    Brian Kernighan (Debugging)
  • The most effective debugging tool is still careful thought, coupled with judiciously placed print statements.
    Brian Kernighan (Debugging)

Brian Kernighan (Unix Philosophy) (1)

Code Complete (8)

  • It's OK to figure out murder mysteries, but you shouldn't need to figure out code. You should be able to read it.
    Code Complete (Code Quality)
  • Measuring programming progress by lines of code is like measuring aircraft building progress by weight.
    Code Complete (Code Quality)
  • The Principle of Proximity: Keep related actions together.
    Code Complete (Code Quality)
  • Managing complexity is the most important technical topic in software development.
    Code Complete (Complexity)
  • Good code is its own best documentation. As you're about to add a comment, ask yourself, "How can I improve the code so that this comment isn't needed?"
    Code Complete (Code Quality)
  • The cheapest and fastest way to find a defect is at the point when it is created.
    Code Complete (Debugging)
  • A working program is not sufficient. It must be readable and understandable.
    Code Complete (Code Quality)
  • When you start coding, the design should be as complete and as error-free as you can make it.
    Code Complete (Code Quality)

Common Wisdom (4)

  • Code should be written for humans first, computers second.
    — Common Wisdom (Code Quality)
  • Code comments should explain WHY, not WHAT. The code itself explains what.
    — Common Wisdom (Code Quality)
  • If you need to add a comment explaining your code, consider if the code could be clearer instead.
    — Common Wisdom (Code Quality)
  • Delete code > Write code > Refactor code.
    — Common Wisdom (Code Quality)

Dan Abramov (5)

  • Things I don't know: many computer science concepts, algorithms, functional programming, assembly, etc. You don't need to know everything.
    Dan Abramov (Mindset)
  • Don't compare your inside to someone else's outside.
    Dan Abramov (Mindset)
  • The best way to learn something is to build something with it.
    Dan Abramov (Career)
  • Every popular library started as someone's side project.
    Dan Abramov (Career)
  • You don't need to know everything to be productive. Focus on what you need to solve the problem at hand.
    Dan Abramov (Mindset)

David Heinemeier Hansson (6)

Domain-Driven Design (6)

  • The heart of software is its ability to solve domain-related problems for its user.
    Domain-Driven Design (Code Quality)
  • Model the domain, not the database.
    Domain-Driven Design (Code Quality)
  • Use the language of the domain in your code. If you can't say it in the domain language, you probably shouldn't be building it.
    Domain-Driven Design (Code Quality)
  • Make implicit concepts explicit.
    Domain-Driven Design (Code Quality)
  • The ubiquitous language is the foundation of domain-driven design.
    Domain-Driven Design (Code Quality)
  • Bounded contexts are a central pattern in DDD. They define the limits of a model and keep it internally consistent.
    Domain-Driven Design (Code Quality)

Donald Knuth (6)

  • Premature optimization is the root of all evil.
    Donald Knuth (Performance)
  • Beware of bugs in the above code; I have only proved it correct, not tried it.
    Donald Knuth (Debugging)
  • The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at the wrong times.
    Donald Knuth (Performance)
  • Let us change our traditional attitude to the construction of programs: Instead of imagining that our main task is to instruct a computer what to do, let us concentrate rather on explaining to human beings what we want a computer to do.
    Donald Knuth (Code Quality)
  • Science is what we understand well enough to explain to a computer. Art is everything else we do.
    Donald Knuth (Code Quality)
  • Programs are meant to be read by humans and only incidentally for computers to execute.
    Donald Knuth (Code Quality)

Douglas Hofstadter (1)

  • Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law.
    Douglas Hofstadter (Career)

Drunk Sr Engineer (Reddit) (20)

Edward V. Berard (1)

  • Walking on water and developing software from a specification are easy if both are frozen.
    Edward V. Berard (Code Quality)

Gang of Four (6)

  • Program to an interface, not an implementation.
    Gang of Four (Code Quality)
  • Favor object composition over class inheritance.
    Gang of Four (Code Quality)
  • Design patterns are descriptions of communicating objects and classes that are customized to solve a general design problem in a particular context.
    Gang of Four (Code Quality)
  • Consider what should be variable in your design. This approach is the opposite of focusing on what will cause redesign.
    Gang of Four (Code Quality)
  • Encapsulate the concept that varies.
    Gang of Four (Code Quality)
  • Design patterns help you choose design alternatives that make a system reusable and avoid alternatives that compromise reusability.
    Gang of Four (Code Quality)

Gordon Bell (1)

  • The cheapest, fastest, and most reliable components are those that aren't there.
    Gordon Bell (Complexity)

Grace Hopper (5)

  • It's easier to ask forgiveness than it is to get permission.
    Grace Hopper (Career)
  • The most dangerous phrase in the language is: "We've always done it this way."
    Grace Hopper (Mindset)
  • Humans are allergic to change. They love to say, "We've always done it this way." I try to fight that.
    Grace Hopper (Mindset)
  • If it's a good idea, go ahead and do it. It's much easier to apologize than it is to get permission.
    Grace Hopper (Career)
  • Leadership is a two-way street, loyalty up and loyalty down. Respect for one's superiors; care for one's crew.
    Grace Hopper (Career)

Grug Brain (50)

  • Complexity is the apex predator of developers. Complexity very, very bad.
    Grug Brain (Complexity)
  • The best weapon against complexity is the magic word: "no".
    Grug Brain (Complexity)
  • Don't factor your code too early. Wait for good cut-points to emerge naturally.
    Grug Brain (Complexity)
  • Good cut points have narrow interfaces that trap complexity like a demon in a crystal.
    Grug Brain (Complexity)
  • When in doubt, use the 80/20 rule: build 80% of the value with 20% of the code.
    Grug Brain (Complexity)
  • Sometimes the best thing you can do is not tell the project manager and build the simple solution anyway.
    Grug Brain (Complexity)
  • Write tests after the prototype phase when code has firmed up, not before you understand the domain.
    Grug Brain (Testing)
  • Integration tests are the sweet spot: high-level enough to test correctness, low-level enough to debug easily.
    Grug Brain (Testing)
  • Unit tests break as implementation changes. Don't get too attached to them.
    Grug Brain (Testing)
  • End-to-end tests show the system works but drive you crazy when they break. Use sparingly.
    Grug Brain (Testing)
  • "Test first" is fine, but "test along the way" works pretty well too.
    Grug Brain (Testing)
  • "Yes" is the magic word for more shiny rocks and getting put in charge. "No" keeps you sane.
    Grug Brain (Career)
  • Learn to say "no" early. It gets easier over time, even if the shiny rock pile isn't as high.
    Grug Brain (Career)
  • How many shiny rocks does grug really need anyway?
    Grug Brain (Career)
  • Senior developers should be willing to say publicly: "This is too complex for me." It gives juniors permission to admit confusion too.
    Grug Brain (Career)
  • Fear Of Looking Dumb (FOLD) is a major source of the complexity demon's power. Take that power away.
    Grug Brain (Career)
  • Big brain developers have big brain! Need only be harnessed for good.
    Grug Brain (Career)
  • Call early versions "prototype". Sounds fancier to project manager.
    Grug Brain (Career)
  • If senior dev says code is too complex and confuse, it ok for junior dev to admit too!
    Grug Brain (Code Quality)
  • Recursive descent is the most fun and beautiful way to create a parser. Ignore parser generators.
    Grug Brain (Code Quality)
  • Parser generator tools generate awful snakes nest code. Impossible to understand or debug.
    Grug Brain (Code Quality)
  • Parsing is not big brain only magic. So can you!
    Grug Brain (Code Quality)
  • Demand working demo tomorrow. Forces big brain to see reality on ground more quickly.
    Grug Brain (Code Quality)
  • As all sane developers know: fear concurrency. Keep it simple with stateless handlers.
    Grug Brain (Code Quality)
  • Good APIs don't make you think too much. Bad APIs require you to understand implementation details.
    Grug Brain (APIs)
  • Layer your APIs: simple api for simple cases, complex API for complex cases.
    Grug Brain (APIs)
  • Put common operations on the object itself, not hidden behind abstractions.
    Grug Brain (APIs)
  • Nobody cares about your clever abstraction. They just want to filter a list.
    Grug Brain (APIs)
  • Splitting front-end and back-end means you now have TWO complexity demon lairs.
    Grug Brain (Frontend)
  • Front-end complexity demon is more powerful than back-end demon and has deep spiritual hold on entire industry.
    Grug Brain (Frontend)
  • Not every website needs to be a SPA with GraphQL talking over HTTP.
    Grug Brain (Frontend)
  • Keep it simple: HTML and minimal JavaScript. Avoid becoming an acolyte of the complexity demon.
    Grug Brain (Frontend)
  • React is good for jobs, but you become an acolyte of complexity demon whether you like it or not.
    Grug Brain (Frontend)
  • Lots of fads in front-end development. Take revolutionary new approaches with grain of salt.
    Grug Brain (Frontend)
  • Nobody is an impostor if everybody is an impostor. It's the nature of programming.
    Grug Brain (Mindset)
  • Grug is always in one of two states: ruler of all survey OR no idea what doing. Mostly the latter.
    Grug Brain (Mindset)
  • Even experienced developers feel like impostors. You'll do fine anyway.
    Grug Brain (Mindset)
  • Make thinking face and look big-brained when admitting confusion. Then use sense of humor.
    Grug Brain (Mindset)
  • Be strong! No Fear Of Looking Dumb!
    Grug Brain (Mindset)
  • Club not work on complexity demon. Also bad idea to hit developer who let spirit in, sometimes yourself!
    Grug Brain (Mindset)
  • Logging is more important than most developers think. Should be taught more in schools.
    Grug Brain (Debugging)
  • Print statements are better debugger than actual debugger 80% of the time.
    Grug Brain (Debugging)
  • Make log level dynamically controlled. Even better: make it per-user.
    Grug Brain (Debugging)
  • Include request ID in all logs if request spans multiple machines.
    Grug Brain (Debugging)
  • Worth investing time in getting logging infrastructure "just right". Pays off big later.
    Grug Brain (Debugging)
  • Debugger is good for when code not even run. Otherwise log statements usually better.
    Grug Brain (Debugging)
  • Always have concrete, real-world perf profile before optimizing. You'll often be surprised!
    Grug Brain (Performance)
  • Don't only focus on CPU. Network hits cost millions of CPU cycles.
    Grug Brain (Performance)
  • Inexperienced devs see nested loops and panic about O(n²). Complexity demon smiles.
    Grug Brain (Performance)
  • Minimize network calls if possible. Much bigger impact than that nested loop you're worried about.
    Grug Brain (Performance)

Jessica Kerr (5)

  • The goal of software is not working software. The goal is to solve problems.
    Jessica Kerr (Mindset)
  • Software development is a learning process. Working code is a side effect.
    Jessica Kerr (Mindset)
  • The system is not the code. The system is the people plus the code plus the runtime environment plus the deployment plus everything.
    Jessica Kerr (Code Quality)
  • Symmathesy: learning together. Teams that learn together, succeed together.
    Jessica Kerr (Career)
  • When you automate something, you don't eliminate the work. You change where it happens.
    Jessica Kerr (Code Quality)

John Carmack (5)

  • Focused, hard work is the real key to success. Keep your eyes on the goal, and just keep taking the next step towards completing it.
    John Carmack (Career)
  • The cost of adding a feature isn't just the time it takes to code it. The cost also includes the addition of an obstacle to future expansion.
    John Carmack (Complexity)
  • It is not that uncommon for the cost of an abstraction to outweigh the benefit it delivers.
    John Carmack (Complexity)
  • Low-level programming is good for the programmer's soul.
    John Carmack (Code Quality)
  • If you aren't sure how something should work, code it both ways and see which is better.
    John Carmack (Code Quality)

John Johnson (1)

  • First, solve the problem. Then, write the code.
    — John Johnson (Code Quality)

Kelsey Hightower (5)

  • Sometimes the best way to solve a problem is to stop participating in the problem.
    Kelsey Hightower (Mindset)
  • Configuration is code. Treat it like code.
    Kelsey Hightower (Code Quality)
  • The best place to store secrets is in your head. The second best place is a secrets manager.
    Kelsey Hightower (Code Quality)
  • Kubernetes is a platform for building platforms. It's a better place to start, not the endgame.
    Kelsey Hightower (Code Quality)
  • If you can't explain something simply, you don't understand it well enough.
    Kelsey Hightower (Mindset)

Kent Beck (6)

  • Make it work. Make it right. Make it fast. In that order.
    Kent Beck (Code Quality)
  • I'm not a great programmer; I'm just a good programmer with great habits.
    Kent Beck (Mindset)
  • Optimism is an occupational hazard of programming: feedback is the treatment.
    Kent Beck (Mindset)
  • For each desired change, make the change easy (warning: this may be hard), then make the easy change.
    Kent Beck (Code Quality)
  • Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
    Kent Beck (Code Quality)
  • I'm not a great programmer, I'm just a good programmer with great habits.
    Kent Beck (Career)

Linus Torvalds (6)

  • Talk is cheap. Show me the code.
    Linus Torvalds (Code Quality)
  • Bad programmers worry about the code. Good programmers worry about data structures and their relationships.
    Linus Torvalds (Code Quality)
  • Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.
    Linus Torvalds (Mindset)
  • I'm a huge proponent of designing your code around the data, rather than the other way around.
    Linus Torvalds (Code Quality)
  • If you need more than 3 levels of indentation, you're screwed anyway, and should fix your program.
    Linus Torvalds (Code Quality)
  • Intelligence is the ability to avoid doing work, yet getting the work done.
    Linus Torvalds (Mindset)

Martin Fowler (6)

  • Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
    Martin Fowler (Code Quality)
  • When you feel the need to write a comment, first try to refactor the code so that any comment becomes superfluous.
    Martin Fowler (Code Quality)
  • I'm not a great programmer; I'm just a good programmer with great habits.
    Martin Fowler (Career)
  • Before you start refactoring, check that you have a solid suite of tests. These tests must be self-checking.
    Martin Fowler (Testing)
  • Refactoring is a disciplined technique for restructuring an existing body of code, altering its internal structure without changing its external behavior.
    Martin Fowler (Code Quality)
  • The true test of good code is how easy it is to change it.
    Martin Fowler (Code Quality)

Phil Karlton (1)

  • There are only two hard things in Computer Science: cache invalidation and naming things.
    Phil Karlton (Code Quality)

Reid Hoffman (1)

  • If you're not embarrassed by your first release, you waited too long.
    Reid Hoffman (Code Quality)

Rich Hickey (6)

  • Simple is not easy. Simple means one thing, not multiple things braided together.
    Rich Hickey (Complexity)
  • Programmers know the benefits of everything and the tradeoffs of nothing.
    Rich Hickey (Mindset)
  • We can make the same exact software we are making today with dramatically less complexity.
    Rich Hickey (Complexity)
  • Simplicity is prerequisite for reliability.
    Rich Hickey (Complexity)
  • If you want everything to be familiar, you will never learn anything new.
    Rich Hickey (Mindset)
  • State is never simple. It is the new spaghetti code.
    Rich Hickey (Code Quality)

Richard Stallman (5)

  • Free software is a matter of liberty, not price. To understand the concept, you should think of "free" as in "free speech," not as in "free beer."
    Richard Stallman (Mindset)
  • Sharing is good, and with digital technology, sharing is easy.
    Richard Stallman (Mindset)
  • Software is like sex: it's better when it's free.
    Richard Stallman (Mindset)
  • If programmers deserve to be rewarded for creating innovative programs, by the same token they deserve to be punished if they restrict the use of these programs.
    Richard Stallman (Mindset)
  • Proprietary software keeps users divided and helpless.
    Richard Stallman (Mindset)

Robert C. Martin (12)

  • Clean code is simple and direct. Clean code reads like well-written prose.
    Robert C. Martin (Code Quality)
  • The ratio of time spent reading versus writing is well over 10 to 1. We are constantly reading old code as part of the effort to write new code.
    Robert C. Martin (Code Quality)
  • Truth can only be found in one place: the code.
    Robert C. Martin (Code Quality)
  • You should name a variable using the same care with which you name a first-born child.
    Robert C. Martin (Code Quality)
  • A long descriptive name is better than a short enigmatic name. A long descriptive name is better than a long descriptive comment.
    Robert C. Martin (Code Quality)
  • Functions should do one thing. They should do it well. They should do it only.
    Robert C. Martin (Code Quality)
  • The first rule of functions is that they should be small. The second rule of functions is that they should be smaller than that.
    Robert C. Martin (Code Quality)
  • Master programmers think of systems as stories to be told rather than programs to be written.
    Robert C. Martin (Code Quality)
  • Indeed, the ratio of time spent reading versus writing is well over 10 to 1. We are constantly reading old code.
    Robert C. Martin (Code Quality)
  • It is not enough for code to work.
    Robert C. Martin (Code Quality)
  • Professional developers are responsible for their own career, and for their own skills.
    Robert C. Martin (Career)
  • Test code is just as important as production code. It is not a second-class citizen.
    Robert C. Martin (Testing)

Sandi Metz (6)

  • Duplication is far cheaper than the wrong abstraction.
    Sandi Metz (Code Quality)
  • Prefer duplication over the wrong abstraction.
    Sandi Metz (Code Quality)
  • The trick to getting the most value from an abstraction is to recognize when you have the wrong one.
    Sandi Metz (Code Quality)
  • Your code should be SOLID: Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion.
    Sandi Metz (Code Quality)
  • Make the change easy, then make the easy change.
    Sandi Metz (Code Quality)
  • The code you write should be transparent, reasonable, usable, and exemplary (TRUE).
    Sandi Metz (Code Quality)

The Pragmatic Programmer (12)

Working Effectively with Legacy Code (6)