

ASK HN: Becoming a hacker in one year - dvbarr

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.<p>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.<p>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<p>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?<p>Thanks
======
cd34
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.

------
jdietrich
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.

------
dstein
_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.

------
Skywing
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.

~~~
dvbarr
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.

Thanks

~~~
brudgers
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.

~~~
nostrademons
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.

------
guynamedloren
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!

------
mindcrime
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.

------
r11t
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.

------
anujkk
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.

------
chipsy
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.

------
Sargis
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.

------
vantran
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.

------
dwolfson20
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.

------
wallflower
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

<http://proudn00b.com>

------
naithemilkman
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.

------
edmccaffrey
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

------
jetjune
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.

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

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

------
snissn
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

------
tkahn6
If you can _learn Haskell_ in 2 months, you are a god.

~~~
nostrademons
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.

