views:

211

answers:

6

I wondered if any of you have knowledge of the internal workings of windows (kernel, interrupts, etc) and if you've found that you've become a better developer as a result?

Do you find that the more knowledge the better is a good motto to have as a developer?

I find myself studying a lot of things, thinking with more understanding, I'll be a better developer. Of course practice and experience also comes into play.

+2  A: 

I dont think that one requires special or secret knowledge of internals such as those that may be extended to members of the windows team or those with source access but I absolutely contend that understanding internals helps you become a better developer.

Take threading for instance, if you are going to build an application that uses threading in even a moderate way - understanding how windows works, how the threading works, how memory processes work are all keys to being able to do a good job with that code.

I agree to a point with your edict but I would not agree that experience/practice/knowledge are mutually exclusive. That net-net of experience is that you have knowledge gained from that experience. There is also a wisdom component to experience and practice but those are usually intangible situational elements that you apply in the future to avoid mistakes. Bottom line knowledge is a precipitate of experience.

Think of it this way, how many people do you know with 30+ years of experience in IT, think of them and take the top two. Now go into that memory bank and think of the people you know in the industry who are super smart, who know so much about so many things and pick the top two of those. You now have your final 4 - if you had to pick one to start a project with who would it be? Invariably we pick the super smart guy.

keithwarren7
not to mention debug it :)
Paolo
+1  A: 

Yes, understanding Windows internals helped me to become a better programmer. It also taught be a lot of bad practices, bad ideas, and poor design concepts.

I highly suggest studying OS X or Linux internals as an alternative. It'll take less time, make more sense, and be much more productive.

Read code. Read lots of code. Read lots of good code. jQuery, Django, AIR framework source, Linux kernel, compilers.

Try to learn programming languages that introduce you to new approaches, like Lisp, Ruby, Python, or Javascript. OOP is good, but .net and Java seem to take the brainwash approach on it, and elevate it to some kind of religious level, instead of it just being a good tool in your toolbox.

If you don't understand the code you are reading, it likely means you are on the right track, and learning new techniques.

I'd suggest getting a mac simply because you'll find yourself wanting to make your UIs simpler and easier. It's really important to have a good environment if you want to become a great programmer. Surround yourself with engineers better than yourself (if you can), work with frameworks and languages that take the 'engineer' approach vs. the 'experimenter' approach, and... use a operating system that contains code better than yours.

I'd also reccomend the book "Coders at Work".

Computer Linguist
I agree with you on the reading code bits and learning other languages for a different view, but I'm not so sure that learning about the Linux kernel will assist me a windows developer. I could be wrong however.
Tony
Studying Windows internals is effective aversion therapy for OS design. (Provided one understands there are better architectural choices.)
wallyk
@Tony - It will make you a better developer, period. The important developer skills are cross-platform. They are concepts, not facts.
Computer Linguist
+4  A: 

This is a no brainier - absolutely (assuming you're a developer primarily on the Windows platform, of course). A working knowledge of how the car engine works will make a lot of common programming tasks (debugging, performance work, etc) a lot easier.

Windows Internals is the standard reference.

Terry Mahaffey
"A working knowledge of how the car engine works will make a lot of common programming tasks ... a lot easier." +1 mixed metaphor of the day :)
Jason Orendorff
+1 for the book you referenced
Frank Schwieterman
"If we hit that bull's eye, the rest of the dominoes will fall like a house of cards. Checkmate." - Zapp Brannigan
Terry Mahaffey
+2  A: 

I believe it is valuable to understand how things work underneath. CLR/.NET to C++, native to ASM, ASM to CPU architecture, building registers and ops from logical gates, logical gates from MOSFETs, transistors from quantum physics and the latter from respective mathematical apparatus (group theory, etc).

Understanding low level makes you not only think different but also feel different - like you are in control of things, standing on the shoulders of giants.

Pavel Radzivilovsky
like the ' like you are in control of things, standing on the shoulders of giants.' Very well phrased! :)
Tony
A: 

It depends. Many programmers who understand the internals of a system begin writing optimised code to exploit that knowledge. This has three very serious side-effects:

1.) It's harder for others without that knowledge to extend or support the code.

2.) System internals may change without notice, whereas interfaces are usually versioned and changes discussed publicly.

3.) Interfaces are generally consistent across platform revisions and hardware, internals do not have this consistency.

In short, There's a lot of broken, unsupportable code out there that's borked because it relies on an internal process that the vendor changed without notice.

SpliFF
I agree that you with you that if you base code on internals of a specific OS, that it becomes fixed to that OS and if these internals change, there's a problem. But adhering to good principles and patterns in programming and understanding OS internals, I'm sure can be helpful.
Tony
+1  A: 

More knowledge is always better, and having knowledge at many levels is a lot more valuable than just knowing whatever layer of abstraction you are working at.

A good rule of thumb is that you should have a good knowledge of the layer below the layer where you are working. So, for example, if you write a lot of .NET code, you should know how the CLR works. If you write a lot of web apps, you should understand HTTP. If you writing code that uses HTTP directly, then you should understand TCP/IP. If you are implementing a TCP/IP stack, then you need to understand how Ethernet works.

Knowledge of Windows internals is really helpful if you are writing native Win32 code, or if OS performance issues are critical to what you are doing. At higher levels of abstraction, it may be less helpful, but it never hurts.

Kristopher Johnson