Ask HN: Make something people want - 4.5 years left and counting
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 ment...
9 comments
[ 3.5 ms ] story [ 34.6 ms ] threadThis 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.
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.
My biggest mistake was not starting a company sooner. I started my first company my last semester in college and decided to keep on an entrepreneurial path.
It was pretty tough in that situation. I didn't have the same disposable income all my corporate friends had. I wish I started a company three years earlier when I was a freshmen. No need to wait four years to write code and start a company, I would practice by building code you can use to make a profit. These small sites can potentially be building blocks for your future endeavors. You can even use them to attain datasets you'll want to use later on.
I do agree with the sentiment though, and I'm definitely going to be coding whenever I can!
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.
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!
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.