Meh, I dunno. This list isn't really that great. It's good if your goal is to learn as many programming languages as you can, but it's sorely lacking fundamentals. (Even considering the theory books, which are pretty all over the place.)
My list would definitely include more books around software architecture, system design, algorithms, data structures, and different domains of software like computer graphics, machine learning, databases, embedded systems, simulation/games, audio/video, and so on.
I would agree. Some of the books I'd highly recommend for anyone looking to be a well-rounded hacker:
* TCP/IP Illiustrated (Volumes 1,2 & 3) - W. Richard Stephens
* The Web Application Hacker's Handbook - Stuttard, Pinto et al
* The Shellcoder's Handbook - Kozoil, Aitel et al
* The Cuckoo's Egg - Clifford Stoll
* Neuromancer - William Gibson
* ARM System-on-chip Architecture - Stephen B. Furber
* Operating Systems Design & Implementation - Tanenbaum
* The Design and Implementation of the FreeBSD Operating System - McKusick, Neville-Neil
These are just a few, and I'm sure there's plenty of others, even better ones. But to truly round yourself out you need to know more than programming a few languages - you need to know the low-level end of things and the high-level view of the world.
I think your hacker definition falls a little more along the same lines as mine. I initially read the list expecting the author to be telling me ways of how to obtain 1337 skillz, but realized he was talking about hacking from the tinkering perspective. I really wish they would quit dicking with the definition. Crackers just sound so foolish.
Starting with Ruby is an interesting way to learn programming.
I started with LOGO. I made that turtle DANCE! ;) Okay, well, maybe not. But it did give me a solid foundation that the computer is a robot that follows the commands.
I fear that languages with too many features (objects? classes? blocks!?!?) confuse the heck out of the new programmer.
My main objection to learning high-level languages first (or low level languages for that matter,) is that effectively debugging the language requires understanding concepts that are beyond your zone of proximal development.
I know this is a very difficult question, but if you could choose only one book to convey the main ideas in each of those four areas you mention (software architecture, system design, algorithms, data structures), what would they be? I ask because I'm looking to buy some good books on the subjects.
Design Patterns: Elements of Reusable Object-Oriented Software
The term "web development" doesn't mean much. There is web design. There is application development. When the two mix, there is web application development. Any kind of application development is hard, and simply knowing a language or two isn't going to make you a good application developer any more than knowing english will make you Stephen King. (IMO)
Those books are great, but they only start to make sense after you've been doing development for a few years. Its very hard to get any kind of 'buy in' with those when you are just getting started.
I disagree that application development and web development are similar. When you build web apps like 'real' applications, you end up with all those heavy java frameworks. And god help your sanity if you ever been subjected to the code of a desktop application written by a web developer.
I dunno about that. The bulk of an app should be business logic, or you are just plumbing / churning our boiler plate. Behind that theres some infrastructure, or connections to external systems, websites, file IO, hardware, databases. All that is not going to look much different, if you are doing it right. The only difference between a web app and a desktop app, is the presentation layer which should be as thin as possible, and whatever is hosting it, i.e. a framework, an executable.
In fact most of the real apps I have been working on lately aren't one or the other, they are a mix. Basically a core of domain logic, with thin patches of external interface exposing it. A web page here, a web service there, a desktop app over there, a server here.
And the line between is getting fuzzier. I hear some places are standardizing on technologies like Flex that can be either web apps or desktop apps depending on configuration.
If I understand you correctly you are implying that web apps don't need to have as clean a design as desktop apps. I am not sure if that is what you mean, but if it is, then you are going have the same trouble with maintenance as a product matures if you ignore e.g. SOLID principles, separation of concerns etc, whether it is a desktop or web app. And you don't need any "heavy java frameworks" either. If anything web frameworks like rails encourage a cleaner design (ie via MVC) than typical desktop tools like what C# developers might use to make an app.
Sorry man, but this list is so tilted towards the web-app world it's more than a bit ridiculous.
For an genuinely deep understanding, start at the gate/transistor level and move up the stack. Here is a list which will hit major portions of what one needs to know (yet leave infuriating gaps).
Digital Design and Computer Architecture by Money and Harris is very readable.
Structure and Interpretation of Computer Programs is the classic intro text.
The C Programming Language
The C++ Programming Language
On Lisp by Paul Graham.
Algorithms by Baase
Code Complete by McConnell.
AI by Norvig.
This list isn't about the latest sexy languages or technologies. This is about timeless principles and how things really work... Yet there is much more to be said after the fundamentals are understood - garbage collection, virtual machines, modern cpu design, modern type system design, networks, concurrency - the list doesn't end for a while.
Web apps are great, and I think they represent "The Computer" to many humans. But they represent a only a fraction of computer experience and existence. The Master must understand the principles of it all.
You can't start at the transistor level. You'd have to learn about circuit theory first. Besides, the math involved with transistors (even in large-signal analysis) is too disconnected from code to be starting there.
It's like saying, "To learn to be a manager, start at the neural level." It's the emergent behaviour that you're really interested in.
Nah, I think what the author meant is learning pick up skills. That's one thing I'm really disappointed about the HN in general is that people don't necessarily branch outside of computers and break the nice guy-politically correct-nerdy stereotype. Awhile back there was that whole "lifehack" movement, but even that was preaching to the choir about "productivity hacks" and being generally PC. Once, hacking was about infiltration, social engineering, alternative culture and breaking conventions in any field; but now it's being reduced to getting paid and "making a difference" in the world.
I used to think the same thing about people here on HN, but I realized that a lot of accounts are tied to peoples' real names (and professional lives). So there's a filter that keeps people from discussing anything outside of politically-correct, nice-guy stereotypical talking points. But if you went "off-the-record", you'd probably find quite a few men open up about things like PUA techniques.
I realized that a lot of accounts are tied to peoples' real names (and professional lives). So there's a filter that keeps people from discussing anything outside of politically-correct, nice-guy stereotypical talking points
The tied-to-real-name affect has advantages. It prevents the "Greater Internet Fuckwad Effect" (http://www.penny-arcade.com/comic/2004/03/19/): "Normal Person + Anonymity + Audience = Total Fuckwad"
PUA meant a lot to me at one time. I was much more of a theorist than anything else, but it really helped me get through some bad times and back into success with women.
I'm not 100% sure why you've been downvoted, I'm guessing it's the grammar. I've voted you up for asking a good question.
Like almost everyone, I had a fairly bad breakup once. I was basically engaged, we would have been except she wanted me to wait 'till after college to ask. Then one day, she left me. For one of my close friends. It was bad. I was real fucked up about it. I had sort of built everything up around our relationship, so it pretty much wrecked most of my plans.
As I tried (and failed) at getting another girlfriend, failure leads to lack of confidence, which makes it harder to attract women, which leads to failure, and the cycle continues. What PUA did for me was make me realize that I had the rules of the game wrong. I was really angry that I was 'doing everything right' and it still wasn't working out, until I realized that it wasn't that I was an unworthy dude, I was just playing by the wrong rules. Of course using the wrong ruleset leads to failure. It wasn't my fault, really, it was that I was being a bit naive. So while I wasn't hardcore following the PUA ruleset, it helped increase my self esteem a great deal, which naturally meant I was better. Eventually, success. Though PUA almost screwed that up, but that's another story...
Although the question is directed at someone else, allow me to interject and add my $0.02. I don't buy all of the PUA neg/evolutionary psychology/detach-attach etc. However, the biggest takeaway I had from PUA is handling social rejections like feedback. PUA taught me that social relations is nothing at all like Disney romance but like playing sports, music and programming. When you miss a shot shooting hoops, or a note in a guitar solo or get a compile error coding, you don't slump your shoulders and go home. You figure out what went wrong, repeat usually 100 times until you get it right. Blind confidence is perhaps the most important skill for PUA and programming. In the latter, you stay up until 2AM, Googling stack-overflow to fix that one illusive bug; in the former, you stay up until 2AM, working set after set going for that one illusive f-close.
Agreed. I think the author should have just written it as "learn to date". I think learning to date is harder than any programming language and saying it that way leaves it open to the readers sexual preferences.
Disappointed to see "Teh Womenz" on there - is it so inconceivable that someone wanting to be a hacker is a woman? Or not into women?
Agreed. A better wording would be "Don't forget to develop romantic/sexual relationships with other people, don't spend all your time in front of a computer"
Our community is filled with sexists, that's just how it is. The reason there are no women in tech is because we're all misogynistic assholes. Devops community, point in case. Every time I see a programmer or a sysadmin refer to women or their employees as "bitches", I put a note, "Never hire this lawsuit waiting to happen" into my addressbook entry for them.
Repeat after me, correlation does not imply causation. While misogyny is not a cultural value to be perpetuated, it's not quite that simple. There have been serious discussions about the subject recently here on HN, and one thing I've learned that is a big part of the "women in tech" equation is that a large proportion of women find other work more enjoyable and remunerative than tech or engineering.
> There are guys out there who will argue about different tools/methods in a religious fervor. Pay attention to the people who get things done, break new ground, or get you pumped.
It's so easy to get sucked into endless debates. Do stuff instead.
I can't tell you how many stupid pointless debates I've gotten into with people about this language vs that language vs this editor vs that editor vs linux vs openBSD vs gpl vs BSD vs MIT vs vs vs vs vs
SHUT UP! I'm telling this to myself too because as I said, I've participated in the discussions, but this type of stuff is almost completely pointless. A hacker friend of mine hates the arduino board. Isn't real computing. Isn't real programming. It's a toy. It's STUPID!
Stupid? People are building stuff. Who cares if the board has a bunch of stuff that they don't need. They're going to take the toaster apart in a week and repurpose it as a kegerator controller, or a droneduino, or a christmas light controller, or a...whatever.
Sorry, I'm getting ranty, but I really, really hate this type of stuff and I find myself having to defend the position of "who f!cking CARES?!" pretty often.
One argument I got into recently was with somebody who insisted that people who can't or don't do manual memory management aren't real programmers. Python isn't a real language and nobody really uses it in production. /facepalm
Just shut up and code/build. If it doesn't work, take it apart and build it again.
There are some benefits of working with hardware, even if it's just toys: it's far more accessible to non-geeks, & if it stops working, you can give it a smack & feel better.
But Arduino isn't hardware in that sense — it's a shitty microcontroller rebranded as a standard building block. It's software!
The thing that chaps our asses is that it's almost exclusively used where a simple circuit would have done fine, often boiling down to being just a 555 timer or a parallel port breakout box.
> The thing that chaps our asses is that it's almost exclusively used where a simple circuit would have done fine, often boiling down to being just a 555 timer or a parallel port breakout box.
So what's been lacking in the nearly 40 years since the 555 was created that it's taken until now to get some of the people who are now working with electronics to get started? (Aside from needing to be born. :) )
Your definition of "simple circuit" is probably different from the majority of the world.
And you're correct that the majority of what makes the Arduino what it is, is software. I describe it as being popular with software people because it took what used to be a 100% hardware problem (your 555 timer "simple circuit") and turned it into a 90% software/10% hardware problem.
The Arduino has got more people into creating tangible electronic devices that operate in the real world--I think that's a good thing--who cares if they don't know what Kirchhoff's circuit laws are before they get something that works.
This is distasteful. Every tech geek on the planet is trying to sound authoritative; I get that. Everyone wants to present themselves as a master of some sort. But self-praise is no praise.
The Hacker's Path? To write such an article, you have to basically call yourself a hacker, and good enough to know _the_ path and to inspire others to follow you. Hubris.
Most of us have mastered a few things, and are trying new things regularly. We're all beginners, we're all masters.
The crux of working inside the .NET ecosystem is that you need to ignore roughly 90% of it if you want to build anything complicated. Specifically, you have to ignore the 90% of .NET that you'll learn in "Teach Yourself To Build Terrible Intranet Websites with ASP.NET in 21 days".
Those books will tell you about how to drag and drop controls onto a page. Don't do that. They'll tell you about all these cool <ASP:whetever> rich usercontrols. Don't use those (except Repeater and Literal). They'll tell you about Ajax.NET. Definitely don't use that. They'll tell you about the terrible built in ORM garbage that's lurking in VS.NET that you absolutely need to stay away from if you want your thing to stand up in the face of traffic.
Nobody has yet written the book that teaches you the parts of ASP.NET to use. It's a shame, since most of us have stumbled across the same set of amazingly powerful libraries on our own, and are building really cool stuff with them. But nobody has published that list.
Maybe when I get some time I'll do so. Until then, you're going to need to learn .NET by using it. Stay away from anything you can accomplish with wizards or by drag/drop, and you'll do OK.
I'm constantly trying to determine what it is that's wrong with .Net (aside from the politics) -- and I think you might have nailed it -- it might be as simple as 'design view' and all the 'built-in stuff you should never use that looks really tempting/easy'.
That's today's guess anyway.
Such a great language (C#) and platform... while there are certainly healthy parts of the ecosystem/community, a huge chunk of it (majority even?) is crap, which is a shame.
Thanks for the link, that field is really something I've avoided as a learning developer and while it's probably kept me sane in a lot of instances, it's probably hurt my "money makin'" chances more.
Random and inane, and by its very nature, involves a bunch of name-checking of works that the person obviously hasn't read: "Oooh, the Dragon Book, everyone says that's awesome, so I better put it on there". If you were enough of a middleweight to have read the Dragon Book the rest of the list wouldn't be so bizarre and randomly chosen.
It's not even good quality name-checking where people at least pretend to have read Knuth or SICP or HAKMEM or whatever.
These types of articles always give lists of books to read. I understand how important reading books are, but I've almost never been able to read a book about programming and get anything useful out of it; my brain just doesn't retain knowledge (only book that has come close is Head First Design patterns, but that book was trying to help me retain).
Most of what I've learned come from articles on HN, reading source code, classes in school, and my own experience in both personal and work projects.
There are different learning styles. For some (lucky) people, reading it in a book is enough. For you, that may not be enough. If it isn't, then you need to learn how to teach yourself. The book is there to provide technical insight. It is up to you to turn the information into a curriculum that you assign yourself -- little projects or scratch coding things (weekend hacks) that you can do to test out the technique, strategy or technology.
I'd suggest to newcomers to get into the habit of reading source code. Pick some of the prominent projects written in the language you're studying, and spend some time figuring out how things work. You'll learn a lot.
Learn how good projects approach things like testing and error handling. Look at how well documented and easy to read the code is. Any clever idiot can write clever code; the kind of coder people want to hire are fastidious about making sure other people can read and grok their work.
Why Ruby AND Python? I understand why either one would be a good first language, but both? Wouldn't that just confuse someone who is genuinely just starting out?
And I love _why's book to death, but trying to learn programming from Why's Poignant Guide to Ruby (with Cartoon Foxes) is like trying to learn to play guitar by listening to Jimi Hendrix records while stoned.
If you're capable of learning to program from the Poignant Guide you certainly don't need an exhaustive guide on how to be a hacker. You're going to be able to figure it out on your own.
While anything that brings more talent into the programming world is a good thing, I find it disappointing when I see such lists encourage cursory understanding like this. While it does have a section on "Becoming the Master", I think that prefacing the section with "[i]f you're still yearning for more" doesn't have the normative force I find in similar but more inspiring works such as Raymond's "How to Become a Hacker."
Personally, reading the following in Raymond's essay many years ago impressed me with the importance of mastery and motivated much of my attitude toward programming:
"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."
The focus on mastery is critical to any hacker's path, in my opinion -- it is not an option.
I didn't expect for this to make it this high in HN. I certainly didn't see it as worthy of much discussion.
I'm going to take a weekend (Or a few nights) to go over these comments and make improvements where I can. Especially the books! I've got to read these to make sure I'm not adding any old boring thing :)
I think you're half joking, but you're 100% right. I think it's really important to maintain a balance between hacking and a healthy social life, but not just because going out for drinks and laughs is fun.
It's important to spend time with people who aren't hackers because, a lot of times, you're building stuff for people who aren't hackers.
Gabriel Weinberg (Duck Duck Go founder, cool freaking guy IMHO) posted a list here a while ago of projects that he had started that he considered failures. One of these things was a photo-sharing service wherein users simply emailed pictures to an address if they wanted to share them.
This is brilliant, I don't know why it never caught on. This is also the type of thing that my hacker friends and I would never have come up with. If I want to share a photo, I'll just scp it to a webserver and send you a link. Email it? That seems awfully cumbersome!
Not to my mom it wouldn't.
Obviously the big reason to keep a social life is because it's fun, friends are friends. I guess what I mean is that it's important to not think like a hacker sometimes.
Well, they do. That's the consequence of knowing something. Because you are "literate" in solutions based on reusing prior working knowledge(as in the "host photos on own web server" solution) you will fail to see a problem for the tech-illiterate layperson.
This has some crossover with the "tech-elitist" trap as well. The intense focus of writing software tends to make people forget about a well-rounded life - and the more you are involved with computers instead of people, the more likely you are to look down upon people who cannot live in the computer world.
w3schools is the single worst 'developer' site on the entire web. The very worst. If there was a single site I would have delisted from google, purged from caches, and it's maintainer burned at the stake, this is it. I'd settle for him just having his PageRank taken out back and shot.
It's composed entirely of mangled versions of ancient official documentation, corrupted with hearsay, riddled with content-styled ads, and scummily trading on the name of the bureaucrats that attempt to be authoritative on the whole mess. Every single example he provides manages to be a horrifying implementation of 'worst practice'.
I suppose I'll risk further downvoting and respond here. I don't disagree with any particular point you've made except one: it isn't a developer site.
A developer (read anyone with sufficient technical background and experience to actually write code) doesn't need or want the kind of shit that site is peddling. But for someone with zero technical background the site actually does a pretty good job of providing enough of an introduction for someone to get a toehold on the material.
While I appreciate his effort, I always felt like that page was a bit too...ideologically stamped. Later on he writes things like:
Q: I've been cracked. Will you help me fend off
further attacks?
A: No. Every time I've been asked this question
so far, it's been from some poor sap running Microsoft
Windows. It is not possible to effectively secure
Windows systems against crack attacks; the code and
architecture simply have too many flaws, which makes
securing Windows like trying to bail out a boat with
a sieve. The only reliable prevention starts with
switching to Linux or some other operating system that
is designed to at least be capable of security.
I don't think that's appropriate, or really needed. I mean sure, even my post is opinionated, but you don't see me telling someone they're an idiot because they don't understand something.
While I don't disagree with you that ESR has a strong ideological tilt, it's also useful to remember that he wrote that quite a long time ago now, when that effectively =was= true.
Going back to the subject at hand, I think that the post misses the point that being a 'hacker' isn't really about how many languages you know, it's about certain ways of thinking. The most important, IMO, things to know are all (fairly) language agnostic - algorithms and data structures. If you don't understand those and how they work and how to choose between them, then you're never going to be really good at what you do.
Also, you need to learn a functional language well enough that you can solve hard problems using it. Understanding functional programming and all the concepts it introduces (partial evaluation, currying, monads, first class functions, map/reduce to name a few) will do wonders for how you write code in other languages and will make the code you write far cleaner and more readable and easier to extend afterwards.
So you can (later in the game) better understand the foundation of your programming. This "list" has a heavy lean on web applications because they're popular, having a web app means (eventually) having a server.
Yeah, I'm really sorry about that, I meant to transfer that to the routes logic but this as a surprise. Very very few people read my log, never thought it'd be that big a deal to shunt explorer users to a browser page. :(
You are not an idiot...but it is annoying. Are all the IE's displaying it incorrectly, including IE9? I'm using IE9 beta and pretty happy with it. Makes me sad that I can't view your page :)
My list would definitely include more books around software architecture, system design, algorithms, data structures, and different domains of software like computer graphics, machine learning, databases, embedded systems, simulation/games, audio/video, and so on.