Ask HN: project ideas for a noob
Hi, I just learned programming for about a year. I am familiar with a few programming languages such as python, scheme and java. My experiences with them include 1 OO programming course using Java and 2 courses using scheme and python. I feel I want to advance working on some simple projects but not sure where to start. Ideally the problem is not too simple or too complex. I have been reading source codes on sourceforge but not many really suit me. (either uninteresting or complex) So no idea what I should work on. Could you please share your experience with me about your first major/minor programming project that made your friends say, "wow"?
PS, I prefer writing in python or scheme.
43 comments
[ 2.4 ms ] story [ 87.6 ms ] threadI don't expect you to dawn a blackhat at this stage, you're probably too mature, and the scene is pretty much lame nowadays anyway. What you can do however is join a community that enjoys and fosters a healthy hacking attitude. Something very geeky and very focused, like the demo scene (if they're still as innovative as they used to be.) You need a group of friends, all of whom are hacking for fun and giving each other feedback. IRC is an excellent place to find such people. Something focused on a given subject and a given technology. Start with your favorite libraries and join their IRC channels. The Allegro game library scene was cool, write 2D games for fun. Once you master the basic usage of the library, you will see what more experienced people have done with it. There is a different, unique taste to seeing a master craftsman make something great out of the ordinary ("wow, he did that in 4k" or "wow, fake 3D".) This will motivate you to no end :-)
Take out the manual of your "battery included" language of choice (Python, PLT or Chicken Scheme) and step through the module list. Write small programs that use each module/library and pretty soon you will have tons of ideas. Just take a GUI library, a network library, a regex parser, a mime/XML/html parser, and an audio library; taken into any combination, you will have something that solves an interesting problem. Something as "big" as a web server can be written with just the system calls built into every unix :-)
Finding your own problems, to keep you busy, is also something you will eventually develop as you continue hacking.
P.S. DON'T start with a janitorial position cleaning up other people's code or doing manuals, as the "Hacker HOWTO" advocates. Fuck that, NIH and all, go out there and create your own bugs to fix. Have fun, eh? :-)
* Learn how to find good information. Hone your bullshit detector, learn who knows what they're talking about and who is full of it (many will try to sell you things, if not an actual product or service, then their personality: good hackers are selfless and rarely sign their work.)
* Get heroes. Find good hackers to imitate. I grew up wanting to be "like Terje Mathisen" ..
* Avoid fluff mediums. Best information is found in ASCII mediums :-P just my finding. Avoid the blog scene, most of it is written to pad an ego or a resume. Usenet is good, sparingly. Citeseer is good when you know better. The underground zines are good, with a grain of salt.
* Discover the past; everything you need to know about computing was invented/discovered before 1980. Mine the past, seek the originators, not the imitators. Nothing good happened since 1999; the greatest minds left the Science and went to industry, behind NDAs, patents and sold to "investors".
* Don't do the web, yet. Start working in the console, then perhaps do a tangible GUI. Don't do Unicode
* ACM, IEEE and Elsevier are bastards. If you need a paper, google the authors' websites and you can usually find it there.
* It's OK to be in hackmode. If you need to get away from society, you are allowed to forgo all human contact and basic hygiene until you figure shit out.
* Mathematics is easy. The smaller and denser the text the better. It's the long, repetitive hammer-into-your-head crap that probably bored you in school. Real mathematics is neat and compact. Get math books with answers to the exercises at the back. Don't cheat yourself.
* Save your first programs, even print them out. You will be willing to give up everything just to get them back, should you lose them (and remain a programmer ;-)
* Learn assembly language. Learn C. Learn how to write your own tools. Programming tools should be the first systems you investigate. Levine's book "Linkers and Loaders" is free online. You can find "Advanced DOS" on Alexie Frounze's site. K&R is online. Unix is good. Learn it well, at the kernel level. Familiarize yourself executable file formats. Get into compiler hacking early, it will enlighten you, but will also force you to learn so many different languages you will have no time for anything else.
* Share what you learned, even if you have to cringe at your own verbosity :-)
* Help yourself to other people's servers. Get a free shell account on a unix server and try to use it to the fullest. Chat with people in whatever MUD system they have in place. Try to circumvent security, build software on your account to go around network restrictions .. but don't be abusive. Try to tunnel a banned network protocol over a permitted one. Have your programs in your various account talk to each other. Leave backdoors, but not big, nasty gaping ones.
* Automate your social life. Write scripts to check your email, or parse RSSes of sites you frequent, or see any replies to your threads.
* Get accounts on shells that run on non x86 archs. Learn different assembly languages and have fun. Hack your router and game consoles, install a different OS than the vendor's ;-]
Update!
* Clone the basic unix commands in python and scheme. Coreutils from the GNU project should keep you busy for a while.
* Keep your code off of other people's boxes, including Google (with the appengine recommendations and all.) Sandboxed environments will not teach you how NOT to shoot yourself in the foot. This also goes for hacking in an emulator or a VPS. Learn on a real machine that you can touch and physically fuck up. A desktop is highly recommended, it will force you to open it up and change hardware. The first time you google a motherboard manual to flip a jumper or change a dead CMOS battery will be the day you realize the benefit of having total mastery over your machines.
There are no cookie-cutter "noob" problems; there are problems whose solutions you can visualize in your head and see them happen, and problems that make you sit back and go "hmmmm". As you gather many technologies, more and more previously impossible problems begin to fall into the first category. This is what allows you, as an experienced programmer, to rule many application domains as boring and trivial. Even if you have never written a ticket ordering application for a concert hall, if you have done the most basic database application, you can pretty much visualize the solution :-)
Yes! I wish I had done that. I vividly remember writing my first programs when I was a kid; alas, the code is gone forever now. I really should've printed it out.
Yes, and they're very good. More of your posts, more posts like yours!
I started out by making batte.net bots for Starcraft. They were super hard but there was plenty of open source code to leech and copy off of in the beginning. Later on, I managed to learn how it all worked and pieced together which allowed me to be able to write them from scratch. This was no easy task and I started proramming like this. It entailed understanding network programming, reverse engineering, how to code in general, how to send/receive packets, and all the fundementals associated.
Make a bot for anything or any game, scripting bots to do automated things that are annoying to do manually generally has a great sense of sanctification. Making an IRC bot is easy, start to get into more challenging things like non-plaintext protocols.
If that's too complex join a community that has already done this so you have something to go off of.
The most important thing is to do something you'll have fun with and still learn. Create something that either fixes a need for yourself or for you to gain an advantage in or something you'll get to see people use.
Great advice; unlike an artist who is burdened with a blank canvas, a programmer does not share this burden. You don't need to start with this blank canvas, instead heed mahmud's words and get your finger-tips dirty with some libraries and modules as a place to start.
Try building a client/server chat program, using TCP/IP, a mass-file Renamer, or mp3 tagger, including a GUI for your OS of choice.
In python, try building something using either google app engine, or implementing a full blog using django (with packages for all the useful features).
Build something that downloads stock data from yahoo or google, parses it, and charts it.
Most of those are more towards the 'trivial' end of the spectrum, but they'll make you familiar with the standard libraries, and the last 10% of 'polish' will sharpen your skills.
I just launched the latest incarnation as a Google App Engine blog using Django/Python: http://andrewljohnson.appspot.com
Pick a project that interests you and has a large/friendly community, and make a plugin or a patch for it. You'll learn a lot about working with other developers, and a lot about the ancillary tools that are needed to build big and useful software but are rarely taught in school.
Edit: I saw you were going for projects maybe something using pythons cgi library on a web server to do interesting tasks would be nice.
http://projecteuler.net/
Start from problem 1 and work your way up - they get gradually harder to solve as complete more. They are simple yet require flexing your algorithm-development muscles, which also help you to think about coding in an "efficient enough" manner: some problems can be implemented in ways that take 10 hours to run, or .001 seconds.
Also, there are some paired problems where the first is small enough to be feasible by a naive solution, but the second would take far too long, and you have to figure out the trick. There's a pair that requires finding the maximum path down a pyramid of numbers, for example, and the second pyramid is several times taller.
Try writing one. You'll learn about concurrency, networking, parsing (some mushes have a built-in scripting language) and you will end up writing a lot of code.
When I was learning to program as a kid (not counting Basic), I was really into text adventure games like this (http://www.rickadams.org/adventure/). I wrote an interpreter for text game worlds. It wasn't that great (I was 12 and it was in C++), but I learned quite a bit, and it gave me confidence for other stuff.
If you like math puzzles, Project Euler (http://projecteuler.net/) is great. Python Challenge (http://www.pythonchallenge.com/) is a series of fun puzzles that will also lead you through its standard library.
But, really, go with your interests. If you like logic puzzles, or making music, or 3D game stuff, or MUDs, etc., just pick something and run with it. Also, feel free to start small, you can hit the ground running once you have the basics down.
But i definitely agree with Paul Graham on this subject: http://www.paulgraham.com/ideas.html
If one pays attention carefully there are many opportunities for projects that present themselves weekly. Some of your ideas will be bad, some of them good. But just keep thinking of things that may be cool to work on.
I think the important part of finding ideas has nothing to do with programming. You should find a subject you're interested in and something that you think would be cool to accomplish to help others.
Read EoPL, it's awesome (and free) and LiSP is awesome but expensive. In fact almost every Lisp related textbook seems to have several lisp interpreters in it.
edit: As noted below EoPL is apparently not free, and it seems that I've inadvertently pirated it from somewhere.
http://www.cs.indiana.edu/eopl/
http://tinyurl.com/lispinsmallpieces
I'm working on a toy (for now) lisp in javascript at the moment and it's profoundly unimpressive but has been hugely fun and educational for me.
EoPL is not free afaik. I agree that it is an awesome book.
If you want to start with web, start coding a blog or a url shortner. If you want to have something more complex, start with existing web APIs and make a mashup!