What Computer Science concepts should I know? [closed]

What concepts in Computer Science do you think have made you a better programmer?

My degree was in Mechanical Engineering so having ended up as a programmer, I'm a bit lacking in the basics. There are a few standard CS concepts which I've learnt recently that have given me a much deeper understanding of what I'm doing, specifically:

Language Features

  • Pointers & Recursion (Thanks Joel!)

Data Structures

  • Linked Lists
  • Hashtables

Algorithms

  • Bubble Sorts

Obviously, the list is a little short at the moment so I was hoping for suggestions as to:

  1. What concepts I should understand,
  2. Any good resources for properly understanding them (as Wikipedia can be a bit dense and academic sometimes).

Solution 1:

Take a look at this blog post by Steve Yegge (formerly of Amazon, now at Google):

  • The Five Essential Phone Screen Questions

It goes into some detail about the the five most important concepts that developers should be required to know:

  1. Basic programming (including recursion, file I/O, formatted output, loops etc)
  2. Object oriented design (including design patterns etc). You should be able to produce sensible OO designs as well as understanding the concepts.
  3. Scripting and regexes.
  4. Data structures -- lists, sets, hashtables, trees, graphs, and so on -- as well as Big O notation and algorithmic complexity.
  5. Bits, bytes and binary numbers -- how numbers are represented within the computer, and how to manipulate them.

Solution 2:

You definitely should understand the Big-O notation and Big-O estimations of algorithms - what it is, how it is used, why it is important, how you compare two algorithms given their Big-O estimations, how you build Big-O estimations for the simple algorithms.

Solution 3:

I find it a little funny that you're looking for computer science subjects, but find wikipedia too academic :D

Anyway, here goes, in no particular order:

  • The relational model: Introduction to Database systems
  • Object orientation : Object Thinking
  • Complexity and computation theory (think Turing machines and automata): Introduction to theory of computation
  • A little compiler design: The Dragon Book, although this might be a little over too in-depth for your needs.
  • Operating system concepts: Modern operating systems
  • People skills: How to win friends and influence people
  • Teamwork: Peopleware
  • User interface design: The inmates are running the asylum