ASK HN: Becoming a hacker in one year
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?
Thanks
26 comments
[ 8.0 ms ] story [ 372 ms ] threadI'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.
But I agree, once I have the basics down, I should just start executing and learn new languages and frameworks as needed.
Thanks
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.
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.
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)
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.
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.
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.
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.
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:
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.
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.
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!
"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
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
http://proudn00b.com
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.
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.
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.
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.