So it's not YOU who is "wrong": it's the universities who have it backwards and are disconnected from the real world work that programmers do.
So it's not YOU who is "wrong": it's the universities who have it backwards and are disconnected from the real world work that programmers do.
But then the universities teach them CS bullshit where 90% of it is unapplicable to the real world.
Why would you go to such an university which is so disconnected from the real world?
Pretty much every class in my degree program used a different programming language. You had to develop the ability to learn a language and be productive with it in a semester (~4 months) or at most an academic year. Sometimes you'd be learning two new languages along with the course material.
The CS theory I use far less. I think if you are in a job that boils down to implementing CRUD functionality (even if dressed up a bit on the UX side) you don't really find yourself thinking about CS theory very often.
Yes, if it's doing something more complex, algorithmic complexity can be a factor. The vast majority of "enterprise" or business apps aren't.
That's your problem right there. Also, the term 'university' seems to be overloaded in so many different ways (multiplied by different countries and cultures).
To me, it seems that the American descriptions and their derivatives are pretty bad, same with the "poly"-prefixed educational institutions. There are so many factors that should be irrelevant (i.e. the "name" of the institute, the cost, the location) where only the subject matter and accreditation should be the actual factors.
If I were to categorise it, you'd have to split it in three directions:
- Academia, scientific research (University)
- High-level education, scientific principles and theory, but with application of said principes and theory in mind (College perhaps?)
- General or vocational education, aimed at learning how to do a job (Trade school?)
But it is of course much more marketable if you call that middle tier a "University of Applied Sciences" as that sound much cooler and more advanced. The reality is that there are many more people needed in the world that actually perform the work than the amount of people that mostly think about the work that others might do.The world needs people in all sorts of varieties, but the real-world workload is overwhelmingly one of execution, not one of theory. Of course, when people are stuck in the (rat) race, one must go to university because that is the best, and only the best is good enough. So even if going that far risks people into diving headfirst into their own Peter Principle, it is what people do anyway. The end result are a bunch of people that barely made it through university and aren't all that useful in the real world right away (not advanced enough to propel the entire field or niche forward, not practical enough to perform less theoretical work).
Of course, FAANG only wants the best, and since they can't go screen the 100k+ applications in their inboxes in detail they just start filtering based on paper promises or previous experience, with the end result being a stack of people who either already did the job, or who came out of university with advanced enough results to be malleable into the positions that are available. And thus the path is biased towards "if you want to make a ton of money so you can rent a broom closet in the bay area, you have to work at a FAANG and you can only do that with a university background". Ironically, as large and advanced as those companies may be, most people in the world don't work there. And trading in 80k for half the amount of work and normal living arrangements really isn't a bad deal when working anywhere else that's not a FAANG.
The university that I went to (Riga Technical University) didn't quite have computer science and software engineering as two completely separate degrees. Instead, we had separate IT (basically sysadmin oriented stuff) and computer science degrees, the latter of which includes software engineering.
Currently the title of my Master's degree is: "Professional Master Degree in Computer Systems and Qualification of Programming Engineer"
Similarly, the title of my Bachelor's degree is: "Bachelor Degree Of Engineering Science in Computer Control and Computer Science"
I know that many believe that the theoretic aspects should be somewhat separate from the practical ones, but to me it felt like most people could probably benefit from a bit of both - so that the research you do isn't completely detached from ways it could be applied, and so that the day to day programming you do doesn't end up disregarding things like O(n) complexity or even the theory behind how software costs increase due to mistakes made in the earlier development stages.
Then again, we do have specialization in the form of "Academical" and "Professional" degrees, the latter of which involves more course work around practical development and working in a company, whereas I think the former involved more research (though of course anyone could submit articles for peer review in the "Applied Computer Systems" journal).
It is especially important to have balance in the undergraduate B.S. degree. At this point, the foundational knowledge is presented, and a broader perspective of the applications of computer science (e.g. software engineering, database design, compilers, operating systems, applied artificial intelligence, etc.) aids in decisions toward which concepts to focus on next whether it be for enterprises or as a researcher.
There is nothing wrong with CS curriculum. It's just not for everybody.
This is like going to college for Physics and then complaining that they didn't teach you how to fly an airplane.
Like yeah, go to college and get enriched and all of that, but honestly, if one can be self enriched by taking courses a la carte online, then is it really worth to pay out the nose for a degree that has not much (and even dwindling) monetary return? For some, yeah, because of a level of prestige you get from having a degree. For other fields, not so much.
No, people shouldn't take physics and then expect to become a pilot. On the other hand, computer science, which is not actually science but instead a fancy way of describing usage of computers, necessarily means applying algorithms and programming languages. If someone goes through an entire CS degree program but comes out with mostly knowledge that doesn't apply to real world usage of computers, well, what were they even taught in that case?
Ideally a lot more people would be doing apprenticeships or vocational courses instead, not getting Bachelor's and Master's degrees. This isn't really viable now though because of the expectation society has for everyone to get a university degree.
Most plumbers don't need to be theoretical experts in hydraulics and pneumatics; but there certainly is time when such expertise is called for.
It was a semester long project where the professor was the "business" person and everyone had shared roles (someone was QA for a sprint)...and we get lectures on code quality, testing, best practices.
To my surprise it doesn't exist in every college. Even though I went to a state school, not all state schools in that state required it.
I disliked the professor but am eternity grateful for the class...I would interview kids nowadays who want $100k but have no idea what Agile is.
This was in mid 2000s.
I've worked for companies and managers who don't know what Agile is. Not knowing one specific thing, even if it's an important thing, isn't worth writing off a candidate. If you can't teach someone the basics of agile in an afternoon, you're doing agile wrong.
You’d be amazed at how many middle managers making 250+ think that agile equals scrum or that scrum is valuable in the context of software. I’ll take the person that has never heard of it, to be honest.
So yea, it depends where you did your CS degree from. Personally, I think it taught me a lot and got us ready for the real world at least as an entry level. Back then, there were no frameworks.
The programmers should take one level or so below that level of education (which has different names depending on where you live).
Academia has mostly devolved to intellectual dick measurement contenst by entrenched academics/professors who cannot be fired.
1. CS 101 - I mean, duh? Intro to programming, basic algorithms and data structures. By the end you can at least write a simple program, and if you weren't a nerd like me (started programming at 8 because the computer was there) this would be essential. Which was the case for the majority of my classmates in college, most hadn't done any programming beyond maybe "hello world" before college.
2. CS 102 - Data structures focus, don't recall its name, may have just been "Data Structures". Choosing the right data structure for the job (though many of the particulars aren't necessarily relevant, but how to choose what, that part is critical for embedded systems).
3. Compilers - Parsing, mostly, not the translation part. This was an introductory course, 200-level.
4. CS theory - Main takeaway was choosing between regular and context free languages and understanding the limits of both. Again, parsing but not translation has been more common in my work. The proofs side has been less useful in my professional work, but informal proofs are still very useful.
5. Systems 101 - Baby operating systems, especially working "close to the metal" in embedded, even on a host OS.
6. Computer graphics - Less the graphics part, more the structure of programs to operate at high throughput on large data.
7. Calculus through Linear algebra - (required by the CS degree, 4 courses) highly applicable to some of my work. Especially the recent stuff, touching on orbital mechanics.
8. AI - In the "good old fashioned" sense, not the deep learning/machine learning sense. Turns out it's highly applicable to making expert systems. Probably because that's what it excelled at, and those can be applied to some interesting situations. I'll place this as "indirect" though, like graphics.
9. Computer architecture - Direct and indirect. On the indirect side, it really taught me to work with boolean algebra which turns out to be very useful for studying real programs and their logic (and simplifying them). On the direct side, ever done VHDL/Verilog? Good luck being successful at that without studying computer architecture (self-study or in school)
10. Another computer systems course - Had a big assembly emphasis. Means that I don't "fear" it like many of my colleagues. I can read disassembled code without much trouble, and write it with reference material (because I don't do it often, it's like Fortran to me - I can read it, but writing is slow since I'm unpracticed).
11. Parallel programming - Actually very applicable to some embedded work if you have multiple processors involved or a multi-tasking OS available.
That's 14 courses right there that I've used in my career or am presently using. And that's not counting the math courses I took when I tacked on a math degree. At least I didn't waste 99% of my time. Maybe 10%? But, honestly, I cannot think of a technical course that has not, at some point, come up in my professional work. Even my abstract algebra class from the math degree saved us a lot of time and money a couple times when I proved a requirement was actually impossible.
I can imagine some of my colleagues feeling the way you do, the lack of utility of their degrees. But they all jumped into management roles early on, their technical degrees are useful only for the lingo.
EDIT: I finally thought of a time-waster class. It was our software engineering class. In theory, that should've been one of the more practical classes. Taking requirements, developing solutions, changing requirements, changing the system, etc. In practice, it was all theory. Useless. My AI class was actually a better software engineering class since it was team-project based.
The most helpful one was a "software engineering" course, but mostly it was c++ development in a Unix environment. The part that was directly helpful was the shell scripting, not the basics of it since I was already running Linux and knew my way around a command prompt, but the professor would demonstrate things live in class, and he was a serious pro. I was just blown away at some of the stuff he knew, he could basically operate in a shell environment at the speed of thought. I'm still not like that, but I learned some stuff.
CS 101, like you, I already knew. "Basic Computer Games" from when I was a 7 pretty much covered that.
Discrete math helped a little, I mean I already knew most of it, but it helped. Stats helped a little, the first stats class we had to take. The second was all proofs, never used any of it. Never used any of the other math, linear algebra, three semesters of calc, differential equations, and a graduate level combinatorics class that broke my brain. Never used a single bit of it.
Compilers, we wrote our own compiler, helped a tiny bit indirectly. It made PL/SQL error message make more sense, I don't remember why. Operating systems, we wrote our own operating system, don't know any way that that helped. Graphics, never used it. Two semesters of assembly, never used it.
Algorithms, the first day of class we had a substitute whose accent I couldn't understand and he spent the whole class writing proofs on the blackboard and I thought, "I am so fucked". The actual class turned out to be just things like "count how many times this for loop will execute", total waste of time. One extreme to the other.
Didn't take a database course, worked with databases most of my career. That would have helped.
You could fit the parts of the courses that I've used into a 3 month boot camp pretty easily. But that's not the point of a CS degree to employers, the point of a CS degree to employers is that if someone can figure out vector calc and differential equations, they can figure out what the bug is with your CRUD app. It's just an expensive workaround for an IQ test in an environment where employers aren't allowed to give IQ tests. And also, if they can stick around for 4 years to get a degree without flaking out, maybe they'll stick around for a few years on the job.
I think this is starting to change, for instance, front-end developers being hired from a boot camp or similar program (although this seems nearly the opposite extreme).
Can you point out a thing in standard CS curriculums that doesn't doesn't come up in software once in a while, assuming you are not doing react and express js entire life?