Hacker News new | past | comments | ask | show | jobs | submit login
Ask HN: Advice for a young, self-taught programmer
136 points by godarderik on June 12, 2011 | hide | past | favorite | 73 comments
[TL;DR I’m a 15 year old self taught programmer unsure of what to learn and how to learn it].

Hello, I’m a 15 year old self-taught programmer and I need some help. About a year ago, I made $21,000 making apps for webOS through their Hot Apps promotion. However, that was a onetime thing, and I’ve concluded that the size of their user base makes it a bad platform to sell apps on. But now I’m unsure of what to do.

As a self-taught programmer, it is difficult for me to pick up new technologies. Right now, I know Python, C/C++, Objective C, and some HTML/CSS/JS, and my most complex app was about a 1,500 line C++/OpenGL piano app. I know the syntax of these languages, but I feel like I don’t know how to apply them to make things. When trying to learn frameworks, two things generally happen: One: I find a tutorial, follow it halfway through religiously, and then quit because I’m not making anything useful. Then, I transition to the “just build something” phase, in which case I will spend hours googling relatively trivial issues that I run into. I eventually give up because it takes a ridiculous amount of time to do something that seems so easy. I then move onto the next technology and repeat.

One option is to continue doing phone apps, except for iOS and Android. I have never programmed for Android, but I have been learning cocos2d for iOS and also about normal iOS apps. However, I don’t feel that I can make an app that’s good enough to compete with what’s already out there. Resulting from this is a constant belief that my ideas suck, I would never be able to code my idea, the idea wouldn’t be good enough to be sold, etc.

Another option would be for me to learn about data structures and algorithms. I’ve been studying them a little and know some of the basics, big O, sorting, etc., and I’ve done the first 55 or so Project Euler problems without much trouble. This seems like it would help me the most in the future, but I find it hard to see the benefit in it now, and wonder if I should just wait until college to learn it. Everything else just feels like gluing together libraries that won’t help me at all in the future, while this feels as if it would actually be worth something. Additionally, I also want to get into Stanford, and knowing things like this would help me be ahead.

Another thing I could learn is web programming, which I now know next to nothing about. I mean sure, I know HTML, CSS, JS, Python, but I don’t know how that’s glued together to make a flashy web app. I mean with my skills now I could design something, but it would probably look like crap. The idea of doing a web start-up right now is very appealing to be, but I just don’t know where to begin. I feel like most material is way too basic (“this is a variable…”) or talks about stuff that I have no idea in what context its being used.

Anyways, thanks for reading, and any help that anyone can give would be much appreciated. Thanks!




A minor heresy: most valuable programming involves a lot more gluing together libraries than it involves classical algorithms. You can go years in industry without ever seeing anything more complex than a hash table, and you don't even need to know why hash tables work, really. (And sorting? Sorting gets done by calling list.sort(), not by coding a merge sort.)

1) The way to go from "dabbling" to "proficient" is to ship software. It doesn't have to be amazing software. Entire industries are built on very non-amazing software. You will learn more from writing and supporting 1 real application than you will from a hundred tutorials.

You are, from the perspective of 99% of people in the world, a magician. Other people solve their problems by hand, by paper, by process, etc. You can conjure demons, speak arcane words to them, and the problems just go away. Find someone with a problem that they think is a Really Big Deal because they are not on speaking terms with any demons. Speak to demons for them. Get their money. You'll learn a lot from the process -- in particular, how little speaking to demons is actually required of a demon-speaker.

2) Study CS in college. Study something else, too. Your career prospects will not be dominated by your programming ability. Restated for emphasis: your career prospects will not be dominated by your programming ability. If you get really good at one hard thing plus programming, you're pretty much set for life (if that is your goal), since the intersection of the sets "can do This Particular Hard Thing" and "can program" will be only a handful of people.

3) The really useful engineering classes are the ones that teach you how to interact with other people, in particular, how to interact with people who are not engineers. People who are not engineers control most decisions you want made in your favor. Look for courses like Technical Writing or Communication For Geeks or whatever and make a special effort to take those versus learning e.g. how to build microcomputers out of NAND gates.


Very good advice. You could create great software just glueing code, no matter how dumb it sounds, most people are not too good at it and it's very very obvious. Now there are situations where glueing might not be enough and they surely will occur. That's when you need an engineer to solve the problem, CS will help you become one. The question is do you want to be one?

If you are more into Internet entrepreneurship studying something that is not CS could give you more advantage. Many great programmers never create any significant software for themselves, their knowledge is too confined to CS. These are people you might want to hire once you have your start-up, tell them what exactly you need your software to do and they will perform.

Go to Top Coder's website. All the top schools are in Asia and Eastern Europe. Actually a school from Poland, my country comes, in 3rd. Few years ago it was 1st. I would hear on TV how we have the best programmers in the world. But did they ever create anything significant? No. Most of them now work for Google, MS or some other big corporation that needs people who can write very efficient algorithms fast. So while I could easily attend an university that generates those great programmers (even for free I think, not too sure) I never even thought about it.

Knowing the science behind paint does not make you a painter and you don't need it to become one.

I'm not in any way against CS, it's definitely very interesting to study and if you truly love programming then by all means go and study it. But beware of what CS is and what it's not.


Regarding the heresy: wow, you're lucky. Every other project, I seem to have to decipher and apply some PhD thesis from the previous year and I didn't even complete university.

Sometimes I think I don't get paid enough for this.

Edit: I'm not unlucky, I love what I do. But see my responses to a couple of people below :)


Food for thought: if you approached getting paid more like it was a fun new optimization problem to be studied, deconstructed, and hacked, you would already be getting paid more. Instead, you're busy making other people rich.

Apologies if I sound like a broken record on this topic. It is largely projection.


Hey, you are my inspiration! You actually inspired me to make my own products.

The problem is, matching the day job pay is pretty hard because it's pretty high (should get paid more even though I'm paid well.) I think I'll get there eventually, just need to keep plugging away at it.


I have to say that that sounds awesome. I'll happily trade you my job (no serious academic thinking required) and work for 20% less of whatever they're paying you.


It is awesome.

