My first real programming project was a DOS TSR keylogger. When you start your programming journey in the computer underground: 1) you have no idea the magnitude of the problems being thrown around by your peers, everything is trivialized and you're expected to know a great deal of info about the inner workings of your programming languages and their execution model, application software, OS/kernel internals, compilers, network, hardware, file formats and .. bugs and 2) there is an absolute joy to everything you do; never underestimate the power of mischief as a great motivator.
I 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? :-)
There are more things I want to touch on, but I'm afraid my posts are long and opinionated as they are. Just a few quick pointers and hints, things that must be passed on:
* 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.
Nearly every interesting programming problem is a bit over the top to you, at your current knowledge level. The point is to apply yourself, learn things as you go, research, and conquer the problem.
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 :-)
Even though he is a "noob" the term coined by pg and appropriate here is to be relentlessly resourceful. That is if he wants to become a good hacker from a nubile state he will need to become relentlessly resourceful in the effort to get things done. I agree with pg that the good/great hackers are extremely resourceful.
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.
Completely agree, mischief motivates you like none other.
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.
I have to 2nd this post. I learned a great deal about systems programming by learning about binary hacking and what not. See http://www.overthewire.org/wargames/
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 :-)
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.
Comments
My first real programming project was a DOS TSR keylogger. When you start your programming journey in the computer underground: 1) you have no idea the magnitude of the problems being thrown around by your peers, everything is trivialized and you're expected to know a great deal of info about the inner workings of your programming languages and their execution model, application software, OS/kernel internals, compilers, network, hardware, file formats and .. bugs and 2) there is an absolute joy to everything you do; never underestimate the power of mischief as a great motivator.
I 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? :-)
There are more things I want to touch on, but I'm afraid my posts are long and opinionated as they are. Just a few quick pointers and hints, things that must be passed on:
* 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 :-)
[Edit: Update 2
* 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.
Some of your suggestions are a bit over the top for a noob...
Nearly every interesting programming problem is a bit over the top to you, at your current knowledge level. The point is to apply yourself, learn things as you go, research, and conquer the problem.
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 :-)
Even though he is a "noob" the term coined by pg and appropriate here is to be relentlessly resourceful. That is if he wants to become a good hacker from a nubile state he will need to become relentlessly resourceful in the effort to get things done. I agree with pg that the good/great hackers are extremely resourceful.
There are more things I want to touch on, but I'm afraid my posts are long and opinionated as they are
Yes, and they're very good. More of your posts, more posts like yours!
Save your first programs, even print them out.
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.
Completely agree, mischief motivates you like none other.
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.
Red Code is also an interesting hackish programming environment one could clone in python or scheme.
I have to 2nd this post. I learned a great deal about systems programming by learning about binary hacking and what not. See http://www.overthewire.org/wargames/
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 :-)
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.