views:

217

answers:

11

I am a software developer with four years experience in .Net development, I always like to keep up to date with the latest technologies (.net related normally) being released and love learning them. I didn't however go to university and learnt all I know through helpful colleagues, .Net courses, the internet and good old books. I feel that I am a good developer, but without learning the lower levels of a computer as you would in the first year of a computer related Uni course, I get lost when talking to people about a lot of more technical lower level computing. Is there a book(s) that anyone could recommend, that would cover the lower levels of what is going on when I click "Run" in Visual Studio? I feel out of my depth when my boss says to me "Thats running in the CPU cache" or "you're limited by disk reads there", and would like to feel more confident when talking about how the hardware talks to each other (CPU to RAM etc).

Apologise if thats a vague question, or has been asked before (i did check and couldn't find anything on here that answers my question).

A: 

May be you can look into

  1. OS Concepts
  2. Compliers
  3. Data structures
  4. Assembly level languages and its execution
  5. Microprocessors
Ram
A: 

Even if you will never ever write your own code at that level, I found it helpful to read about assembly and machine language. Jeff Duntemann's books (http://www.duntemann.com/assembly.html) on that topic were a good start for me.

Andreas F
A: 

Get yourself a copy of William Stallings - Computer Organization and Architecture. This is a standard textbook that covers most of the points you've raised (and worked for me!).

Martin Smith
+2  A: 

I learned a lot from here: http://www.asmcommunity.net/board/

Writing various things in assembly is a great way to force yourself to understand what is going on. You might try FASM or MASM as your language (I started in MASM but I think FASM is more in vogue these days).

Noon Silk
A: 

If you've programmed mainly in the .Net world, it would be beneficial to understand resource management; A good way to do this is to go to a lower level language, like C or C++ and write something non-trivial that handles user generated data.

It may also be beneficial to read up on algorithms and comparing them - being able to understand "Big O" notation will be very useful.

In my experience, those also cover the two common pitfalls of your average .Net programmer - believing that the framework handles all the evils of memory management (it's stupidly easy to create a resource leak) and also getting the performance right on algorithms (waiting for faster hardware is just a bit too arrogant for my liking)

Rowland Shaw
A: 

Mobile Phone Development - Get out of your comfort zone (.net) and possibly look at something different, maybe embedded programming in C is a bit far but what about mucking around with mobile phone development?

Android is a good platform, all the tools you need are free, you don't even need a phone, as the SDK comes with an emulator. You'll learn a lot from having to consider things that you wouldn't think twice about on a windows machine and the leap from .net isn't that great.

You'll learn about the constrained environment, memory, cpu cycles etcetera that will make you think about programming in a different way and more importantly it's pretty cool!

You could even experiment with native development on the android/ARM platform?

Dog Ears
A: 

+1 with Ram - on my cs course we did operating systems (look into pipelining - interesting concept) and compilers. start with the basic models and if your interest goes further see how it soon becomes highly complex. interesting topics

bergin
bergin
+2  A: 

Speaking from the perspective of a long-time professional developer as well as an instructor (Comp. Sci courses) I see your situation. Couple of thoughts come to mind at first glance.

  • Get some hobby stuff that controls devices (model trains, visual sign, music thing, robotic controls etc.) whatever line would be of interest to you and write code to control those.
  • Take night classes or just get started there.
  • Study code from non-trivial sources such as open source OS stuff with device drivers until you REALLY understand what it is doing.
  • All the other answers here (C, C++ code, assembly code, good old standard books etc.)
Mark Schultheiss
+1  A: 

I would start off by reading Computer Systems: A Programmer's Perspective. It is exactly what you are looking for. I love this book. I had the first edition and just recently bought the second edition. It is used at Carnegie Mellon for their Introduction to Computer Systems course.

It is meant to be a stepping stone as an overall introduction and covers a broad array of subjects. The material is presented very well. After reading this book, you can move on to more advanced subject matter on what ever peaks your interests.

Here's a list of chapters:

  • Chapter 1: A Tour of Computer Systems
  • Chapter 2: Representing and Manipulating Information
  • Chapter 3: Machine-Level Representation of Programs
  • Chapter 4: Processor Architecture
  • Chapter 5: Optimizing Program Performance
  • Chapter 6: The Memory Hierarchy
  • Chapter 7: Linking
  • Chapter 8: Exceptional Control Flow
  • Chapter 9: Virtual Memory
  • Chapter 10: System-Level I/O
  • Chapter 11: Network Programming
  • Chapter 12: Concurrent Programming
Dale Ragan
+3  A: 

You are of course familiar with MIT's Open Courseware site. There are far worse things you could do than wander around the Course 6 (Electrical Engineering and Computer Science) section. If you are serious, and have the time, start with 6.001 (what else?), then 6.004, and then 6.033.

I should caution you. That site, and exploring the contents therein, can be highly addictive.

If you have the time, and the money, you might even consider taking college classes. With four years of work experience under your belt, you will have no trouble with the administrative chicken** that happens at every college and university, and the memories you will get from it will stay with you for a lifetime. (A few years ago, I had the opportunity to go back to school for a couple of semesters, a little over twenty years after I'd first graduated. I wouldn't trade that experience for ANYTHING, not even the Mansion AND The Girls Next Door.)

John R. Strohm
+1 for SICP (if you have the time).
Skilldrick
A: 

Short books:

"K&R", aka "The C Programming Language" by Brian Kernighan and Dennis Ritchie, preferably the latest version ( 1988 ) rather than the 1978 edition.

Long books:

"Knuth", aka "The Art of Computer Programming", by Donald Knuth. Surprisingly high level for a book where all the examples are written in machine language.

"Computer Architecture: A Quantitative Approach." by Hennessy and Patterson. Possibly a little too low-level -- information on building your own CPU.

"AoE", aka "The Art of Electronics", by Paul Horowitz and Winfield Hill. Likely far lower-level than you wanted -- digital and analog electronics.

David Cary