1 This is a collection of quotations (collected from my larger, more general quotes collection) which I see as having some relevance to the craft of programming and software design. There is a conspicuous dominance of quotes which extol the virtues of simplicity (and the deceptive difficulties involved in achieving it).
Simplicity is the soul of efficiency.
—Austin Freeman (in The Eye of Osiris)
… it is simplicity that is difficult to make.
Unix was not designed to stop people from doing stupid things, because that would also stop them from doing clever things.
Please don’t fall into the trap of believing that I am terribly dogmatical about [the goto statement]. I have the uncomfortable feeling that others are making a religion out of it, as if the conceptual problems of programming could be solved by a single trick, by a simple form of coding discipline!
The designer of a new kind of system must participate fully in the implementation.
—Donald E. Knuth
… the designer of a new system must not only be the implementor and the first large-scale user; the designer should also write the first user manual. … If I had not participated fully in all these activities, literally hundreds of improvements would never have been made, because I would never have thought of them or perceived why they were important.
—Donald E. Knuth
More good code has been written in languages denounced as “bad” than in languages proclaimed “wonderful”—much more.
—Bjarne Stroustrup (in The Design and Evolution of C++, 1994)
I have yet to see any problem, however complicated, which, when you looked at it in the right way, did not become still more complicated.
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.
… with proper design, the features come cheaply. This approach is arduous, but continues to succeed.
Simple things should be simple and complex things should be possible.
Premature optimization is the root of all evil in programming.
Bird-feeding, for human consumption and mnemonic purposes, is perfectly appropriate in comments, but should be kept out of protocols.
The problem with using C++ … is that there’s already a strong tendency in the language to require you to know everything before you can do anything.
The key to performance is elegance, not battalions of special cases. The terrible temptation to tweak should be resisted unless the payoff is really noticeable.
—Jon Bentley and Doug McIlroy
It should be noted that no ethically-trained software engineer would ever consent to write a “DestroyBaghdad” procedure. Basic professional ethics would instead require him to write a “DestroyCity” procedure, to which “Baghdad” could be given as a parameter.
—Nathaniel S. Borenstein
The lyf so short, the craft so long to lerne.
If you’ve been pounding nails with your forehead for years, it may feel strange the first time somebody hands you a hammer. But that doesn’t mean that you should strap the hammer to a headband just to give your skull that old familiar jolt.
There are features that should not be used. There are concepts that should not be exploited. There are problems that should not be solved. There are programs that should not be written.
Writing code … is not an exercise in manliness.
The trouble with the world is that the stupid are cocksure and the intelligent are full of doubt.
Luck is the residue of design.
I think psychoanalyze-pinhead is the important lesson of GNU Emacs.
—Bennett Todd (I love Emacs, but I agree that there’s a lesson there. I’m just not sure what it is.)
It’s hard to read through a book on the principles of magic without glancing at the cover periodically to make sure it isn’t a book on software design.
A charlatan makes obscure what is clear; a thinker makes clear what is obscure.
Anybody who thinks a little 9,000-line program that’s distributed free and can be cloned by anyone is going to affect anything we do at Microsoft has his head screwed on wrong.
—Bill Gates (regarding Java, shortly before Microsoft licensed Java and cancelled the Blackbird project)
The real tight interface is between the book and the reader—the world of the book is plugged right into your brain, never mind the [virtual reality] bodysuit.
—Bill McKibben (in The Age of Missing Information)
[ActiveX] will have no security, no reliability, and although the demos might be impressive, they are simply clothes with no emperor: it is a pretty face and no more.
Good judgement is the result of experience … Experience is the result of bad judgement.
Programs must be written for people to read, and only incidentally for machines to execute.
—Abelson and Sussman
A language that doesn’t have everything is actually easier to program in than some that do.
A designer can mull over complicated designs for months. Then suddenly the simple, elegant, beautiful solution occurs to him. When it happens to you, it feels as if God is talking! And maybe He is.
—Leo Frankowski (in The Cross-Time Engineer)
Programming languages should be designed not by piling feature on top of feature, but by removing the weaknesses and restrictions that make additional features appear necessary.
from Revised4 Report on the Algorithmic Language Scheme (I contend that this statement is true of software systems in general.)
Unformed people delight in the gaudy and in novelty. Cooked people delight in the ordinary.
… 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. … The trick is to pick the features that don’t fight each other.
Increasingly, people seem to misinterpret complexity as sophistication, which is baffling—the incomprehensible should cause suspicion rather than admiration. Possibly this trend results from a mistaken belief that using a somewhat mysterious device confers an aura of power on the user.
Although NT has lots of the cool stuff I discovered in UNIX, what it doesn’t have is personalities.
To keep large programs well structured, you either need superhuman will power, or proper language support for interfaces.
… with the right value system, making good short-term decisions leads to good long-term results. … I think that is the purpose of a value system. We need to figure out the way to live so that when we are in the middle of life we “do the right thing.” When our neighbor comes over to argue with us, we are not going to start thinking about how this will effect our life ten years from now, but we react according to the way we were taught, and the way we taught ourselves.
—Ralph Johnson (Unlikely as it may seem, this quote came from a discussion of programming practices.)
One of the great skills in using any language is knowing what not to use, what not to say. … There’s that simplicity thing again.
The ideal engineer is a composite … he is not a scientist, he is not a mathematician, he is not a sociologist, or a writer; but he may use the knowledge and techniques of any or all of these disciplines in solving engineering problems.
—N. W. Dougherty
When we use a language, we should commit ourselves to knowing it, being able to read it, and writing it idiomatically.
—Ron Jeffries (in Wiki:ReturnBooleanEvaluations)
Learning research tells us that the time lag from experiment to feedback is critical …
—Kent Beck (in Wiki:IsExtremeProgrammingWacko)
If we spoke a different language, we would perceive a somewhat different world.
One of the most dangerous (and evil) things ever injected into the project world is the notion of process maturity. Process maturity is for replicable manufacturing contexts. Projects are one-time shots. Replicability is never the primary issue on one-time shots. More evil than good has come from the notion that we should “stick to the methodology.” This is a recipe for non-adaptive death. I’d rather die by commission.
“Perilous to us all are the devices of an art deeper than we possess ourselves.”
—J. R. R. Tolkien
We don’t think of ourselves as being perfectionists, really. To us it’s more about desperately trying to have it sound more or less OK.
You think you know when you can learn, are more sure when you can write, even more when you can teach, but certain when you can program.
The greatest obstacle to discovery is not ignorance, but the illusion of knowledge.
Nothing in progression can rest on its original plan. We may as well think of rocking a grown man in the cradle of an infant.
Inspiration comes from the act of writing.
Design and programming are human activities; forget that and all is lost.
… as a slow-witted human being I have a very small head and I had better learn to live with it and to respect my limitations and give them full credit, rather than to try to ignore them, for the latter vain effort will be punished by failure.
—Edsger W. Dijkstra
Out of intense complexities, intense simplicities emerge.
There is nothing permanent except change.
To a database person, every nail looks like a thumb. Or something like that.
There’s no sense being exact about something if you don’t even know what you’re talking about.
—John von Neumann
I don’t know or trust Demeter.
Newton was a genius, but not because of the superior computational power of his brain. Newton’s genius was, on the contrary, his ability to simplify, idealize, and streamline the world so that it became, in some measure, tractable to the brains of perfectly ordinary men.
—Gerald M. Weinberg
The skill of writing is to create a context in which other people can think.
If you like your remote messaging fat, dumb, and interoperable, you could also look into the SOAP libraries distributed with Ruby.
Good engineering is not a matter of creativity or centering or grounding or inspiration or lateral thinking, as useful as those might be, but of decoding the clever, even witty, messages the solution space carves on the corpses of the ideas in which you believed with all your heart, and then building the road to the next message.
Java development without a little heresy would be a dull place, and a dangerous one.
First you listen to the users; then you ignore them.
The really important thing about Ajax is that it’s tricked us into adopting a really powerful language when we wouldn’t have chosen to do so on our own.
It would be well if engineering were less generally thought of, and even defined, as the art of constructing. In a certain important sense it is rather the art of not constructing: or, to define it rudely, but not inaptly, it is the art of doing well with one dollar, which any bungler can do with two after a fashion.
—Arthur Mellen Wellington
The hardest part of design … is keeping features out.
Simplicity does not mean want or poverty. It does not mean the absence of any decor, or absolute nudity. It only means that the decor should belong intimately to the design proper, and that anything foreign to it should be taken away.
—Paul Jacques Grillo
Ring the bells that still can ring, Forget your perfect offering. There is a crack in everything— That’s how the light gets in.
Every task involves constraint, Solve the thing without complaint; There are magic links and chains Forged to loose our rigid brains. Structures, structures, though they bind, Strangely liberate the mind.
Beauty is more important in computing than anywhere else in technology because software is so complicated. Beauty is the ultimate defense against complexity.
—David Gelernter (in Machine Beauty: Elegance and the Heart of Technology)
Simplicity is the most difficult thing to secure in this world; it is the last limit of experience and the last effort of genius.
A simple [writing] style is the result of very hard work.
Design is the art of separation, grouping, abstraction, and hiding. The fulcrum of design decisions is change. Separate those things that change for different reasons. Group together those things that change for the same reason.
—Uncle Bob Martin
The tragedy of our time is that we’ve got it backwards, we’ve learned to love techniques and use people.
Everything is vague to a degree you do not realize ‘til you have tried to make it precise.
Systems programmers are the high priests of a low cult.
The general problem with ambitious systems is complexity. […] it is important to emphasize the value of simplicity and elegance, for complexity has a way of compounding difficulties.
—Fernando J. Corbató
When I’m working on a problem, I never think about beauty. I think only how to solve the problem.
But when I have finished, if the solution is not beautiful, I know it is wrong.
—R. Buckminster Fuller
Simplicity and elegance are unpopular because they require hard work and discipline to achieve and education to be appreciated.
Solving a problem simply means representing it so as to make the solution transparent.
Architecture is the tension between coupling and cohesion.
Programming is one of the most difficult branches of applied mathematics.
—Edsger W. Dijkstra
Anyone could learn LISP in one day, except that if they already knew Fortran, it would take three days.
So much complexity in software comes from trying to make one thing do two things.
The purpose of abstraction is not to be vague, but to create a new semantic level in which one can be absolutely precise.
Problems worthy of attack prove their worth by hitting back.
Simple, clear purpose and principles give rise to complex, intelligent behavior.
Complex rules and regulations give rise to simple, stupid behavior.
Programmers spend the first 5 years of their career mastering complexity, and the rest of their lives learning simplicity
Overload, clutter, and confusion are not attributes of information, they are failures of design.
The best performance improvement is the transition from the nonworking state to the working state.
A week of coding can often save an hour of thought.
Simplicity is the unavoidable price we must pay for reliability.
—C.A.R. Hoare (This is the pithy line that is most often quoted, but I think I prefer the expanded version.)
Good design adds value faster than it adds cost.
—Thomas C. Gale
The thing that makes software design difficult is that we must express thoughts about a problem and a solution we typically do not understand fully, using a language that does not contain many of our accustomed features of expression, to a system that is unforgiving of mistakes.
The question of software correctness ultimately boils down to, “Does it do what we have in our minds, even the things we have not gotten around to thinking about yet?”
Don’t shoot yourself in the foot with a magic bullet.
—Gerald Jay Sussman
Scope doesn’t creep; understanding grows.
Sustainable development is development that meets the needs of the present without compromising the ability of future generations to meet their own needs.
—The Brundtland Commission (This definition from the domain of public policy and economic development fits my understanding of software architecture quite well.)
Constraints are not limitations; they are insight.
To hell with computer literacy. It’s absolutely ridiculous. Study mathematics. Learn to think. Read. Write.
—Butler Lampson (Given what “computer literacy” meant when Lampson said this in 1986, I agree. But I do believe coding should be taught as a fundamental skill.)
If you are a creative person then you are never really off the clock. Even sleeping feels creative.
The paradox is that when managers focus on productivity, long-term improvements are rarely made. On the other hand, when managers focus on quality, productivity improves continuously.
The most exciting phrase to hear in science, the one that heralds new discoveries, is not “Eureka!” but “That’s funny …”
The only secret of magic is that I’m willing to work harder on it than you think it’s worth.
People forget how fast you did a job, but they remember how well you did it.
We in science are spoiled by the success of mathematics. Mathematics is the study of problems so simple that they have good solutions.
I don’t know what I’ll need to learn next, but it will probably be something I previously dismissed as useless.
—John D. Cook
You don’t pay engineers to write code, you pay them to understand subtleties and edges of the problem. The code is incidental.
The purpose of abstractions is to conceal undesirable properties; desirable ones should not be hidden.
Almost anything in software can be implemented, sold, and even used given enough determination. There is nothing a mere scientist can say that will stand against the flood of a hundred million dollars. But there is one quality that cannot be purchased in this way—and that is reliability. The price of reliability is the pursuit of the utmost simplicity. It is a price which the very rich find most hard to pay.
Language design and implementation is engineering. We make decisions using evaluations of costs and benefits or, if we must, using predictions of those based on past experience.
If you think good architecture is expensive, try bad architecture.
—Brian Foote and Joseph Yoder in Big Ball of Mud
A good design is not the one that correctly predicts the future, it’s one that makes adapting to the future affordable.
Last updated 2 February 2017