The World Of Programmer

Thursday, 28 February 2013

If You are interested in systems and infrastructure, It Is recommended

Networking. Write a server or two. A simple static-file HTTP server is a good start, or an SMTP server. If you want to get into concurrency, write a multithreaded IM server or game server. For the ambitious, implement a peer-discovery system and make it do something useful - for example, build a serverless local chat service.

Storage.Build a simple filesystem. FUSE can abstract away the kernel interfaces for you; all you have to do is implement the basic filesystem functions. Flattening a complex directory structure in a consistent, reliable, and expandable way isn't easy, and there are many edge cases to consider.

Assembly.Even if you never plan to use it in a real project, it's essential to understand how the computer actually works. Write a simple program or algorithm in assembly - quicksort is a good choice. Try to optimize it as much as possible. Implement setjmp() and longjmp() too - these will push you to break the rules you may have learned from higher-level languages.

OS concepts. Writing malloc() and free() is not as easy as you might think. Have you ever wondered why free() can fail in weird ways when free()ing non-malloc()'d pointers? (You can fix this, but it'll be slow.) Writing a thread scheduler might be overkill, but you'll learn a lot about locking and concurrency.

Languages. Write a compiler/interpreter for a language. Maybe even design your own language. Generating working code is a good start, but try to optimize the generated code if you can.

If Your are interested in game development, It Is recommended

Graphics. You want your game to look good. Write some simple OpenGL programs. Make a spinning cube first, then maybe add some sort of interactions with it. Make a particle system that follows some pre-defined rules, and play with rendering methods to make it look like something else (a fiery or smoky plume, or water droplets, for example). What you can display on the screen is limited only by your imagination.

OS concepts. Games are complex systems, and each piece has to behave in a certain way at a certain time. There's a lot of work to be done that the player doesn't see, but the game always has to be responsive when the player does something.

Networking. If you want people on different machines to be able to play with or against each other, you'll need to come up with a way for them to communicate. Design a protocol that's fast, but also allows room for expansion as you add new features.

Security. Players will always try to cheat, and usually security involves staying one step ahead. Try to think of everything players could possibly do with your program, and restrict them to the set of things they should be allowed to do. Some of the techniques involved can be tricky - for example, you can't stop players from reading your game's memory, but you can make it hard to search by moving sensitive data around in memory often.

Artificial intelligence. Players may want to play with other people, or by themselves (with AIs). I don't have any recommendations here since my AI/ML background is rather lacking.