- 1. Learn how to program.
- 2. Get one of the open-source Unixes
and learn to use and run it.
- 3. Learn how to use the World Wide Web
and write HTML.
- 4. If you don't have functional
English, learn it.
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:
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 or OpenSolaris, 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.
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.