Hacker News new | past | comments | ask | show | jobs | submit login
ASK HN: Becoming a hacker in one year
16 points by dvbarr on Jan 15, 2011 | hide | past | web | favorite | 24 comments
I have a start up idea that I have been pondering for quite some time. However,if there is one thing I have learned hanging around this board, no one gives a damn about my brilliant idea if I can't execute.

With that in mind, my goal is to become a competent programmer by the end of the year. My plan is to learn a new language every two months.

Tentative Schedule: Jan-Feb: JAVA Mar-Apr: Haskell (functional programming seems intuitively easier to understand than OOP) May-Jun: PHP Jul-Aug: Python Sep-Oct:HTML 5, Javascript, XML,Jquery Nov-Dec: Execute my brilliant idea

I am curious to hear what others think of this plan. Are there other languages that I should work on? Would I be better off picking one language to focus all my effort on? What are the best books or resources to get a general understanding of programming and computer science?


to become a competent programmer by the end of the year. My plan is to learn a new language every two months. Jan-Feb: JAVA Mar-Apr: Haskell May-Jun: PHP Jul-Aug: Python Sep-Oct:HTML 5, Javascript

This is about the programming equivalent of saying "I want to become a UFC champion in one year, so I'm going to learn a new martial art every 2 months". The reality is it takes years to be a competent programmer in any language.

You would be much better off starting with Python and HTML/JS and begin building your project immediately. Just learn how to program as you go along. Why Python? Because Java and PHP are probably nearing the end of their shelf life. It would be a waste of time to learn Haskell if you don't plan to use it to build your project.

A lot of people are of the opinion that you can pick up a new language very quickly, but I disagree strongly. Being able to formulate a basic program is easy, learning to be fast and efficient and effective is another matter entirely.

Personally, I'd pare that schedule right down. If you don't need a specific language, I'd start by learning the basics with Python. It's clear, readable, comes with a brilliant standard library, is very useful for all sorts of things and is a fairly 'normal' high-level language - what you learn in Python will be very broadly applicable.

Once you can competently write software in Python, the logical and inevitable next language is JavaScript, which is as useful as it is ugly. It's a terrible first language, but it's a brilliant second one, mainly because it's so useful. Obviously there's client-side web stuff, but also servers with node.js, smartphone apps with Appcelerator Titanium, Chrome plugins and a whole variety of other stuff. Javascript is very similar indeed to ActionScript, so you should find it fairly easy to pick up Flash and Air, giving you the opportunity to do all sorts of rich web stuff, develop multi-platform apps with Air or develop for the upcoming Blackberry Playbook.

You'll pick up HTML and SQL by default and while it's worth having a book or two on standby, you'll probably find yourself learning what you need as you need it.

As regards books: http://learnpythonthehardway.org/ http://www.greenteapress.com/thinkpython/

There is no good introductory text on JavaScript, but try: http://oreilly.com/catalog/9780596517748/ http://oreilly.com/catalog/9780596101992/

Now go out and build something.

Personally, I think planning out which languages you're going to learn over the course of an entire year is a pretty good plan on how to not become a hacker. Think about what you're about to do - you have a startup idea and want to execute it, so instead you're going to learn a bunch of languages that you probably wont use. How does that sound like the right way to get you startup off the ground? Well, it doesn't to me.

I'd suggest that you ask around and determine what languages other people are using to execute their startup ideas. For example, I think Python would be a great start. Perhaps learn Javascript too, since it has many applications.

Don't focus on learning all of the languages. Focus on executing your brilliant idea, and learn the languages and frameworks required to do so.

I get what you are saying and it makes sense. I made the plan I did because I didn't know where to start and figured focusing on a sequence of languages would be a good way to get a solid foundation.

But I agree, once I have the basics down, I should just start executing and learn new languages and frameworks as needed.


I believe you are missing Skywing's point. Learning to hack requires using what you do know to get things done and only worrying about what you don't know only when not knowing it becomes a problem.

