Design Pattern Evangelist Blog

Smart pointers about software design

Bumper Sticker Computer Science and Software Engineering

Wit and wisdom of Computer Science and Software Engineering in itty bitty bytes


404 Bumper Sticker

Introduction

Jon Bentley wrote a series of articles in the Communications of ACM in the 1980s called Programming Pearls. He bundled those articles into two books of the same title.

One of my favorite articles was Bumper-Sticker Computer Science published in September 1985. It’s filled with pithy quotes by those in the industry almost 40 years ago. It’s still a great read, and many of the quotes are as valid today as they were back then. And sadly, some are just as ignored. I highly recommend it.

I’ve always liked quotes, and some Computer Scientists and Software Engineers do know how to craft a good phrase.

Inspired by Bentley, I’m going provide my own set of Bumper Sticker Computer Science and Software Engineering, which includes some of my favorites from Bentley’s original article. I hope some of these make you laugh, maybe cry and definitely think.

Philosophy

Give someone a program, you frustrate them for a day; teach them how to program, you frustrate them for a lifetime. — David Leinweber

What programming continuously teaches me is that asking the right questions is infinitely more important than writing the code. — @DanielMiessler

Programmer’s motto: “We’ll cross that bridge when it’s burning underneath us.” — @garybernhardt

The Programmers’ Credo: We do these things not because they are easy, but because we thought they were going to be easy. — Anonymous

On two occasions I have been asked, ‘Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?’ I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question. ― Charles Babbage

Make it work, then make it beautiful, then if you really, really have to, make it fast. 90 percent of the time, if you make it beautiful, it will already be fast. So really, just make it beautiful! — Joe Armstrong

Make it work, make it right, make it fast. — Kent Beck

Make it correct, make it clear, make it concise, make it fast. In that order. — Wes Dyer

I’m not a great programmer. I’m just a good programmer with great habits. — Kent Beck

Learning to program teaches you how to think. Computer science is a liberal art. — Steve Jobs

Just because you’ve implemented something doesn’t mean you understand it. — Brian Cantwell Smit

You see, programmers tend to be arrogant, self-absorbed introverts. We didn’t get into this business because we like people. ― Robert C. Martin

Programming is a social activity. ― Robert C. Martin

We might even invent laws for series or formula in an arbitrary manner, and set the engine to work upon them, and thus deduce numerical results which we might not otherwise have thought of obtaining; but this would hardly perhaps in any instance be productive of any great practical utility, or calculated to rank higher than as a philosophical amusement. — Ada Lovelace

Induction makes you feel guilty for getting something out of nothing … but it is one of the greatest ideas of civilization. — Herbert Wilf

I am worried that algorithms are getting too prominent in the world. — Donald Knuth

About 1,000 instructions is a reasonable upper limit for the complexity of problems now envisioned. — John von Neumann, 1946

Programming isn’t about what you know; it’s about what you can figure out. — Chris Pine

In programming the hard part isn’t solving problems, but deciding what problems to solve. — Paul Graham

The manager’s function is not to make people work, but to make it possible for people to work. — Tom DeMarco

The purpose of software engineering is to control complexity, not to create it. — Pamela Zave

A computer will do what you tell it to do, but that may be much different from what you had in mind. — Joseph Weizenbaum

To me programming is more than an important practical art. It is also a gigantic undertaking in the foundations of knowledge. — Grace Hopper

The best thing about a boolean is even if you are wrong, you are only off by a bit. — Anonymous

There are 10 types of people in the world, those who can read binary, and those who can’t. — Anonymous

Programming is not a zero-sum game. Teaching something to a fellow programmer doesn’t take it away from you. I’m happy to share what I can, because I’m in it for the love of programming. — John Carmack

Computers are good at following instructions, but not at reading your mind. — Donald Knuth

Why are video games so much better designed than office software? Because people who design video games love to play video games. People who design office software look forward to doing something else on the weekend. — Ted Nelson

Programming is not about typing, it’s about thinking. — Rich Hickey

The smartest thing you can do as a programmer is realize how stupid you are, and make accommodations. — Jason Swett

Every great developer you know got there by solving problems they were unqualified to solve until they actually did it. — Patrick McKenzie

