Hackers & Painters
Big Ideas From The Computer Age
By Paul Graham
At some point while reading this book I wrote on the margin “The amount of interesting ideas in this book is remarkable” . Word for word this is perhaps one of the most fascinating books I’ve read in the past few years. Like in his essays, Paul wastes no words in saying things, drawing great examples and explaining ideas drawing from history, art, and technology.
I don’t think anybody understands technology as well as he does. If you want to stop every couple of paragraphs to look something up and go from rabbit-hole to rabbit-hole of interesting ideas, this book is a must-read.
Computer programs are all just text. And the language you choose determines what you can say. Programming languages are what programmers think in.
Why do hackers care so much about free speech? Partly, I think, because innovation is so important in software, and innovation and heresy are practically the same thing. Good hackers develop a habit of questioning everything. You have to when you work on machines made of words that are as complex as a mechanical watch and a thousand times the size.
The computer world is like an intellectual Wild West, where you can think anything you want, if you’re willing to risk the consequences.
Alberti, arguably the archetype of the Renaissance Man, writes that “no art, however minor, demands less than total dedication if you want to excel in it.”
The main reason nerds are unpopular is that they have other things to think about. Their attention is drawn to books or the natural world, not fashions and parties. They’re like someone trying to play soccer while balancing a glass of water on his head.
I think the important thing about the real world is not that it’s populated by adults, but that it’s very large, and the things you do have real effects.
I didn’t realize that the reason we nerds didn’t fit in was that in some ways we were a step ahead. We were already thinking about the kind of things that matter in the real world, instead of spending all our time playing an exacting but mostly pointless game like the others.
Kids are sent off to spend six years memorizing meaningless facts in a world ruled by a caste of giants who run after an oblong brown ball, as if this were the most natural thing in the world. And if they balk at this surreal cocktail, they’re called misfits.
Teenage apprentices in the Renaissance seem to have been cheerful and eager.
Teenage apprentices in the Renaissance were working dogs. Teenagers now are neurotic lapdogs. Their craziness is the craziness of the idle everywhere.
Now adults have no immediate use for teenagers. They would be in the way in an office. So they drop them off at school on their way to work, much as they might drop the dog off at a kennel if they were going away for the weekend.
What hackers and painters have in common is that they’re both makers. Along with composers, architects, and writers, what hackers and painters are trying to do is make good things. They’re not doing research per se, though if in the course of trying to make good things they discover some new technique, so much the better.
I’ve never liked the term “computer science.” The main reason I don’t like it is that there’s no such thing. Computer science is a grab bag of tenuously related areas thrown together by an accident of history, like Yugoslavia.
Instead of doing what they really want to do, which is to design beautiful software, hackers in universities and research labs feel they ought to be writing research papers.
Most of AI is an example of this rule; if you assume that knowledge can be represented as a list of predicate logic expressions whose arguments represent abstract concepts, you’ll have a lot of papers to write about how to make this work. As Ricky Ricardo used to say, “Lucy, you got a lot of explaining to do.”
The way to create something beautiful is often to make subtle tweaks to something that already exists, or to combine existing ideas in a slightly new way. This kind of work is hard to convey in a research paper.
Samuel Johnson said it took a hundred years for a writer’s reputation to converge. You have to wait for the writer’s influential friends to die, and then for all their followers to die.
All the time I was in graduate school I had an uncomfortable feeling in the back of my mind that I ought to know more theory, and that it was very remiss of me to have forgotten all that stuff within three weeks of the final exam.
Hackers need to understand the theory of computation about as much as painters need to understand paint chemistry.
A programming language is for thinking of programs, not for expressing programs you’ve already thought of.
Static typing would be a fine idea if people actually did write programs the way they taught me to in college. But that’s not how any of the hackers I know write programs. We need a language that lets us scribble and smudge and smear, not a language where you have to sit with a teacup of types balanced on your knee and make polite conversation with a strict old aunt of a compiler.
If you want to make money at some point, remember this, because this is one of the reasons startups win. Big companies want to decrease the standard deviation of design outcomes because they want to avoid disasters. But when you damp oscillations, you lose the high points as well as the low. This is not a problem for big companies, because they don’t win by making great products. Big companies win by sucking less than other big companies.
One way to build great software is to start your own startup.
All makers face this problem. Prices are determined by supply and demand, and there is just not as much demand for things that are fun to work on as there is for things that solve the mundane problems of individual customers.
Hacking programming languages doesn’t pay as well as figuring out how to connect some company’s legacy database to their web server.
can’t do anything really well unless you love it, and if you love to hack you’ll inevitably be working on projects of your own.
Scientists start out doing work that’s perfect, in the sense that they’re just trying to reproduce work someone else has already done for them. Eventually, they get to the point where they can do original work. Whereas hackers, from the start, are doing original work; it’s just very bad. So hackers start original, and get good, and scientists start good, and get original.
An example we can take from painting is the way that paintings are created by gradual refinement.
It’s unrealistic to expect that the specifications for a program will be perfect. You’re better off if you admit this up front, and write programs in a way that allows specifications to change on the fly.
the key to flexibility, I think, is to make the language very abstract.
Great software, likewise, requires a fanatical devotion to beauty.
In hacking, like painting, work comes in cycles. Sometimes you get excited about a new project and you want to work sixteen hours a day on it. Other times nothing seems interesting.
The right way to collaborate, I think, is to divide projects into sharply defined modules, each with a definite owner, and with interfaces between them that are as carefully designed and, if possible, as articulated as programming languages.
Empathy is probably the single most important difference between a good hacker and a great one.
Programs should be written for people to read, and only incidentally for machines to execute.
What would someone coming back to visit us in a time machine have to be careful not to say? That’s what I want to study here.
Mapmakers deliberately put slight mistakes in their maps so they can tell when someone copies them. If another map has the same mistake, that’s very convincing evidence.
I think many interesting heretical thoughts are already mostly formed in our minds. If we turn off our self-censorship temporarily, those will be the first to emerge.
Diff present ideas against those of various past cultures, and see what you get. Some will be shocking by present standards. Ok, fine; but which might also be true?
A well brought-up teenage kid’s brain is a more or less complete collection of all our taboos — and in mint condition, because they’re untainted by experience.
To launch a taboo, a group has to be poised halfway between weakness and power. A confident group doesn’t need taboos to protect it.
So if you want to figure out what we can’t say, look at the machinery of fashion and try to predict what it would make un-sayable.
I’m especially curious about anything that’s forbidden. Let me see and decide for myself.
You especially need a brain that’s in the habit of going where it’s not supposed to.
Argue with idiots, and you become an idiot.
The most important thing is to be able to think what you want, not to say what you want.
“I pensieri stretti e il viso sciolto." Closed thoughts and an open face. Smile at everyone, and don’t tell them what you’re thinking. This was wise advice.
optimal plan, if you can manage it, is to have a few trusted friends you can speak openly to. This is not just a way to develop ideas; it’s also a good rule of thumb for choosing friends.
It’s only by looking from a distance that we see oscillations in people’s idea of the right thing to do, and can identify them as fashions.
the disobedient attitude of hackers is a net win.
Hackers are unruly. That is the essence of hacking. And it is also the essence of American-ness. It is no accident that Silicon Valley is in America, and not France, or Germany, or England, or Japan. In those countries, people color inside the lines.
I think a society in which people can do and say what they want will also tend to be one in which the most efficient solutions win, rather than those sponsored by the most influential people.
Is the people who break rules that are the source of America’s wealth and power.
When you use a web-based application, your data will be safer.
Designing web-based software is like designing a city rather than a building: as well as buildings you need roads, street signs, utilities, police and fire departments, and plans for both growth and various kinds of disasters.
You release software as a series of incremental changes instead of an occasional big explosion.
Functional programming means avoiding side effects. It’s something you’re more likely to see in research papers than commercial software, but for web-based applications it turns out to be really useful.
Being able to release software immediately is a big motivator.
Working to implement one idea gives you more ideas. So shelving an idea costs you not only that delay in implementing it, but also all the ideas that implementing it would have led to. In fact, shelving an idea probably even inhibits new ideas: as you start to think of some new feature, you catch sight of the shelf and think, “but I already have a lot of new things I want to do for the next release.”
as groups get smaller, software development gets exponentially more efficient. I can’t remember the programmers at Viaweb ever having an actual meeting. We never had more to say at any one time than we could say as we were walking to lunch.
At Viaweb our system had so many components and changed so frequently that there was no definite border between software and infrastructure.
software development is an ongoing process. I think it’s cleaner if you openly charge subscription fees, instead of forcing people to keep buying and installing new versions so they’ll keep paying you. And fortunately, subscriptions are the natural way to bill for web-based applications.
Who will the customers be? At Viaweb they were initially individuals and smaller companies, and I think this will be the rule with web-based applications. These are the users who are ready to try new things, partly because they’re more flexible, and partly because they want the lower costs of new technology.
The classic startup is fast and informal, with few people and little money. Those few people work very hard, and technology magnifies the effect of the decisions they make. If they win, they win big.
Desktop software forces users to become system administrators. Web-based software forces programmers to. There is less stress in total, but more for the programmers.
If you’re a hacker who has thought of one day starting a startup, there are probably two things keeping you from doing it. One is that you don’t know anything about business. The other is that you’re afraid of competition. Neither of these fences have any current in them.
There are only two things you have to know about business: build something users love, and make more than you spend. If you get these two right, you’ll be ahead of most startups. You can figure out the rest as you go.
software has to be designed by hackers who understand design, not designers who know a little about software. If you can’t design software as well as implement it, don’t start a startup.
you can think of a startup as a way to compress your whole working life into a few years. Instead of working at a low intensity for forty years, you work as hard as you possibly can for four. This pays especially well in technology, where you earn a premium for working fast.
Money is a side effect of specialization. In a specialized society, most of the things you need, you can’t make for yourself. If you want a potato or a pencil or a place to live, you have to get it from someone else.
Someone graduating from college thinks, and is told, that he needs to get a job, as if the important thing were becoming a member of an institution. A more direct way to put it would be: you need to start doing something people want. You don’t need to join a company to do that. All a company is is a group of people working together to do something people want. It’s doing something people want that matters, not joining the group.
To get rich you need to get yourself in a situation with two things, measurement and leverage. You need to be in a position where your performance can be measured, or there is no way to get paid more by doing more. And you have to have leverage, in the sense that the decisions you make have a big effect.
Steve Jobs once said that the success or failure of a startup depends on the first ten employees. I agree. If anything, it’s more like the first five. Being small is not, in itself, what makes startups kick butt, but rather that small groups can be select.
McDonald’s franchise is controlled by rules so precise that it is practically a piece of software. Write once, run everywhere.
If there were two features we could add to our software, both equally valuable in proportion to their difficulty, we’d always take the harder one.
Like guerillas, startups prefer the difficult terrain of the mountains
As soon as some big company becomes aware of it, they’ll make their own, and with their brand name, capital, and distribution clout, they’ll take away your market overnight.
A startup is like a mosquito. A bear can absorb a hit and a crab is armored against one, but a mosquito is designed for one thing: to score. No energy is wasted on defense. The defense of mosquitos, as a species, is that there are a lot of them, but this is little consolation to the individual mosquito.
It is easier to sell an established startup, even at a large premium, than an early-stage one.
Users are the only real proof that you’ve created wealth. Wealth is what people want, and if people aren’t using your software, maybe it’s not just because you’re bad at marketing. Maybe it’s because you haven’t made what they want.
If you plan to get rich by creating wealth, you have to know what people want. So few businesses really pay attention to making customers happy.
Europeans rode on the crest of a powerful new idea: allowing those who made a lot of money to keep it.
You can see wealth — in buildings and streets, in the clothes and the health of the people.
To say that a certain kind of work is underpaid is thus identical with saying that people want the wrong things.
When we see increasing differences in income in a rich country, there is a tendency to worry that it’s sliding back toward becoming another Venezuela.
If you buy a custom-made car, something will always be breaking. The only point of buying one now is to advertise that you can.
If Lenin walked around the offices of a company like Yahoo or Intel or Cisco, he’d think communism had won. Everyone would be wearing the same clothes, have the same kind of office (or rather, cubicle) with the same furnishings, and address one another by their first names instead of by honorifics. Everything would seem exactly as he’d predicted, until he looked at their bank accounts. Oops.
I’d like to propose an alternative idea: that in a modern society, increasing variation in income is a sign of health. Technology seems to increase the variation in productivity at faster than linear rates. If we don’t see corresponding variation in income, there are three possible explanations: (a) that technical innovation has stopped, (b) that the people who would create the most wealth aren’t doing it, or (c) that they aren’t getting paid for it.
If you suppress variations in income, whether by stealing private fortunes, as feudal rulers used to do, or by taxing them away, as some modern governments have done, the result always seems to be the same. Society as a whole ends up poorer.
GOOD DESIGN IS SIMPLE. You hear this from math to painting. In math it means that a shorter proof tends to be a better one.
In writing it means: say what you mean and say it briefly.
GOOD DESIGN IS TIMELESS. In math, every proof is timeless unless it contains a mistake. So what does Hardy mean when he says there is no permanent place for ugly mathematics? He means the same thing Kelly Johnson did: if something is ugly, it can’t be the best solution. There must be a better one, and eventually someone else will discover it.
If you can make something that appeals to people today and would also have appealed to people in 1500, there is a good chance it will appeal to people in 2500.
GOOD DESIGN SOLVES THE RIGHT PROBLEM.
Humor is related to strength. To have a sense of humor is to be strong: to keep one’s sense of humor is to shrug off misfortunes, and to lose one’s sense of humor is to be wounded by them.
Today’s experimental error is tomorrow’s new theory. If you want to discover great new things, then instead of turning a blind eye to the places where conventional wisdom and truth don’t quite meet, you should pay particular attention to them.
as you become expert in a field, you’ll start to hear little voices saying, What a hack! There must be a better way. Don’t ignore those voices. Cultivate them. The recipe for great work is: very exacting taste, plus the ability to gratify it.
The more you have to say to get something done, the harder it is to see bugs.
If high-level languages are better to program in than assembly language, then you might expect that the higher-level the language, the better. Ordinarily, yes, but not always.
I prefer dynamic typing. I hate a language that tells me what to do. But some smart people seem to like static typing, so the question must still be an open one.
Saying less about implementation should also make programs more flexible. Specifications change while a program is being written, and this is not only inevitable, but desirable.
Though I don’t think it has much to offer good programmers, except in certain specialized domains, it is irresistible to large organizations. Object-oriented programming offers a sustainable way to write spaghetti code.
The trend is not merely toward languages being developed as open source projects rather than “research,” but toward languages being designed by the application programmers who need to use them, rather than by compiler writers. This seems a good trend and I expect it to continue.
When you learn to drive, one of the principles they teach you is to align the car not by lining up the hood with the stripes painted on the road, but by aiming at some point in the distance. Even if all you care about is what happens in the next ten feet, this is the right answer. I think we should do the same thing with programming languages.
Eric Raymond has written an essay called “How to Become a Hacker”.
In a big company, you can do what all the other big companies are doing. But a startup can’t do what all the other startups do. I don’t think a lot of people realize this, even in startups.
In business, there is nothing more valuable than a technical advantage your competitors don’t understand. In business, as in war, surprise is worth as much as force.
Ordinarily technology changes fast. But programming languages are different: programming languages are not just technology, but what programmers think in. They’re half technology and half religion.
How many hackers do you need to hire, after all? Surely by now we all know that software is best developed by teams of less than ten people. And you shouldn’t have trouble hiring hackers on that scale for any language anyone has ever heard of.
If you start a startup, don’t design your product to please VCs or potential acquirers. Design your product to please the users. If you win the users, everything else will follow.
In programming languages, as Erann Gat has pointed out, what “industry best practice” actually gets you is not the best, but merely the average.
Hackers are lazy, in the same way that mathematicians and modernist architects are lazy: they hate anything extraneous.
Succinctness is one place where statically typed languages lose.
There are two ways new technology gets introduced: the organic growth method, and the big bang method. The organic growth method is exemplified by the classic seat-of-the-pants underfunded garage startup. A couple guys, working in obscurity, develop some new technology. They launch it with no marketing and initially have only a few (fanatically devoted) users. They continue to improve the technology, and meanwhile their user base grows by word of mouth. Before they know it, they’re big. The other approach, the big bang method, is exemplified by the VC-backed, heavily marketed startup. They rush to develop a product, launch it with great publicity, and immediately (they hope) have a large user base.
To write good software you must simultaneously keep two opposing ideas in your head. You need the young hacker’s naive faith in his abilities, and at the same time the veteran’s skepticism. You have to be able to think how hard can it be? with one half of your brain while thinking it will never work with the other.
Design doesn’t have to be new, but it has to be good. Research doesn’t have to be good, but it has to be new.
making what works for the user doesn’t mean simply making what the user tells you to. Users don’t know what all the choices are, and are often mistaken about what they really want. It’s like being a doctor. You can’t just treat a patient’s symptoms. When a patient tells you his symptoms, you have to figure out what’s actually wrong with him, and treat that.
To get good design you have to get close, and stay close, to your users. You have to calibrate your ideas on actual users constantly. One of the reasons Jane Austen’s novels are so good is that she read them out loud to her family.