For example if you don't know any kind of code at all, draw pictures of your application screens, then learn HTML and CSS to mock them up, then learn whatever framework and language is handy to handle the backend and logic necessary to tie them all together.

A working kludge is better than a perfect code in one's head.

Largely true, with the caveat that learning new technologies expands the scope of what you can get done.

I can't count the number of times that I've learned a new technology and thought "You can do that? Woah, that's what I want to present to the user. None of this ugly kludgey stuff that I was gonna do."

I've also found that the hardest part about eliciting requirements from non-technical people is that their vision is constrained by the systems they've used. You ask them what they want, and they'll give you something that looks basically what they're already using, but with a few minor annoyances fixed. If you actually build that, you'll find that they won't bother to switch over. You usually need something that works in a radically different (and better) way for people to use it.

For example, you shouldn't assume that application screens, HTML and CSS is the right way to solve the problem at all. Maybe it's better done as a mobile app. Or maybe you're better off wiring together existing apps (say, Google Docs or Drupal) and writing a bookmarklet with a little bit of JavaScript glue. Maybe you want a hardware component and will be selling a physical device, like WakeMate.

Agree that learning languages isn't the way to discover these technologies. Instead, focus on algorithms and APIs. Learn what's possible before diving into the details of how to get it done.

Why on earth would you need to learn so many languages for a single startup idea?

I think the question you should be asking yourself is this "Do I want to be a brilliant programmer, or do I want to be a hacker and make a kickass app (that can eventually become a startup)?"

The former is great - especially if you're planning on working for big prestigious software company that's into that kind of thing. The latter, however, doesn't necessarily require knowing the theory, fundamentals, and ins and outs of a programming language. If you only want to build a single app, your time would be more wisely spent jumping into development and figuring things out as you go. This way, you'll learn everything you need to develop your idea without wasting precious time (and brain space) on things that may not apply to you.

My own experience is similar to what you are describing. I had a startup idea but had never programmed a day in my life. I figured out that Ruby on Rails would work for me so I started reading every single tutorial/ebook that I could get my hands on. I tried for months but nothing stuck - I just couldn't get the hang of it. Eventually, I said screw it and started building my app (with very little knowledge of what I was doing). Currently, I wouldn't say development is finished, but I do have a beautifully working MVP. When an obstacle crops up(and they do quite often), I google my very specific problem and 99% of the time the answer appears as a blog article or stackoverflow question. On the rare off chance that I can't find a solution to my answer, I post a question of stackoverflow with a detailed description of my problem (and usually some code). Every single question I've asked has been answered in minutes - an invaluable resource. A few weeks ago I started working on my second and third apps. I was amazed that I actually knew what I was doing, but it validated that I had actually been learning how to program the whole time I was hacking through my first app.

Good luck!

You have a lot of duplicate functionality in your language choices. There's a difference between learning programming, and learning enough programming to get an MVP.

I think I would take the idea, break it down, figure out what it is going to take to do it, then, learn the different pieces that will allow you to construct it. Java, PHP, Python duplicate effort. From a webapp deployment standpoint, you might find PHP or Python to be easier to deploy than Java. You might find Python to have some slightly better frameworks available than PHP which leads to more agile development. You've left out Ruby/Rails.

I don't know what you're trying to write, but, Haskell for a front-facing webapp might not be optimal. For many backend tasks, you might find it to be useful.

I don't know how you learn, but, two months immersion into each language will give you a good idea of what each language could do, but, 8 months in Python with a Framework would probably get you very prepared for your two month HTML/Javascript/(XML|JSON)/JQuery stint before executing your idea.

Unless your idea doesn't involve storing data, you may have missed SQL/NoSQL technologies - MySQL/PostgreSQL or CouchDB/MongoDB or key/value stores MemCached/Redis.

Granted there are other technologies - you could probably spend a month reading thousands of benchmarks and come to absolutely no conclusion as to what you want to use, so, use this metric: Find out what people you know are using and use that. You'll have someone to bounce ideas off of, push you through points you don't know, etc.