Telling a programmer there’s already a library to do X is like telling a songwriter there’s already a song about love. — Pete Cordell

Becoming a good engineer is about collecting experience. Each project, even small ones, is a chance to add new techniques and tools to your toolbox. — Addy Osmani

The computing scientist’s main challenge is not to get confused by the complexities of his own making. ― Edsger W. Dijkstra

Good judgement comes from experience, and experience comes from bad judgement. ― Attributed to many

In software development, “perfect” is a verb, not an adjective. There is no perfect process. There is no perfect design. There are no perfect stories. You can, however, perfect your process, your design, and your stories. ― Kent Beck

All programmers are optimists. ― Frederick P. Brooks Jr.

In theory, theory and practice are the same. In practice, they are not. ― Attributed to many

The best theory is inspired by practice. The best practice is inspired by theory. ― Donald Knuth

Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why. ― Anonymous

Sometimes the problem is to discover what the problem is. ― Frederick P. Brooks Jr.

Not “can we build it?” but “should we build it? ― Jez Humble

The most serious barrier is to be found in organizational culture, leadership, and strategy. ― Jez Humble

The hardest problem in computer science is not being an opinionated jerk about everything. ― Nick Takayama

Planning

The sooner you start to code, the longer the program will take. — Roy Carlson

When we set out to write software, we never know enough. ― Eric Evans

Furious activity is no substitute for understanding. — H. H. Williams

Weeks of coding can save you hours of planning. — Unknown

Good, Fast, Cheap: Pick any two (you can’t have all three). — Ross Callon

How does a project get to be a year late? . . . . One day at a time. ― Frederick P. Brooks Jr.

[Rule of Credibility] The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time. — Tom Cargill

It always takes longer than you expect, even when you take into account Hofstadter’s Law. — Hofstadter’s Law

… crucial discoveries always emerge during the design/implementation effort. ― Eric Evans

Some folks think that Agile is about going fast. It’s not. It’s never been about going fast. Agile is about knowing, as early as possible, just how screwed we are. ― Robert C. Martin

Requirements

The act of describing a program in unambiguous detail and the act of programming are one and the same. — Kevlin Henney

Much of the essence of building a program is in fact the debugging of the specification. — Fred Brooks

Walking on water and developing software from a specification are easy if both are frozen. — Edward V Berard

If it’s your decision, it’s design; if not, it’s a requirement. — Alistair Cockburn

Architecture

A distributed system is one in which the failure of a computer you didn’t even know existed can render your own computer unusable. — Leslie Lamport

We build our computer (systems) the way we build our cities: over time, without a plan, on top of ruins. — Ellen Ullman

Software and cathedrals are much the same — first we build them, then we pray. — Anonymous

If a change to the requirements breaks your architecture, then your architecture sucks. ― Robert C. Martin

If you think good architecture is expensive, try bad architecture. — Brian Foote and Joseph Yoder

Good architecture makes the system easy to understand, easy to develop, easy to maintain, and easy to deploy. The ultimate goal is to minimize the lifetime cost of the system and to maximize programmer productivity. ― Robert C. Martin

Architecture is the decisions that you wish you could get right early in a project, but that you are not necessarily more likely to get them right than any other. — Ralph Johnson

The first concern of the architect is to make sure that the house is usable — not to ensure that the house is made of bricks. ― Robert C. Martin

Architecture is a hypothesis, that needs to be proven by implementation and measurement — Tom Gilb

The tragedy is that the architects, by making a premature decision, multiplied the development effort enormously. ― Robert C. Martin

At a certian level of abstraction, all complex systems are message passing systems. … Genes are one mechanism that life uses to pass information across time; memes are one mechanism that societies use to pass information across time. — Grady Booch

Abstraction

One particular talent stands out among the world-class programmers I’ve known—namely, an ability to move effortlessly between different levels of abstraction. — Donald Knuth

The purpose of abstraction is not to be vague, but to create a new semantic level in which one can be absolutely precise. — Edsger Dijkstra

Success comes in an emerging set of abstract concepts that makes sense of all the detail. This distillation is a rigorous expression of the particular knowledge that has been found most relevant. ― Eric Evans

Abstraction is the elimination of the irrelevant and the amplification of the essential. ― Robert C. Martin

