
Ask HN: Make something people want - 4.5 years left and counting  - yewweitan
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.<p>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).<p>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.<p>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.<p>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?<p>Let me elaborate on that.<p>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)<p>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).<p>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".<p>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.<p>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.<p>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.<p>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?<p>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).<p>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.<p>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.<p>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.<p>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.<p>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.<p>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.<p>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.<p>Finally, people may say that I'm thinking too much. To them I say, Though is infinitely Scalable
======
moggleface
Your attitude towards math/"timeless" cs is correct. Today's infrastructure,
if you want to build something awesome four years in the future, is of little
interest to you. Focus on learning general-purpose algorithms, maths, language
concepts, and design sensibilities. When the time comes to pick up the
technologies of the day you want to build in, you'll have an abstraction of
those technologies ready to give you the context to totally own it.

This is not to say that you should totally neglect concrete tools. The
strategy that I've followed in this case has served me well, and I'll outline
it below:

First, learn a few "immortal tools" really well: emacs, some kind of revision
control, and how to be fluent in a UNIX shell. This includes understanding the
"unix philosophy," and shell scripting. None of these things are going
anywhere anytime soon, and a deep understanding and fluency with them will
boost your productivity by quite a lot.

Second, learn an orthogonal basis of programming languages to reasonable
fluency. That is, identify the major families of programming languages, pick
the one that most appeals to you in each family, and learn it. Do some project
euler stuff, or hack out that application you wanted, or implement one of your
favorite algorithms. The first thing I always write in a new programming
language is a nondeterministic finite automaton description language and
execution engine, for instance. Not only will this be fun, but it will prepare
you to learn whatever is in vogue when you sit down to make your product by
giving you broad context for programming languages in general.

Good luck. You have a good attitude and you're starting in the right place;
linear algebra is great stuff, and so is CLRS.

Oh, and finally: for the love of god take a class that uses SICP. Or just work
through it yourself with the online lecture videos. It teaches programming by
giving you a series of ever-more-elaborate models of program evaluation. It
will give you a deep understanding of how programming languages work, in
general, which it sounds like you'd really enjoy.

~~~
yewweitan
Thanks for the reply. The recommendations are awesome, thanks! I've put off
picking up SICP for awhile, will probably do that soon.

------
barrydahlberg
Start now.

Theory means so much more when you have experience to apply it to, especially
the experience of doing it wrong. Building things will keep you grounded and
give you leads for more theory to learn. I don't think either are very
relevant on their own.

Learning technology is also a skill and something that comes with practice. As
new things are generally an evolution of old things, the more exposure you
have the easier learning will be.

Front end (CSS, JS, HTML...) is a deep rabbit hole. It sounds like you are
really more interested in data, maths and algorithmic problems so I would play
there as much as possible. Things like Clojure are more likely to keep your
interest and excite you.

Don't wait!

------
jsharpe
Get internships. These will help remind you why you're in school, and give you
great mentorship opportunities. I've learned just as much if not more from
internships as I have from my CS classes (although the knowledge tends to be
of a more practical, rather than theoretical, nature).

If you're really lucky, in your time in undergrad, you'll be able to already
have experience working at some of the most innovative companies.

------
keefe
<braces for downmod> tl; dr

The focus seemed : How do I optimise my learning, such that I am capable of
actually building a great product the moment I'm out of Uni?

to which I have to say..... write code. Lots of code. Endless amounts of code,
debug it, fix it, test it, write it.

There's no reason you can't write a great app right now. Pick a language and
get to it.

~~~
yewweitan
Great to hear opinions. However, the point isn't if one could produce a great
app right now, it's if the time invested in doing so, especially if it's on a
narrow implementation space, is worth the opportunity cost of doing the more
"heavy" stuff like statistics, algs, etc.

I do agree with the sentiment though, and I'm definitely going to be coding
whenever I can!

~~~
keefe
imho, an operating software system is kind of an organic entity. It behaves in
very different ways, requires different kinds of attention and more personal
commitment to keep going. This is distinct from toy examples, prototypes and
course projects.

So, I'm suggesting that while you're young, start building something. It
doesn't have to make you money or be successful or take any more than 5 hours
a week of maintenance. The goal is to have something tangible for the
experience of maintaining it and to use in discussions with other people.

This could be an open source project or a serious commitment of contribution
to one, something to deal with mp3s or videos or whatever interests you.

------
apgwoz
I think you're off to a good start, but the best way to learn any of this
stuff is through experience. Take your classes of course, and study, but if
you've got time, contributing to open source, or creating your own projects
from scratch is a great way to learn and gain real-world experience.

