I have worked as a programmer for over ten years, with a pretty good grasp of PHP, classic ASP, and VB. But I am self-taught, first using books and magazines, and now the Internet to improve my skills.

[Edit: I studied engineering in school, so I quickly learned enough programming to get my lab work done (Fortran, Pascal, and Assembly in the mid 80's). During my career I worked with market research databases and sales force automation, and created some early web sites for my employer. Success there let me move into IT where it was obvious (to me) that I lacked many core CS concepts and the associated vocabulary.]

But I feel that by not being formally trained in CS, I am missing large and important parts of the foundation and theory of CS. I know how to solve particular problems in a given language (usually by hacking my way through them), but I sense that I lack the fundamentals that would allow me to come up with the best solution for a problem.

What resources should I use to obtain this step change in knowledge and understanding? Do I need to return to college to really learn this?

+5  A: 

As someone who did not get a CS degree in school, I think the biggest thing I missed out on was algorithms.

17 of 26
+20  A: 

I wouldn't think you'd need to go back to school necessarily, the topics are all covered in various places online. What I recall from my degree courses that helped:

  • Big O notation
  • Formal Methods (State Machines, etc)
  • Sorting algorithms
  • Searching algorithms
  • Compiler and Language theory
  • Operating System theory
+1  A: 

I dont think returning to college is the best choice now that you have gone this far. BUt where you go and how you go from here depends on what you are doing now and where you want to go.

I would suggest picking up training kits that come with exam preps. Study hard, take the test exams, see how you fare. If you are faring well, you really have not much to worry about. Go take the actual exams. Honestly, just having a few letters after yoiur name will make you feel better.

My answer is by no means the solution, but one part. Lots of other things to do from studying others code, joining OS projects etc.

+12  A: 

I think the most fundamental CS concepts that you should study are:

  • Data Structures & Algorithm (both different types, as well as evaluating algorithm complexity)

  • The building blocks of Programming Languages, Parsing and if your serious: Compilers

  • Theory of computing: State machines, regular expressions etc.

These are just important CS topics from the top of my head. You might be able to study these on your own, but in most cases I would recommend studying these kinds of topics in a university setting.

+1  A: 

10 years experience is great, but if you're still "hacking my way through" you might be missing something. It depends where you have spent your time researching etc. Maybe try looking at something like Open University which is all off campus learning (UK based).

+5  A: 

A CS degree is usefull as a start, but it's very different from the real world. I don't think a programmer with 10+ years of experience has a lot of benefit from a CS degree. Some of the stuff you'll learn in CS doesn't have much relevance to actually being a commercial programmer.

If you want, you could read up on these fundamental issues by yourself without actually have to pay a college tuition fee.

Turing machines, fundamentals of algorithms, databases and compilers, and mathematics are typical subjects that are nice to know, but not absolutely necessary for a professional programmer. Practical knowledge is often more useful.

+1 but somewhat reluctantly. Unfortunately a lot of universities don't teach (and probably can't teach) more of the practical concepts of writing code effectively on a daily basis. That's something one must generally learn on his own and through a lot of practice. No amount of theory makes for an effective coder. Nevertheless, the theory is important but someone with a great amount of practice should be able to pick this up without the aid of expensive university courses. The degree might help one's resume, however.
+34  A: 

Firstly, CS isn't about programming. Programming is just a small part of any decent CS course. Programming is also a small part of any decent engineering, physics or maths course as well.

The programming parts of these courses will cover a functional language, a procedural language and an object oriented language. They might miss one of these out. The assumption is that once you know how to program in general, you will be able to pick up other languages without a problem.

It will also cover data structures and algorithms, a few projects (personal and group), maybe numerical analysis, etc.

Other CS courses will draw upon programming (Graphics, Security, Functional Languages, Types, Compilers, Databases, AI, Operating Systems, etc). Your AI course won't be presented as "Learning Prolog", it will be about AI algorithms, and you'll be expected to pick up Prolog from the examples and a brief overview.

Your best bet is to look online at the course material for a good university to see what you are missing, and to see whether it is relevant to your career. If you want to learn the stuff anyway, then you should sign up for a CS course, but do research the quality - many of them are glorified programming courses and shouldn't be called "Computer Science".

+8  A: 

I think what you get from a CS degree is a breadth of knowledge rather than a depth of knowledge. As a programmer you are likely to only have learnt about topics you have worked on or were interested in, however during the course of a CS degree you are "Forced" to learn about things that you would normally not have looked into.

I use the word forced not in a negative sense, I think it's a good thing and a enjoyed being forced to learn about the topics I learnt in university.

Also you might be lacking in some of the soft skills that are taught at university like team working and the fundamentals of project management. I found that most of the people in my CS class ignored this stuff anyway, which is bad.

I've recently re-taught myself about design patterns which when I was at University I thought were a waste of time, but now I have some experience under my belt think are facinating.

You are also missing qualifications, which means that some people might not hire you, but to be honest most companies will take real life experience into account when hiring. What you wont be missing is experience, I found that when I graduated I went through a soul destroying month of applying to a bunch of jobs that required industry experience which I couldn't get because no one would give me a job withough experience.

As far as resources check out MIT's open courseware or standfords equivelent, I cant remember what it's called, but essentially they have all their university lecture notes available to the public. The stanford site even has video lectures in a number of formats.

Omar Kooheji
+3  A: 

You are probably missing some of the theoretical side but that can be helped with reading more books.

If you are really serious take a look at some of the CS curricula on-line (MIT) and see which courses seem both alien and interesting to you. I'd suggest algorithms, basic theoretical CS (finite state machines, grammars, etc.) and maybe some software engineering style courses.

+2  A: 

I learned computing before going to university, learned about algorithms, hardware, assembler, databases, Big-O, all on my own. However I did learn a lot from other fields which has served me well such as Sociology, Biology, Evolution, Statistics, Mathematics, Music, Physics.

And I really appreciate what I learned in those fields from going to School.

Robert Gould

I think the most important things you need to cover would be the lifecycle. Either pick up a systems analysis and design book, or a project management book. Either will have something about the project lifecycle, and the steps you should always take when designing or modifying software. It may seem cumbersome at first, but following the steps can truly make you code better. They all basically revolve around one main concept, nail down the requirements before you begin coding. Define what it is you are supposed to do before you begin, not while you are coding, or after you create your first prototypes.

That's software engineering, not computer science.
He was asking what he was missing to learn how to solve problems more effectively. Did you even read the original post?
If you ask me, I don't think that you should *ever* be allowed to separate software engineering, information systems and computer science. It creates a disconnect between business, best practice for real world applications, and theoretical and in-depth computer things.
+27  A: 

There's tons of resources available to get you to grips with CS concepts. The intertubes has tonnes of material to get you going, but I've listed some of the books I can remember that gave me excellent insight, without becoming overly boring and rigorous.


I think the best resource to buy and cherish is the Cormen bible.

Programming languages

Ravi Sethi's book on programming languages is great but may be a bit dated.

Operating Systems

Alot of really good books on operating systems. We used this book by Silberschatz and it's really good. Another good book is written by Andrew Tanenbaum.


TCP/IP volumes 1-3 is an excellent resource that you'll keep referring to over and over again. Reading the RFCs for certain protocols is a also a requirement - but don't worry they're (mostly) easy to understand.


We used a number of texts on databases, but I honestly haven't really done that much work with databases, so I'm not going to suggest anything here...

With all these topics, the texts vary from introductory and shallow to practical use with examples to formal treatment. You need a bit of everything I guess. Even with a CS degree I feel I've missed out on quite a bit - but that's mostly because I didn't really pay that much attention.

At the end of the day, it all depends on how passionate you are about something - I really enjoyed the variety in a computer science degree. It helps you put things into perspective...

On the minus side, and I speak for myself, I've got into an ADD-like rut because I honestly cannot stick to a single technology and master it. I blame computer science. I could also blame beer, but come's beer...

But you shouldn't feel that you missed out something incredibly essential that only CS can give...

+1  A: 

I would say that the biggest assets of a CS course are:

  • Algorithm/Data structure analysis
  • Formal computing theory: some will say you never use this. It does help however if you want to explore more theoretical topics like parsing theory, machine learning, AI etc beyond what you see in most general books
  • Understand the machine/OS: learn the machine from the circuit/bit level. Understand how the OS works, e.g. process security, scheduling, etc etc

Do you need to go to college to get that? No. I did btw. You can learn all this yourself.

With respect to TheOtherScott knowing an API means nothing. Knowing how to program efficiently and correctly is much more important.

+2  A: 

Going back to college always helps. It brings in a newer perspective which is generally not there in practice. I mean when you are coding, you are looking to solve problems constantly without having that extra bit of understanding about the OS level details or the algo that you used.

I went back to college after working for about 6 years and its helped me a lot. Most of the CS specific topics are already covered in the earlier comments. A thorough understanding of all these is vital if you want to land that job at Google or Faceoook :)

