Succeed personally: no. Some dev jobs obviously require a lot of foundational knowledge. I wouldn't want to have a colleague who didn't know linear algebra, simply because that's important in my field. That's not important for making Wordpress sites.
I think there are things "every good developer should know" such as knowledge about how cpus work, how OS'es work, how some important algorithms work, some basic set theory and complexity etc. All of this is doable without a degree, but I'd probably be more willing to bet that someone with a degree knows it, than someone without. Also of course - there are jobs that are doable without knowing foundations, but I'd call those "code monkey jobs" and whether such a job constitutes success I guess depends on who you ask. And what it pays.
Most importantly, when I recruit I don't see the diploma as evidence of what they know but as evidence that they could learn, quickly. If the diploma is from a prestigeous school but says they failed math 101 four times over that would make me doubt their capacity. Being able to pick something up is the capability I'm looking for. A curious mind, with a taste for the abstract. A diploma is just one clue.
One of the much-downplayed things that degrees are more likely to indicate than personal projects is foundational knowledge. When you work exclusively on Wordpress sites, this is irrelevant. When you work on distributed systems or cryptography, then foundational knowledge gets pretty important.
It is completely possible for any person to learn foundational knowledge outside of a formal instructional setting. I personally know excellent developers who have done so. It's unquestionably possible. I firmly believe that given sufficient time and determination and help, it's possible for any person to learn any subject to any level.
It is, however, possibly true that not all people learn discrete mathematics, relational algebra, and computer architecture in an ideal manner when entirely self-directed. Or perhaps even all developers.
This is what struck me about my formal education. While I also believe you can learn anything with enough material and dedication on your own, having the structure to ensure that you cover a set of subjects that constitute "foundational knowledge" can be invaluable.
What is it about formalized schooling specifically, that you believe makes it uniquely capable in teaching people what they don't know?
When I was 18 I spent dozens of hours pouring through a university course catalogue, looking at the required courses for each degree, the prerequisite trees and the requirements for graduate degrees. It felt like a bird's-eye of the entire fractal structure of human inquiry.
Later, I realized how much sharper the view is to people who do that today. Regardless of whether or not they're a student, they can see the course catalogues online and, in the case of MIT (and many top institutions), even see lectures of those courses recorded in previous years. If you're reading this now and you don't have a very high idea what kinds of knowledge are out there, it's probably your own choice.
I think one factor is that Universities are usually involved in research, so they're in a good position to continually identify what's important out of the existing body of knowledge, and keep their courses up to date with new ideas.
Another factor is that you can't skip over topics that don't immediately interest you. Some self-taught people can have that discipline as well, but it's not universal.
> What is it about formalized schooling specifically, that you believe makes it uniquely capable in teaching people what they don't know?
The teacher. Teaching/learning was always about the teacher, who knows what
and in what order to teach.
You can have the same effects with the same effort as with formalized
schooling if you have a private teacher, but how many self-taught developers
had them? And then there's this small thing that in formalized schooling
you're taught by several people, each for their own discipline. It's hard to
come by a tutor that knows seven different fields and it's hard to come by
seven tutors for each of the fields.
Plenty of courses have their general outline publicly available. Some colleges even share older lectures [0]. There are more-than-enough resources available for self-directed learning. Have questions? StackOverflow exists.
The #1 criticism against self-directed learning is how self-motivated the autodidact is. Most people suck at staying motivated to teach themselves. If they aren't 100% passionate about learning the subject and can keep their interest going, they will fail.
I totally agree with you -- staying motivated, especially if you are learning alone from home, it's incredibly difficult. I have a thesis that I have recently started to validate which is that you can considerably improve motivation in self-directed learning environments by introducing online collaborative learning. I just wrote about it and launched a little course/workshop to test the idea: https://medium.com/@arielcamus/learn-to-build-a-backend-with...
This is an excellent point. A lot of what I learned in university was things I didn't know before, and didn't learn either, but I learned they existed.
When faced with a problem now, I can often identify at least what area of my non-knowledge it belongs to. In that sense I knew a lot less after university than before (in a relative sense).
The ninja skill you get from a very broad education isnt solving problems by applying knowledge, its solving problems by identifying them (then Googling)
Self-taught developer with the mentioned "foundational knowledge." I'm very strong so far as any university-level CS subject goes. One area where I have recently learned that "I don't know" is anything beyond high school calculus - having started to play around with Tensorflow. You are most certainly correct and now, instead of immediately having that expertise at my fingertips, I have to self-learn it over a month.
With all the resources available these days, including MOOCs, textbooks, syllabi, and recorded lectures from the best schools, there's a middle ground between "degree" and "entirely self-directed".
You're completely right! Those are all amazing resources.
I would posit that using textbooks, syllabi, recorded lectures from the best schools and greatest professors, and documentation is still a form of self-direction. The learner is left entirely to their own direction, discipline, and environment. Perhaps the only thing that's changed in that list of wonderful resources since the 1960s is MOOCs. I thought of and considered these resources when writing my previous comment.
Perhaps I would have been best-advised to use a turn of phrase such as "self-directed with use of readily available non-instructor instructional resources". I thought such a phrase excessively clunky and unnecessary to make the point, but perhaps I was wrong.
> The learner is left entirely to their own direction, discipline, and environment.
I think this is one of the main problems of self-directled learning and why, in average, is not nearly as effective for most people unless they are incredibly motivated.
I just started playing with the idea that online collaborative learning can considerably reduce that pain and I just wrote and launched a little experiment to test it:
It's a great idea! I would consider being careful with peer instruction, however. In software it runs the considerable risk of encouraging and inculcating bad practices, which is something an instructor is often used to mitigate in classroom-style environments.
A person with a strong grasp of the subjects described therein would have excellent foundational knowledge.
I would say that you're right! These days it's easier to access all the required instructional material for foundational knowledge outside a university. I would also say that this has probably been true for multiple decades. I would say that a list of MOOC courses is possibly not the same as a strong grasp of core materials, however.
Such a curriculum, while strong at first blush, likely suffers from many of the flaws of self-directed learning. It is perhaps not access to information or instructional material that is the problematic part of the educational process.
You sure can gain all that knowledge, but my experience is that without a formal setting with defined expectations and specific goals, few people will actually have enough motivation to spend few hours every day for a few years doing this.
The best I've found is to find any university and look at their recommended course calendar for a CS degree and go to those course homepages to get the lecture notes/slides or vids if they are public. This will be a course structure made by professional educators to give you the intuitive ideas for a subject. Then look up the same foundational material in The Art of Computer Programming or other academic text with enough challenging problem sets so you remember the material. Unfortunately many universities require campus accounts to get at homework or tests so the only other way is get it from TAOCP.
While you do this apply for entry level support engineer somewhere and work your way into development from within the company or find open source projects and write requested features, debug them when problems arise, repeat. That plus being helpful on the mailing list and stackexchange for whatever project it is almost always leads to email job offers coming in. When you have enough experience you can directly apply to developer ads and hopefully survive the initial screen for not having a degree as you have real experience, plus all those problem sets you did will help pass a whiteboard interview.
With everything that's available in documentation, on YouTube, in forums, and in boot camps and other trainings, doesn't it seem like there are much more efficient ways to get the foundational knowledge that don't require four years of expensive college courses?
Step one: Find that material organized into a complete lesson plan. Without curation, a library is just a pile of books.
Step two: Package that with a bunch of people (both experienced and inexperienced) who can help with coursework and answer questions when they come up, teams of people to work with, somewhere to live with dozens of others doing the same work, hundreds more learning unrelated things (but who might be useful to you in the future), and you've got something close to a replacement for college.
Every time I think of all the extra hundreds of hours I spent learning things that didn't help my developer career and that seemed to be distractions, I tend to compare those to courses published online that have precise learning modules that are so helpful.
College just seems like it's so expensive compared to the value you get out of other sources of knowledge.
College is a lot more than learning about software development and computer science. I guess that's what I was getting at. It's expensive, but I don't know any other way to meet the same mix of people and get the same set of experiences. And that's part of the point: If you just want to learn development, college shouldn't be a prerequisite. I'd imagine that some kind of trade school, self-study, or job training would make more sense.
All the material exists in one form or another, but I've yet to see anyone put together a credible "DIY CS degree" online resource.
Some day most (certainly not all) aspects of university education will be supplanted by high-quality universally accessible materials. But it's not here yet.
I think even if that existed, you would still miss one of the most important aspects of college and any other traditional learning environment: the motivational side of having a community of learners and teachers that hold you accountable and help you stay motivated.
Is this a market opportunity? Is there a way to make money producing a high-quality curated list of online resources, plus a series of online tests to prove that you learned it?
It does seem utterly inconceivable that getting copiously documented things into the heads of people would be something only accomplishable through an outmoded and expensive educational process. Surely we've come up with something better by now with all the effort being poured into it!
Yet, perhaps there's something about that process. After all, there are aspects to a formal collegiate experience that are not neatly captured by boot camps, fora, YouTube, and documentation. Perhaps some of those aspects, like an instructional environment that values theory, are of nontrivial significance.
Obviously, it's still possible that something better can be done. This may not be the same as a better option having been developed and being on offer, though.
This may or may not scale but I've been lucky to be part of a startup program that roughly matches your description of a "better option". It's a 2-year program; I was, and still am, part of their experimental first class of students. So far I've gone through 9 months of entirely CS study, and I was even placed in an internship working in Mountain View, and without a college degree.
I have never held a dev job before, but I’ve gotten to doing some pretty serious and nuanced coding (all the way down to memory management and writing in C). They’re a really great team of people, their unofficial motto is “Google it”, and RTFM, and their program is called Holberton School.
None. At least not on the first 9 months. Mostly it has been about performance, data structures, algorithms, and time complexities.
So far, the first part (9 months) the focus is mostly on practical project-based learning and skills for developers. But we are encouraged to learn on our own. I certainly know about uncountable sets and the Axiom of Choice, but how much do I really need for the problems I am solving on my day to day?
Unfortunately, I must inform you that that is the answer I feared. There's a strong tendency for would-be "better options" and bootcamps to discard CS fundamentals and theory in favor of practical education. I am of the opinion that this sacrifices long-term practical utility for short-term utility. While seemingly of obvious benefit to those seeking jobs in the not-so-distant future, this is a penalty that mounts later in careers.
Odds are very good that your entire career will not use whatever tools this program has taught you. Odds are similarly good that your time as a junior engineer won't hinge much on abstract mathematics. But odds are very good computers will run on the same mathematics in twenty years.
Even today more interesting work (cryptography, geospatial, distributed systems, graphics) hinges on the sort of mathematical underpinnings that are generally found in a full collegiate computer science education. Of course, all of this can be learned independently, but most individuals struggle to learn crypotgraphic mathematics in such a way.
So really, it depends a great deal on what you want to do with your career. How much you know about how computers work will do a great deal to determine how much flexibility you have down the line. I have had jobs where reasonably complex synchronization problems involving work-stealing and partial orderings over a network were pretty common, and other jobs where `rails g ...` was the most complex thing I needed to know.
Well, like you said, it really depends on what you'll be doing. Granted, there are different paths one's trajectory will take, and you won't know them in advance.
On the other hand though, I wouldn't presume to write my own cryptographic protocol without having the fundamentals myself. Wouldn't you say that it's actually reasonable to learn this on your own? There are so many options, paid, or free, that can help you with this. You could take a Coursera class, or follow an open source curriculum like someone said in the comments down below.
You did say "most individuals" struggle to learn in such a way, but the argument can be made that individuals studying cryptographic principles are not "most people", which, if not intelligence, shows a special kind of perseverence and dedication that will also differentiate them in self-study. I wouldn't say what you're saying is immediately obvious.
You're right! The world contains a wondrous bounty of instructional materials the curious might use to attempt to edify themselves.
You're also right that the argument can be made that any individual who might seek self-study of advanced mathematics is not "most people" as I described previously. To that subject, let me offer a different formulation: most individuals attempting to study advanced mathematics independently struggle to learn effectively in such a way.
A non-zero number of people have set about doing what you describe with a special kind of perseverance and dedication... and wound up making rather severe mistakes. CryptoCat comes to mind. Perseverance and dedication failed to differentiate them. You may be different! It's very possible! But perseverance and dedication should not be confused for a rigorous and rigorously evaluated course of study. This becomes a significant difference when questions of scaling arise.
The world is full of options to help you learn, and I would not dissuade you from doing so. I just want you to be aware of the limitations likely to be imposed by a given educational approach.
As a percentage, how many US colleges would you say are excluded from the opportunities provided by "rigorous course of study"? Would you say you could get this kind of rigorous study at any university? If not, how many (as a percentage of all undergrad colleges)? Is this scalable/sustainable for the entire population?
I don't know, and I don't think the answer is as relevant in this context as might be hoped. There are many known, admitted, and well-documented failings in and problems with the current tertiary educational system. Yet, it's perhaps possible that these are not repaired by stripping away some of the aspects that are of value.
The general need for a better approach might not be the same as a given different approach being better.
> With everything that's available in documentation, on YouTube, in forums, and in boot camps and other trainings, doesn't it seem like there are much more efficient ways to get the foundational knowledge that don't require four years of expensive college courses?
Sure, but the risk of getting led onto an inefficient, time wasting path that doesn't give you a good grounding in the foundational knowledge is also high.
The skill to evaluate approaches to learning the information and the set of information you need to learn is not something you are likely to have without having studied the information, and there are lots of people with pet theories or financial interest in your actions trying to promote different approaches.
Your metric will lock me out:I did Real and Complex Analysis sophomore year but was forced to take intro to statistics senior year in order to graduate.
That kind of thing is in every transcript. Doesn't look strange at all with the odd one like that. It's rather systematic failure I'm trying to look out for.
Maybe early in career you are correct, however after 5+ years of professional experience nobody even cares to which school you went or do you even have a degree.
The exceptions are companies like Facebook and Google, whose hiring practices seem to really be focused on hiring people straight out of college as opposed to established programmers.
Perhaps it's too broad a generalization - I haven't worked at Google - but all the companies who ape the GAFA hiring policies are indeed only interested in developers straight out of college. And I have a hard time blaming them; college students are fairly inexpensive to hire, and there's a lot of them out there looking.
I knew linear algebra in high school. I taught myself matrix math because I wanted to make games, and because the most challenging math my lackluster rural public high school offered was basic calculus.
My top university's CS program had a linear algebra class that loaded me up with theory though like Hilbert spaces, wavelet transforms, spectral theory, abstract algebra, and of course, principal component analysis (but the latter, along with SVD, is becoming more valuable these days with data science-y type jobs).
It was more concerned with proofs and advanced concepts than applications, which was fine for me, because I already learned the applications in high school because I was bored and self-motivated. The most valuable benefit of learning all of this extra theory to me was learning how to solve problems because doing proofs isn't some algorithm like long division or evaluating a derivative that you can just crunch as a cog-in-the-wheel.
The question is whether all of that extra rigmarole is worth it in my day-to-day development work. The answer to that is "no." Occasionally, I'll borrow some code that does thing X that is tangentially related (like convolution for computer vision and deep learning), but the theory behind it rarely comes in handy because I'm not doing academia or R&D work.
Of course, your usual full stack developer job won't even come close to touching any of this, but if you're doing moonshot type work like self-driving cars, you're going to need all of this theory to really attack the types of unsolved problems you're facing. Those types of jobs are rare, sometimes highly-compensated, and inaccessible to your Hack Reactor grad.
Linear algebra is used in even the simplest of games, and almost anything related to cad, computer vision, engineering, ...
If the problem is related to web and databases and crap then there is rarely any linear algebra (heck there are rarely even real numbers) but we didn't go to school to work with databases and web forms did we ;)
Obviously hilbert spaces might not be useful everywhere but for example, anecdotally I did stumble across one interesting problem already in my first year out of university: A drawing program needed to scale a drawn ellipse in one direction, which wasn't necessarily along one of its axes. Q: is the result an ellipse? What are its axes?
A: (I had to ask a friend with better linear algebra skills, which still bugs me): the axes will be given by the eigenvectors of the matrix involved. The math was fairly hairy compared to most other things in a simple drawing program, but it was fun and really rewarding when the math worked.
There is a tiny fraction of linear algebra that's very useful for most games, but you can pick most of it up over a long weekend. Further taking the class five years ago means you still need that long weekend anyway...
Compared to say learning direct X it's a tiny time investment and hardly worth a degree.
> ... I don't see the diploma as evidence of what they know but as evidence that they could learn, quickly.
It's a better evidence that they can follow steps to complete something, but is not a good indicator of the one thing I value in SEs: being self-directed in tackling a problem.
Also this varies a ton by sub-industry, over in games we don't care about degrees at all, just demonstrated work. Once you move on the sliding scale over to the larger corps it starts becoming a checkbox for HR that won't get you through the filter(most of the time).
> I think there are things "every good developer should know" such as knowledge about how cpus work, how OS'es work
Considering the complexity of modern CPU's and OS's, does college go into enough depth to tech them well or does it just let students think they know how they work?
Well, what you need to know as a developer of either is pretty limited. Understanding the basic existence of the following will get you a long way: cache hierarchy, branch prediction, instruction reordering, syscalls, interrupts, virtual memory and page mapping, the layers of the networking stack, etc. You might need to go in depth about a particular CPU/OS later during your working life, but most likely not, just know enough to have a semi-realistic picture of the layers below your own code. Those are all things that can be self-taught to some level, specially if you have the discipline to write some experimental code to test them in your system. For most developers, however, those are things that are easier to learn in a classroom than on your own time.
(Some of the theoretical parts are even more suitable for college and equally useful: complexity/computability theory, lambda calculus, graph theory, autómata theory, ML, etc)
My classes taught me the existence of a lot of low-level constructs and showed us example implementations. To me, it's more like some handholds to use when I need to go spelunking into a particular implementation. Do I always know how something works? No. But I've got starting places to investigate when reality doesn't match my mental model.
"A curious mind, with a taste for the abstract. A diploma is just one clue."
This is me and my BA in math. I would like employers and coworkers and people to understand this point. They often don't get it. Also, I think I've come to realize that I am actually a slow learner. I need practice and patience to deeply understand something and confidently talk about it. Where do I belong then? Personalities who say they are quick and are able to confidently sell things erk me and makes me question if they truly have the best they can give. You could read a Wikipedia page about some things and sound awesome if you have prior knowledge and a quick wit be able to convince most people of expertise.
I think there are things "every good developer should know" such as knowledge about how cpus work, how OS'es work, how some important algorithms work, some basic set theory and complexity etc. All of this is doable without a degree, but I'd probably be more willing to bet that someone with a degree knows it, than someone without. Also of course - there are jobs that are doable without knowing foundations, but I'd call those "code monkey jobs" and whether such a job constitutes success I guess depends on who you ask. And what it pays.
Most importantly, when I recruit I don't see the diploma as evidence of what they know but as evidence that they could learn, quickly. If the diploma is from a prestigeous school but says they failed math 101 four times over that would make me doubt their capacity. Being able to pick something up is the capability I'm looking for. A curious mind, with a taste for the abstract. A diploma is just one clue.