Now, there is a special exception in the rule above - Redis. Redis is absolutely, positively powerful - beyond a key/value store. antirez frequents HN a bit, is super responsive on Twitter and has been pushing out some really cool stuff. Once you understand lists and sets with Redis, you will find that you aren't really just dealing with key/value. Depending on what you are doing, you could easily use Redis for your MVP (and use it beyond launch).

http://news.ycombinator.com/item?id=2085351 (written with Redis + Jquery)

  If you go Python, Pyramid or Django, perhaps Flask.
  Ruby on Rails
  PHP, cakephp, kohona, codeigniter
  Java Play
Any method you choose, I would suspect you could pick pieces and write them along the way rather than waiting until November.

And don't think people aren't interested if you haven't given them a chance. You might find some very valuable feedback or an angle you hadn't considered.

I think you have too many "things" in there, to gain any real mastery of any one of them in just a year. How much Java can you learn in two months? How much Haskell? How much Python? In either case, I'd say it's doubtful you're going to learn enough to really be able to execute an idea.

OTOH, if you spent 6 months on one of Java OR Python OR Haskell, I think you'd have a fighting chance at getting far enough to be able to get something done.

That said... Haskell is, by all accounts, a fine language. I want to learn it myself, and have nothing against it. But... it has a reputation for being difficult to learn, and I'd question if it has the degree of support, in terms of libraries, community, documentation, etc., that something like Java, Python, PHP or Ruby has. For a beginner going for an MVP, I'd really seriously question if Haskell would be a great choice.

As far as Java... I am most definitely NOT one of the "Java basher" crowd, and I'm actually a big proponent of Java. But it's not the best language to use if you're trying to do Rapid Application Development, and if you want to move fast. For getting an MVP out the door, I honestly think you might be better off with a different choice. But if you go with Java, look at some frameworks like Wicket or Play that can help you out.

Personally, if I were advising a beginning hacker, and they wanted to do what you're trying to do, I'd say pick one of Groovy/Grails, Ruby/Rails or Python/Pylons (or maybe django), and focus on that, while mixing in some exposure to HTML, CSS, and Javascript as you go.

Oh, and you'll want to learn at least the basics of some sort of persistence mechanism. NoSQL solutions are very en-vogue these days, but traditional RDBMSs still have a role to play as well. I'd recommend learning the basics of using SQL with PostgreSQL, and the basics of one of the popular NoSQL systems.

This comment by coffeemug is the most relevant advice I have every found for anyone wanting to become a competent programmer/hacker : http://news.ycombinator.com/item?id=1747713

Also from http://www.catb.org/~esr/faqs/hacker-howto.html :

"So, if you want to be a hacker, repeat the following things until you believe them:"

To follow the path:

    look to the master,

    follow the master,

    walk with the master,

    see through the master,

    become the master.

Your goal when you start should be to work on the concepts and to stay motivated. You need to go in-depth when you first start; jumping languages slows that process down.

I would try splitting your program into two six-month blocks instead. The first six months you spend mining university CS courses for some kind of curriculum and assignments; most will be in Java but JS, Python, Ruby or Racket are all acceptable replacements. Try coming up with "fun projects," even if you can't quite do them yet. Other people can tell you what you'd need to learn.

The second six months you spend specifically on your application domain. If it's a web site, you'd learn about database layout, running login and authentication, building a UI, and building the payment mechanisms. All the while you're building prototype code for the final app.

The reason to spend such a large period on the app is because tons of things only come up as you build the app, and they don't appear in general CS, so you can't plan for them, and no book, lecture, or forum post can tell how they're resolved; you have to hack your way through poorly the first time, and then return with better solutions later as the problem fully reveals itself.

You'd also work on getting the other business aspects rolling in the second six months.

I would suggest you that instead of trying to be jack of all trades, you choose to be the master of a few that are relevant. I assume you don't have any kind of development experience so this is the route I suggest -

