This makes me wonder. What is the "best" way to teach computer science to students? Universities are not trade schools (nor should they be), but it seems apparent that CS graduates in general are unprepared entering the workforce. The other extreme (bootcamps) seem to produce graduates that are more "industry ready" but only at a superficial level. These graduates seem to lack rigor/theory. Makes me wonder if there is a more optimal training path for training students.
This is a topic I've spent some time researching and talking with professional educators about. The general consensus is we have to accept that the skills needed for the majority of professional work (the CRUD apps, the web dev, the infrastructure, etc) is almost completely disparate from any of the topics under the umbrella "computer science" (which is really more of a subset of mathematics). The sooner we treat the skill of programming more like writing (as in you need to be able to write to do all manner of jobs, but very few people go to school for it) the sooner we'll produce students of all disciplines that will excel in the jobs that are most numerous.
Jobs that actually need a strong foundation in CS theory are very rare, and will continue to be and the fantasy that you need a computer scientist to manage your CRUD app is resulting in many people incredibly over qualified for their positions and, in my opinion, one of the major reasons there's so much mental illness in the technology space.
I am in favor of incremental education. (Agile if you will) Right now education is in waterfall mode. College -> Work.
Both focus on different goals and clearly they are not aligned and they shouldn't be either. I would be in favor of just getting the fundamentals to enter the workforce, get my feet wet, get a sense of how my interests match up with the market and then pursue focussed education in areas of interest.
This will require a lot of support from the academic institutions as well as progressive employers. This provides more arenas for longer and more meaningful relationships that are flexible, less rigid and can move faster to meet market needs.
Almost certainly an apprenticeship of some sort. You wouldn't hire a mechanical engineer and expect him to do a mechanics job straight out f University, which is in essence what you're asking people with CS degrees to do.
Shameless plug for UWaterloo's (and many other schools, for that matter) co-op (AKA internship) program. I had two years' work experience (6 x 4 months) by the time I graduated.
Internships/Co-ops basically serve this purpose already. As a mechanical engineer, if you haven't had any internships during your undergrad then you are going to have a very hard time finding a job after graduation. The same goes for software in my experience.
If the problem is already solved then why are people still saying it's not? (E.g. This post).
I'm an engineering grad (as opposed to a CS grad). Most of the people who graduated from our mech eng course studied thermodynamics, control systems, fluid mechanics, acoustics.
Most of those people are now working jobs where they use those skills (or some of them) day to day. A CS grad studies algorithms, discrete math, fuzzy logic, compilers, possibly some networking/telecoms. And Day to day, most CS grads are writing CRUD apps/glueing APIs together.
So does a completely self-taught computer scientist.
Why throw your money away on expensive bootcamps when you can just teach yourself everything?!
My first programming gig was before college, and I was completely self-taught (this was before CS was offered in 99% of high schools).
Learning how to program was easy. I was probably a better web developer in middle school than I am now (although JQuery happened at the tail end of my web programming days, so there was a lot less complexity. Or at least a different type of complexity).
I needed the formal structure of a degree program to learn CS. Past Linear Algebra or so, the math became too difficult to learn on my own.
I expect I'm pretty typical in that respect.
If someone tells me they taught themselves how to program, I usually don't think twice about it. Just a "me too, aint it grand!" If someone tells me they taught themselves CS, I'm much more impressed (and therefore, in the case of hiring, incredulous).
1. Executable code provides a fast feedback loop that doesn't require instruction. That's hard to find especially for mathematics.
2. You don't really have to understand what you're doing in order to build something. So you can do useful stuff -- which is great for motivation etc. -- and then use that stuff to probe and gain a greater understanding.
3. The psychology is favorable to self-study because there aren't long periods of self-study before the material becomes truly useful.
4. A lot of CS is just more difficult. No one asks why Analysis is more difficult than Calculus -- it seems like a silly question on face. Maybe programming vs CS is similar.
4,310 schools had a college credit CS course as of 2015 (cf 14,183 for calculus.) My anecdotal experience is that this number is increasing pretty rapidly. All the high schools in my area have a cs course.
Internships and rigorous senior projects can help prepare students for real jobs. Having senior projects where you need to spend time documenting your work, scheduling tasks, etc can greatly help students get ready for when they start working at places where this is required from a management standpoint. My senior design project involved scheduling our project milestones, weekly meetings with the professor, daily meetings among group members, documenting the features, and even putting in purchase requests and justifications for hardware. That project plus my internships (once as a help desk tech, once in an intern group project, once working on a contract, and once working on an internal project) made me feel pretty confident to start my actual job and jump into the whole process again.
The "dream" scenario would be to leave training and mentoring to the actual companies. I understand a 5 person startup does not have the bandwidth to teach, but larger companies do yet most reject smart graduates because they don't happen to know Framework X.
I think it is up to the university to teach the students more theoretical topics and up to the students to either learn more technical topics on their own, or learn them quickly during the start of entering the workplace.
Let's not confuse "programming" with "computer scientist." I am a pretty good programmer. I am in no way a computer scientist. Asking what the "best" way to teach computer science is is akin or asking what is the "best" way to teach biology or physics or history.
A Computer Science degree does not, and should not, be the sole qualifier for whether or not you want to be a programmer.
Many strong graduates wind up in roles at major companies - Google, Facebook, Amazon, Microsoft, etc - where they are working with teams to implement things that do require research, rigor, etc. Their value as a contributor is wrapped up in theory, the code is just an implementation detail.
Bootcampers, meanwhile, often find themselves at younger companies that are more focused on shipping features and stamping out bugs - areas where the ability to write and ship code quickly is a priority. The differences between a b-tree and a red-black tree will be moot to them unless they're interviewing; going beyond binary search, hashmap, and bloom filter sees diminishing returns on investment in the near term for most small companies.
Working with real code in class. Finding what it takes to jump into a repository and start making incremental changes based on need. This could be an apprenticeship sort of thing or the professor finding some good OSS to have students look at.