Ask HN: Advice for a young, self-taught programmer

136 points by godarderik ↗ HN
[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!

76 comments

[ 0.39 ms ] story [ 137 ms ] thread
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.

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

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

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

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.

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

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.

(comment deleted)
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).

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.
Google Summer of Code is only offered to college students.
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.
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)

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.

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!

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!

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

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

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!