But before I went to college I was self-taught and after college I consider myself to be self-teaching all the time. Learning should never end.
And while in college were probably self-taught too. As an ex-academic I believe formal education is about credentialing. Being able to tell someone that you've acquired a degree of mastery we believe is appropriate to some level. And that's fine, but I fundamentally believe that all learning is really self-taught.
Someone lecturing to you is just a different medium from reading it in a book or online video. In all these cases someone who knows the topic better than yourself has manifest some information in some way for you to learn. (It's not like anyone using the term "self-taught" actually means they learned how to do AI from first principles. They learned it by reading a book written by Russell & Norvig.)
And with that said, let me say that CS isn't programming. No more than a degree in biology is the same as being a doctor. In fact the profession of doctor is so specialized they created a special degree just for it, with residencies in specialties -- and you don't need a bio undergrad degree to get into med school.
And as a general rule, if you're passionate about an intellectual pursuit you'll probably be pretty good in it (not asserting how the causality works). Those that learn via books outside of a formal setting are self-selected as it requires a special type of discipline. Although as more people race to become founders and teach themselves, this pool probably gets diluted.
As a self-taught developer, college-graduate, and continual learner, I propose that exposure is the most important benefit of the college experience. We have to know what questions to ask before we can ask them. We can accidentally walk into all kinds of concepts on our own, but the college experience is a kind of jumpstart, a dive into the large pond. Now we know some questions to ask and have an idea where to get answers. We have more patterns at our disposal, more tools in our belt.
Also, there is that credential thing and the higher paycheck. And the networking.
I'm self taught, the last math class I took was 9th grade Algebra.
I wrote one of the first vector based, anti-aliased, alpha channeled UI frameworks for Windows 95 (16 bit!). I wrote a DSP processing engine for a telemedical application to monitor heart rate and blood pressure in 1997. I've written control software for elevators. I've written contract after effects plugins for post fx shops. I've written audio and midi sequencers. My video editing app, Shave, is the only other useful editor in the Mac App Store other than iMovie.
I've never cracked a math book.
Am I the exception that proves the rule? I'm not saying I could write Maya, but I think you are overvaluing your opinion a little.
All of the mathematics listed above is on the short list of what anybody following the Khan academy or the MIT open courseware would teach themselves. It's already been shared and organized into a curriculum, for free, by a number of different sources. In fact, I'd say the process of learning the software would be the bigger challenge for an independent learner.
But even before the availability of those sorts of really convenient tools a lot of people have self-taught themselves past that level. In fact, I remember my abstract algebra prof telling us an anecdote to illustrate the importance of working through things on our own instead of waiting to see what was presented to us in our courses. He talked about a grad level course that he had been teaching for the past 10 years. Clearly, he knew the material inside and out, but the interesting thing is that he had never taken it himself as a student. How did he do it? He read a couple of books about the topic! It's a time-tested method.
I'd say if people aren't learning the math it's because they underestimate its importance. Either that, or people like me (and maybe you) overestimate its importance.
shrugs I don't have a degree and I'm fairly comfortable with all those topics (and quite a few more - including abstract algebra, real analysis, numerical methods, tiny bits and pieces of category theory, etc).
I like to read journal articles, and when I stumble onto something I don't know, I go learn about it. Just in the last year or so, I've taught myself stochastic calculus (I was doing HFT and wanted to learn more about the greeks) and the basic typed lambda calculus (was into haskell and wanted to learn more type theory). These days I'm doing distributed systems, so I'm brushing up on the process calculi.
This is a point that seems obvious but I'm not sure it is actually true. I majored in math and took a number of computer science courses and have a hard time figuring out where to begin when it comes to signal processing and videogame code. In contrast, I know a number of guys who make video games and audio software and they are almost all college dropouts or have completely unrelated degrees. In fact, in my limited experience it seems like games and audio software are two parts of the software industry where not having a CS degrees is the norm.
I think the maths-in-programming topic is a bit of a distraction. To be blunt, general programming doesn't need any university-level mathematics at all, assuming a decent pre-university maths education. On the other hand, specialist programming in mathematical fields typically needs specialist mathematics of at least masters level, which surely no CS undergrad course is going to cover because not even good maths undergrad courses do.
Any sort of maths, really. When my cow-orkers want to look for correlations in graphs they quite literally print them all, lay them out on a meeting room table and stare at them. I just run Spearman and Pearson coefficients on every possible combination, then I look. I look for regular patterns using Fourier. I optimize systems using Linear Programming. My self-taught colleagues are good at their jobs day-to-day but seriously, I am being driven up the wall by alerts and reports that trigger on some dumb threshold (e.g. loadavg 10) and not on some change in the behavior or response of the system...
As a current college student I can tell you that what you are saying is an exaggeration. A small subset of Linear Algebra is required for graphics . I took linear algebra in first year of college and forgot almost all of it by the time I took a second year graphics, needless to say I had no problem picking up the concepts in a weekend from scratch. The amount of LA required is a very very small subset compared to all the crap you do in a full blown LA course.
Most students in the CS program hate math and CS theory courses. Subjects like Algorithm Analysis, Discrete Math, Automata Theory which often get cited as examples of stuff that self-taught programmers might not know are boring and annoying. Almost every student in the department dreads these courses but has to hold his/her nose and take them to fulfill the degree requirement and most people promptly forget these courses after passing the exam unless they have real interest in the topic and are taking fourth year electives in the subject. To be honest I don't think the self-taught programmers are missing anything.
And congratulations for digging up a use case for Calculus in CS. I can site examples of CS fields where say Cognitive Psychology has huge influence. The fact still remains that it is completely irrelevant to most of CS unless you are interesting in that one obscure area (in which case more power to you).
You might argue that they don't fit your definition of "good schools," but plenty of schools let you skim by with only the lightest introduction into things like set theory, probability, Turing machines, and automata. The math requirements are also pretty shallow, usually only requiring you to take some level of calculus, but not requiring linear algebra or analysis. Theory courses that scratch the surface a bit deeper are often electives. Some schools force you on tracks, but others let you choose and you can basically glue javascript and ruby together for the rest of your degree.
The tracks allow a similar siloing. If you take an applications track, it's likely you won't be learning fourier transforms that you'd get in the graphics and vision track. In either of those cases, you may not get the functional programming experience that you would get in the AI or theory tracks. Those two wouldn't require you to take the database courses you'd need for info science.
There's only so much that classes can cover in the course of an undergraduate education. Teaching yourself advanced topics is likely essential in taking on a project of a different nature than what you learned in school.
Sadly in the real world 90% of IT jobs can be winged by googling snippets and reworking them. Even worse people judge what's on the outside. I worked with a web dev that didn't even know js and didn't have highschool degree, he got the job because he "looked nerdy".
Think about how many times you've worked on a unique and perfect piece of code, only to realize someone's already made it. Usually with clever optimisations you never thought of. So it might be in a different language or framework, but porting it would have been easier than understanding the issue and reworking it.
A good code monkey understands the problem, a good businessman doesn't bother and repackages other people's stuff at a price.
I myself have a compsci degree and upvoted you, but the people in charge often don't get this.
The difference between mediocrity and brilliance --in ANY field-- lies in something that has nothing whatsoever to do with a formal education. I have met so many people with impressive pedigree's that are clueless to not need further proof. I have also met a good number of people with what I would call "interrupted educations" that focused so intensely on a particular field of study that they truly became masters within that field.
In engineering or cs there's also what happens before university.
In my particular case, I built my first computer way before I saw my first college textbook on the subject. And, by "build my first computer" I mean that I wired the CPU and ALU from discrete components (Who knows how a diode matrix can be used as an instruction decoder?), created my own machine language and coded instructions bit-by-bit into memory.
After that came wire-wrapping 6502, 8080, 8085 and 68000 computers, again, before seeing my first college textbook. And so, it only stands to reason that the focus and drive once in college and out of college was very, very different from that of someone who never had any such experiences and came to college with a blank stare waiting to be taught something they knew nothing about.
The physics, linear algebra and calculus portions of my degree were less than 9 months of study, and I went to a very good school for computer science.
I think you're overvaluing those if you think someone cannot learn those topics if it's apropos to the thing they're doing.
Signal processing is a considerably bigger chunk of schooling though.
I don't disagree with your opinion, I prefer school credentialed programmers, however I don't think your line of reasoning works.
There seem to be a fair number of programmers who are BOTH college/uni-educated AND learnt it all on their own. What I mean is one of their previous employers/clients (perhaps their first) have them on file as having some CS/SE credential, while others (including their current one) have them listed as self-educated. Perhaps they told one employer their major was computing, but their current client thinks their major was business.
One way to recognize these frauds is whether they list their credentials online. They may write online that you don't need qualifications to be a good programmer, which is true, but they won't actually say they don't have any credentials because that's not what they've told their previous employers and they don't want to be exposed.
When there's 2 people giving presentations, one lists their PhD from a certain university and the other only lists some IT groups they run, I know which one I'll pay more attention to.
With sites like khan academy the expectations for self taught programmers can be much higher now than before. If someone isn't a mathematician I think they can still do better than gluing Javascript and Ruby together.
>"There are some things that can't be self taught."
Do books not matter anymore? The most brilliant ideas ever conceived and implemented in society are written down. All information that goes into your head comes in as a concept in some form or another. If it can be conceptualized, it can be communicated (whether in a class, a book, or experienced through trial and error). What we're really saying is there are some concepts that self-taught programmers aren't discovering. Point them out and they'll find them (they're in books).
School is awesome. I went. But don't believe the hype.
Some people actually believe it isn't possible to learn sufficiently complex things without instruction. I suspect this is because they themselves are unable, unwilling, or have not tried to learn without instruction. I had a professor that insisted I was cheating because I was able to get A's on projects and tests in a C course, but did not attend any classes or discussions. He insisted that it was absolutely impossible to learn C without taking a course and attending the lectures.
To be fair, you should actually quote what I wrote which was:
"Personally, I think the differences come at the top end. I think computer science students who've spent a lot of time doing research (particularly Ph.D.s) gain something that can't be self-taught."
So, in this context, I think it makes sense. Yes, there will always be edge cases like Ramanujan (0.00001% of the population) but I took a little liberty not to qualify every single statement I made.
If anything, this was more about giving respect to the <1% of people who have Ph.D's. But I guess you were offended.
Generally speaking, it's not that it's impossible someone who doesn't go to school will learn things, it is just less likely.
I generally expect a greater degree of people who went to school (therefore COULD benefit from instruction) have a higher chance of foundational knowledge helpful in a computer based career.
At the same time, I met dozens of nitwits while at school who can't code their way out of a paper bag and misunderstood half their classes.
School increases their likelihood of being good, it doesn't guarantee it.
School is awesome in that it helps show you things you should know about, but otherwise wouldn't be aware of. So far as ignorance of a subject's existence prevents you from self-teaching, there are subjects that cannot be self taught.
When you are self-learning from books, you only learn as fast as you personally can.
With an instructor (if lucky, a good instructor) you learn same material, but much, much quicker due to how course program is laid out, experience of the instructor, etc.
In the end, it's up to you and how you want to spend the time on this earth.
Also, there are many kinds of self-taught programmers. Some are task-oriented learners* , and will learn CS concepts they encounter on the way to achieving their underlying goal. (This seems to be the kind the article has in mind.) This has its problems. For example, rather than realizing that their problem is easily solved with parsing tools, they may just lean harder on the regular expressions they already know. Learning within a classroom setting would direct them to ideas they may not otherwise encounter, nudging them out of local maxima.
Others self-learners try to get a full overview of whatever niche they're working in. Perhaps they've been burned by missing concepts from purely task-oriented learning, or perhaps they find having some big picture understanding makes finding practical applications easier. (I fall into the latter.) One problem with this group is that learning everything by breadth-first search can take a while - I wrote a web server from scratch to figure out how web programming works, while some people would be content just going through a Rails tutorial or something. That kind of perpetual, open-ended research really adds up, though.
> Perhaps they've been burned by missing concepts from purely task-oriented learning, or perhaps they find having some big picture understanding makes finding practical applications easier.
Or we just like to learn, or we've been told by people we respect that we ought to be better grounded in theory. (Both are true in my case.)
In response to a post about raising smart kids on Slashdot a long time ago, someone posted this:
"Uh-oh, the ground is trembling, (Score:4, Funny)
by Anonymous Coward on Thursday November 29, @08:06AM
Small mammals are scurrying for cover,
All the birds have taken wing.
The hordes of self-proclaimed geniuses who wander the halls of Slashdot approach."
This is possibly the Hacker News equivalent of that topic. It appears impossible to have these discussions without the whole thing degenerating into thinly-concealed self-praise.
'Self-taught' vs 'CS-educated' covers such a wide range as to make the question almost meaningless, in any case. Even among CS-educated people, most of us have progressively forgotten and relearned so much as to have way more in common with 'self-taught' than we'd care to admit. For example, I took computer architecture courses in both undergrad and grad school, but pretty much forgot it all and relearned almost everything that I know about it now in a very different context (high-end x86 that didn't exist back when I took comp arch). Much of what I 'knew' then isn't even true anymore...
And 'self-taught' could mean "ploughed though Cormen, Leiserson and Rivest + TAOCP + SICP + Hennesy&Patterson" while CS-educated can equally mean "took a bunch of Java courses and dodged all the hard stuff I could".
I'm a mostly self-taught programmer (I took a class on QBasic and a class on Visual Basic in community college).
At the risk of generalizing, self-taught programmers tend to learn things as we need them, since our primary focus seems to be on making features or making products.
I will say that I greatly appreciate the academic programmers though, as without them I wouldn't have any tools to work with. I have no drive to create a new database storage engine, a more efficient bloom filter, or an experimental programming language, but I'm grateful that someone gave me those things to play with.
My experience is that CS-educated programmers will often be more humble and ready to admit that they might not know all there is about a subject, and self-taught programmers more certain that they know the one way to solve a certain problem.
Of course, this might just be the people I've met, but based on personal experience, I think university teaches you that you're _not_ the smartest one in the world, that there are lots of things you don't know, and that things are usually not as simple as they seem.
That said, a lot of the self-taught programmers I know get more humble as the years go by. And of course, all the great CS-educated programmers I know learnt programming in their spare time, and got the theoretical and low-level background at uni.
I think this statement is funnily self-negating: "I already understand grammatical structure, the relationships between subject/object/verb and the uses of prepositions." This guy must be learning Romance languages (e.g. surprise! he's learning Portugese) since languages outside of this family differ in a lot of ways. E.g. all the things here can and do differ: http://en.wikipedia.org/wiki/Romance_language#Linguistic_fea...
This sort of euro-centric natural language egalitarianism seems to bleed over into his thoughts about programming languages as well, e.g. those expressed in this statement:
"Learning a new language simply teaches me to communicate the same thoughts and feelings but in a different way."
This is wholly false. Languages differ with respect to their requirements for self-description. These requirements, when propagated into code through the actions of a large community, shape the types of programs that are written and how those programs can be expected to interact.
For instance, part of the reason that Haskell programs can be very short, is that the type system on which Haskell is based is extremely deeply thought out and based on a rich mathematical framework. This framework allows the programs to be self-describing in a consistent and meaningful way and for that self-description to be used to express ideas more clearly.
Ruby is self-reflecting through a sort of imperative set of meta-programming techniques. This allows "conventions" to exist in ruby code which enables a framework like rails.
Etc. etc.
When will people realize that not all languages are created the same? Language shapes culture and culture shapes language. Once you put a stick in the ground and decide where features will be located and how they will be inter-related you are planting the seed for all sorts of complicated emergent behavior.
It's true for natural languages and for programming languages. This guy just seems to have missed the ticket.
The problem here is that you can't group all of one type together. There will always be brilliant self-taught programmers. From my experience in the field, however, is that self-taught will often take the first solution over the best solution, or will pick the best solution to their particular problem without thinking enough about coding standards or clean integration into the code base. There are plenty of tools out there to ensure this kind of thing in other languages, but I don't often work with those.
Of course, there are also many schooled programmers which may be able to think critically but lack the ability to go from a program to a product.
But not all of course... you can't make these stereotypes without starting a flamewar.
I tend to agree with Mark Twain on this point: "I have never let my schooling interfere with my education."
For me, I have learned more outside of school than I have in it. Really I'm in it for the diploma. I wish companies would look at your software rather than your certificates, I think they would tend to find better developers. I know some companies are good about this but the reality is that programmers do need to go to college if they want to compete for jobs.
I will say this for school: it fills in gaps in education so companies can expect some standard knowledge from everyone. Also, it can be helpful for people that don't have the motivation to learn on their own.
Agreed on the math point. I took CS50 (Introduction to Comp Sci) at school my Senior Year and being that my focus was directed mostly to kegonomics, I didn't quite get as much out of the course as I should have. I also took "Bits" which is watered down Comp Sci though the professor Harry Lewis said Zuckerberg got a C in it (?!?!?).
What I did learn was the basics of putting together algorithms and "thinking like a computer." For a guy who studied Social Anthropology and whose last math course was in High School, you can imagine the nitty gritty of building a C search algorithm was difficult to get at first glance (Linear search, bubble search my a$*).
To cut the BS:
1) CS I took was broken into discrete testable units. For each problem set there was a core CS theory that you needed to understand to be able to finish it. Some were less functional (ie arcane data structures), others were basics of programming that anyone should know like the back of their hand (pointers, data manipulation etc).
2) When self-teaching, you tend to pull together bite size chunks of important info necessary to solve a particular problem rather than building a solid foundation. If you're completely self taught, you'll miss 101 level theory points that may help you later when tackling a known problem that has a solution or is nearly impossible. That said, in self teaching myself, I've cobbled together quite a bag of tricks as well as the resourcefulness to pull up any info I need to solve a problem and absorb it quickly. I've yet to meet a problem I couldn't tackle just because I wasnt a "CS Educated Programmer".
Through the course though, the biggest takeaway for a non quant type like me was breaking problems down into discrete parts solved and tested by logic loops (read: thinking like a computer). The basic structures and solutions to problems involved I still use today when I program for the web.
I see too many programmers that get in it for the money and not the passion. Having passion removes the need to be formally instructed. Passion gives people the drive to excel and be the best. However, you do get a big picture view of what's going on having earned a degree. The slackers tend to be the non-self-teaching among us.
I once read something to this effect from Oded Goldreich's book (his book on Computational Complexity): Knowledge is the result of hard computation on publicly available information. I think getting a formal education definitely aids the process of learning. Otherwise how do you get around Meno's paradox (i.e. how do you enquire about something if you don't know of its existence?) ? And self-taught programmers definitely would benefit from some structure in their education (again - the structure is decided by a formal CS curriculum). I have been trying to learn signal processing over the last couple of years and I found that OCW + Berkeley webcasts took me a lot farther than random googling about how to accomplish something.
"Learning a new language simply teaches me to communicate the same thoughts and feelings but in a different way. This is the same with programming languages: you accomplish the same tasks in a different language that has different syntax."
I liked that. A computer language, or CS, are both, for me, means to turn an idea into reality. I don't think it necessarily matters which way you were trainer, so long as the idea you're trying to execute gets done. Success either way imo.
I would have very much liked to have a CS education (I have an MS in Neuroscience), but did not really know I had aptitude and a passion for it until later in my life. I took the long self-taught route to programming being very task driven, ie the first business I started needed certain things so I just did it. Was it ugly? oh heck ya! To some degree it still is, but for many years it has more than payed the rent.
I very much miss a mathematics background but these days there are many sources of information that can and do aid in the solving of programming problems.
I have railed against "credentialism" for years because ultimately there have been many people I have worked with who were capable of many tasks but not allowed to the opportunity because they lacked a degree, but not the skills. And don't get me started on people doing the identical job but one getting more due only to a degree.
A credential tells me what you might be able to do, a body of work shows me what you can do.
A bit of background about me before I add my 2 cents: because of my rank in an entrance examination (JEE), I ended up majoring in Civil Engineering and managed to work towards a minor in CS (which was, and is my passion). I'll be graduating in a few months.
I've experienced a bit of both worlds—I picked up books on Data Structures (including Red Black trees), attempted to implement Rjindael in C++ (without understanding any of the underlying math) in high school, learnt PHP/JS/CSS/C++ and started building from there.
What I've observed is—as a self taught programmer the biggest disadvantage is that you don't know what all is available/standard—as someone else mentioned in the thread, I did not know about parsers until I managed to take a course in Programming Languages.
Since I realized that there was so much I did not know, I've tried to make it a point to keep asking my batch-mates in CS what they are reading, picking up textbooks recommended by professors in class; reading other books as recommended on HN, and elsewhere (SICP, Learn you a Haskell..., started reading TAOCP, etc.) and have attempted to at least match my batch-mates who are CS undergrads. At the very least—try to get a fairly broad idea about known solved and unsolved problems.
The biggest advantages an avg CS undergrad has over me is that s/he has the credentials (which, I've tried to match by having my own open source project, doing interns in well-known companies, etc.), and that s/he is exposed to much more theory than I would ever be without actually having to do much beyond attending classes (for which I have to go the extra mile).
The advantage _I_ have over the other, standard CS guys is that I have the freedom to find out more about what I really want to do, and explore/follow certain areas which I find more interesting without being bound by academia (tests, reports, stupid & pointless assignments), and in general, perhaps—have a lot more fun while learning.
There is no divide, like anything in life if a person simply uses it as a means to an end then the product is going to reflect this. This is true with anything.
I think this the the point -- that in general someone who is not in a PhD program generally won't spend such a huge amount of time focused purely on a very narrow but deep problem.
There are obviously exceptions to every rule, but I think this is a good point. Most folks who are NOT in an academic program don't take out loans and stop work on all practical projects for 3-5 years to focus like this.
I'm not very familiar with the CS PhD world -- I'm very much in the self-taught category, personally -- but I'm married to an author who got a (fully-funded) MFA in creative writing. It was great -- not because the profs were teaching anyone how to write (if you didn't already know, you didn't get into the program), but because it gave her a couple of years out of the real world, focused entirely on her writing, surrounded by very supportive & similarly focused people.
Am I missing something, or does this article basically say: within the domain of self-taught and c-educated programmers, there are groupings with various levels of theoretical and practical skill?
It seems it wouldn't be a stretch to say that, "cs-educated programmers" aren't even really identifiable by trait, since course selections made by both the university department and the student can change the curriculum unpredictably. The same could be said for "self-taught;" in my experience, half the people in cs-related math or theory classes just read the book and don't bother to attend class anyway.
[+] [-] kenjackson|15 years ago|reply
And while in college were probably self-taught too. As an ex-academic I believe formal education is about credentialing. Being able to tell someone that you've acquired a degree of mastery we believe is appropriate to some level. And that's fine, but I fundamentally believe that all learning is really self-taught.
Someone lecturing to you is just a different medium from reading it in a book or online video. In all these cases someone who knows the topic better than yourself has manifest some information in some way for you to learn. (It's not like anyone using the term "self-taught" actually means they learned how to do AI from first principles. They learned it by reading a book written by Russell & Norvig.)
And with that said, let me say that CS isn't programming. No more than a degree in biology is the same as being a doctor. In fact the profession of doctor is so specialized they created a special degree just for it, with residencies in specialties -- and you don't need a bio undergrad degree to get into med school.
And as a general rule, if you're passionate about an intellectual pursuit you'll probably be pretty good in it (not asserting how the causality works). Those that learn via books outside of a formal setting are self-selected as it requires a special type of discipline. Although as more people race to become founders and teach themselves, this pool probably gets diluted.
[+] [-] Xurinos|15 years ago|reply
Also, there is that credential thing and the higher paycheck. And the networking.
[+] [-] bartonfink|15 years ago|reply
As an ex-academic with this view, how much stock do you put in credentials?
[+] [-] freshfunk|15 years ago|reply
[+] [-] pkaler|15 years ago|reply
I have met very few self-taught programmers that also happen to be self-taught mathematicians. This limits the type of code you can write.
Linear algebra is required to deeply understand computer graphics.
Calculus is required anywhere you have signal processing. This means audio and video editing.
Physics is required for simulation software and video games.
Discrete and combinatorial math is required in systems software like databases.
You're just not going to hit these issues if what you do all day is glue Javascript and Ruby together.
[+] [-] jawngee|15 years ago|reply
I'm self taught, the last math class I took was 9th grade Algebra.
I wrote one of the first vector based, anti-aliased, alpha channeled UI frameworks for Windows 95 (16 bit!). I wrote a DSP processing engine for a telemedical application to monitor heart rate and blood pressure in 1997. I've written control software for elevators. I've written contract after effects plugins for post fx shops. I've written audio and midi sequencers. My video editing app, Shave, is the only other useful editor in the Mac App Store other than iMovie.
I've never cracked a math book.
Am I the exception that proves the rule? I'm not saying I could write Maya, but I think you are overvaluing your opinion a little.
[+] [-] xiaoma|15 years ago|reply
But even before the availability of those sorts of really convenient tools a lot of people have self-taught themselves past that level. In fact, I remember my abstract algebra prof telling us an anecdote to illustrate the importance of working through things on our own instead of waiting to see what was presented to us in our courses. He talked about a grad level course that he had been teaching for the past 10 years. Clearly, he knew the material inside and out, but the interesting thing is that he had never taken it himself as a student. How did he do it? He read a couple of books about the topic! It's a time-tested method.
I'd say if people aren't learning the math it's because they underestimate its importance. Either that, or people like me (and maybe you) overestimate its importance.
[+] [-] smanek|15 years ago|reply
I like to read journal articles, and when I stumble onto something I don't know, I go learn about it. Just in the last year or so, I've taught myself stochastic calculus (I was doing HFT and wanted to learn more about the greeks) and the basic typed lambda calculus (was into haskell and wanted to learn more type theory). These days I'm doing distributed systems, so I'm brushing up on the process calculi.
[+] [-] rdouble|15 years ago|reply
[+] [-] Silhouette|15 years ago|reply
[+] [-] gaius|15 years ago|reply
[+] [-] reedF211|15 years ago|reply
Most students in the CS program hate math and CS theory courses. Subjects like Algorithm Analysis, Discrete Math, Automata Theory which often get cited as examples of stuff that self-taught programmers might not know are boring and annoying. Almost every student in the department dreads these courses but has to hold his/her nose and take them to fulfill the degree requirement and most people promptly forget these courses after passing the exam unless they have real interest in the topic and are taking fourth year electives in the subject. To be honest I don't think the self-taught programmers are missing anything.
And congratulations for digging up a use case for Calculus in CS. I can site examples of CS fields where say Cognitive Psychology has huge influence. The fact still remains that it is completely irrelevant to most of CS unless you are interesting in that one obscure area (in which case more power to you).
[+] [-] antiterra|15 years ago|reply
The tracks allow a similar siloing. If you take an applications track, it's likely you won't be learning fourier transforms that you'd get in the graphics and vision track. In either of those cases, you may not get the functional programming experience that you would get in the AI or theory tracks. Those two wouldn't require you to take the database courses you'd need for info science.
There's only so much that classes can cover in the course of an undergraduate education. Teaching yourself advanced topics is likely essential in taking on a project of a different nature than what you learned in school.
[+] [-] klochner|15 years ago|reply
You can actually make a decent living as a programmer by just gluing js/ruby together, since that constitutes the bulk of most programming jobs.
I guess the point is that formal eduction forces you to learn advanced math, whereas only the motivated self-taught programmers learn it.
[+] [-] pippy|15 years ago|reply
Think about how many times you've worked on a unique and perfect piece of code, only to realize someone's already made it. Usually with clever optimisations you never thought of. So it might be in a different language or framework, but porting it would have been easier than understanding the issue and reworking it.
A good code monkey understands the problem, a good businessman doesn't bother and repackages other people's stuff at a price.
I myself have a compsci degree and upvoted you, but the people in charge often don't get this.
[+] [-] algoshift|15 years ago|reply
The difference between mediocrity and brilliance --in ANY field-- lies in something that has nothing whatsoever to do with a formal education. I have met so many people with impressive pedigree's that are clueless to not need further proof. I have also met a good number of people with what I would call "interrupted educations" that focused so intensely on a particular field of study that they truly became masters within that field.
In engineering or cs there's also what happens before university.
In my particular case, I built my first computer way before I saw my first college textbook on the subject. And, by "build my first computer" I mean that I wired the CPU and ALU from discrete components (Who knows how a diode matrix can be used as an instruction decoder?), created my own machine language and coded instructions bit-by-bit into memory.
After that came wire-wrapping 6502, 8080, 8085 and 68000 computers, again, before seeing my first college textbook. And so, it only stands to reason that the focus and drive once in college and out of college was very, very different from that of someone who never had any such experiences and came to college with a blank stare waiting to be taught something they knew nothing about.
[+] [-] jksmith|15 years ago|reply
[+] [-] gte910h|15 years ago|reply
I think you're overvaluing those if you think someone cannot learn those topics if it's apropos to the thing they're doing.
Signal processing is a considerably bigger chunk of schooling though.
I don't disagree with your opinion, I prefer school credentialed programmers, however I don't think your line of reasoning works.
[+] [-] vorg|15 years ago|reply
One way to recognize these frauds is whether they list their credentials online. They may write online that you don't need qualifications to be a good programmer, which is true, but they won't actually say they don't have any credentials because that's not what they've told their previous employers and they don't want to be exposed.
When there's 2 people giving presentations, one lists their PhD from a certain university and the other only lists some IT groups they run, I know which one I'll pay more attention to.
[+] [-] rickdale|15 years ago|reply
[+] [-] DanielRibeiro|15 years ago|reply
[+] [-] logic_magic|15 years ago|reply
Any good math books you can recommend, for people who are genuinely scared of complicated equations? And without losing my day job(graphics designer).
[+] [-] entangld|15 years ago|reply
>"There are some things that can't be self taught."
Do books not matter anymore? The most brilliant ideas ever conceived and implemented in society are written down. All information that goes into your head comes in as a concept in some form or another. If it can be conceptualized, it can be communicated (whether in a class, a book, or experienced through trial and error). What we're really saying is there are some concepts that self-taught programmers aren't discovering. Point them out and they'll find them (they're in books).
School is awesome. I went. But don't believe the hype.
[+] [-] jcnnghm|15 years ago|reply
[+] [-] freshfunk|15 years ago|reply
"Personally, I think the differences come at the top end. I think computer science students who've spent a lot of time doing research (particularly Ph.D.s) gain something that can't be self-taught."
So, in this context, I think it makes sense. Yes, there will always be edge cases like Ramanujan (0.00001% of the population) but I took a little liberty not to qualify every single statement I made.
If anything, this was more about giving respect to the <1% of people who have Ph.D's. But I guess you were offended.
[+] [-] gte910h|15 years ago|reply
I generally expect a greater degree of people who went to school (therefore COULD benefit from instruction) have a higher chance of foundational knowledge helpful in a computer based career.
At the same time, I met dozens of nitwits while at school who can't code their way out of a paper bag and misunderstood half their classes.
School increases their likelihood of being good, it doesn't guarantee it.
[+] [-] awj|15 years ago|reply
[+] [-] kirbman89|15 years ago|reply
[+] [-] MrVitaliy|15 years ago|reply
With an instructor (if lucky, a good instructor) you learn same material, but much, much quicker due to how course program is laid out, experience of the instructor, etc.
In the end, it's up to you and how you want to spend the time on this earth.
[+] [-] silentbicycle|15 years ago|reply
Others self-learners try to get a full overview of whatever niche they're working in. Perhaps they've been burned by missing concepts from purely task-oriented learning, or perhaps they find having some big picture understanding makes finding practical applications easier. (I fall into the latter.) One problem with this group is that learning everything by breadth-first search can take a while - I wrote a web server from scratch to figure out how web programming works, while some people would be content just going through a Rails tutorial or something. That kind of perpetual, open-ended research really adds up, though.
* just making up terms here.
[+] [-] kragen|15 years ago|reply
Or we just like to learn, or we've been told by people we respect that we ought to be better grounded in theory. (Both are true in my case.)
[+] [-] onan_barbarian|15 years ago|reply
"Uh-oh, the ground is trembling, (Score:4, Funny) by Anonymous Coward on Thursday November 29, @08:06AM Small mammals are scurrying for cover, All the birds have taken wing.
The hordes of self-proclaimed geniuses who wander the halls of Slashdot approach."
This is possibly the Hacker News equivalent of that topic. It appears impossible to have these discussions without the whole thing degenerating into thinly-concealed self-praise.
'Self-taught' vs 'CS-educated' covers such a wide range as to make the question almost meaningless, in any case. Even among CS-educated people, most of us have progressively forgotten and relearned so much as to have way more in common with 'self-taught' than we'd care to admit. For example, I took computer architecture courses in both undergrad and grad school, but pretty much forgot it all and relearned almost everything that I know about it now in a very different context (high-end x86 that didn't exist back when I took comp arch). Much of what I 'knew' then isn't even true anymore...
And 'self-taught' could mean "ploughed though Cormen, Leiserson and Rivest + TAOCP + SICP + Hennesy&Patterson" while CS-educated can equally mean "took a bunch of Java courses and dodged all the hard stuff I could".
[+] [-] jarin|15 years ago|reply
At the risk of generalizing, self-taught programmers tend to learn things as we need them, since our primary focus seems to be on making features or making products.
I will say that I greatly appreciate the academic programmers though, as without them I wouldn't have any tools to work with. I have no drive to create a new database storage engine, a more efficient bloom filter, or an experimental programming language, but I'm grateful that someone gave me those things to play with.
[+] [-] gnaffle|15 years ago|reply
Of course, this might just be the people I've met, but based on personal experience, I think university teaches you that you're _not_ the smartest one in the world, that there are lots of things you don't know, and that things are usually not as simple as they seem.
That said, a lot of the self-taught programmers I know get more humble as the years go by. And of course, all the great CS-educated programmers I know learnt programming in their spare time, and got the theoretical and low-level background at uni.
[+] [-] yelsgib|15 years ago|reply
This sort of euro-centric natural language egalitarianism seems to bleed over into his thoughts about programming languages as well, e.g. those expressed in this statement:
"Learning a new language simply teaches me to communicate the same thoughts and feelings but in a different way."
This is wholly false. Languages differ with respect to their requirements for self-description. These requirements, when propagated into code through the actions of a large community, shape the types of programs that are written and how those programs can be expected to interact.
For instance, part of the reason that Haskell programs can be very short, is that the type system on which Haskell is based is extremely deeply thought out and based on a rich mathematical framework. This framework allows the programs to be self-describing in a consistent and meaningful way and for that self-description to be used to express ideas more clearly.
Ruby is self-reflecting through a sort of imperative set of meta-programming techniques. This allows "conventions" to exist in ruby code which enables a framework like rails.
Etc. etc.
When will people realize that not all languages are created the same? Language shapes culture and culture shapes language. Once you put a stick in the ground and decide where features will be located and how they will be inter-related you are planting the seed for all sorts of complicated emergent behavior.
It's true for natural languages and for programming languages. This guy just seems to have missed the ticket.
[+] [-] KeyBoardG|15 years ago|reply
Of course, there are also many schooled programmers which may be able to think critically but lack the ability to go from a program to a product.
But not all of course... you can't make these stereotypes without starting a flamewar.
[+] [-] joelburget|15 years ago|reply
For me, I have learned more outside of school than I have in it. Really I'm in it for the diploma. I wish companies would look at your software rather than your certificates, I think they would tend to find better developers. I know some companies are good about this but the reality is that programmers do need to go to college if they want to compete for jobs.
I will say this for school: it fills in gaps in education so companies can expect some standard knowledge from everyone. Also, it can be helpful for people that don't have the motivation to learn on their own.
[+] [-] EMRo|15 years ago|reply
What I did learn was the basics of putting together algorithms and "thinking like a computer." For a guy who studied Social Anthropology and whose last math course was in High School, you can imagine the nitty gritty of building a C search algorithm was difficult to get at first glance (Linear search, bubble search my a$*).
To cut the BS:
1) CS I took was broken into discrete testable units. For each problem set there was a core CS theory that you needed to understand to be able to finish it. Some were less functional (ie arcane data structures), others were basics of programming that anyone should know like the back of their hand (pointers, data manipulation etc).
2) When self-teaching, you tend to pull together bite size chunks of important info necessary to solve a particular problem rather than building a solid foundation. If you're completely self taught, you'll miss 101 level theory points that may help you later when tackling a known problem that has a solution or is nearly impossible. That said, in self teaching myself, I've cobbled together quite a bag of tricks as well as the resourcefulness to pull up any info I need to solve a problem and absorb it quickly. I've yet to meet a problem I couldn't tackle just because I wasnt a "CS Educated Programmer".
Through the course though, the biggest takeaway for a non quant type like me was breaking problems down into discrete parts solved and tested by logic loops (read: thinking like a computer). The basic structures and solutions to problems involved I still use today when I program for the web.
[+] [-] kailashbadu|15 years ago|reply
[+] [-] kirbman89|15 years ago|reply
[+] [-] shriphani|15 years ago|reply
[+] [-] onassar|15 years ago|reply
I liked that. A computer language, or CS, are both, for me, means to turn an idea into reality. I don't think it necessarily matters which way you were trainer, so long as the idea you're trying to execute gets done. Success either way imo.
[+] [-] lowprofile|15 years ago|reply
I very much miss a mathematics background but these days there are many sources of information that can and do aid in the solving of programming problems.
I have railed against "credentialism" for years because ultimately there have been many people I have worked with who were capable of many tasks but not allowed to the opportunity because they lacked a degree, but not the skills. And don't get me started on people doing the identical job but one getting more due only to a degree.
A credential tells me what you might be able to do, a body of work shows me what you can do.
[+] [-] kunalb|15 years ago|reply
I've experienced a bit of both worlds—I picked up books on Data Structures (including Red Black trees), attempted to implement Rjindael in C++ (without understanding any of the underlying math) in high school, learnt PHP/JS/CSS/C++ and started building from there.
What I've observed is—as a self taught programmer the biggest disadvantage is that you don't know what all is available/standard—as someone else mentioned in the thread, I did not know about parsers until I managed to take a course in Programming Languages.
Since I realized that there was so much I did not know, I've tried to make it a point to keep asking my batch-mates in CS what they are reading, picking up textbooks recommended by professors in class; reading other books as recommended on HN, and elsewhere (SICP, Learn you a Haskell..., started reading TAOCP, etc.) and have attempted to at least match my batch-mates who are CS undergrads. At the very least—try to get a fairly broad idea about known solved and unsolved problems.
The biggest advantages an avg CS undergrad has over me is that s/he has the credentials (which, I've tried to match by having my own open source project, doing interns in well-known companies, etc.), and that s/he is exposed to much more theory than I would ever be without actually having to do much beyond attending classes (for which I have to go the extra mile).
The advantage _I_ have over the other, standard CS guys is that I have the freedom to find out more about what I really want to do, and explore/follow certain areas which I find more interesting without being bound by academia (tests, reports, stupid & pointless assignments), and in general, perhaps—have a lot more fun while learning.
[+] [-] nwmcsween|15 years ago|reply
[+] [-] dean|15 years ago|reply
Isn't research the very definition of self-taught? You're learning as you go -- no one has defined the path yet.
[+] [-] jtheory|15 years ago|reply
There are obviously exceptions to every rule, but I think this is a good point. Most folks who are NOT in an academic program don't take out loans and stop work on all practical projects for 3-5 years to focus like this.
I'm not very familiar with the CS PhD world -- I'm very much in the self-taught category, personally -- but I'm married to an author who got a (fully-funded) MFA in creative writing. It was great -- not because the profs were teaching anyone how to write (if you didn't already know, you didn't get into the program), but because it gave her a couple of years out of the real world, focused entirely on her writing, surrounded by very supportive & similarly focused people.
[+] [-] antiterra|15 years ago|reply
It seems it wouldn't be a stretch to say that, "cs-educated programmers" aren't even really identifiable by trait, since course selections made by both the university department and the student can change the curriculum unpredictably. The same could be said for "self-taught;" in my experience, half the people in cs-related math or theory classes just read the book and don't bother to attend class anyway.