4 ms·
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
- apgwoz 16y agoI 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.
- moggleface 16y agoYour 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 16y ago