Ask HN: Make something people want - 4.5 years left and counting 
Quick background. I'm 19 years old, 1st year in University, gunning for a Master's in Software Engineering from the University of Melbourne (Australia) in 4.5 years time.

I'm at an awesome stage in life right now: full benefits of University with an interest-free study loan, along with the power to leverage the internet for both learning and creation (i've got 2 sites up and running).

I'm a big proponent of learning from others, and talk to people older than myself frequently. The one recurring theme is: stay focused during Uni, learn some skills that will make you indispensable in life.

While that's all great, I believe it isn't enough: we as individuals somehow need to optimise our own learning if we expect to be able to afford groceries in 5 years time. While I think I'm doing that pretty well, and have firmly set my direction into the world of software, building a product is a whole different beast.

So the main question here is: How do I optimise my learning, such that I am capable of actually building a great product the moment I'm out of Uni?

Let me elaborate on that.

First, this is the ideal end goal. It is not easy, I respect that, and there's always plan B (go work for a company, learn the ropes, etc)

Second, when I talk about product, I'm not referring to things like iPhone apps. I'm referring to large-scale data-driven products (akin to what Bradford Cross talks about).

This is where the "Do Programmers need math?" argument pops up again, and as far as I know, the answer to that question is, "it depends on what you're doing". And for myself, I foresee a future in the direction of what Bradford Cross would term a "research-driven startup".

Hence, I place great emphasis on getting the basics right. I've went ahead and invested in some texts (Intro to Algorithms!), completed a course in Linear Algebra, soon to be doing much more related stuff, and have been programming in Common Lisp and Python for about 1 year now (with project euler being my main past-time). I'm thinking of expanding into the more front-end stuff (CSS and Javascript) as my next step, but that can be a whole other discussion.

The thing is, knowing all of that doesn't teach you anything about server architecture, datastore management, etc. Heck, I don't know anything about MVC right now.

While I'd love to get off and just build something, like anyone in this community can attest to, both the act of programming and learning to program, be it an iPhone app or a next-gen server, is one MASSIVE time sink. So too, is the process of learning to do math, statistics and the like.

Hence the dilemma: How much focus does one place on mastering the skills to work with today's existing infrastructure and tools, as opposed to focusing on the related theoretical aspects of the craft?

Similarly, how much does one invest in learning about how things fit together on a specific implementation, as opposed to learning how to program in general (and solve logic problems, etc).

Now of course, there is no black and white here, and the answer is to do everything. The question is how much of each to do, bearing in mind that technologies change so quickly. EC2 was not feasible for independent developers 2 years ago. Google App Engine was non-existent (at least for Python) then, and who knows where it will go in the future. Nodejs is all the rage now, and just today, a new clojure server (aleph) is up and running.

On the opposite end, my trusty "Introduction to Algorithms" and "Artificial Intelligence: A Modern Approach" will never go out of fashion, and will only add more to my current skill set.

I'm in a great position, mainly because I have no pressing need to make money. The corollary is that I have a pressing need to get good at making things people want. That means investing the time to pick up the necessary skills. More importantly, it means taking up evergreen skills, since even languages come and go but math will always stay.

Most importantly, it's about ensuring that I go about it in a way that I can sustain physically and mentally for the next 4.5 years in college.

By definition, someone looking up at the wild world of software can only be perplexed by the complexity, and be caught up in the vagaries; paralysis by analysis. But once you've come to grips with a novel concept, it starts to look less difficult and the fog seemingly clears overnight. The skill becomes second nature and mastery ensues.

I'm not at that stage yet, and to those that are, and can remember what it was like at my stage, I ask for your advice.

If you managed to read through all that ranting, Thank You. If you manage to come up with a coherent response to this, I'll be even more grateful.

Finally, people may say that I'm thinking too much. To them I say, Though is infinitely Scalable