All the best!

Nikhil Kashyap
+1  A: 

It depends what sort of Programmer you are. If you're working in business or consultancy then doing a business qualification is more likely to give you a career boost. Whilst good coders are always at a premium it's an even rarer beast that can interface between business management and technology/techies and be trusted by both sides.


I'm facing the same dilemma myself (programming for 5+ years, though, so not quite a far along as you), and I'm looking at the problem through the lens of what I want to spend the rest of my life doing.

Haven't quite answered that question yet, but here's my thinking so far...

If I want to make a living writing code and making software, then I suspect that I can probably pick up whatever it is that I need to know through the great methods mentioned above, especially the open university and open courseware elements. It'll take me a lot longer, since I'll always be pulled towards actually making something (and, hopefully, getting paid at least a little in the process), but I'll be able to get by, and be at least competent, and potentially better than that (depending on how much effort I put into it).

If I really want to understand the way things work in a deep and complete fashion, and get a solid theoretical grounding in the topics mentioned above, then at least for me I'll probably need to go back to school. And since I come from a family of university professors, I can't dismiss the allure of teaching this stuff for a living, which will require some formal education. In my situation that probably means a few undergrad courses then on a masters (the school I'll probably go to discourages 2nd BS degrees).

Don't know how much that helps you....

+5  A: 

You are not alone. There are many programmers in the world who don't have CS degrees. Here are some steps to take:

  1. Read the right books. Start with “Code Complete”. Sure it’s huge, but if you read it in small chunks, it’s quite manageable.
  2. Learn C++. You may never use it, but you’ll learn a lot about coding. You’ll learn object-oriented programming, pointers, strings, arrays, address arithmetic, lots of data structures (especially if you dive a bit into the standard template library.) Yes, java and C# are easier to learn, but by getting close to the metal in C++, you’ll gain an appreciation both for what tools are available and how lucky you are to be using something at a different level.
  3. Research some basic stuff on your own. Learn about the different types of data structures and what they’re good for. Write a few simple algorithms to see how they work. Once you get the idea, you’ll feel more confident and won’t worry so much about knowing how to implement them as much as knowing what to choose and when.
  4. Take a class. If you really want a more formal education, start small. Take a class at the community college or online. This will allow you to start at a slower pace while you’re working. You can also decide if this is really what you want to be doing or not.

I’ve worked with many newly minted CS grads and many non-CS engineers. The new CS grads knew little about really writing software. Many of the non-CS engineers didn’t know anything about writing clean, efficient code. Don’t feel insecure. The best thing you can do is take constant steps to make yourself a better programmer and it takes time and effort.

Code complete, oh yes.
Paul D. Waite
+3  A: 

I'm sort of in the same boat as you. I have a 2 year degree and programming and a 4 year degree in IT, but neither covered CS. I'm been watching some of the new free Stanford video lectures to help fill in holes. (To see the videos, click on a class and then "View lectures and materials")


You are missing a piece of paper in a frame that has your name on it.

But what a beautiful frame it would be...and the fonts...them awesome fonts... and graduation gowns... man...those was the days!!
Thanks to a screwup, I graduated with a blank piece of paper in my diploma-holder, so don't count on your name being on it.
Same here, got a nice blank sheet with a ribbon.
Robert Gould
+2  A: 

What are you missing?

Student Loans!

Honestly, I am glad I got the degree. I worked hard, focused on problem solving rather than client demands, and learned a ton. If nothing else, it adds rigor to your thinking, which is never a bad thing.


The good that you learn in school is a lot of the behind the scenes nuts & bolts of why & how computers and programming languages work, which helps when you're trying to figure out a best approach or even to help comprehend an in-depth conversation on a programming topic.

The bad is definitely the student loans, and the time spent in useless liberal arts classes.

Lance Roberts

You may be missing out on opportunities. I have seen people's resume sent to the discard pile because they were missing university education. If you ask me it matters little, if you know what you are doing and have experience but it is a screening criteria sometimes.

Brian G
This is true, unfortunately
+15  A: 

I've been in the computer industry for 20 years now, and don't have a degree.

Here's what I wish I knew 20 years ago. You'll learn it all as you go but sometimes you don't know what you don't know.

  • Theoretical computing! What's better, a regex or a state machine? Why? Why are Turing machines so cool and how are they related to Conways Game of Life?

  • Fundamentals of algorithms. Read Knuth. Learn all about trees, graphs, lists, hashes, heaps and so on. There are lots of cool ones!

  • Basics of compiler design. How is the stack implemented? How does malloc work? How does a virtual machine work?

  • Concurrency, threading, parallel processing, distributed processing, etc. SO MUCH FUN HERE. Having access to a university or a cluster of machines at the place you work is a great help but you can learn most of this stuff on a modern 2- or 4- core machine.

  • I know I am missing a lot.

The best way to learn, in my experience, is by surrounding yourself with people who are smarter than you. Find yourself a job or a school where that's possible, and seek those people out, and you'll learn the stuff that's relevant to what you're doing.

this was super helpful to me. Surrounding yourself with people smarter than you is really key: but a challenging part of that is realizing how smart you aren't!

A few points IMHO.

  1. It gets your foot in the door. A piece of paper won't particularly get you more money in this field. It might help you get your foot in the door somewhere, but if you are required to have a piece of paper, that also means that particular place is overlooking a LOT of really good talent.

  2. Others have posted useful contexts on topics such as the algorithms and other things. This, I believe is probably the biggest thing you'll miss, because without it you'll not know a lot of the underpinnings of what you are working with. At the same time a lot of modern languages are setup specifically to prevent the extensive back knowledge. If this is a good or bad thing is to be debated, but overall you have less knowledge about the things you are working with. - not to say of course that you can't just teach yourself these things, I have and don't regret a day of missed classes.

  3. College and schooling in some cases help one in a big way with patience, bureacracy, and other things of that nature. In this field one almost always needs a massive dose of patience. A lot of software shops have many working departments that one needs to go through for simple things before moving forward on programming. On a daily basis programmers often don't do all that much programming anyway, college in a way preps one for these types of things.


My advice is to take a look at Computer and Electrical Engineering courses , it is for free. This may help you to learn Algorithms, AI and more CS related stuff.

+8  A: 

You're missing student loan debt. :)

+1 because its so true
Robert Gould

Already mentioned, I think the most important thing is: CS isn't about programming per se, it is about concepts, algorithms and of course a lot of math. These things help to become a better programmer but aren't a requirement.

As for programming, I think the bible(s) is Knuths Series on The Art of Programming

+1  A: 

Try to watch lectures from Berkeley University for the beginning: CS 61A: The Structure and Interpretation of Computer Science.

+1  A: 

Try to get some background in mathematics (combinatorics, graph theory, discrete mathematics in general, algorithm complexity etc), formal computer science (automata theory, compilers, computer architecture, operating systems), digital electronics (maybe learn VHDL or Verilog), computer networks etc.

Here are some titles I think every computer scientist should read:

Aho, Sethi, Ullman, Compilers: Principles, Techniques, and Tools
Knuth: The Art of Computer Programming
Tannenbaum: Modern Operating System
Tannenbaum: Computer Networks
Silberschatz, Galvin, Gagne: Operating System Concepts

Igor Pozgaj