Design

To become experts at managing complexity, we need the following: Modularity, Cohesion, Separation of Concerns, Abstraction, Loose Coupling. ― David Farley

[One Page Principle] A (specification, design, procedure, test plan) that will not fit on one page of 8.5-by-1l.1 inch paper cannot be understood. — Mark Ardis

Bad programmers worry about the code. Good programmers worry about data structures and their relationships. — Linus Torvalds

Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. — Stan Kelly-Bootle

Inside every large program is a small program trying to get out. — Tony Hoare

Unix is user-friendly; it’s just picky about who its friends are. — Anonymous

So much complexity in software comes from trying to make one thing do two things. — Ryan Singer

OOP does model the real world! Things at the top of the hierarchy seemingly do nothing but tell those at the bottom what to do. — @fogus

All problems in CS can be solved by another level of indirection, except for the problem of too many layers of indirection. — David Wheeler

Strive to add function by deleting code. — Jon Bentley

The mark of a mature programmer is willingness to throw out code you spent time on when you realize it’s pointless. — Bram Cohen

One of my most productive days was throwing away 1,000 lines of code. ― Ken Thompson

UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. — Dennis Ritchie

In protocol design, perfection has been reached not when there is nothing left to add, but when there is nothing left to take away. — Ross Callon in the fantastic RFC 1925

I have always wished for my computer to be as easy to use as my telephone. My wish has come true because I can no longer figure out how to use my telephone. — Bjarne Stroustrup, creator of C++

There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult. ― C. A. R. Hoare

Folk wisdom in software development teaches that interfaces shouldn’t be unduly influenced by implementations. Writing a test first is a concrete way to achieve this separation. ― Kent Beck

The vital detail about the design is captured in the code. A well-written implementation should be transparent, revealing the model underlying it. ― Eric Evans

Implementation

Allocate four digits for the year part of a date: a new millennium is coming. — David Martin (Published as early as 1985)

In programming, if someone tells you “you’re overcomplicating it,” they’re either 10 steps behind you or 10 steps ahead of you. — Andrew Clark

Whenever possible, steal code. — Tom Duff

Eschew clever rules. — Joe Condon

For each desired change, make the change easy (warning: this may be hard), then make the easy change. — Kent Beck

… the best programs are the ones written when the programmer is supposed to be working on something else. — Melinda Varian

Good Programming is not learned from generalities, but by seeing how significant programs can be made clean, easy to read, easy to maintain and modify, … . Careful study and imitation of good programs leads to better writing. — Kernighan and Plauger

There’s nothing more permanent than a temporary hack. — Kyle Simpson

The strength of JavaScript is that you can do anything. The weakness is that you will. — Reg Braithwaite

Always implement things when you actually need them, never when you just foresee that you need them. — Ron Jeffries

TDD applies a pressure to create code that is objectively “higher quality.” This is irrespective of the talent or experience of the software developer. It doesn’t make bad software developers great, but it does make “bad software developers” better and “great software developers” greater. ― David Farley

Legacy code isn’t the problem. It’s all the cruft and technical debt in the legacy code that’s the problem. ― Jim Humelsine

Readable/Comprehensible Code

Software is like poetry. Most of it probably should not have been written. — Anonymous

Code is like humor. When you have to explain it, it’s bad. — Cory House

Any fool can write code that a computer can understand. Good programmers write code that humans can understand. ― Martin Fowler

Programming is the art of telling another human being what one wants the computer to do. ― Donald Knuth

Programs are meant to be read by humans and only incidentally for computers to execute. ― Donald Knuth

A procedure should fit on a page. — David Tribble

Clean code always looks like it was written by someone who cares. — Michael Feathers

Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. — Martin Golding

Writing software as if we are the only person that ever has to comprehend it is one of the biggest mistakes and false assumptions that can be made. — Karolina Szczur

Whenever I have to think to understand what the code is doing, I ask myself if I can refactor the code to make that understanding more immediately apparent. ― Martin Fowler

It is not the language that makes programs appear simple. It is the programmer that makes the language appear simple! ― Robert C. Martin

Write code as if you had to support it for the rest of your life. ― Kevlin Henney

