

Steps to become a good hacker? - pchekuri

As this is probably a hacker rich audience, I thought it would be appropriate to ask the question here. 
A little background, I know a little C++, C#, SQL, just enough to get me through programming classes. 
So to become a decent hacker, where should i start? Like what kind of stuff should i be doing, e.g reading books, doing projects etc. What languages would be most beneficial?
~Thanks in advance HN Readers.
======
mindcrime
I'd say that being a hacker is more about an attitude, or state of mind, than
it is about having read certain books, or knowing certain languages, etc.

Now, if by "hacker" you just mean "developer" or "software engineer," then one
could be a little bit more detailed, but there's still a lot of different
areas to explore.

That said, if you want suggestions for books, articles, links, etc:

I'd suggest you start out by reading some books / articles that give a bit of
the history of "hackerdom" and some insight into the hacker mindset. Some
possibilities that come to mind:

 _Hackers & Painters_ by our very own Paul "pg" Graham

 _Hackers: Heroes of the Computer Revolution_ by Steven Levy

 _The Soul of a New Machine_ by Tracy Kidder

 _Cyberpunk: Outlaws and Hackers on the Computer Frontier_ by Katie Hafner &
John Markoff

 _Artificial Life: A Report from the Frontier Where Computers Meet Biology_ by
Steven Levy

 _Godel, Escher, Bach: An Eternal Golden Braid_ by Douglas Hofstadter

Most or all of Paul Graham's essays. <http://paulgraham.com/articles.html>

Read some of Edgar W Dijkstra's works: <http://www.cs.utexas.edu/~EWD/>

Couple that with a good book on the C language, some basic "theory of
computing" stuff and a good algorithms book. I actually like Java as a good
language to explore a lot of different things, since it has great library and
tool support, plenty of community support, plenty of docs and books, etc.
Learning some Java so you can play with cool libraries like Mahout, OpenNLP,
etc. isn't the worst idea in the world. And, of course, learning a Lisp of
some sort. This is still on my personal TODO list as well, and I've been
dabbling in Clojure... but I don't think you'd go wrong with Common Lisp or
Scheme either.

Other book recommendations:

 _Code: The Hidden Language of Computer Hardware and Software_ by Charles
Petzold

 _The Annotated Turing: A Guided Tour Through Alan Turing's Historic Paper on
Computability and the Turing Machine_ by Charles Petzold

 _Structure and Interpretation of Computer Programs_ by Harold Abelson and
Gerald Sussman

 _Hacker's Delight_ by Henry S. Warren

 _Operating System Concepts_ by Abraham Silberschatz

 _Introduction to Algorithms_ by Thomas H. Cormen, Charles E. Leiserson,
Ronald L. Rivest and Clifford Stein

One (or more) of the _Algorithms in FOO_ series by Robert Sedgewick. There are
_Algorithms in C_ , _Algorithms in C++_ and _Algorithms in Java_ to pick from.
Each is a multi-part series. The Java one goes up to at least 5 parts, I can't
recall offhand if the series numbering is identical across languages.

I also find that most hackers have an affinity for F/OSS software. If you
don't already, I'd suggest running Linux or BSD as your operating system.
Learn the standard command line tools, learn at least one of (Emacs|Vim).

Read _The Cathedral & The Bazaar_ if you haven't yet.

Also consider some of esr's various rants, some of Stallman's stuff, etc., for
context if nothing else.

Edit: Also, expect somebody in this discussion to recommend reading _The Art
of Computer Programming_ by Don Knuth. I'll just say that TAoCP is more
reference material than tutorial, and isn't something you'd normally just
"read" as in "read cover to cover." It's a great reference to have around for
when you need to dig into the deep details of implementing an algorithms, and
need the mathematical stuff, etc. But it's not something you necessarily want
to start with.

There's SO many more places you can go though, than all this. The stuff
mentioned above is good foundation stuff for a lot of paths you might want to
explore, but don't limit yourself. Buy and Arduino and start doing some
hardware hacking, read chemistry books and biology books, whatever floats your
boat. Like ChuckMcM says below, curiosity is huge. If you're curious and don't
limit yourself, you'll be a hacker.

~~~
pchekuri
Thank You mindcrime! Out of everything you suggested i have done 2 things so
far. 1\. I run linux. 2\. I have read all of Paul Graham's essays which was
what caused my interest in hacking. I will definitely take your advice
seriously. Thanks again.

------
tjr
That's a very open-ended question. What do you wish to hack?

When I started, I was advised to learn C. This has served me well, though I
don't actually do much with C any more. I was also advised to learn Lisp. This
was a very enlightening experience, but I don't actually do much with Lisp any
more. I mostly write code in Python.

