What stops a self taught developer from also 'self teaching' the fundamentals?
Books and lectures (from OCW etc) have been available for years now. These days you can go one step further by taking online courses with assignments, exams etc from Coursera. All you need is motivation, and self taught devs often have that in spades.
The real problem is that in most enterprise swshops/codebases, knowing (say) algorithmic complexity is not very valued in terms of reward structure (though it should be - I've fixed my share of O(k^n) horrors) and lots of people choose to go through life writing simple apps and stitching APIs together (which is perfectly ok as a career choice if that's what floats your boat).
(Due Disclosure: I worked as an enterprise dev for a decade before I shifted fields. I work on fairly large machine learning systems these days and let me assure you that knowing algorithmic complexity analysis - and other things like statistics and linear algebra - is a basic required skill in this world. Fwiw I am entirely self taught. My degree is in Industrial Engineering)
> Why would I care about the difference between a list and a hash table.
> A lot of people tend to assume hostile bias against knowledge simply because they've been successful without it for a while.
I don't necessarily see it like that. My opinion is more along these lines:
> Why would I care TO STORE IN LONG TERM MEMORY the difference between a list and a hash table.
There are plenty of things I know I know, things I know I don't know and things I don't know I don't know. The vast majority of my programming knowledge resides in short-term memory; in six months ask me about Linked Lists vs Array Lists and I will have forgotten the primary differences (fast iterate vs fast insert or something like that)... I only vaguely know that today because I was researching something.
The biggest challenge I see as a self-taught developer is I see everything on equal footing. That means the basics (map, set, list) and the trivial (apache config settings, tomcat's web.xml) tend to reside in the same heap and if I don't think about one element for awhile it tends to get GC'ed. Since all of my knowledge came from 14 years of on-the-job-training nothing was given particular precedence, everything was important to the task at hand.
I believe that's really what frustrates self-taught developers. It isn't that I don't know the answer, or that I'm hostile to learning new things (far from it) it is simply that I never burned these fundamentals into my permament memory. I've tried, but I tend to miss bits and pieces, for example, I needed to refresh myself on autoboxing just a few weeks ago because I just haven't _thought_ about it.
> What stops a self taught developer from also 'self teaching' the fundamentals?
I think that the main problem, especially for maintaining the student's motivation, is that a lot of the fundamentals don't seem to be all that useful to a programmer... until you finally understand them and it "clicks".
The more serious topics(set theory, algorithm design, and processor design) are almost entirely theoretical at the basic level, with very little information that can be directly applied to the real world. But once you start digging deeper, the usefulness becomes readily apparent.
Algorithms is an especially problematic topic, for a couple of reasons. The first is that the entire topic is built on top of a good foundation of discrete math, big-O, set and graph theory, and with a sprinkling of data structures on the side. So it's no a topic that you can just jump into immediately. There's a lot of background study needed before you can really start working on it.
The second is that to really understand an algorithm, you really need to be able to make(or understand) the proof of correctness and proof of efficiency. The goal of the student looking into algorithms shouldn't be just to get a laundry list of potential things to use(though they will get that as well), but to have the skills to be able to show that their algorithm will work correctly for all valid inputs, and that it's capable of doing so at a certain efficiency. That's the mindset of a good programmer, and it definitely comes with experience, but I think having the theoretical background helps a lot as well.
I think what stops them is motivation and a realization that the information can be really valuable when reasoning about software.
Certainly I am making up for a deficiency of math during my early years now. I always dismissed all category theory as useless but increasingly I realize how important statistics, category theory, and a solid understanding of how to analyze algorithms is. Even if you never prove the time complexity of an algorithm, being able to approach new literature and come out with new insights for your engineering efforts is invaluable.
Which is what any civil or mechanical engineer could have told you about their career, I guess.
For me, I've learned what I've needed to learn to solve immediate problems that I was facing -- more like JIT learning. As such, there's many concepts that I simply haven't had a pressing need to learn and personal curiosities aside, they won't get learned.
Self teaching fundamentals is boring and not sexy. I'm self taught and I'll admit it took me a year of doing the fun stuff before I forced myself to go back and start to really understand the fundamentals of what I was doing. Turns out I now enjoy what I used to think was boring.
Comments
What stops a self taught developer from also 'self teaching' the fundamentals?
Books and lectures (from OCW etc) have been available for years now. These days you can go one step further by taking online courses with assignments, exams etc from Coursera. All you need is motivation, and self taught devs often have that in spades.
The real problem is that in most enterprise swshops/codebases, knowing (say) algorithmic complexity is not very valued in terms of reward structure (though it should be - I've fixed my share of O(k^n) horrors) and lots of people choose to go through life writing simple apps and stitching APIs together (which is perfectly ok as a career choice if that's what floats your boat).
(Due Disclosure: I worked as an enterprise dev for a decade before I shifted fields. I work on fairly large machine learning systems these days and let me assure you that knowing algorithmic complexity analysis - and other things like statistics and linear algebra - is a basic required skill in this world. Fwiw I am entirely self taught. My degree is in Industrial Engineering)
What stops a self taught developer from also 'self teaching' the fundamentals?
Just read through the many comments here the gist of which is: Why would I care about the difference between a list and a hash table.
A lot of people tend to assume hostile bias against knowledge simply because they've been successful without it for a while.
> Why would I care about the difference between a list and a hash table.
> A lot of people tend to assume hostile bias against knowledge simply because they've been successful without it for a while.
I don't necessarily see it like that. My opinion is more along these lines:
> Why would I care TO STORE IN LONG TERM MEMORY the difference between a list and a hash table.
There are plenty of things I know I know, things I know I don't know and things I don't know I don't know. The vast majority of my programming knowledge resides in short-term memory; in six months ask me about Linked Lists vs Array Lists and I will have forgotten the primary differences (fast iterate vs fast insert or something like that)... I only vaguely know that today because I was researching something.
The biggest challenge I see as a self-taught developer is I see everything on equal footing. That means the basics (map, set, list) and the trivial (apache config settings, tomcat's web.xml) tend to reside in the same heap and if I don't think about one element for awhile it tends to get GC'ed. Since all of my knowledge came from 14 years of on-the-job-training nothing was given particular precedence, everything was important to the task at hand.
I believe that's really what frustrates self-taught developers. It isn't that I don't know the answer, or that I'm hostile to learning new things (far from it) it is simply that I never burned these fundamentals into my permament memory. I've tried, but I tend to miss bits and pieces, for example, I needed to refresh myself on autoboxing just a few weeks ago because I just haven't _thought_ about it.
> What stops a self taught developer from also 'self teaching' the fundamentals?
I think that the main problem, especially for maintaining the student's motivation, is that a lot of the fundamentals don't seem to be all that useful to a programmer... until you finally understand them and it "clicks".
The more serious topics(set theory, algorithm design, and processor design) are almost entirely theoretical at the basic level, with very little information that can be directly applied to the real world. But once you start digging deeper, the usefulness becomes readily apparent.
Algorithms is an especially problematic topic, for a couple of reasons. The first is that the entire topic is built on top of a good foundation of discrete math, big-O, set and graph theory, and with a sprinkling of data structures on the side. So it's no a topic that you can just jump into immediately. There's a lot of background study needed before you can really start working on it.
The second is that to really understand an algorithm, you really need to be able to make(or understand) the proof of correctness and proof of efficiency. The goal of the student looking into algorithms shouldn't be just to get a laundry list of potential things to use(though they will get that as well), but to have the skills to be able to show that their algorithm will work correctly for all valid inputs, and that it's capable of doing so at a certain efficiency. That's the mindset of a good programmer, and it definitely comes with experience, but I think having the theoretical background helps a lot as well.
I think what stops them is motivation and a realization that the information can be really valuable when reasoning about software.
Certainly I am making up for a deficiency of math during my early years now. I always dismissed all category theory as useless but increasingly I realize how important statistics, category theory, and a solid understanding of how to analyze algorithms is. Even if you never prove the time complexity of an algorithm, being able to approach new literature and come out with new insights for your engineering efforts is invaluable.
Which is what any civil or mechanical engineer could have told you about their career, I guess.
For me, I've learned what I've needed to learn to solve immediate problems that I was facing -- more like JIT learning. As such, there's many concepts that I simply haven't had a pressing need to learn and personal curiosities aside, they won't get learned.
Self teaching fundamentals is boring and not sexy. I'm self taught and I'll admit it took me a year of doing the fun stuff before I forced myself to go back and start to really understand the fundamentals of what I was doing. Turns out I now enjoy what I used to think was boring.
I think this is a fairly common experience.