1. Frontend - Learn HTML 4/5, CSS 2/3, JavaScript, XML, JQuery/JQuery UI (or any library of your choice). Read books, online tutorials etc to learn the basics and then practice the skills by developing front-end part of your startup idea. This will help in not only polishing your web designing skills but you will also have a working HTML Prototype of your web application.

2. Backend - Learn only one backend programming language. Choose from Python/PHP/Ruby/Java. If you want to take easy but good enough route learn PHP. If you want to choose the best, learn Python/Ruby. While learning the backend programming language, at some stage, you will be required to learn database technologies - SQL (MySQL), or NoSQL(CoucheDB, MangoDB etc). When you feel comfortable with your skill level, take the html mockup developed in first stage and implement its backend to have a fully functional prototype of your application.

3. Frameworks(optional) - Though step one and two are enough to help you develop your application, it is always good to know a good framework for your language of choice. I would suggest codeigniter for php, Django for python and Ruby for rails. For practice, try re-implementing your application in the chosen framework.

4. Mobile Technologies(optional) - It is important if you plan to have a mobile version of your application. You have many options here. Start with Android/Java and then ios/objective-c. Develop the mobile version of your application.

I don't think it's a good idea to jump from language to language. If you want to get something done, pick one (maybe two) language that will get the job done.

Is your goal to do a startup, or become a programmer?

If it's the former, I strongly recommend simply learning HTML/CSS/Javascript and make a killer front-end of your product without the back-end logic. Trust me on this.

Not only is it faster, it's the pretty front end that gets other developers to understand your product. Don't worry if your "product" lacks logic at first. Static content serves the purpose just fine. At the same time, this will convince people that you can carry your own weight in the startup. Now you have something real useful to offer and contribute instead of just an idea.

I am not sure what you mean that OOP is intuitively harder to understand than functional programming. In fact, OOP was explicitly conceived as a more intuitive alternative to traditional languages, and most modern languages implement its core concepts in some way. Java is classic OOP, and is a good way to learn these concepts, so you may want to begin there.

Of course, I agree with everyone that you shouldn't be worrying about these things. You can learn many of these things through experience, and the bonus is you can get stuff done at the same time.

There was a marketing guy who about six months ago decided to quit his job and learn how to code. He announced it on HN/was featured on HN, along with other sites. Starting with Python.

I just googled and I am very happy to see that he didn't quit or give up - he kept going and coding... It looks like he has managed to build up a small community of supporters and that he had changed his focus to front-end development (HTML,CSS,JavaScript)...for now


I thought it might be interesting to share my expectations ss someone who is taking a similar path.

Goal: Launch a databound webapp by June. Requirements: Get good at Python and Django. Pick up HTML/CSS along the way.

So maybe you can become a hacker in one language in 6 months as opposed to trying to be a hacker in 10 languages in 1 year. Honestly, I would go with the shorter option. Time is everything in this business.

Sorry for the snark.

"no one gives a damn about my brilliant idea if I can't execute."

Tentative Schedule: Jan-Feb: not executing Mar-Apr: not executing May-Jun: not executing Jul-Aug: not executing Sep-Oct: not executing, Nov-Dec: Execute my brilliant idea

HTML5 is a markup language not a programming language Stick with trying to master Java, or Haskell, or Python Not all And just get a basic understanding of HTML 5, CSS, Javascript, PHP, and MySQL.

Before you decide to learn one programming language in 61 days please read this short essay: http://norvig.com/21-days.html

Thank You to everyone who has responded to this thread. My goal is still the same, but I definitely will be rethinking my strategy.

no. if you want to execute, you should spend jan-dec executing your brilliant idea, and learning the technology you're building your idea with as you're going, you should also ask HN or hacker friends of yours that you trust what languages to build your technology out in, and stay in those technologies

If you can learn Haskell in 2 months, you are a god.

I think it's actually much easier for people without prior programming experience. I met teenagers in #haskell that picked it right up, and were talking fluently about GADTs and MPTCs and the finer points of the type inference algorithm.

Personally, I struggled for years with it. Java rots your brain; it's much harder to understand FP if you were raised on it, C, and BASIC.

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact