[This question was originally asked on Stack Overflow, but recommended to move the question here.]

I can't find anything quite like the question I'm about to ask, so please forgive me if there's something just like it already, please feel free to point me in the right direction. It'll take a bit of background explaining too, please forgive me for that.


Basically, I graduated from University about 18 months ago with a degree in Business Information Systems and Japanese. The Japanese took up half of the degree so the BIS was only joint. I only learned PHP in terms of languages and basically no computing theory - everything was vocational (Networking, programming basics, CMS development, Office and VBA and then loads of Business theory courses).

Since this, I decided to teach myself C# and ASP.Net and try to get a position as a programmer. I created an online shop style website and a small CRM application in Windows Forms to both teach myself and build a portfolio, and luckily I managed to snag a developer position.

Bad side? I'm the only developer at my company. Now don't get me wrong, in the last year I've learned loads and loads, I did some devpt. before Uni so knew the basics anyway, but it was very much a "learning from books" job - every night.

Now then... I am now at a point where I'm building software on a regular basis, making good judgements for time scales, and have even been told my code and methodology are good by other professionals that have been in the game longer than me, and they have offered me jobs.


What this whole thing boils down to, is that I now want to study up on the topics I'll have missed by not doing CS. More importantly, could you recommend books / free online courses? I want to learn about Computer Science theory, not just better coding.

Thank you!


The key here is to try to absorb the concepts, rather than the specifics. For example, rather than learning Java, learn about the Virtual Machine that it brings to the table and how that differs from, e.g. the C# CLR.

The kind of topics you want to cover are (in no particular order):

  • Algorithms. How does Bubble Sort compare with QuickSort (QS not always fastest), what is a binary search, etc.
  • Compilers. All modern programming languages have some concept of being compiled from source to bytecode or machine code. It helps to understand how to write efficient code if you know the pain the compiler goes through. Some processor architecture theory may help your understanding - see the Andrew Tanenbaum book.
  • Scale. There are some differences between programming for e.g. a supercomputer versus a phone, even though they may both run the same OS. Find out the differences and challenges, for example, why/behaviour when malloc() fails.
  • Concurrency. With multiple cores, desktop PCs can now actually be running different pieces of code simultaneously. This causes all sorts of issues - locking, race conditions, starvation, etc.
  • Debugging. Get good with tools or instrumenting code to work out how best to fix stuff when it goes wrong, particularly when it's live and you can't reboot/restart
  • Databases. It doesn't matter which database, but an understanding of database organisation and how they work helps. The introductory chapters to most Database books give a good overview - pages, rows, locking, optimism, indices, execution plans, etc.
  • SDLC. Learn the Requirements > Specifications > Design > Code > Build > Test > Commit > QA > Deploy > Maintain lifecycle, regardless of actual project methodology.
  • Methodologies. Look at traditional BUFD, Waterfall, Agile, Scrum, XP, etc.
  • Tools. Other than an editor and compiler, there are lots of tools used in SE practices, from code generators to static analysis.
  • Functional vs Procedural. More and more functional programming constructs are making their way into procedural languages lately - with good reason. Go find out why Lisp/Prolog/Haskell are still in use and how things like F# are taking the concepts forward.

There are a ton of resources out there - MSDN's Channel 9, Yahoo!/Google videos, YouTube, VideoJug, etc.

If you want to actually keep up with a Comp Sci person, then take a look at any university's course prospectus, to get an idea for what topics they cover in their CS course. Personally, I'd pay more attention to the Software Engineering courses than Computer Science as you have a history of programming but perhaps don't need to learn micro electronics to understand them (in the UK, CS = programming + hardware, SE = programming + theory).

  • Debugging and scale are not exactly a Computer Science topics, however everything else you listed certainly is and worth mentioning. – Bryan Harrington Nov 8 '10 at 17:03


You need to be really good at math. Not quite as much because you are likely to encounter the need to solve differential equations in order to write your code, but because you need the same skills it takes to solve math problems to be really good at software engineering. I recommend taking a few upper lever math classes at your local community college. Perhaps a numerical methods or discrete math class first.

I took a class in software engineering for my degree in computer science a few years ago that the professor used some of the material from MIT's open course-ware. He used course 6.170. I recommend going through that class and a good course on object oriented programming and especially design patterns. If you still have time and want to learn more, move on to artificial intelligence and theory of computation studies. If I had to to pick a single course that was most helpful in my career as a developer, it would be the studies on design patterns.

Because I have a low reputation, I can't post more links. Do a Google search for "gang of four design patterns" for the book that is classically used to teach that subject.

Good luck!

  • Thanks vary much! +1 in lieu of not yet 15 reputation. I'm British so going to a college or university for single classes is generally very uncommon, but I'll get some books on numerical methods and discrete maths. – David Archer Nov 7 '10 at 22:16
  • Math. Really? Perhaps, but only if it's the right kind of math. When was the last time you had to solve an algebra problem to write a computer program? – Robert Harvey Nov 7 '10 at 22:45
  • 2
    @Robert Harvey: Did you read my answer? "Not quite as much because you are likely to encounter the need to solve differential equations in order to write your code, but because you need the same skills it takes to solve math problems to be really good at software engineering." – Jonathan Swinney Nov 7 '10 at 23:01
  • 1
    @everybody - I agree that learning math has a lot to do with becoming a great software engineer, but not actually for the math skills; it's more about the problem solving skills. Most of the material that you learn in upper level math classes is teaching you how to go about solving problems in general, not specific problems. As you advance in math, you advance in solving the abstract. IMHO, this is the single most important skill for a software engineer to have. – Topher Fangio Nov 8 '10 at 15:28
  • 1
    Upvoted, because you hit the nail on the head: "Not quite as much because you are likely to encounter the need to solve differential equations in order to write your code, but because you need the same skills it takes to solve math problems to be really good at software engineering." Sure, you may never need linear algebra or multivariable calculus in your day job, but the skills you develop when studying upper-level math are essential to programming as well. – mipadi Nov 8 '10 at 16:59

If you can afford it, get an unlimited subscription to Safari Books Online. You will have access to thousands of computer-related (and other technical) books. Pick a topic: algorithms is a good place to start. Then something on data structures and program design. Object oriented programming. Pick a new language, different from what you already know -- such as Ruby or Python. Browse some books on each subject, and those you like, read in depth.

From there, pick some topics which interest you, such as operating systems, compilers, cryptography, image processing, etc.

  • Done and done. I've plumped for the 5-book subscription for now, at $10/mo (roughly £8?) it's affordable but still highly useful... not that I think I could read more than that, especially without jumping from book to book to book. – David Archer Nov 8 '10 at 8:04

Here is a blog post I just learned about today. It's very interesting. The letter I wish I could write to my former self, and have beamed at light-speed through some kind of vacuum tube and delivered at the precise moment when I finally decided to learn to program.

First off, congradulations on gaining such high marks from seasoned professionals at such a young age.

I think the very thing you are truely looking for can be found by answering this question?

Where do you want to be five years from now?

Answer that question and then chart a path that leads you there.

As Mr. Miagi would say "Focus Danielsan".

  • Honestly? I want to go back to University and only work part-time for a while, and research into my PhD. I don't really know enough about the theory of Comp Sci to pick a topic off my own back, I've always been vocational in this respect. I really want to learn the theory because it's one of the few things that when I started learning, I was truly passionate about and couldn't stop reading. So now I want an overall CS viewpoint, that way I can delve deeper into the CS theory over the next 5 years and then get my Doctorate, for no reason other than pure love and furthering of the subject matter – David Archer Nov 8 '10 at 8:03

Read The Structure and Interpretation of Computer Programs, aka SICP

For building up your fundamental knowledge of CS topics, there is probably no better book than SICP. The acronym alone is almost always recognized by top CS graduates, as a classic they either learned from, or know they need to read. :) Big names in CS and programming know and recommend the book, e.g. Peter Norvig's praising SICP as the greatest introduction to computer science ever written.

SICP covers the fundamentals of computation in a satisfyingly deep way, raising many perspectives and questions about the nature of computation — quite a few of which remain open issues — while leading the reader to see beyond the superficial aspects of telling the machine what to do, or how to do it.

alt text

Click the image to get to the free text online. You can also readily find the video lectures by the authors, complete with '80s style color and clothing no less.


The best thing you will receive out of learning Computer Science topics is problem solving skills and "attention to detail".

These things are certainly the backbone of an excellent programmer, but just be warned you wont learn very much in terms of technically skills and hands-on coding skills.

A great deal of math and theory will be thrown your way and if you think that you should improve on the two areas I listed at the top, I certainly think you will not be wasting your time.

So to best answer your question, you should study Math topics specifically Linear Algebra, Discrete Math and Computational Theory. These will all improve you significantly.

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