Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

I'm a software engineer at a local university, and I feel I'm able to competently do my job, but recently I've been interested in "filling in" the gaps in my knowledge. I suspect I would have learned some of this in school; for example, I don't have a lot of knowledge of sorting algorithms (something I feel is pretty common in college). So, what knowledge am I likely missing by not going to college that I could study on my own?

Bonus points for listing resources that might put me on the right track!

Some background: I've programmed in PHP, Java, and Ruby (more seriously in Java and Ruby than PHP); I have some experience with C/C++, though my workload doesn't really lend itself to those languages; I work mostly (recently) with the web, using frameworks such as CakePHP and Rails. I'm familiar with SQL (though probably not with some of the theory).

Note: The university I work for has no technical classes, so taking courses on the university's dime is a great idea but not possible for me. :)

share|improve this question

closed as off topic by Mark Trapp Dec 17 '11 at 6:18

Questions on Programmers Stack Exchange are expected to relate to software development within the scope defined by the community. Consider editing the question or leaving comments for improvement if you believe the question can be reworded to fit within the scope. Read more about reopening questions here. If this question can be reworded to fit the rules in the help center, please edit the question.

What are you missing that is relevant to your work you do now, and you have ambitions to do? Learn that - there is far too much I don't know, but I'd rather spend my time learning what I need to know.. –  Nim Mar 14 '11 at 15:20
Well, I sort of feel that's my problem--when I realize there's knowledge I'm missing, I go find it, and I have no problem with that. I'm wondering what things (mostly theory) I don't know that I don't know I don't know, if that makes sense. :) I updated the question with my background if that helps. –  BinaryMuse Mar 14 '11 at 15:23
One thing you've missed is having to study stuff that you have absolutely no interest in. Most college courses will have some aspects that are intensely boring, when self learning you would just skip over this. Having to persevere with these does build up a certain mental strength and agility. –  Mongus Pong Mar 14 '11 at 15:48

9 Answers 9

up vote 5 down vote accepted

Here are some resources for you. I consider this to be the core of computer science.

0) Introduction programming course(s) - depending on your background you might skip this.

http://see.stanford.edu/see/courses.aspx or maybe http://webcast.berkeley.edu/course_details_new.php?seriesid=2011-B-26281&semesterid=2011-B

1) Discrete Mathematics


2) Algorithms


3) Computer Organization


4) Operating Systems


5) Theory of Computation


Berkeley also has a compilers class: http://webcast.berkeley.edu/course_details_new.php?seriesid=2011-B-26554&semesterid=2011-B. Google for the class webpage.

share|improve this answer
I think that just working through some low level computer programming courses like this would get you most of what you haven't covered in your pragmatic experience thus far. It seems like most of the core theory I learned was really early on in my classes, and once you get there it is simply to learn as you go. –  Panky Mar 14 '11 at 18:09
Great list of resources; I'll have to check these out, thanks! Definitely going to give CLR a look too (thanks Uri!) –  BinaryMuse Mar 15 '11 at 21:27

Get a subscription to o'reilly's Safari Books, you can check out 10 books a month then swap them back for others so you can continually learn, Head First Design Patterns are good, as is anything on UML.

I also am self taught and have been programming for 16 years and been a Senior Java Developer for the last 6.

share|improve this answer

Others have offered a lot of technical suggestions, but I would add to those that you should also take advantage of what your university may offer in other non-technical areas. Classes I would suggest would include statistics, basic accounting, public speaking, business writing & communication, critical thinking, time management and basic business administration courses. Far too many developers are held back by bad impressions they leave by not being able to understand business speak, not being able to understand what the business really needs, and communicating technical ideas to non-technical people and enabling them to understand what you are trying to say.

share|improve this answer
  1. Computer Architecture
  2. Automata and Compilers and Programming Languages (while not directly applicable to Software Engineering it does help in understanding the systems we work with and is a great asset)
  3. Operating Systems (same reason as #2)
  4. Higher level math/logic skills
  5. Benefits of being able to explore various subjects of CS that are of interest to you.
share|improve this answer
  1. Design Patters
  2. Software Construction
  3. OOP
  4. Advanced coding concepts in the language of your choice. Amazon has many books there. :)
share|improve this answer

I'm a self-taught programmer as well, and do well without any education. Over the years I've discovered topics that people with an engineering degree know better though.

  • The commonly used names for certain technologies. Reading e.g. Design Patterns put a name on a lot of stuff I've been implementing for years, but never had thought of naming.
  • Certain data structures. Take e.g. red-black trees. I understand them, can explain how they work, can debug implementations, but I've never actually taken the time to write an implementation.
  • Certain algorithms, commonly specialized algorithms such as A* - I never needed them, so I never took the time to read up on and implement them.

What I'd like to do, and plan to do, pending spare time, is e.g.

  • Design a language and write a compiler
  • Learn more math
  • Implement well-known algorithms, such as A*, the sorting algorithms I haven't already written, the text search algorithms I haven't already written, permutation algorithms and so on. Basically go through wiki's List of algorithms and write working implementations

What I have done, and would like to see my coworkers also do, many of them wouldn't know where to start:

  • Write an assembler, and a disassembler
  • Write a debugger. Write one more for another OS.
  • Write drivers for a few OS'es
  • Design and implement a filesystem
  • Design and implement a distributed application
share|improve this answer

My experience is that OOP is easy to pick up in the course of programming or reading code (I picked it as a teenager just from looking at code samples and then practicing).

Things that are not immediately evident: algorithms, data structures, and theory of computation (e.g., what problems are decidable, what is P vs. NP). Your friend here, as usual, is CLR (the Cormen and Rivest book, best 60$ you'll spend).

share|improve this answer
Excellent resource! Yeah, I feel pretty good about OOP, just from learning C++ at a young-ish age and moving through PHP (eh, arguably OO :) then Java and then Ruby. (I also did take a few college classes, and they had C++ and Java there too). The things you list in the second paragraph is great, and looking through the table of contents in that book, it sounds like a great start! Thanks! –  BinaryMuse Mar 14 '11 at 15:32

These could be good
1. OOP
2. Algorithms and data structures
3. Assembly

share|improve this answer

Most likely :

OO Concepts and Principals & DB Concepts and Principals

share|improve this answer

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