How to become a hacker/programmer
I've been struggling to figure out what exactly I should learn and do to become a good programmer and found that there really is no single way to do so. I compiled a Readlist, Advice for Computer Science majors, of articles that provide some experts' advice on becoming a hacker/programmer and summarised the suggestions in a list below. I guess that it wouldn't be necessary to follow exactly all of the below suggestions to get a decent job in programming, but it would sure help to do as many of them as possible to become an expert.
So here it is:
Steps and things to learn to become a good hacker/programmer:
Architecture - Understand a computer from the transistors up (machine architecture) (design and simulate a small CPU) - Learn, run, tinker, modify Linux* (or other Unix distribution) - Learn basic systems administration - Learn about compilers/interpreters - Operating systems - understand how kernels handle system calls, paging, scheduling, context-switching, file systems and internal resource management - Learn about networking** and protocols
Theory - Get a solid grasp of formal logic and proof (cover reasoning about: trees, graphs, formal languages & automata) - Learn enough about number theory to study and implement common cryptographic protocols - Become good at designing algorithms (hash tables, linked lists, trees, BSTs, directed and undirected graphs) - Computability, complexity & tractability - Learn about databases (relational algebra & calculus, sub-Turing models of computation) - Learn about graphics (ray tracers, BSP trees, z-buffer rendering) - Learn about artificial intelligence - Learn about computer security*** and cryptography (understand symmetric-key and public-key cryptosystems)
Miscellaneous - Become very good at programming (work on a lot of hard problems) - Read a lot of code and write a lot of code - Help test and debug open-source software / become a beta-tester - Learn how to really use the web, write HTML and a real website with good content Learn to write well - Learn microeconomics - Read about the glider emblem and mathematical simulation Life - Publish useful information - Build a portfolio (blog/site with a post for each project/accomplishment with some code hosted publicly and contributions to open-source should be linked and documented) - Learn about version control - Learn about specific, cool problems
*Systems administration Linux - configure & compile the Linux kernel - troubleshoot a connection with dig, ping and traceroute - compile and configure a web server like apache - compile and configure a DNS daemon like bind - maintain a web site with a text editor - cut and crimp a network cable **Networking Every computer scientist should implement the following: - an HTTP client and daemon - a DNS resolver & server - a command-line SMTP mailer ***Security Learn to understand: - social engineering - buffer overflows - integer overflow - code injection vulnerabilities - race conditions - privilige confusion