Well designed and written code doesn’t require much maintenance. Software developers are constantly thrust into the poorly designed and written code to fix bugs and add new features. Thus is our curse. We’re constantly exposed to bad code but rarely good code. ― Jim Humelsine

No matter how slow you are writing clean code, you will always be slower if you make a mess. — Bob Martin

All public elements of a design together make up its interface, and the name of each of those elements presents an opportunity to reveal the intention of the design. ― Eric Evans

To write clean code, you must first write dirty code and then clean it. ― Robert C. Martin

Prevention

Rarely is anyone thanked for the work they did to prevent the disaster that didn’t happen. — Mikko Hypponen

Some of those firefighters were also the arsonists. — Dave T., coworker and friend, who whispered this to me at a Department Meeting after several developers were given The Firefighter Award by our Department Head for their heroic efforts in fixing issues in production.

A good lifeguard never gets wet. A bad lifeguard gets his name in the paper. — My Red Cross Lifeguard Instructor when I was as teenager

Documentation

If the code and the comments disagree, then both are probably wrong. — Norm Schryer

Don’t Use a Comment When You Can Use a Function or a Variable. ― Robert C. Martin

A common fallacy is to assume authors of incomprehensible code will be able to express themselves clearly in comments. — Kevlin Henney

When you see commented-out code, delete it! ― Robert C. Martin

Code never lies, comments sometimes do. — Ron Jeffries

A heuristic we follow is that whenever we feel the need to comment something, we write a method instead. ― Martin Fowler

Redundant comments are just places to collect lies and misinformation. ― Robert C. Martin

If your code needs comments, consider refactoring it so it doesn’t. ― Kevlin Henney

Every time you write a comment, you should grimace and feel the failure of your ability of expression. ― Robert C. Martin

Testing and Debugging

Testing can show the presence of bugs, but not their absence! — Edsger W. Dijkstra

Sometimes it pays to stay in bed on Monday, rather than spending the rest of the week debugging Monday’s code. — Dan Salomon

If debugging is the process of removing software bugs, then programming must be the process of putting them in. ― Edsger W. Dijkstra

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

The first step in fixing a broken program is getting it to fail repeatably. — Tom Duff

Debugging is like being the detective in a crime movie where you are also the murderer. — @fortes

When programmers do their jobs, testers find nothing. — Bob Martin

Hardware eventually fails. Software eventually works. — Michael Hartung

Our end users are our best and most expensive testers. — Jim Humelsine

The most effective debugging tool is still careful thought, coupled with judiciously placed print statements. — Brian Kernighan

Test-driven development is double-entry bookkeeping. — Bob Martin

The art of debugging is figuring out what you really told your program to do rather than what you thought you told it to do. — Andrew Singer

Tests don’t break your code; they break your illusions about the quality of that code. — Maaret Pyhäjärvi

Beware of bugs in the above code; I have only proved it correct, not tried it. — Donald Knuth

Testing leads to failure, and failure leads to understanding. — Burt Rutan

Write tests until fear is transformed into boredom. ― Kent Beck

The unit tests are documents. They describe the lowest-level design of the system. ― Robert C. Martin

Rather than apply minutes of suspect reasoning, we can just ask the computer by making the change and running the tests. ― Kent Beck

All race conditions, deadlock conditions, and concurrent update problems are due to mutable variables. ― Robert C. Martin

The earlier you catch defects, the cheaper they are to fix. ― David Farley

Tests are a reflection of the code. If tests are ugly or difficult to write, then the issue resides in the implementation, not the test. Refactor the implementation. — Jim Humelsine

If you’re good at the debugger it means you spent a lot of time debugging. I don’t want you to be good at the debugger. ― Robert C. Martin

Performance

Premature optimization is the root of all evil. ― Donald Knuth

The best performance improvement is the transition from the nonworking state to the working state. — John Ousterhout

The fastest algorithm can frequently be replaced by one that is almost as fast and much easier to understand. — Douglas W. Jones

Fancy algorithms are slow when n is small, and n is usually small. — Rob Pike

References

Comments

Previous: Hexagonal Architecture – Adapter Flexibility

Next: Composable Design Patterns – Basic Concepts

Home: Design Pattern Evangelist Blog