I have long had an interest in artificial intelligence, a classic hacker
topic. I still do. But I eventually discovered that even more than waxing
eloquent about theories of cognition, I enjoyed building applications that
people actually benefited from. I learned a lot from Philip Greenspun's books
and classes on web/database programming. Even when not doing web/database
work, I believe what I learned there was helped me to become a better software
engineer.

But software engineering is not necessarily hacking. Hackers need not produce
anything that is useful to non-hackers. Hacking is often driven more by
curiosity, enjoyment, and personal delight than helping non-hackers to
accomplish things with a computer.

Or is it? The very definition of the word _hacker_ is almost too ambiguous to
be useful.

Lots of folks here recoil in hatred at the mention of ESR, but I found this
interesting: <http://www.catb.org/~esr/faqs/hacker-howto.html>

~~~
mindcrime
esr is a controversial character (as is Stallman) but he is worth reading,
IMO. His work has been very influential on a lot of hackers and is worth at
least some passing familiarity.

~~~
tjr
The Jargon File (or Hacker's Dictionary) is also very interesting. ESR
"maintains" it now, but a lot of the original writing was done by Guy Steele,
RMS, and some other folks at MIT.

------
csense
I read the following quote somewhere (paraphrased since I don't remember the
exact wording):

The apprentice hacker hears of an interesting problem, gets excited, rushes
off to his computer and starts madly writing code. The master hacker hears of
an interesting problem, settles back in his chair, stares off into space and
says, "You know, I think I've seen something like this before..."

At this point, your goal should be to expand your knowledge base. Your end
goal should be to have a sufficiently good understanding of enough different
tools, technologies, and ways of thinking that you can decompose anything new
into ideas you already understand.

So here are some random suggestions for what you should actually do:

You have to have a balance between theory and practice. Try to build specific
things like a blog site, a game, a raytracer, a media player, a website
scraper, whatever tickles your fancy or scratches an itch. Try out different
languages, libraries, IDE's, tools, operating systems. Exposure to different
layers in the stack, different philosophies and different problems will
increase your skills, help you learn the sense of the right tool for the job,
and help you develop your own style as by combining the strengths of your
different experiences.

Likewise, math and theory will help your skills reach new heights, especially
after you start to feel comfortable with programming. You can accomplish a lot
if you don't know much theory, but theory will give you a deeper understanding
of many situations and make your thoughts clearer and more effective.

Your general programming abilities will improve if you learn high-school
algebra, graph theory, automata theory (finite automata, push-down automata,
and Turing machines), regular expressions, and compiler design. Geometry,
trigonometry, calculus, and linear algebra are helpful for physics or
graphics-intensive programming. Number theory and abstract algebra are
virtually required to study modern cryptography.

------
anujkk
As others have said, being a hacker is more about mindset and attitude than
your technical capability. It is more a journey than destination. Anyway here
are some suggestions:

1) Read this - <http://www.catb.org/esr/faqs/hacker-howto.html>

2) Try to get into explore-learn-do habit. Always look out for new things to
learn and use that knowledge to solve some problems.

3) Learn Linux - If you aren't doing it already install a linux OS and try to
use it as much as you can. I'm not asking you to ditch Windows. Install both
if needed. If you aren't able to do something in linux, then do it in windows.
Ubuntu Linux is good to start with.

3) Learn Programming. I would suggest you to begin with Python as it is easy
to learn and have very good library ecosystem. Learn a relational(mysql) and a
no-sql(mongodb) database along with python. Try to understand what different
kinds of applications can be made - Web app, Desktop app, Mobile app,
libraries, scrapers, servers, clients etc.

4) Learn about WWW, HTTP and Web Development with HTML, CSS, JavaScript and
any python web framework - django/flask/etc.

5) Code, code and code. Keep learning and making new things.

------
ChuckMcM
Be curious.

~~~
mindcrime
Well said. That's probably the defining characteristic of a hacker. An
unlimited curiosity, desire to learn, explore, tinker, etc. And a willingness
to experiment, fail, succeed, and learn by doing. The "hands on imperative" as
they say.

------
codegeek
Instead of "how", always ask "why". Once you have developed an urge to do this
by default, you have become a good hacker. My 2 cents.

------
logn
Read the classics (preferably with a group): Pragmatic Programmer, Clean
Code... (there's others, lil help?)

------
kayman
learn to be curious. play with code. Build small utilities, even if it's just
a blog or website.

Get a domain name and play with getting a simple site out there. Iterate and
add things you like. In the process you'll learn fundamentals, each time
building on previous knowledge.

------
orangethirty

        10 Never stop.
        20 GOTO 10

------
alpine
Hackers can be found in all walks of life, it is not a label to be restricted
to those working in technology or writing code. Hackers are people that can
effect leveraged change on a system (eg human, technological, natural), taking
delight in the outcome. Above all, I would say a sense of mischief and fun is
the common trait found in hackers. Read a couple of Richard Feynman's books.
He's quite explicit - his work was often done simply 'for the fun of it'.

