
Ask HN: Advice for a young, self-taught programmer - godarderik
[TL;DR I’m a 15 year old self taught programmer unsure of what to learn and how to learn it].<p>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.<p>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.<p>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.<p>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.<p>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.<p>Anyways, thanks for reading, and any help that anyone can give would be much appreciated. Thanks!
======
patio11
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.

~~~
cheez
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 :)

~~~
patio11
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.

~~~
cheez
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.

------
puls
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.

~~~
citricsquid
> 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.

------
mechanical_fish
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)

------
astrofinch
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.)

------
csomar
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.

~~~
Tiomaidh
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.

~~~
a3camero
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.

------
atakan_gurkan
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!

------
mpk
> 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.

------
chromium
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.

------
Tinned_Tuna
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!)

------
jinfiesto
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.

------
ZackOfAllTrades
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.

------
kyledr
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.

------
spc476
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).

------
btcoal
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!

------
veyron
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

------
Jd
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!

------
mcs
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.

------
M1573RMU74710N
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.

------
safetyscissors
"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>

------
T-R
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.

------
cj
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

~~~
nicklovescode
:)

------
Jarred
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

------
dlo
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>

~~~
dlo
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/>

------
Khroma
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.

~~~
japherwocky
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.

------
cel
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!

------
tsunamifury
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.

------
charlesdm
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.

------
japherwocky
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.

------
joelhooks
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...](http://www.amazon.com/Clean-Coder-Conduct-Professional-
Programmers/dp/0137081073)

------
josephmosby
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.

------
7a1c9427
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!

~~~
godarderik
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.

------
thisisnotmyname
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.

~~~
koko775
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.

------
jdthomas
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.

------
mfn
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.

~~~
46Bit
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.

------
46Bit
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.

------
Thetawaves
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.

------
random42
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.

------
Vanheist
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.

------
ohashi
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.

------
koko775
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)

------
nicklovescode
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.

------
evanlong
"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.

------
JBerlinsky
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 :)

------
squealingrat
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.

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

~~~
koko775
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.

------
sixtofour
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.

------
arianvp
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

------
shareme
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!

------
noduerme
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.

------
shahedkhan30
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!

