Ever since I discovered programming five years ago, I've done a lot of things. I've learned numerous programming languages and technologies and tried out many interesting things. I've written games, both console and with graphics, console and windowed applications that run in the desktop, CRUD web applications, my own (crappy) PHP XML-based flat file database. In addition to Web and desktop, I've tried mobile development with Android but didn't enjoy it, so I stopped that. I recently finished a Web project of mine and am learning functional programming right now (Haskell).

But I have never dabbled into system programming before. The idea of building software (I'm not even sure if that's the correct terminology to use for it) at a low level that interacts with the operating system seems interesting. The problem is, I'm not sure how exactly to get started, and need more examples of what I do with this.

Should I start by learning the Win32 API? I know some C++ as I've used it to make quite a few console apps and games, but haven't used it in a few years. Is that the way to go? Also, what about C? I am planning to learn some more about C (using the K&R book) before the summer ends and college starts. I want to get a good head start as a college freshman with a solid programming background.

  • I'd think you should clarify your question: what do you want to do? Write an OS? Follow the SIGOPS tutorial, read the Tanenbaum book. Learn Win32? There's the Petzold book (although I'm not sure why someone would want to do it without a strong motive). Device drivers? Systems programming is such a wide concept. – Vitor Py Jul 16 '11 at 3:49
  • Why do you say that something would not want to learn Win32 without a strong motive? – Ryan Jul 16 '11 at 3:52
  • 2
    Because the raw Win32 API carries a lot of cruft: it comes from the Win16 API, there's a lot of stuff that appears to make little sense. Using a modern GUI toolkit for most of your application and just calling a few methods of the Win32 API where you really need it is usually a better and less painful approach. – Vitor Py Jul 16 '11 at 3:56

The idea of building software (I'm not even sure if that's the correct terminology to use for it) at a low level that interacts with the operating system seems interesting.

I believe you're getting system programming confused with application development. System programming would be more along the lines of writing the operating system, not interacting with it. I would probably suggest starting off with regular application development (on Windows that would be the WinAPI), then move on to exploring subsystems you find interesting in depth.

K&R is obviously the definitive guide on C, and if you're going to target Windows applications I would highly recommend picking up a copy of Programming Windows.

If you're really interested in "low level" interactions, I might also suggest Iczelicon's Win32 Assembly tutorials (MASM is great, and it's also free).

If you manage to grasp even a fraction of that information before your freshman year of college, you'll be light-years ahead of probably just about everyone else.

|improve this answer|||||
  • It's really hard to me to recommend the Win32 API to someone. Why not target something more modern and usable like Qt, GTKmm, or heck, even MFC? I see no use for Win32 API programming, despite having learned it for a few jobs. – Vitor Py Jul 16 '11 at 14:26
  • @Victor I guess it just really comes down to a matter of personal preference. I "cut my teeth" on Win32 C, so I guess I have some personal nostalgic connection to it. Although I don't use it very often in my current job, I do still use it regularly for person projects / recreational development (mainly via Interop or CLI / C++ wrappers and such, however). I do think that direct Win32 C is "closer to the metal" as the OP is desiring than the layers of abstraction offered by frameworks (especially MFC, good lord...). – Brandon Moretz Jul 16 '11 at 14:58

Consider writing a small embedded project on an embedded controller like the Arduino. This is a great way to begin the process of learning systems programming, because it starts you off at a basic level and allows you to grow into it.

|improve this answer|||||
  • +1 for "to the point" answer. Can you explain more and add several reference? – Md Mahbubur Rahman Mar 8 '14 at 10:56
  • The Arduino website goes into significant detail about the platform and how to use it, as well as many other resources already available on the Internet. – Robert Harvey Mar 9 '14 at 3:57

If you're interested in systems programming, nothing beats actually working on an operating system (either on the core of the OS kernel or on the related device drivers)

I'd therefore suggest getting involved in Linux development - it's a very good community to learn about OS internals. I learnt a huge amount about operating systems simply by following the linux-kernel discussion lists....

It's also an opportunity to take on a tangible project and enhance your skills. As a recruiter of software developers, I take real notice when someone has contributed to an open source project - it's almost always a positive indicator of skill and commitment!

|improve this answer|||||

Not the answer you're looking for? Browse other questions tagged or ask your own question.