First, I have already searched the site and read all the previous "self-taught vs. college" topics. The majority of the answers defended that going to college was the best choice, for two main reasons:

Going to college gives you the paper, which is essential to landing jobs, especially in tough economic times.

Going to college gives you a solid programming base, teaching you the principles that will be essential regardless of the language/path you take after.

Here comes my question: I am not worried about reason 1 at all, because I already have my own company (I build websites/ do affiliate marketing) and a stable financial situation, so I am pretty sure I won't need to look around for a job.

I am worried about reason 2 though. That is, I want to make sure I'll have as solid a programming foundation as anyone else out there, and I am wondering if that is possible with self-learning.

Suppose I take my time to study the very basics, like discrete maths, algorithm design, programming logic, computer architecture, Assembly, C programming, databases and data structures - mostly using books,online resources and lots of coding. Say I spend 1-2 years covering those basics.

Do you think my foundation would be solid, or still lack in comparison to someone who went to college?

This question appears to be off-topic. The users who voted to close gave this specific reason:

"Questions seeking career or education advice are off topic here. They are only meaningful to the asker and do not generate lasting value for the broader community. Furthermore, in most cases, any answer is going to be a subjective opinion that may not take into account all the nuances of a (your) particular circumstance." – Community, Jimmy Hoffa, GlenH7, Corbin March

There is likely at least one person on this planet who can. By the way, reason 1 still matters. When all else is equal, "they" would still usually prefer someone with more formal education.
– JobJan 6 '11 at 15:21

1

I can tell you one thing, you won't find out what solid means at a university.
– Peter TurnerJan 10 '11 at 21:38

15 Answers
15

Absolutely definitely. Yes, it's possible. How do I know? Because I did it!

It's difficult. Don't have any illusions about this. With no tutor to go to when things don't work, you have to figure out problems yourself. There's a lot to learn and if you aren't self motivated or aren't dedicated enough, you won't be able to do it. For me, I find it difficult to be motivated about anything, but I enjoy learning and programming so much that I don't have to fight myself.

Some tips:

Learn by doing! Want to know how binary trees work? Make one.

Do by learning. Set yourself ambitious projects where you'll have to learn new things in order to complete them. Caution: If you set yourself projects that are too hard then it's easy to become disheartened, but if you set yourself projects that are too easy, then you won't learn very much. You're looking for a butter zone.

Start with C. High-level languages make you lazy. I'd never had learnt C if I'd learnt python first.

Wikipedia should be your first point of call for any concepts you need to learn.

It doesn't matter if you never finish a single project, (after all, what is finished). It's much more important that you learn new things. That doesn't mean to say that you should never try to finish a project. It can be a huge motivational boost to see something you made working. It's easy to get side-tracked, don't worry if you do.

How do you know when you are done? Well, the reason you undertake a degree is so that you will become proficient in programming. When you are sure you could write any software given a reasonable amount of time then you're a programmer, but that doesn't mean you should stop learning.

Incidentally, I'm now suffering from point one. Being far away from any software development companies doesn't help either.

Same here. I did get a degree for the paper. I didn't learn too much, mostly everything I already knew. I did learn that I really hated java more than I initial thought(had to use it for my final project) and I did have one great professor who taught us from his personal experience where I did learn many things.
– EchoJan 6 '11 at 18:31

I think it makes a lot more sense to start with a high-level programming language, especially with Python. Of course it depends on the types of tasks you would like to tackle once you're done learning the basics: if you want to do hardcore systems programming, go for the C route, if you want to develop end-user applications, don't bother with C and go for something like Python.
– Zsolt TörökJan 10 '11 at 21:57

disagree with the C part. you want to stay at a high level of abstraction. you can argue that C makes you lazy, learn machine code! if you don't need C kind of performance, it's alright to stay with python.
– segfaultJan 10 '11 at 21:57

I think, the most important designation of College/University is to teach you how to learn stuff on your own. It doesn't matter, whether it is programming, physics, chemistry, math, etc. The university taught me how to learn without anyone's help.

Well I already have a degree in International Economics so I that part is covered.
– DanielJan 6 '11 at 14:57

1

I have a friend who has a degree in some <noname>, and he's successful Flash/PHP programmer. I guess it's all up to you. I for example have a degree in physics, but I'm a software developer. Two years ago i decided to get a Master Degree in CS, just because I wanted it, not because I needed it.
– SorantisJan 6 '11 at 15:13

5

My college education taught me to pick up a new computer language in 1-2 days from online tutorials. If you can do that already, you will have learnt a great lesson.
– apoorv020Jan 6 '11 at 15:16

1

Yes, but you have to be a committed autodidact.
– dietbuddhaJan 7 '11 at 3:44

3

Some people don't need to learn how to learn independently.
– dan_waterworthJan 11 '11 at 6:46

Some people thrive in academic environments and even require them to learn (usually as a form of motivation). Others (like me) do not and can even find them off-putting.

I had a long career in software without getting a degree. Toward the end of that career I was in an architectural role and the senior architect of my project said that my knowledge of software and computer science (the two are not the same thing!) was easily equivalent to having a Master's from Waterloo University (one of Canada's top CS schools).

There are some deficiencies, of course, in my knowledge pool. My maths skills are only enough to keep up with what I'm learning today. I hate pure maths and generally can't be arsed to keep up to date on the latest and greatest. This has occasionally put a crimp in my comprehension of things (like, say, Haskell) until I got my maths skills up to a sufficient level to understand the concepts. But the fact remains that the information is available without me being anywhere near a university CS or maths department. All I can really say is that sometimes my learning sequence is suboptimal -- I occasionally have to backtrack and fill in some foundational material before continuing in what I'm doing.

I think your foundation will be solid, provided you have the discipline to actually sit down and teach yourself all those things and work through the examples. I have a degree, but it's in Engineering, not Computer Science. I've worked with plenty of excellent professional programmers who have taught themselves everything they need to know. Self-study is something you'll need to have anyway to be a good programmer, as there is always a new technology coming out that you didn't learn in school.

As with most things in life, my answer is a solid it depends on the person. I firmly believe that you do not need a bachelors degree to be to be programmer; however, based on my experience, college has a tendency to expose people to issues and ideas that they may not encounter on their own through independent study.

In this day and age a motivated person can go online, and thanks to sources such as MIT Open Courseware, put together a course of independent study that will given them a fairly wide breadth of knowledge and it this this breadth of knowledge that I feel is what makes a good developer. However, someone that isn't as self motivated might find that they are able to get by learning a single language and might be able to just get by career wise.

As I stated before, I feel that it is the breadth of knowledge that is what makes a good developer as it means that they have been exposed to more problems and have developed their problem solving skills. You don't need to go to school to get this breadth of knowledge, but school definitely helps in this regards as a good degree program will force you to develop a breadth of knowledge.

As a programmer I find I am constantly playing with non-work related APIs and languages (Ruby on Rails, Python, Node.js, etc). I do this more for interest than for work. I have 2 associates degrees but even after 10 years of programming in Java/JEE I find that I really miss the theory of a BS degree (Big O, Algorithms, Descrete Math, etc).

I am taking part-time evening classes to get my BS in Computer Info Systems, but there isn't much CS theory offered in this program. I am getting my degree mainly to have the "paper" since it is more business than technical but it's my only option for evening classes.

Check out MIT Open Coursware. It's free and is a great resource for filling in the gaps of CS/Math theory.

I believe it is a falacy to think that college/university will by definition give you a good programming foundation. They will teach you a lot of theory, and a lot of different ways to think about a problem. That's all well and good, but turning that theory into practice is a different skillset.

The only effective way to teach proper application of theory is by mentoring and doing. In short, you need to attempt to apply the theory as best you can, and rely on someone with more experience to give you constructive criticism or point you in the right direction. Your mentor isn't going to do your work for you, but will help you be better at doing your work.

I wouldn't be the developer I am today without the help of some good mentors early in my career. Working on open source projects is a good way to find some mentors that will be willing to spend some time hammering out details. At least that was my experience. I also had a mentor in my first programming job that helped me understand how to design easily extended applications.

So is there benefit to college/university? Yes. However, they aren't equipped to help you turn theory into practice unless you take it upon yourself. If you start trying to apply what you are learning while at university, you can start asking the right types of questions that will help you truly understand the theory at a more practical level. If you wait till you are on the job, you've just delayed that important learning process.

Agree. Nearly all of the business programming I've done has been akin to working in a trade like a carpenter. I think an apprentice/journeyman/master programming track would be more helpful than a university in learning how to program.
– cfedukeJan 6 '11 at 20:34

People tend to overestimate the importance of theoretical foundation, mathemathics and algorithmic knowledge IMO. The reasons reasons programmers push and interview these things are that they are math "buffs" themselves.

Now there are of course some programming where it's useful to know what a "state machine" is, or how to use a "Booyer-Moore" search. There are even some problems where it can be useful to know some real math, like if you're working with financial calculations or physics simulations.

However, the thing is 90% of programming generally isn't any of these, not many of us is doing hardcore algorithmic development. Most things that you need to learn you can learn as you go along. No need to construct a huge edifice of foundation but rather keep a constant curiousity how to solve different problems.

I'm myself 100% self-taught and I'v never had any problem to learn about algorithms. I've done job on financial systems and even that was doable without any deeper theoretical math skills.

Getting good at programming is not about foundations, it's about continually expanding your toolbox and the learning you get is so much more worth when you can put it into context of a problem that really needs solving rather than just pure theoretical research.

You don't need to know everything in detail, that's what Google, StackOverflow and Wikipedia is there for :) You do however need know the existence of different tools and methods to realize they're usuable and applyable to your situation. You also need to get the experience of knowing which tool that's best to apply. Foundations are generally spoiled on beginners since they have no experience of why a particular tool would be useful. If you have lots of experience some things will just "click" into place.

Some things I would recommend though:

If you haven't, start learning about design patterns, that's the most practical and universal tool in your toolbox.

Read some general overviews of different algorithms if you are curious, just so that you know what's there when you might need one

Learn about parallelization and multithreading (and some functional programming). Being able to support multiple cores is important today and is going to undispenseble soon so it's crucial knowledge.

Do challenging and experimental hobby projects that push your skill forwards and forces you to learn things in context.

Your estimate of about 90% of programming not having strong theoretical content is probably about right. Unfortunately most programmers will periodically come upon the other 10%, so it is needed.
– OrblingJan 10 '11 at 21:45

One thing that college will help you with that you may find difficulty getting on your own is the ability to read and understand academic research papers especially the math. However, even this can be achieved on your own, but it helps to have instructors and peers guiding you in the learning process to get the knowledge quicker and easier.

As a general programmer of information systems, you will not likely read research papers to do well. Today's information systems are fairly simple and most of the intense algorithms such as searching, sorting and indexing are done by the database systems. As long as you understand the concepts you should have no difficulty.

If you decide to get involved in more difficult areas of programming such as developing micro-operating systems, compiler development, artificial intelligence and such, then having the ability to read and understand research papers can be critical to implementing systems quickly and efficiently.

As far as being able to apply knowledge, that is very individualistic. People that go to college may not be able to apply the principles as well os someone that does not go to college. There is an old saying that goes, 'it does not matter what goes in but what comes out'.

To sum up, the knowledge you obtain from going to college can help you better understand and communicate with the academic world. However, the knowledge can be achieved without going to college. Having a degree makes it easier to persuade others that you know what you are doing and can understand academic research papers.

I don't think many people will get as good a "foundation" through self-study as they would from going to university, at least not in the same timeframe. Two years of reading random books and playing with toy problems in your spare time is not going to get you to the same level as two years of focused study with an organized curriculum. Will it get you enough to get by? Quite possibly. But if you really want "as good a foundation as anyone out there", then it'll take longer than two years.

Not to discourage you, it certainly wouldn't be a waste of time. I'm just not terribly confident that many people can pull together the equivalent of two years of college in two years while running their own business and having some kind of a personal/family life.

I did. In fact, the bulk of my study was in significantly less than 2 years (about 6 months), but I regularly do 60-70 hour weeks.
– dan_waterworthJan 6 '11 at 20:31

Agree with TMN. In GENERAL your formal education has no idea where you will end up, it has a certain amoung of BREADTH (ie tends to cover a lot of territory). My example on a previous post: I never ever ever thought I'd use Compiler Construction that was part of my course. It turns out, 20+ years later to have been one of the most important courses I ever did. Now the trouble is, for those who don't have that knowledge in the back of the head - you dont know what you dont know. And that level of ignorance makes you less effective, in the long term.
– quickly_nowJan 6 '11 at 22:29

I've been developing professionally for a decade without a degree. When I interview people I'm interested in their ability to problem solve and code. Saying that, there are some companies/roles I'm not eligible for purely because they insist on a degree. Certain consultancies have this policy because they can sell you for more to clients.

This is mostly a problem where hiring is done through an Human Resources (HR) department. The best way to deal with it is to build a business social network of IT managers who know you or at least of you, and let try to side-step the HR "filter" process. In other words, people without degrees tend to have to be better at marketing their skills and services themselves, rather than applying for advertised positions. Most competent IT managers will hire based on a solid track record, and reputation (i.e. referral from someone they trust). Don't expect to get a government job. It's rare nowadays
– mctylrJan 6 '11 at 21:50

If you play the numbers game, those with a degree get better jobs & pay.

Not everyone who got the degree learned/remembered anything.

Most people wouldn't take the time to learn much of the theory/background/basics as they would if they went to college. Maybe your parents would support you through 4 years of self-study; everyone else has to get a job.

The drawback would be if you had a CS degree and failed have a certain level, you may be viewed as having low-horsepower. Let's face it, if you didn't get it in 4 years of spoon-feeding, you won't figure it out on the side while holding down and full-time job. Exceptions of course.

If you really want to make a living in the software development field without a degree, I suggest what you do is contact your local University. Get from them a listing of the courses that would be required were you to get a degree. The vast majority of universities will have that information available on request, as well as a synopsis/syllabus/book list for each of the courses. Go down that list. Look up the books in question. See what topics they cover. If you see anything covered that you don't understand, purchase/check out the book and learn it. At the end of that process, you should at the very least know what you know and what you don't know, and be pretty competitive with your average college grad (who may have slept/cheated through some of those courses anyway).

Suppose I take my time to study the very basics, like discrete maths, algorithm design, programming logic, computer architecture, Assembly, C programming, databases and data structures - mostly using books,online resources and lots of coding. Say I spend 1-2 years covering those basics.

Yes and no. Some stuff is brutally hard to grasp without a teacher. Usually it's the more mathy stuff.

I believe - and still believe after helping beginning CS majors as a TA - that anyone without mental retardation can learn to code at the PHP/Java/C# level. It is not, fundamentally speaking, hard.

Nor, for that matter, is assembly and the other technological areas you mention. Those are implementation details that are Good To Know.

I have no doubt that a motivated and dedicated person could achieve a solid foundation but if you choose not to go for a degree you will be missing out on many aspects which will enhance your development. One of these things and possibly the most important is the exposure to like minded people with whom you can exchange of ideas and concepts. It is also very nice to be able to listen to the experiences of instructors who have valuable wisdoms to impart and can sometimes straighten out misunderstood concepts in a sentence or two. It is nice to be able to clarify concepts at the time of initial exposure rather then have the wrong ideas sink in and have to sort it out later. These things are not totally necessary but they certainly can give you an advantage over someone who is locked away in their computer room with a pile of arcane technical manuals... although that has its merits as well.