What is a Hacker?
The
Jargon
File contains a bunch of definitions of the term ‘hacker’, most
having to do with technical adeptness and a delight in solving problems
and overcoming limits. If you want to know how to
become a
hacker, though, only two are really relevant.
There is a community, a shared culture, of expert programmers and
networking wizards that traces its history back through decades to the
first time-sharing minicomputers and the earliest ARPAnet experiments.
The members of this culture originated the term ‘hacker’. Hackers built
the Internet. Hackers made the Unix operating system what it is today.
Hackers make the World Wide Web work. If you are part of this culture,
if you have contributed to it and other people in it know who you are
and call you a hacker, you're a hacker.
The hacker mind-set is not confined to this software-hacker culture.
There are people who apply the hacker attitude to other things, like
electronics or music — actually, you can find it at the highest levels
of any science or art. Software hackers recognize these kindred spirits
elsewhere and may call them ‘hackers’ too — and some claim that the
hacker nature is really independent of the particular medium the hacker
works in. But in the rest of this document we will focus on the skills
and attitudes of software hackers, and the traditions of the shared
culture that originated the term ‘hacker’.
There is another group of people who loudly call themselves hackers, but
aren't. These are people (mainly adolescent males) who get a kick out
of breaking into computers and phreaking the phone system. Real hackers
call these people ‘crackers’ and want nothing to do with them. Real
hackers mostly think crackers are lazy, irresponsible, and not very
bright, and object that being able to break security doesn't make you a
hacker any more than being able to hotwire cars makes you an automotive
engineer. Unfortunately, many journalists and writers have been fooled
into using the word ‘hacker’ to describe crackers; this irritates real
hackers no end.
The basic difference is this: hackers build things, crackers break them.
If you want to be a hacker, keep reading. If you want to be a cracker,
go read the
alt.2600 newsgroup
and get ready to do five to ten in the slammer after finding out you
aren't as smart as you think you are. And that's all I'm going to say
about crackers.
Basic Hacking Skills
The hacker attitude is vital, but skills are even more vital. Attitude
is no substitute for competence, and there's a certain basic toolkit of
skills which you have to have before any hacker will dream of calling
you one.
This toolkit changes slowly over time as technology creates new skills
and makes old ones obsolete. For example, it used to include programming
in machine language, and didn't until recently involve HTML. But right
now it pretty clearly includes the following:
1. Learn how
to program.
This, of course, is the fundamental hacking skill. If you don't know any
computer languages, I recommend starting with Python. It is cleanly
designed, well documented, and relatively kind to beginners. Despite
being a good first language, it is not just a toy; it is very powerful
and flexible and well suited for large projects. I have written a more
detailed
evaluation
of Python. Good
tutorials are
available at the
Python web site.
I used to recommend Java as a good language to learn early, but
this critique has changed my mind (search for
“The Pitfalls of Java as a First
Programming Language” within it). A hacker cannot, as they
devastatingly put it
“approach
problem-solving like a plumber in a hardware store”; you
have to know what the components actually
do.
Now I think it is probably best to learn C and Lisp first, then Java.
There is perhaps a more general point here. If a language does too much
for you, it may be simultaneously a good tool for production and a bad
one for learning. It's not only languages that have this problem; web
application frameworks like RubyOnRails, CakePHP, Django may make it too
easy to reach a superficial sort of understanding that will leave you
without resources when you have to tackle a hard problem, or even just
debug the solution to an easy one.
If you get into serious programming, you will have to learn C, the core
language of Unix. C++ is very closely related to C; if you know one,
learning the other will not be difficult. Neither language is a good one
to try learning as your first, however. And, actually, the more you can
avoid programming in C the more productive you will be.
C is very efficient, and very sparing of your machine's resources.
Unfortunately, C gets that efficiency by requiring you to do a lot of
low-level management of resources (like memory) by hand. All that
low-level code is complex and bug-prone, and will soak up huge amounts
of your time on debugging. With today's machines as powerful as they
are, this is usually a bad tradeoff — it's smarter to use a language
that uses the machine's time less efficiently, but your time much
more efficiently. Thus, Python.
Other languages of particular importance to hackers include
Perl and
LISP. Perl
is worth learning for practical reasons; it's very widely used for
active web pages and system administration, so that even if you never
write Perl you should learn to read it. Many people use Perl in the way I
suggest you should use Python, to avoid C programming on jobs that
don't require C's machine efficiency. You will need to be able to
understand their code.
LISP is worth learning for a different reason — the profound
enlightenment experience you will have when you finally get it. That
experience will make you a better programmer for the rest of your days,
even if you never actually use LISP itself a lot. (You can get some
beginning experience with LISP fairly easily by writing and modifying
editing modes for the Emacs text editor, or Script-Fu plugins for the
GIMP.)
It's best, actually, to learn all five of Python, C/C++, Java, Perl, and
LISP. Besides being the most important hacking languages, they
represent very different approaches to programming, and each will
educate you in valuable ways.
But be aware that you won't reach the skill level of a hacker or even
merely a programmer simply by accumulating languages — you need to learn
how to think about programming problems in a general way, independent
of any one language. To be a real hacker, you need to get to the point
where you can learn a new language in days by relating what's in the
manual to what you already know. This means you should learn several
very different languages.
I can't give complete instructions on how to learn to program here —
it's a complex skill. But I can tell you that books and courses won't do
it — many, maybe
most of the
best hackers are self-taught. You can learn language features — bits of
knowledge — from books, but the mind-set that makes that knowledge into
living skill can be learned only by practice and apprenticeship. What
will do it is (a)
reading code and
(b)
writing code.
Peter Norvig, who is one of Google's top hackers and the co-author of
the most widely used textbook on AI, has written an excellent essay
called
Teach Yourself Programming in Ten Years. His "recipe
for programming success" is worth careful attention.
Learning to program is like learning to write good natural language. The
best way to do it is to read some stuff written by masters of the form,
write some things yourself, read a lot more, write a little more, read a
lot more, write some more ... and repeat until your writing begins to
develop the kind of strength and economy you see in your models.
Finding good code to read used to be hard, because there were few large
programs available in source for fledgeling hackers to read and tinker
with. This has changed dramatically; open-source software, programming
tools, and operating systems (all built by hackers) are now widely
available. Which brings me neatly to our next topic...
2. Get one of
the open-source Unixes and learn to use and run it.
I'll assume you have a personal computer or can get access to one. (Take
a moment to appreciate how much that means. The hacker culture
originally evolved back when computers were so expensive that
individuals could not own them.) The single most important step any
newbie can take toward acquiring hacker skills is to get a copy of Linux
or one of the BSD-Unixes, install it on a personal machine, and run it.
Yes, there are other operating systems in the world besides Unix. But
they're distributed in binary — you can't read the code, and you can't
modify it. Trying to learn to hack on a Microsoft Windows machine or
under any other closed-source system is like trying to learn to dance
while wearing a body cast.
Under Mac OS X it's possible, but only part of the system is open source
— you're likely to hit a lot of walls, and you have to be careful not
to develop the bad habit of depending on Apple's proprietary code. If
you concentrate on the Unix under the hood you can learn some useful
things.
Unix is the operating system of the Internet. While you can learn to use
the Internet without knowing Unix, you can't be an Internet hacker
without understanding Unix. For this reason, the hacker culture today is
pretty strongly Unix-centered. (This wasn't always true, and some
old-time hackers still aren't happy about it, but the symbiosis between
Unix and the Internet has become strong enough that even Microsoft's
muscle doesn't seem able to seriously dent it.)
So, bring up a Unix — I like Linux myself but there are other ways (and
yes, you
can run both Linux and
Microsoft Windows on the same machine). Learn it. Run it. Tinker with
it. Talk to the Internet with it. Read the code. Modify the code. You'll
get better programming tools (including C, LISP, Python, and Perl) than
any Microsoft operating system can dream of hosting, you'll have fun,
and you'll soak up more knowledge than you realize you're learning until
you look back on it as a master hacker.
For more about learning Unix, see
The
Loginataka. You might also want to have a look at
The Art Of
Unix Programming.
To get your hands on a Linux, see the
Linux Online! site; you
can download from there or (better idea) find a local Linux user group
to help you with installation.
During the first ten years of this HOWTO's life, I reported that from a
new user's point of view, all Linux distributions are almost equivalent.
But in 2006-2007, an actual best choice emerged:
Ubuntu. While other
distros have their own areas of strength, Ubuntu is far and away the
most accessible to Linux newbies. Beware, though, of the hideous and
nigh-unusable "Unity" desktop interface that Ubuntu introduced as a
default a few years later; the Xubuntu or Kubuntu variants are better.
You can find BSD Unix help and resources at
www.bsd.org.
A good way to dip your toes in the water is to boot up what Linux fans
call a
live
CD, a distribution that runs entirely off a CD without having to
modify your hard disk. This will be slow, because CDs are slow, but it's
a way to get a look at the possibilities without having to do anything
drastic.
I have written a primer on the
basics of Unix and the Internet.
I used to recommend against installing either Linux or BSD as a solo
project if you're a newbie. Nowadays the installers have gotten good
enough that doing it entirely on your own is possible, even for a
newbie. Nevertheless, I still recommend making contact with your local
Linux user's group and asking for help. It can't hurt, and may smooth
the process.
3. Learn how
to use the World Wide Web and write HTML.
Most of the things the hacker culture has built do their work out of
sight, helping run factories and offices and universities without any
obvious impact on how non-hackers live. The Web is the one big
exception, the huge shiny hacker toy that even
politicians admit
has changed the world. For this reason alone (and a lot of other good
ones as well) you need to learn how to work the Web.
This doesn't just mean learning how to drive a browser (anyone can do
that), but learning how to write HTML, the Web's markup language. If you
don't know how to program, writing HTML will teach you some mental
habits that will help you learn. So build a home page. Try to stick to
XHTML, which is a cleaner language than classic HTML. (There are good
beginner tutorials on the Web;
here's one.)
But just having a home page isn't anywhere near good enough to make you a
hacker. The Web is full of home pages. Most of them are pointless,
zero-content sludge — very snazzy-looking sludge, mind you, but sludge
all the same (for more on this see
The HTML Hell
Page).
To be worthwhile, your page must have
content —
it must be interesting and/or useful to other hackers. And that brings
us to the next topic...
4. If you
don't have functional English, learn it.
As an American and native English-speaker myself, I have previously been
reluctant to suggest this, lest it be taken as a sort of cultural
imperialism. But several native speakers of other languages have urged
me to point out that English is the working language of the hacker
culture and the Internet, and that you will need to know it to function
in the hacker community.
Back around 1991 I learned that many hackers who have English as a
second language use it in technical discussions even when they share a
birth tongue; it was reported to me at the time that English has a
richer technical vocabulary than any other language and is therefore
simply a better tool for the job. For similar reasons, translations of
technical books written in English are often unsatisfactory (when they
get done at all).
Linus Torvalds, a Finn, comments his code in English (it apparently
never occurred to him to do otherwise). His fluency in English has been
an important factor in his ability to recruit a worldwide community of
developers for Linux. It's an example worth following.
Being a native English-speaker does not guarantee that you have language
skills good enough to function as a hacker. If your writing is
semi-literate, ungrammatical, and riddled with misspellings, many
hackers (including myself) will tend to ignore you. While sloppy writing
does not invariably mean sloppy thinking, we've generally found the
correlation to be strong — and we have no use for sloppy thinkers. If
you can't yet write competently, learn to.