views:

206

answers:

7

Hi, I've been working as a developer for about 2 years, I did a bit of a shitty IT degree, I wish I had done a "proper" computer science degree, as I have come to realize I have massive gaps in my knowledge.

I work completely in c# with some front end web development. There are things that really want to learn and I was wondering if people could point me to some good resources. I've basically been trying to work out a list of what I don't know and sort it by priority. Can anyone can suggest example projects I could attempt for each item listed and resources to use (both web and book suggestions are welcome).

  • networking, understanding the full ip stack etc.
  • http protocol, is the OReilly book worth a look?
  • multi threaded applications
  • low level programming, assembly currently using this programming from the ground up
  • Data structures and algorithms.
  • Operating systems
  • anything else you think should be on this list!

I suppose I'm asking, "what should every developer know? And what projects should they attempt in their own time to ensure they understand the subject well". I know my list is rather scatter gun in approach but I guess thats why I'm asking for some help with my direction.

Thanks in advance to anyone who takes the time to respond to this.

.. Bri

A: 

One great book to take a look at is "Operating System Concepts" by Silberschatz, Galvin & Gagne.

It walks you thought every aspect from threading, memory management to the design structures of an OS. The examples in the book are in C, so it is easy enough to get the hang of. It really fills in the any gaps you may have about the OS as a whole.

Kyle G
thanks for that, I'll check that out.
+2  A: 

Have you read Code Complete? That's a great starting point, as it highlights a ton of additional reading in a variety of subjects.

GoingTharn
Yes it was a fantastic help. I'll go back again and look at the additional reading....
+3  A: 

I voted your question down because it seems like you didn't do a search.

What should every programmer know?

What algorithms should every developer know?

asp.net frameworks and libraries every developer should know…and use

CSS tips which every beginning developer should know about?

Questions every good .NET developer should be able to answer?

What single URL should every web developer have bookmarked?

What skills should a programmer have nowadays?

I'm not trying to be rude. At least I'm pointing out WHY I downvoted.

GregD
Thanks for the links. They are appreciated. I am looking for something slightly different though, more along the lines of actual projects to attempt.
Well done Greg. I hate why people down vote an answer without a reason (not too bothered about down voting questions though), but at least you have good manners :-)
Peter Morris
A: 

My must-have knowledge is:

  • Dependency injection containers
  • Unit testing
  • Patterns (somewhat)
  • Domain patterns (archetypes)
Peter Morris
Thanks for commenting on why you voted this down, I appreciate it.
Peter Morris
A: 

One thing that you might try is to find some public syllabi for computer science classes. See what kind of projects they are doing and attempt them yourself. Consult books, forums, and SO as necessary when you need help.

I thought the most foundational CS courses I took in undergrad were theory of programming languages, computer organization, operating systems, and theory/discrete math classes.

Try taking a classic algorithm and implementing it in the 4 different types of languages. (try C#, LISP, Prolog, and C for example) Add some toy functionality to a local copy of the Linux kernel to see how it ticks. Write a distributed file system. These are some of the projects in school that taught me the most.

Stuart Branham
thanks for that, very helpful
A: 

Definitely take a look at computational theory. A couple great books are: http://www.amazon.com/Introduction-Theory-Computation-Michael-Sipser/dp/053494728X http://www.amazon.com/Computability-Complexity-Languages-Second-Fundamentals/dp/0122063821

I would also take a look at projecteuler.net and work out some of those problems. Avoid solving the problems using brute force... instead, look at the mathematics and try to learn common algorithms and concepts that would be discussed in a CS theory class.

Tina Orooji
Yeah I've seen that. Some tough stuff in there and I know what you mean about the brute force approach, I remember thinking about a problem from there and coming up with a horrible solution that seemed to scream "there is a much simpler solution!"
+2  A: 

Ok, to attack the list you've given (BTW, they don't sound scattershot at all - you sound like you're interested in computer systems, which is a mature and lively area of research).

I'll give you a resource and an example project for each area:

Data structures and algorithms.

  • Resource: the canonical book, and one that I still think is the best, is Introduction to Algorithms by Cormen et al. It is not very easy going, but it is very rich and well explained. Back up what you can't quite grasp from there with wikipedia (whose DS+A pages are not in general bad) and perhaps the NIST dictionary.
  • Project: implement as many as you like of your favourite algorithms in the language of your choice. If you are using ITA as above, I'd recommend Python only because it's the closest language to the pseudo-code they use, but do not worry too much about your choice of langauge. I'll repeat that don't get bogged down in choosing a language; there's plenty of time to learn them all :)

Networking.

  • Resource: To learn how it all fits together, there are several good books. I like Tanenbaum's 'Computer Networks', but another good choice (although caveat emptor, I haven't read it thoroughly myself) which might suit you better is Kurose and Ross' Computer Networks: A Top Down Approach Using The Internet. This book might work well as you are more likely to hit concepts you find familiar early on.

    To put it all into practice, read the Linux or FreeBSD kernel source to see how the networking stack there is put together. There are good resources, either in print or on the net, to help you with this process. BTW, I really wouldn't worry too much about HTTP. It's an important protocol, but not really a very interesting one. TCP, IP, UDP, BGP and friends are much more interesting in my view!

  • Project: Difficult to know what is a workable project. Answer the questions at the end of book chapters. Teach yourself user-space socket programming by writing a simple client-server program ("Hello world!" over the net isn't too hard to do!). Once you have this, you can probably come up with an extension yourself - perhaps you want to write a really simple web server.

Multi-threaded programming:

  • Resource: This is a huge topic. If you just want to understand how multi-threaded primitives operate in your language of choice, find a tutorial on the net - there are loads for Python, Java and C at least. If you get interested in the theory, search for Herb Sutter's series in DDJ on concurrent programming (but this may a bit advanced for you right now). Herlihy and Shavit's Art of Multiprocessor Programming is a fantastic book on concurrent programming from a very (very!) academic perspective on the practical, although the first edition needs a bunch of mistakes fixed.
  • Project: Take your server from the networking project and serve each client in a new thread, so that you can accept many connections at once. Code up a solution to the dining philosopher's problem :)

Operating systems:

  • Resource: Several good introductory books exist. Again, I'm a fan of Tanenbaum's Modern Operating Systems, but the Silberschatz et. al. book is good as well. You really want a book here, IMHO, as you want a generalist overview of what design choices are available before studying how a particular operating system works.

    When you do get to that point, however, I'd suggest reading the Linux source code again. There are good articles on the net, and some good books in print (I like Linux Kernel Development, but it is becoming necessarily a bit dated).

  • Project: Install a Linux distribution in a virtual machine. Add a system call to the kernel, and test it from user space. Then the kernel is your oyster! Try hacking on the scheduler - start off by making it really dumb, then slowly add features back in.

    If you like, you can try writing an OS from scratch, but that is a large and potentially hugely frustrating experience. I'd suggest starting to work with an extant kernel - at least then when it breaks you know it was because of something you just did :)

HenryR