Here's the problem: I do it all the time and I'm good at it. So people have an expectation of me that I do the hard stuff well. Sometimes, that's not true or a problem is exceptionally hard and those times it's really stressful. It's doubly so when even the experts argue amongst themselves regarding solutions. It's been like that recently so as a result, sometimes I wish I was just doing some CRUD with Django :)


Or we could call you lucky for getting paid to work on stuff that's cutting edge instead of boring CRUD apps.

Seriously, I'm curious where you work.


Yeah, I'm definitely lucky but man, sometimes it's stressful. Especially recently, I've had some really difficult problems to get through.

I kind of work for myself though it's more accurate to say that I work for a lot of people in various highly technical and often mathematically intensive industries...


Whoa there. Hold on just a minute and take a step back.

You're 15 years old, you made $21k making apps on webOS. You have four or five languages under your belt. By anybody's metrics, you're doing really really well. Awesomely, in fact. Even though "awesomely" really isn't a word.

Don't worry about it. Just keep exploring, and you'll run in to fun stuff that will continue to expand your horizons.

One thought that hasn't come up here yet is to get involved with the most intriguing open-source project of your choice. Get some experience programming on a team, and you'll not only have a chance to learn from others, but you'll also be able to expand your own portfolio without having to worry about validating ideas.

But the best thing you can give yourself is an open mind and a shot of confidence. Also: get in touch with the Teens in Tech guys. They're awesome.


> Also: get in touch with the Teens in Tech guys. They're awesome.

curious why you'd recommend this? As a casual observer and not at all familiar with what they've done beyond the "public" stuff, they just seem like a group of teenagers with some dumb luck. Their "conferences" seem surrounded by "drama" (he said she said whaa whaa stuff) that you'd expect from high school students, their actual products are pretty pointless (the blog gets 1 post every few days and it's either about some free product they got or their friends ~~application~~ startup and their apparent "blogging platform" thing died after a few months and was just a wp-mu install.

From what I've seen of "them" it seems he'd gain nothing from them. It's just a group of kids with connections doing nothing but making whatever is hip and happening and abandoning it for the next thing. See each of their twitter profiles, every few weeks they're the "CEO" of a new "startup".

The only "high profile" (in the HN esque scene) teenager I'd think of recommending is Mark Bao, he's actually doing things.


The glory of being in your position is that you really can't make a mistake here. I'll dispense some random suggestions.

-- it takes a ridiculous amount of time to do something that seems so easy.

Yes, this is a sign that you are doing it right. ;) Programming always takes a ridiculous amount of time. The only saving grace is that, once the program is done, a ridiculous number of people will be able to use it a ridiculous number of times. So, if you find that you're not motivated to finish stuff, you need customers. Customers are very motivational, and not just because they give you money. Happy customers are very morale-boosting.

-- The reason why you can know HTML, CSS, JS, and Python and still do not feel that you know web programming is that none of those things is a database. The database is the important part of web programming. Everything else is frosting. Try SQL for Web Nerds:

http://philip.greenspun.com/sql/

It's getting more dated by the second, half the links are broken, and you will not want to actually use Oracle (try Postgres instead, or do what everyone else does and use MySQL with InnoDB) but I know of nothing more readable and certainly nothing cheaper; most published books on SQL are drier than dirt, and I fear that the online tutorials may be all syntax and no substance. Then maybe look at a framework or two. Other folks have recommended Django, or you could look at Rails. Nothing glues all the parts together like a framework.

-- There is nothing wrong with teaching yourself basic CS before you get to Stanford. You will not run out of potentially interesting things to study at Stanford -- either you can study more advanced CS, or you can (hint! hint!) study something that is not CS, like science or other branches of math. If you like reading SICP and CLRS for fun, by all means read SICP and CLRS for fun. Don't neglect other potentially fun things, though.

-- If you find that you know language syntax and simple statements but don't know how a whole app goes together, find someone else's app and tinker with that. Read other people's apps, take them apart, fix bugs in them, find bugs in them.

-- Find someone else to work with. Get some small but honest jobs on an online consulting site and fix other people's code. Join an open-source project and hack on stuff with a community. The Drupal project is always looking for people... (/shameless plug)


Your personality seems similar to the one I had at 15. Here's what I wish I had told myself.

All of your problems stem from your internal ape perceiving itself to be at the bottom of the social hierarchy. For example, right after sharing that you made $21K in a programming contest at age 15, you immediately downplay your accomplishment.

