Ask HN: Advice for a young, self-taught programmer
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 ] threadSince 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.
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.
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
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.
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.
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.
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.
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.
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.
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).
-- 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)
If you need any advice/opinion regarding programming or software development, feel free to e-mail.
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!
- 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'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.
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.
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.
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!