It's interesting that this question implied the negative -- not what's the difference between, not even what are the strengths and weaknesses of, but:
> What pieces of the whole are missing?
The implication being that without a formal CS education, it is an impossibility to obtain a whole. As if whole matters; how does one obtain whole, anyway?
This is a very loaded question and perspective that betrays a serious bias, in my opinion. That we're making a generalization out of humanity's life experiences is futile in itself, but alas, the application of said generalization here is far more interesting to me.
I'm inclined to disagree. The converse -- what skills does a programmer who has never left academia lack? -- strikes me as perfectly valid. And surely there must be some benefit to taking four (or more) years out of your productive life to the study of programming?
But I say this as a self-taught programmer, so perhaps it's just that I'm envious of those who've had the benefit of a formal CS education.
Speaking as someone who was self-taught, spent four years getting a formal CS education, and then has 16 years post-college professional experience, I don't think you probably missed much. I think the only really practical thing I learned in school was big-O notation, and you can probably pick up the essentials of that in about one day of moderate studying. I can't recall ever learning a data structure more complicated than an AVL tree in school, and I think that was in an extra directed-study class. (If you've not heard of an AVL tree, that's not because they're terribly tricky -- it's because they're now nearly obsolete.)
Mind you, a lot of the stuff I learned studying CS at college was interesting. It just hasn't been particularly relevant to my career. My math classes (I had a double major in CS and math) have actually been much more professionally useful.
I agree with you about the math class. As I mentioned elsewhere in the thread, I ended up doing a minor in CS (which comes out to about 6 courses). I focused these courses on the more theoretical/mathy options, and that has definitely served me well.
I, for one, feel incredibly inadequate for lacking the stuff that you'd get on a CS course which I think actually matters - stuff like algos, operating systems architecture, etc.
I think lack of confidence is a huge factor and it's one that's plagued me for a long time, though I don't want to project my issues with it onto all self-taught programmers.
<oversharing>
I had a somewhat unique situation when it came to choosing my degree course - having been brought up in a new-age spiritual belief system, I was pressured into asking a woman in Indonesia what I ought to pursue (yeah seriously :-S), and ended up doing civil engineering despite having no interest in it. I had grown up coding from age 9, and that along with maths were my passions.
I had the added pleasure of having a vast family crisis occur during the degree which caused me to fail a year and end up with, though a good grade (a british 2:1), nowhere near the performance I could have achieved had the shit not been going on.
So I've got a degree in the wrong subject, and have had to work from scratch into some sort of development career, and now I'm in an internal job working on CRUD apps.
</oversharing>
The really frustrating thing is that many (though thankfully not all) potential good employers seem convinced that you must have a computer science degree or otherwise you're not worth considering (and yeah, I'm looking at you google and microsoft), I know I can learn the things I'm missing and contribute to oss, etc. to become a viable coder at a good place, but if you are basically turned away at the door because you lack the right degree it just doesn't matter.
Obviously for me personally, my degree was plagued with problems which weren't my fault, another way in which I can potentially be deselected from the hiring pool.
To end on a positive note - I am working on fixing these things by filling in the gaps and contributing to OSS - a good solution for people who feel similarly inadequate I feel.
Look to someone like Aaron Patterson. He studied CS at university but he did not really understand programming. Out of school, he took a job where he wrote bad Perl.
After many years of experience and a lot of dedication—he expended much effort reading CS books on different topics—he came to be a solid practitioner and now is a leader in the Ruby community.
I didn't know you were self-taught — I wasn't projecting, but literally confessing my agreement toward the bias you described. As to the parent, envy is typically felt from a position of disadvantage or inferiority.
Missed the connection between your reply and the second paragraph of your parent on first read. I responded initially to your combination of comments with that oversight in mind -- connected inferiority to inclined to disagree to me -- so I owe you an apology. Forgive me.
I don't think you can come up with a stereotype for that.
I've seen just as many people with real-world experience that have trouble "getting shit done" -- because getting shirt done is hard for every human being on this planet.
That said, many people coming from academia do suffer from disappointment with the state of the industry, where boring projects are the ones that generate immediate revenue.
And the ability of seeing the bigger picture (I know it sounds enterprisey, but that's how I see it). I can still remember our 1st year Physics professor telling us, a class of nerdy CS kids, about how familiarity and a deeper understanding of the field you're writing your programs for is way more important than pointers, data structures etc.
As a self-taught programmer myself, I confess this is exactly how I would frame the question. I'm constantly worried there's something crucial to which I'm oblivious.
So then the logical answer is that self taught programmers lack the confidence to realize that they are just as good as formally educated programmers. :)
And I wonder if often better. There is value to having the motivation to learn something before being formally trained in it. I was not too impressed with some of my peers in CS, especially those who could not figure out how to open a file in C in their senior year.
I was self-taught, then formally trained, and since self-taught. I would have to say that both have value and that you are missing something without the formal education. "Confidence" is a good reason, but exposure is important, too. I am sometimes surprised when the college math pops up in my work, spanning anywhere from programming drivers PCI cards to web interfaces. Work with a large enough dataset, and maybe you will need to make use of a different sort from the language-included "quicksort" algorithms.
I thought I could my way out of a paper sack before getting the CS degree. I ended up learning a few things, some trivial, some useful and connecting. You could probably pick it all up up in a couple decades, but four years is a nice jumpstart.
Simultaneously, the learning of approaches and techniques does not end there. For example, I sometimes wish my university had made mention of MOP instead of presenting OOP only the C++, Java, and Ada way.
I think there is a difference between people who can accomplish tasks and people who can accomplish those tasks in a way that they can be easily extended and maintained in the future; in one respect, we can call that experience, and in another, we can call that an exposure to enough approaches/patterns that it is easier to select the best for the job. Any jumpstart is a huge help and can aid in removing the bad habits learned from solo experimentation.
The dangerous programmers are those who don't know what they don't know. You have moved on. Once you know that there are things that you don't know you can always pick up some key texts and fill in the gaps. MIT have some great CS videos online, you might want to check them out.
I'm in the same boat and also worry about it to a certain extent. However, 7 years of getting paid to write software has mostly given me more confidence. Also, I know a lot of really smart people (a lot smarter than I) who studied Computer Science and couldn't program their way out of a paper bag.
I'm not 100% sure that fizz buzz is really the indicator that people make it out to be ... I mean, it doesn't really test software design skills, or the ability to design a complex system with loosely coupled objects.
Fizz buzz is very simple. It's easy to communicate, implement and test, there's nothing fiddly about it. It's the entry level indicator and requires no prior knowledge, other than the ability to turn a simple, stable specification into software.
If you can't do fizz buzz in your chosen language, then it's highly unlikely you can do anything more complicated.
It doesn't test your ability to do any kind of high-level design. It just tests whether you can program at all.
The ability to do high-level design is only important in one of these two situations:
1) The position you are hiring for only involves doing high-level design and not doing any programming.
or
2) The position does involve programming, and the person you are hiring is a competent enough programmer to do fizz buzz.
So do something about it. Between the Internet and possibly some nearby university (where you could sneak in and find out exactly what books all their classes require of the CS students), you'll have access to 99% of the same relevant things you'll need to "come up to par" with the so-called college trained programmer. Wikipedia beckons. Amazon (both as bookstore and cloud hosting provider) beckons. Your terminal beckons. Etc.
As a mostly self taught programmer, I disagree. I think this is an extremely relevant question. There are fields of CS that are generally not encountered when learning programming, in spite of being relevant and often useful. Formal verification and proofs, the lambda calculus, language theory, and other "hard CS" subjects which have real world applications (well, in some fields, anyways) are also relatively rare to run across when self-teaching.
That said, the list in the article is not an especially good one. It might as well have said "The Basics", as far as I'm reading it.
There are many good books and even videos of courses for those things you mention.
You can also join courses of interest if you've got a good university around you; as I haven't seen teachers objecting to outsiders participating in their course.
It is true that effort is required without immediate gratification (so it is hard to learn such subjects on your own), but it is feasible, because if the "hard CS" fields you mention don't peak your interest, I doubt they would've had an impact on you if you attended a CS college. Just go and learn, keeping in mind that it may take a while and you need to keep doing it.
There are indeed. However, without courses to direct you to them, many self-taught programmers don't realize that they should be reading them, or watching the lectures.
The problem isn't one of ability to learn. It's just that it's hard to figure out what you should be looking at.
I am a partially self taught programmer. I did take several courses in university to get a minor in computer science. These clued me in to the holes in my education. Otherwise, I might have figured it out eventually, but it would have been harder.
I'm also saddened to see such a misguided stereotype on the front page here. It's damaging in the same way as the old question, "When did you stop beating your wife?"
To my mind, this question, and the answers given, would only begin to make sense if it were phrased "What skills do people who are not interested in Computer Science commonly lack?"
And pointers? Really? That would make sense if the question was "What skills do people who have never used a language with pointers commonly lack?"
In fairness, once pointers clicked for me, a heaping pile of computing made sense. I banged my head on x86 assembly for a few weeks when I was 14, went back to C and got pointers, then reapproached assembly later and was delighted at how easily it fell into place.
It's my personal belief that a firm grasp of C and any processor's assembly -- protected-mode Intel is a can of worms, there's easier architectures like ARM -- is crucial to success as a programmer. Crucial. Enough so that I weigh a CS program based on their application of it, and so far I've been mostly disappointed. Hence why I remain an autodidact.
I wasn't disagreeing with the importance of pointers at all. And I agree strongly that a firm grasp of C and assembly is extremely valuable. My disbelief was with the notion that self-taught programmers wouldn't understand pointers. I was saying that the only way you could get away without knowing pointers would be if you'd avoided programming in asm/C/C++/etc.
Which lets face it, is pretty common nowadays with all the scripting languages.
In all honesty, for a while i felt like i was lacking knowledge compared to my fellow coworkers, but after a while in the job, there is one truth that i only believe: you are either a natural programmer or not, and that's where the difference will be.
I never took real CS courses, i have a degree in Software Engineering, but was basically just how to write software for administration in .NET, design databases and write proper SQL. Never learned C, ASM, algorithm, data structures or stuff like that at school. But i still get a better understanding of those things that most CS graduate i know...
School will not make you a good programmer, if you are good it will help, but you could have probably achieved the same level of knowledge and skill without it.
Hmm. I did a quick poll of the programmers I know personally & would consider successful (for a reasonable value of success). One has a firm grasp of assembly (which makes sense because he uses it a lot), a handful have a firm grasp of C (most claim to have a "little" C but from experience with them they couldn't build anything w/o a book for guidance :P).
You can't even guarantee people with a CS degree know any of that stuff. In my experience, many of the people I've worked with that had CS dregrees had forgotten that stuff long ago, if they ever knew it.
The people answering on Quora are people who are interested in CS or else they wouldn't be on Quora answering the question. That interest is the reason they know that stuff, being taught it in college just made it easier for them.
> What pieces of the whole are missing?
The implication being that without a formal CS education, it is an impossibility to obtain a whole. As if whole matters; how does one obtain whole, anyway?
This is a very loaded question and perspective that betrays a serious bias, in my opinion. That we're making a generalization out of humanity's life experiences is futile in itself, but alas, the application of said generalization here is far more interesting to me.