You are part of the "careful, pessimistic thinker" class of nerd--the kind of nerd who could write space shuttle software for NASA. Most people are overconfident in their beliefs and overrate themselves, but not you. (It's a pretty good sign that my diagnosis is accurate if you find yourself instinctively denying its truth. Overconfident people rarely think they might be overconfident.)

Being a careful, pessimistic thinker has pros and cons. Your model of the world will be better than average, and you'll have a good idea of where its holes are. On the other hand, your psychological health will be below average since you instinctively scrutinize everything looking for flaws--including yourself.

There's a lot to say about how to fix this problem. Fortunately, I've managed to fix it in myself, and I now have really good psychological health (procrastinating very rarely) while still being able to scrutinize everything I do and figure out how I can do it better. (In fact, my scrutinizing instinct was actually pretty useful for improving my psychological health once I learned to apply it properly.)

I read a good quote by a psychologist the other day: "Several times a day, notice that you're basically alright." http://dirtsimple.org/ is probably a good blog to read. It's by the same guy who wrote Python's easy_install, who had this problem and largely solved it. I'd also love to give anyone who thinks they have this problem advice and coaching--feel free to contact me at [my username] at gmail dot com. (I'd probably blog about this if I knew I had one loyal reader, so exchanging email with other folks who have this problem would be great.)


Hi. I might be able to give you some advice. It's centered around

You are too young and inexperienced to make money.

I don't mean you can't make money... actually you did, but it's not the right thing to do now. Focus on learning instead. When I was your age, I was interested in making money and I worked hard building websites but not learning how to build them correctly (the kind of collecting stuff and making them work together). I made some money, however that money didn't really last and my experience/knowledge didn't get so far.

Now I regret the time that I have spent on that. If I spent it on learning a programming language or a framework, I'll be able to do some freelancing in the side with a higher rate. That's my advice: Go and learn something. It can be a programming language (C#.net, ruby on rails, PHP...), networking (DNS, Active directory...), finance, cryptography...

Anything that you are interested on. Don't take tutorials. Read a book. Or may be a couple of books and add some more. Delve into the topic you select. Become an expert in your field. Know the ins and outs and inner workings of it. Be an active member in related communities. Get a portfolio.

By the time you are 20 (and that's 5 years!). You'll have an amazing experience. You can at that time choose whether to work for $100/hour or to run your own startup or may be take CS in Standford. The point is: You are free to choose and you have something invaluable in your brain: The knowledge and the experience.

If I took that road when I was 15, I might be in a completely other life... and it would be a lot better and more engaging.


Thanks for the advice (I'm assuming it applies to me too).

I've spent the past year getting really interested in Lisp (I just finished my senior year of high school, in which I took Lisp as an independent study). For a science fair, I got into genetic programming (https://github.com/tsmacdonald/Genetic-Tic-Tac-Toe), and that project got me interested in AI, and I think that I'd like to spend the summer working through Peter Norvig's Paradigms of Artificial Intelligence Programming. This is in addition to my job--doing code monkey, pay-by-the-hour work in Java.

But I've been bothered by a persistent thought: "Sure, Lisp is cool and AI is cool and there's probably interesting research to be done...but you want to make a startup in a few years, and all the cool kids are making websites or smartphone apps. Say...you know Java, you just got an Android phone...you have four (or maybe three) years of college to get all academic with. A professor already expressed an interest in doing FP research over the summer with you. The smart thing to do would be to crank out an app this summer, use the experience to crank out a better app, hopefully make a revenue source for while you're in college..."

But to heck with making a bit of extra money, and to heck with overanalyzing the startup market of 2015. I'll do what I find really interesting, and assume that something awesome will present itself in due course.


You can't go wrong doing what's interesting.

I did a degree in biomedical sciences at Waterloo, a school in Ontario with a big focus on tech. I went to events, met people. Earned a degree in something almost entirely unrelated. I worked in several foreign countries in the summers because of my knowledge of web programming and made money making web stuff during school. I'm now doing a law degree and continue to build websites. A major web company tried to recruit me last year but I turned it down. I'm now working for another major tech company in the legal department. You never know where things will take you and keep doing what's interesting. Tech will open doors. Keep an eye out for them.


I took the path you described (I went from doing web-based stuff in PHP from 12-14 to reverse-engineering network protocols and file formats, which is still my expertise from 15-23), and outside of a lot of dumb luck, I can completely attribute my success to it. I found it was interesting, and I just started doing it; that thought process has gotten me where I am today.

The only thing I'd disagree with is "Read a book" -- while there are many fine books out there, they should be used to fill in gaps while you're doing things, IMO. Start doing something, and when you run into issues or have questions about how certain things behave, open up a relevant book and figure out what's going on.


Hi. Read a book doesn't mean don't start doing things. It doesn't mean don't have fun and play soccer. It means "Read a book from A to Z". And most of the time, even before I complete reading the book, I become more enlightened and new ideas come to my mind.


Hey, I read your comment and wanted some more info, so I started a separate thread (since the questions I had weren't entirely pertinent to this one): http://hackerne.ws/item?id=2647750

Thanks in advance!


Did you consider learning biology?

You sound smart and comfortable with solving problems with a computer, yet you do not seem to be satisfied with developing applications for people to use in everyday life. Perhaps your calling is to develop computer programs to solve scientific problems. I am extrapolating from my experience here. I am an astrophysicist and do simulations for studying problems in stellar dynamics. It is really fun, but sometimes I wish I had the background in biology to have the option to switch to that field, since there seems to be tons of interesting problems and really smart guys there; in particular in molecular biology and in brain research. I think if I knew what I know now when I finished high school I would go for biology and not physics (this does not mean I regret my choice though, I do not), or at least take a few biology courses.

Unfortunately I cannot recommend many books. The only decent biology book I have is "The Molecular Biology of the Cell" by Alberts et al. It is really good. I have the feeling others here can make better/more recommendations if you ask. This is not necessarily an engaging book.

Good luck!


> Another option would be for me to learn about data structures and algorithms

I wouldn't call this an option, but it also doesn't mean you have to spend the next year doing nothing but this. I would recommend spending a few days getting the basics under your belt and figuring out the more advanced stuff when you encounter it (and trust me - you will, they're everywhere).

You already understand how apps work and how you build them so if you're unsure what project to tackle next I'd highly recommend picking up Django (because you already know python) and building some web app that just seems interesting to you. It'll give you some server-side experience, expose you to databases and the HTTP protocol (which everyone on the web should know - it's not that complicated but having worked with it really gives you a different picture of the web).

It'll also give you a working knowledge of browsers, AJAX, HTML5, etc which are always useful skills to have. You might even find yourself going back to apps this way by using Phonegap which allows you to write cross-device apps using web technologies (though the process isn't as easy as the website makes it appear).

Basically just work on expanding your knowledge until you find a project that fits and then dive deep into that.

Also, it's all hard work and everybody faces those problems, don't let it get you down.


16 year old here, and I know exactly what you mean!

I've been-there done that, with the kinds of things your talking about... I've released iPhone apps, dabbled into web development, done JS, PHP, Python, Ruby on Rails, Java, C#, Objective-C, and lots of other things.

My advice is, this is a great point of opportunity in your life- you're living at home, your expenses (room & board) are being paid for, and you're not yet responsible for having job. It's ok to feel satisfied piddling around different platforms and languages, because this is a great time to explore things without worrying about making money.

Eventually, you'll probably find something that you're really interested in- and learn everything you can about that. The things you're learning now WILL be useful later on, I can tell you this from personal experience as a college student.

Since we're more or less the same age, we should communicate! Feel free to send me an email (grahamrexford@gmail.com) to talk, or even if you want help with something, I might be able to assist.


You don't learn French just by trying to write letters and articles in a vacuum, you learn by reading articles, letters and books in French.

Similarly, to become very proficient with code, read other people's code. Read code written with the help of a framework, read code written in Python, try to read some in a functional language, try to read some C for an embedded system (FreeRTOS, perhaps?).

But similarly, don't just read. You need to be practicing your writing of code too. Write small things, an AVL or Red-Black tree in C, a small web server in Python, an IRC bot in Objective-C are all semi-decent pedagogical projects. You don't need to devote your life to a small project, just knock it out over the course of a couple of weeks to become familiar with the idioms.

Investigate asymptotic complexity, basic data structures (Arrays vs. Linked lists, Hash Tables vs. Binary Trees (balanced and unbalanced), various methods of queuing, stacks), you'll need to know the standard algorithms (binary search, various sorting algorithms, some search algorithms, etc.)

The only way to improve is to continually try to improve. Write code, read code, read books, try to implement the ideas from the books. AI, compiler design and implementation, functional programming, hardware (all the way down to signal processing and digital electronics, see if you can't design a programmable analogue computer!)


I can sympathize with your situation. When I started programming, I felt the same way and had similar experiences. What changed? I read SICP. Programming hasn't been the same since.


Disclaimer:I am not on your level nor was I in the past. I am a 20 year old student who hasn't really accomplished much compared to what you have done. You sound like you are rocketing towards being established as a prodigy of sorts. Way to go!

What's going through my head: "I really want to give him some meaningful advice. This kid seems really neat, he is obviously going to do neat things. I want to make an impact on his life because I want him to succeed."

And I think that is what is going to go through everyone's heads here. It doesn't matter who they are or what they do: they want to see you succeed. And I think that sort of thing will carry over to whatever you try. People will want to see you succeed because you are so rare and so different and stand out so much from everything else in people's lives.

At this point, whatever you want to do, people will want to help you out and make sure that it happens. If you talk about your problems or struggles, people will come out of nowhere and help you out. If you want to learn a particular technology, email the people who made it with your story. If you want to "do" a startup, email some startup ceo's for advice and you will get some amazing advice. All you need to do is decide, and people will show up to lay out the red carpet.

Most normal people, like me, want to help you out but have no idea how to do it. I have had a hard time typing this because I keep thinking of advice to give you that probably wouldn't help. I want to say something profound to you but I have nothing much to add to what has been said here. I think the thing you should do is just pick something, anything, and start doing it. For you, things will probably line up amazingly well. People want to help you.


This brings me back about 8 years when I was learning similar things in the wake of the dot com crash. I will go ahead and say that further learning of languages and whatnot at your age is not necessary. If it's fun, go for it. But being well rounded by exposing yourself to things outside of technology will help flex your idea muscle (brain). Steeping yourself in tech is not the best way to come up with ideas. When I want ideas, I walk around and pay attention to how the people around me use technology and how they could better use it. Just chatting with people will help greatly. Soft skills will help you in life just as much as hard skills. Attempting to learn the sum of a college education from 15-18 is going to be harder than with the help of profs/TAs, you will miss things, and you may find yourself bored once in college (I did). So unless your goal is to be the obnoxious kid in the front row who knows all the material already, or if your goal is to do undergrad research (a better one), I wouldn't worry so much.

Once something cool does hit you, you'll find building it easier and more fun than any work or learning exercise.


First off, if you know C and C++, then you should realize that C is not C++ and really, the two should be considered completely different langauges (C99 has enough semantic differences from C++ that you no longer can compile C99 code under a C++ compiler). With that said:

1. Learn C. Pick up the K&R book and work through it. C is the backbone for most everything these days (Unix, Perl, Python, Ruby, etc, all written in C). It will give you a feel for how the computer works at the lowest level (unless you really want to learn Assembly, which I would recommend eventually). Skip C++ for now. It's very difficult to learn the entirety of the langauge and everybody uses different subsets of C++ (and C++ is a language you can pick up when you need it).

Also, learning C will give you a solid grounding in imperative (procedural) languages.

I would also recommend learning a functional language, either Haskel or Erlang (Haskel is a more "pure" functional language, but Erlang has probably more commercial use, even if it's a bit less "pure"). You don't have to learn this like C, but enough to be comfortable with thinking "functional". It'll help you programming even in non-functional languages.

I would also recommend learning an object oriented language (but not C++)---either Java (more practical these days, if a bit verbose) or Smalltalk (not the original object oriented language (that distinction goes to Simula) but probably the first pure object oriented language).

Don't worry now about making money, nor about reinventing the wheel. At this stage, you should be reinventing the wheel, if only to gain a deeper understanding of the trade-offs in programming. This skill will also help you evaluate which libraries are useful under certain circumstances.

As for keeping your interest, have you thought of making a game? Even a simple game like Space Invaders (even a text-only version is useful) or Tetris is simple enough to finish in a few days, yet significantly non-trivial enough to see how differences in implementation affect the resulting program.

But if you want a real mind-blowing experience, try implementing the language Forth. There are useful implementations of Forth in a little of 2k worth of code (okay, written in Assembly) so it's not a difficult language to implement, but it's amazing just how powerful Forth is (think of it as the poor man's Lisp).


Wow. I think you and I are in very similar positions. Although you've got a decade headstart on me: Win. I would say our interests and current set of skills overlap quite a bit, this is what I'm doing to get to the next level:

- Find a mentor. This is really important. IRC + StackOverflow is a good substitute, but you need somebody who you can go to with your dumbest questions and who has infinite patience.

- Pick something you think is cool and copy it. Wholesale. Don't even worry about doing it well, just get it to work. I made a couple HN clones for different domains just to see how it works.

- Take a break from programming and get a different hobby. Preferably something that makes you work with your hands (metal-working, cooking, painting (PG FTW) are good).

- Take a theoretical CS course at a local university. It will really help elevate your thinking about computation and problem solving.

Hope that was at all coherent/helpful. Good luck!


I would suggest reading K&R (C Programming Language) as it's concise, clean, and should at least help you in developing a proper mindset for understanding programming languages


When I was 15 (1997) I was pretty decent in C/C++, Java, Pascal, and HTML/CSS. There weren't really webapps yet, or at least any way to deploy them, and not any way I knew of to work remotely or ask questions of other programmers like there is today -- so I didn't make much money at it and ended up working bagging groceries at my local supermarket instead. So definitely you have a huge heads up on my generation just by what you have. Simply asking this question (including the useful advice I'm sure other HN contributors will offer you) is a great step forward for you and a huge one for mankind.

I think the most important thing for you to do, however, is follow your passion. If you are passionate about math, complicated computer science questions, creating apps that make people happy, or something else. My pops strongly pushed me toward MIT but I ended going somewhere else and doing something other than engineering that I ended up finding a lot more passion for and that, even though I haven't (yet!) made a gazillion dollars in silicon valley, I've learned a few other human languages and enriched myself in a number of other ways.

So my advice more generally is don't be super narrow if you don't want to be. Get out there and experience the world and other things if you are excited about that. Don't worry about making a flashy web app, unless you have a vision that requires a flashy web app to be executed upon. There are a lot of people in this world doing a lot of different things.

Anyways, it may be true that your ideas suck. Ideas can be big (usually they also require large teams for implementation) or small (and potentially growing from an existing need you have yourself or an observed need of a community -- e.g. no apps for cats on iOS). If you need an idea, observe a community, know a market, ask people more specific questions, then execute.

Do you need to make money? If so, how much? That's a good question to ask yourself now since there is often a tradeoff between coding for cash and pursuing other interesting problems (things like Project Euler certainly don't hurt either way).

However, potentially the most useful piece of advice I have for you is go social. I didn't do that myself until later in my career, but I found it helps tremendously. Find a project that you are excited about and start contributing code (even if it is a very minor way). Your code will get better much faster if other people are reading it and esp. if other people who know what good code looks like critique it. In fact, probably the folks who contribute to such projects will be more valuable critics than profs at Stanford or wherever else you end up (not that it isn't a bad idea to get a good education, but remember that's not all there is to the world).

Good luck!


I would say all successful engineers and aspiring entrepreneurs need to know the basis upon which we program today. Where we came from with assembly, why so many people wrote blocking code vs using event-driven programming, even though we've known that to be the most efficient way to handle IO for nearly 30 years, and the general human nature of technology and economics revolving around that. Working at a startup that is transparent about it's business relations is the most engaging and thrilling way to pick that up, of course. Knowing the broadest amount of relevant technology, and how to apply it to help people solve problems, is the most fulfilling (and coincidentally the fastest way to accumulate large amounts of money).

If you're familiar with some of the heavy hitting problems in computer science right now, such as vertically scalable architecture, garbage collection, how difficult it is to debug multithreaded applications, you might want to check out Node.JS, as it is my #1 bet for large adoption of engineers in the near future. It's the first project of it's kind, in the age of GitHub, that can really be called a trending software platform. It allows you to do very rapid iteration of development, without having the hassle of how to handle large amounts of IO and other problems that will make you bang your head against your desk with if you were using other systems.

Above all though, the most interesting projects for you to work are probably what you would learn the most from.


How are you on computing in general? Are you VERY knowledgeable about the operating system you use? What about other operating systems? Know anything about their inner workings?

If you plan to be a professional programmer a working knowledge of Linux can be very valuable...in some cases a necessity. Ditto for Windows.

In terms of your "hitting the wall" in programming, I'd say seriously consider contributing to an open source project.

This will allow you a good opportunity to both study a (possibly large) code-base, and write code as well. It will force you to become more familiar with some of the processes of software development. You might have to work with other people, use a bug tracker, learn an unfamiliar build system, use an unfamiliar revision control system, etc.

Start small. Pick project that is open about needing help. Learn about the project. Hang out in the IRC a bit, or message board. Ask some questions. Answer some questions. Help track down bugs. Eventually find a feature/bug you can implement/fix and do it.

From your description, it sounds like you're in a good place. You've been doing well, and now it's just a question of finding new ways to challenge yourself. There will be setbacks here and there, but as long as you keep plugging away at it you'll be fine.

One last piece of advice I would offer is to make sure you also take time to enjoy other things besides programming. You're young and you don't get those years back.


"Everything else just feels like gluing together libraries that won’t help me at all in the future"

Don't be discouraged by this. Although it may be easy to use existing libraries and existing tools it does give you some insight on how they are structured and how people have designed them. I have been using cocos2d for a game that I have been creating and I have come to know and love some parts of it but have found some flaws in its design and some areas where it needs improvement. If it wasn't for the library I wouldn't have a working product by now. See using libraries as a way to give leverage your ideas and not re-invent the wheel in the process.

Overall, I think you are in a way better place than most 15yr olds and some older people (like me). I was in the same position as you at your age and I was scared I wasn't making the right decision. You have a lot of knowledge of the tech and know the right tools to build upon your ideas. I say don't worry about the intricacies right now and I suggest that you just keep on building new things and see it as a great learning process. Learn the basics and the rest will just follow. Make mistakes and just relax. You're still young!

If you ever need some inspiration: http://my.opera.com/adrnlnrsh/blog/show.dml/11402771


I want to give some concrete, actionable advice, because when I hit a similar roadblock, I didn't know where to go for advice, and ended up not getting anywhere for a good while. What finally got me where I wanted to be was learning Design Patterns, but there are other ways to get there, too.

When I started out, I mostly focused on the UI, and then hacked together whatever was behind it. Because my focus was on non-portable code, I spent inordinate amounts of time digging through library documentation, so progress felt really slow.

Design Patterns solidified my understanding of OOP, but more importantly, it helped me focus on the parts of my programs that were device/OS/Framework independent. This was helpful because it meant digging through documentation was the last step, instead of the first. My code was more readable and more testable, so I had an easier time planning, making changes, and finding bugs, which meant I was more productive.

You'd get similar mileage out of learning Test Driven Development or Functional Programming - they all emphasize similar concepts that will boost both your understanding and your productivity. Aside from that, they're all very practical (more so than algorithms), and more or less language agnostic, so if you're programming, they'll help you no matter where you go from here.


We should get in touch. I'm a 19 y/o frontend guy working on a video education startup (my co-founder is a Peter Thiel fellow).

Lets see if there's a way we can help you out :)

bp@brandonpaton.com


:)


I don't fully expect you to see this, as there are 40+ comments ahead of me, but I hope I can help you out a bit.

I'm a lot like you, I've messed with C#, Python, Ruby, C, C++, Javascript, and several more. I know the syntax of them well-enough, but I don't actually know them that well. I learned Python somewhat through a class back in 2007 (College for Kids at DVC). I learned C# last year because I liked the drag-and-drop GUI editor with Visual Studio. I sat in at a lower-division class last summer at UCDavis (ECS30) that taught the beginnings of C. The summer before that I went to a summer camp that taught the basics of C++. All of these different experiences taught me different programming languages, but I find the best way to learn is by making something that you want to make.

I'm making something that let's students find out what their homework is online, do it, turn it in, and check their grades; all while making the teacher's job easier. This is teaching me faster and more than I have ever learned from any class. If you want something interesting this summer to learn on then feel free to email me jarred@jantire.com


If you are unfamiliar with the tale of the nine blind men and the elephant, be sure to look it up. [1] While I don't disagree with most of the advice already given, I don't think the advice given thus far paints a complete picture. For example, much of it is certainly good career advice but not so good if you are interested in computer science for its own sake.

One project I wish I started when I was, say, 11 is developing all the software for some hardware. This includes the OS, the compilers, the network stack, the browser, the email client, the application server, etc. Of course, everything might be a little simple, but this is very much akin to how a car enthusiast might spend his/her free time re-building the engine of a classic car. This is a 5- to 10-year project that I would have perhaps completed by now had I started at 15!

Also, I wonder if you'd be interested in doing computer science research rather than writing applications. There's a broad range of topics to choose from: robotics, operating systems, program analysis, graphics, and many, many more! Indeed, one of the reasons to go to a place like Stanford is that there is a lot of opportunity to perform research as an undergraduate. (Do a search for "stanford curis".) As for money, many researchers at Stanford, and indeed the very professors you will take classes from (e.g. Engler, Lam, Rosenblum, Ousterhout, ...), have successfully started companies based on their research.

If you are interested, I can make time later to get into more details, but my main point is to keep in mind that an elephant is not its tusk, its tail, its trunk, etc., but rather the collection of it all!

[1] http://en.wikipedia.org/wiki/Blind_men_and_an_elephant


I will quickly point to some other topics: data mining, machine learning, databases, programming languages, computational biology, etc. Also, application security, which you might get started with via war games, is huge right now. [1]

[1] http://www.overthewire.org/wargames/


Not to be rude but I'd like to ask you for advice.

I'm fourteen, and I'm in a similar situation, although worse at programming. All I know is web, and some low level. Neither very well. The best thing I've made is probably a fancy pastebin (for plain text) in Sinatra.

Here's my advice (question later):

From the part about fearing that your ideas suck, you should ask someone and see what others think of it. They probably aren't that bad. You need confidence within reason.

With web programming, don't start with Django. Sinatra is good for practicing and getting used to moving data, so I would recommend web.py (the equivalent for Python), just because it's like Sinatra (disclaimer: I've never used web.py).

I got confused by SQL and SQLAlchemy. I like MongoDB better. It's easier, in my opinion.

Once you want to do something complicated, beyond a pastebin, then move to Django.

Learn CSS and design and something like Illustrator (logos, background images). I used to open up Firebug/Inspector, select something from a web page, and see what came up. Then I tried to duplicate it. Probably not the best way though...

Here's my question (to everyone, not just you):

What should I do to make the most out of my time?

I have the opposite feeling with algorithms and data structures. They feel like a waste of time when I could be making something, but that's just my delusion probably.

We can continue this over email.

Edit: don't stress over learning something that takes too much time. There's no rush. Also, web programming is useful because you could provide a service/subscription. That is, you make a mobile app which works with a web site/central server.


I'm a professional python webapp guy and I like MongoDB better for the same reason. :) You might find tornado nice!

Some advice on turning this into a career: learning CSS and HTML is very useful, but there's (relatively) lots of jobs where you can program services for the backend and work with a frontend guy who's doing the design work and the user interface. Often for this sort of job though, the people hiring will ask you algorithm and data structure questions.

The other path you can take is really studying graphic design for a bit to train your artistic eye - if you can make pretty nice looking websites, and code up the backend to make them do interesting stuff, you're in a great position to go freelance / solo and build an app on the side.

And lastly, a third path: start writing a lot of javascript! It's getting used more and more, and a lot of the front end guys who "know javascript" are kind of shitty programmers, so there's a good pool of those sorts of jobs available.


My small recommendation, as a just-graduated high school student with similar interests:

Self-study for the AP Computer Science AB exam.

Read through a Barron's review book and do the review questions as you go. It should be fun and easy, and you'll get college credit! (Stanford will give you advanced placement if you get a 4 or 5 on the test.)

When I did this, in tenth grade, it taught me at least 3 things:

Basic data structure and algorithms, like you mentioned. Useful.

OOP. This helped me become better able to manage complexity, and get to the point where I could develop 1500+ line web apps.

Java. I actually applied the concepts I was learning to JavaScript instead, and got away with never compiling any Java. (Java did come in handy later though, when I wanted to hack on some Minecraft plugins!) Many things are less straightforward in JS though (like OOP), and will require more outside reading.

As I studied APCS, I became more and more into JavaScript. Lately, I've been working with CouchDB, which is a database and web server that lets you build entire web apps with just HTML, CSS, and JS. CouchDB could serve as the "glue" that you're looking for!


Find a problem, solve it with a program. Try to do it yourself, and every time you run into a barrier look it up. At your age, don't worry about mastering code by specific languages -- those syntax concepts will come in time as your mind grows. Right now focusing on playing with problems and solutions.


Awesome.

Do you have any preferences? I started out with doing web related stuff and in the end I noticed that I preferred lower level stuff such as C/C++.

I was in a similar position as you a couple of years ago (21 now) and I would say focus on learning more about programming. But, build stuff that is a challenge so you learn new stuff every time.

If you're pretty smart, you should have plenty of spare time. I loved high school because it was pretty much the only time where I had unlimited time to hack on stuff.

As for what to do next, tutorials can only get you so far. I'd say try out some languages and once you decide what you like most then get an (e)book that explains the basics of the language; there are usually good threads on stackoverflow as to which books to get.


I think you're at the phase where you need practice and experience mostly. Either get a job on a team that's cranking out projects, or go freelance and ship a few dozen sites. You'll start to get some insight into the bigger problems around handling clients, cash flow, project management, etc.

I'd also recommend tornadoweb.org - there are some nice demos included using moderately complex javascript in the browser and python on the server. I'm thinking in particular of the chat demo, which was invaluable for me in understanding how ajax apps work.

Really though, you need to just ship a few projects; the frustrations will clear up and you'll be more accurate in estimating how long things should take.


A couple of book suggestions:

Fowler's "Passionate Programmer"[1] and Uncle Bob Martin's "Clean Coder"[2] are both excellent books on making a career out of writing software. Not specific to a particular tech, but both quick interesting reads that contain lots of nuggets of great advice.

Good luck on your journey. I'm sending this link to my 13yr old son. He's been exploring Ruby and Processing.

[1] http://pragprog.com/titles/cfcar2/the-passionate-programmer [2] http://www.amazon.com/Clean-Coder-Conduct-Professional-Progr...


You mentioned you know HTML, CSS, JS and Python. Have you looked into Django? That's a great tie-in of those skills in a single web programming framework. Seeing how Django brings them all together might inspire you toward some app programming.


While you may not appreciate this now, and may seem 'left of field' particularly on HN, consider learning something else. By that I mean learn a foreign language, learn (more?) maths do something academic not related to programming.

You seem to be a smart person there is so much more you can do with your life that is outside the technology industry but you need to lay the groundwork now to open doors for yourself in the future.

Don't forget the programming though but think of it as more of a hobby not a career. And if in five years time you still want to make a life from it you still can. Don't start making big decisions about your life now, have fun enjoy yourself and stay open-minded.

Good luck!


It's actually funny you should say that. I actually love learning languages, I've picked up Spanish over the last year taking classes and talking with a Mexican friend on Skype, just talking about an hour each night in the language. I'm starting to learn Chinese now too, just because its supposed difficulty is somehow attractive to me :) But thanks for the suggestion, I'll be sure to stay open-minded.


Sounds like you're doing great - you're miles ahead of where I was at 15, that's for sure. I think you need a mentor. Look to open source, local universities, etc. I've heard good things about the google summer of code.


This is good advice. I started writing stuff in early elementary school, but I didn't have any mentorship whatsoever until well into college. A mentor would be fantastic.


Google Summer of Code is only offered to college students.


There's some good advice elsewhere on this thread so I will not repeat any.

The only thing I would add is that if you enjoy webos development; I think there may actually be many good opportunities there. The reason I say this is that there is a shortage of good apps. So yeah you are in a smaller market, but you have a market that is untapped and not as saturated as iOS/Android. Also, it seems HP finally has some new products out/about to come out (Veer, TouchPad, Pre3, etc.).

Anyway, you are young; do what you enjoy now there is plenty of time to learn the theory side of things in University.


One of the things you could do is try and intern at a tech company during the summer. The main benefit is that you'll be able to see how different technologies are usually put together to make a product, and will also learn some useful professional software development practices along the way which may become handy in the future in case you ever decide to do a startup.

Since you're not in college yet this may be slightly difficult, but as long as you have put together a portfolio of interesting things you've worked on (which you clearly have), it shouldn't be a problem.


I'd argue the intern part may not be necessary. If he has skills like he says, he could probably just about land a front-end web developer job for a few months with decent pay.


I'll second this. Seeing how an establish company does software ( revision control, testing, rolling out updates, etc.) taught me a lot about programming that I don't think I would have learned anywhere else.


I can definitely associate with you on the learning side of things. The way I've come up with to do things is to, when I get an idea, sketch down a plan for an app/piece of code/whatever on some paper, draw up a basic design if it'll be needed, and file it away for when I next learn an applicable language.

For instance I've got notes and a basic UI for a smallish app called For A Bigger Screen ready for when I dive back in ROR. The advantage of something like this is that I actually feel I'm learning something, and get the same kind of impetus to continue out of it.


The best thing is to write as much as possible. Pick up as many projects as you can, design and recreate everything you have read about in computer science literature. Keep coding fun and do it as much as possible. Find the reference material used to teach computer science courses (there are standard books for many areas). READ READ READ. Diversify your knowledge into areas you find interesting. All you need is diligence.

You may find that by the time you're in your early 20s you are light years ahead of your peers.


You are doing good. Dont over-complicate things, and keep having fun along the ride.

If you need any advice/opinion regarding programming or software development, feel free to e-mail.


Dude I think you arent seeing the forest through the trees...

Yea your e smart and you are making money at a young age. but if you want to be doing * really * cool stuff after and during college, immerse yourself in the big problems. Learn to write code that helps our space program. Do coding summer projects for the government . Find a leisure activity you enjoy and find how to make it better by coding. Just an idea.


Have fun. It seems like you're trying to learn things you really aren't that interested in and solving problems you don't care about. My advice, play. Build things you want to, for yourself. You will get better doing something you love rather than learning to hate something you were once passionate about because you're trying to do everything everyone else expects you to do.


Re: Android vs. iPhone, Android has quite a few quirks and if you're looking to avoid getting mired in confusing details of the system, I would steer clear (the UI layout system in particular can be pretty arcane, but there are other flaws as well). It's easier, and in my opinion, more fun to ship something with iOS. I recommend it highly over the Android SDK.

(I do Android and iOS for a living)


disclaimer: I'm 18, self taught, and have been working professionally for several companies and universities(Stanford included) since I was about 12. I'm a Thiel Fellow now(http://20under20.org search "nick")

Find a co-founder and build a product. It doesn't have to be anything world changing, but make it something substantial. Waking up to work on something and seeing daily or weekly progress is incredibly fulfilling, and having someone to work with on a long term project is an experience everyone should have.

Who knows, it might become something. My first project(web app) took a summer of fulltime work, made absolutely no money, but got millions of views, and taught me a ton.

This kind of dedication is also something that colleges love(especially Stanford), if that's one of your ultimate goals.


"it is difficult for me to pick up new technologies" - This is true for everyone. It doesn't just happen. The more you learn the easier it will get. For example once you know the basics of UI programming on one platform the skills are transferable. The first time you do UI programming you try and figure out things like: controls, events, things that handle events, etc. But when you go to the new platform you understand those concepts and are just learning how to think about it using different APIs.

In terms of learning all the things you said were good. One thing is to just build something that solves your problem. So you are 15 lets see problems I had at 15 that could have user a software: jobs I had in high school had schedules that somebody did in excel. People were always rearranging their schedules. Things getting reprinted. So that might be a problem you could solve. Though, it sounds boring right? But my point is look around at problems you have and solve those because it's easier to see what the end result is like, work towards it and learn things on the way to getting to the goal.

Have you seen some apps in the AppStore though? Lots of crap. Lots of good. Many are mediocre. So I wouldn't worry too much about building a crappy app because it will likely be better than most. Just make sure it solves your problem even if it's make a game to be entertained. Many of the apps that are "great" are not one person. They are a few designers and developers who have years of experience behind them.

The whole webos thing, good job, but you are right (and mature) to recognize that making a buck quick buck won't always last. So building up other skills is important. That way when an opportunity arises you can jump at it fully prepared. At the same time if you like webOS and enjoy developing for it why not continue? In 2006 Cocoa programming wasn't really the cool thing.

As for algorithms, Project Euler and ACM Programming problem sets are good. ACM problems can be quite difficult so don't get discouraged. Most professionals I know would struggle with them. So they are by no means something that have to be mastered in order to be successful but doing so would not hurt. As for getting a head start on college keep in mind many people enter college not knowing how to program (and many leave that way). So you'll learn the math behind the algorithms in school but how to program them you'll have to teach yourself and/or learn from others.

Lessons:

1. You won't make money without hard, boring, and dirty work

2. It is unlikely a single individual is behind many of the toys, gadgets, apps and things we love in life. A team of people is far more likely.

3. http://norvig.com/21-days.html - Because learning doesn't happen overnight. Getting really good at something takes time. Lots of time in fact.


Shoot me an email when you get the chance (in profile). I started young, too, and while I'm certainly not "prodigy-aged" at this point, I rather enjoy conversing about being a young programmer :)


i'm 16 and am on the other side of your world, still loving technology, but avoiding programming in favor of the design/content/consulting side... i've joined sparkmuse.com in hopes of finding someone to partner with me, but i think i'd probably have more success if i had programming knowledge. if you want to build something, i'd suggest checking that out. shoot me an email- m at squealingrat.org- i'd like to talk with you about what you've created.


you are light years ahead of everybody else. you could fall asleep for 5 years and you'd still be ahead.


As someone who started writing HTML in early elementary school, that's a terrible thing to say, IMO. My biggest programming-related anxiety while growing up was that I would stop learning.


There is a lot of good advice here, both specific and general. You'll want to consider which of it is most relevant to you, but if you pick any path pointed to from this thread you won't go far wrong, and you're already on the right track.

So, one specific observation and some general observations.

"Additionally, I also want to get into Stanford, and knowing things like this would help me be ahead."

You're doing many good things, but they may or may not be visible to the admissions process. If you want to get into Stanford or similar, talk to your school counselor and/or the admissions office of Stanford and other schools, and make sure you're doing everything they say you need to do to prepare the groundwork for application and admission. Don't assume anything here, find out for sure and execute.

Time spent on data structures and algorithms is NOT time wasted, but you may or may not need to spend much time on it now. You'll eventually need it later. Don't sweat it, and don't write it off. It would be good to survey it so you know where to jump in if you suddenly need it.

You say you get bored with tutorials and then want to jump in and write something, but then you feel you don't learn the tutorial's subject. Jump in and write something, that's great. But maybe spend a small part of your time to complete or skim the tutorial, or to study the actual thing in more depth. This is some of the tedious but necessary work required to master things.

You say you don't feel you can write competitive phone or web apps. Maybe, but who cares? There's an old saying in computer science: you build the first one to throw away. The idea is you may not really understand the problem until you've come up with a solution. The first solution may suck, but you've gained valuable insight for implementing an actual good solution.

Except for luck, you'll need to write an app or two to really understand what it takes to write a good app. Doing that will also give you ideas on what to write next, and how to do it. So go ahead, write crap, the next one(s) will be great.

Related, here's Ira Glass (producer of This American Life) on Storytelling: http://www.youtube.com/watch?v=loxJ3FtCJJA . This gets posted on HN once in awhile.

He's speaking as an accomplished and experienced radio producer, giving advice to young reporter/producers just starting out. The key is part 3, although you should watch them all, they're each only a few minutes long. But in part 3, he points out that the young video producer (or programmer, chef, whatever) has really good taste but not much experience. He knows that what he's producing isn't great, and may be crap, in fact his taste is so good he can see without a doubt that his efforts have some crap in them. That's you. But you have to go through the body of work that includes crap, until you reach the point that you have the chops to wield your taste effectively.

So, don't avoid the crap, you have to do it to get to the non-crap. Another way to put it: perfection is the enemy of the good. Lucky you, you'll produce your crap before you have a Pointy Haired Boss.

Finally, you seem really focused and driven. That's fabulous, great. But don't be too focused. Learn to enjoy yourself and the world. Get out in the world. Be The Most Interesting Man in the World. This is a great time to be alive, especially if you live in a developed country. Be very open to lots of different experiences, different people, different ideas. Go places and do things. Experiences and people are what you'll remember and treasure, not code. People are what will pull you through the suck, not code. Improve the world with code (please, do), but enjoy the world too.


I'm 16 myself, self-taught etc.

Just enjoy the programming, don't care so much about the result, but just enjoy the process. I myself have great trouble doing serious projects, but I just love reading articles on programming and gaining more knowledge. Just try to find exciting things, for example, search how bootloaders work, try to write one yourself, fail, learn assembly, try again. etc etc. Just scout the web, look for fun things, try them out and enjoy your time! Don't worry about not making any kind of progress as in real projects, those will come later, they really will.

Now just say to yourself: I'm going to learn assembly, I wanna check out shellcode, what is this nodeJS all about, what does IOCP mean, what's better, proactor/reactor.

All these things you can learn are fun to do, even if they don't have a bigger purpose. the only purpose is to gain knowledge in as much fields as you can, so you can use them later when they are most desired.

Have fun programming/hacking/learning/exploring

arian


First, I was like you at 15 having picked up programming before I had attended a formal CS class..my first program was a grading/counselor tracking program for my high school.

Second, you should have not problem picking up android given your iOS, C++ and python skills. Java is a little different but not that hard, just fancy OOP C+ with a smalltalk type bias.

Some of the CS areas that you want to explore could be picked up if you build a game engine or contribute to one in the iOS or Android area.

Third, you are self editing your self to much!


I'd just say, think of the cool big project you want to do first and just let that dictate which technology you use to solve it.


Hey email me: shahedkhan30@gmail.com I'm 16 years old, and own a start-up, would like to give you more info about it!




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: