Ask HN: Working as a software engineer for 5 years, I've forgotten all CS stuff

181 points by dev_0 ↗ HN
I have a Bachelor of CS. But after working for 5 years, I can't remember these CS stuffs like Computer Organization, OS theories, Database normalization. What occupies my mind is delivering the feature to meet business goals and Kubernetes stuffs.

Is this normal? Or I need to work harder to learn them again?

166 comments

[ 4.3 ms ] story [ 225 ms ] thread
I've heard programming != Comp sci, so perhaps it's not a bad thing.
Praxis centric knowledge base, tool set is more responsive to actual demands
As a CS prof of mine once said, studying CS to be a programmer is like studying architecture to be a house builder...
Poor comparison, imo.
I'd probably suggest that its like studying physics to become a plumber.

Note that I based this analogy on being a CS graduate myself and also working for a while for a chap whose academic speciality was mathematical modelling of things like water hammer.

Apt comparison, if you've ever worked in construction: platform home designs use re-usable elements that are requirements- / market-driven, with designers and structural engineers as part of the process. All architecture programs mix engineering and design / aesthetics tracks, both of which are covered on the ARE exams (loosely speaking).

Discussions regarding PE-style certification for software development often get stuck in the mud, but I'd wager that we'll see something emerge in this generation for general development (as it already exists for safety-intensive applications). And crypto may actually increase the demand for formal proofs and other deep CS concepts.

Your CS prof may have made the remark with some degree of disdain, though there are quite a few programmers / developers out there making better money than a college prof (excluding those working in private consultation).

Tom Brady can't solve physics equations but he can throw the football into the end zone. That's what I'm offering this corporation. I can't solve CS questions but I can deliver a great product
Yes and that’s why he is a professor.

“Its hard to get a man to understand something when his salary depends on his not understanding it”

You say "be a programmer" to make it sound demeaning. I am not a "programmer" I am a software engineer, which is a very different way to put it. Studying CS to be a software eng is definitely not over kill.
Yes, it's normal. What you don't use you lose. When you need it, you'll be surprised how much will come back but don't expect to be as good as when you learned it.

Is it worth relearning? Only when you need it. The big problem comes when you need to change jobs. If the industry has moved on from what you know then you'll have a hard time finding a job. What make sense is to stay aware of the industry trends and keep up to date.

It is normal. You may need to relearn what you have completely forgotten.

I try to integrate my CS education in my normal software engineering work. The work is high level, not a lot of opportunity to use theory of computer architecture or operating systems, but I'm still writing programs. This means lessons from algorithms and functional programming are relevant. Organizing code using this theory has not only retained the college lessons but reinforced them. My advice is to use the tools from your education when you can, and they will only become stronger when you do.

Your are way better off than a CS graduate who knows all those things but can't solve simple programming tasks.
... and worse off than someone who knows all those things and can solve programming tasks.

The consolidation is that “use it or lose it” means you just gotta start using it again.

Yes it's normal and, dare I say, a bit of an exaggeration. Academia and industry are different environments.
totally normal. not a day without googling the fundamental stuff. what matters for me is overtime your skill you find the answers you are looking for is now more accurate and precise.
A broader understanding gives your more fallback positions in the event of some disaster or catastrophic economic collapse, so I'd say:

Put a little bit of your time into learning interesting new skills in even vaguely related fields. A Jack of all trades may be a master of none, but if chaos is the future, adaptability is the key to survival.

Jack of all trades, master of none, but oftentimes better than a master of one.
Jack of all trades, master of three, hyperspecialization may be a disease.
Totally normal. There will be some situations where you'll encounter those concepts again, like during troubleshooting X, or reading documentation on something along those lines. You may not remember it perfectly but the concept will be familiar.
Programming is a very broad term and there are many levels at which you can do programming - from as low level as writing a firmware for some device to as high as wirting a VB macro in Excel. All of these are programming and depending on the kind of programming you are doing, different kind of knowledge is useful in those context.

The CS fundamentals you are talking about are things that matter when you are doing specific kind of programming. For ex: OS theory matters when you are writing an OS.

Yes and no. I'd say OS theory is also helpful when writing programs that run on an OS.

In the same way network theory is helpful when writing programs that communicate on a network.

I find I've retained a lot of my CS theory, but in a "quiet" way. [1] It only really surfaces when I'm talking about things with colleagues, and I take some information for granted, but ultimately work out they don't have the same understanding.

I do a fair bit of database work, and all that normalisation, foreign keys, relationships knowledge is "just there". On the other hand I only very occasionally have cause to do graphics work, so I remember the very basics, but not much else.

I also remember we did things, which I haven't used for 30 years, but which "holds no fear". I recently had cause to consider writing some code in assembly, and it may or may not happen, but either way I have no "fear" of what it entails, its "just assembly code."

So to the OP I say, your CS degree isn't about facts. It's about an understanding of how things fit together, and in your career you'll use that knowledge in ways you won't even notice. So relax, it's not like you have to write a refresher exam to keep up :)

[1] today I'd get basically nothing in an exam, I don't remember all the memory-rote stuff, like naming the 7 OSI networking levels, or some specific algorithm, or the theory of P vs NP complete etc. But I actually tangentially use that knowledge every day.

> I'd say OS theory is also helpful when writing programs that run on an OS.

That's a very generalized statement. A C program run on OS and so does a JavaScript on a webpage (at least indirectly). I am not sure how OS theory is useful in the JavaScript on a webpage case.

Javascript on a web page targets the browser-based Javascript runtime, though, and would be constrained by the capabilities and security model of that runtime plus of the browser.
(edited after 2m, added the first paragraph)

You gave an example the OS theory would only be good when writing an OS. But the (valid) counter point was that it also becomes relevant when interfacing with an OS.

JavaScript first and foremost runs on your browser, not on the OS itself. So understanding how browsers work (DOM, APIs, XHR...) becomes akin to understanding how the OS works.

(I also have the following rant, which I don't like too much [too polemic] after posting, but I'm keeping it for transparency sake)

No-one claimed you need to know quantum physics to understand what happens to the electrons in your CPU; but generally it's a good idea to know how the next few layers you're interfacing with work (in either direction). And that's often the OS, or the network, or the cache behaviour of your CPU or the superscalar nature of the GPGPU you use to accelerate something important. Or another something attached by some bus to your MCU in the embedded device you're building, or maybe the user navigating that website.

If you wish to write a program from scratch, you must first invent the universe.
This may also apply to non-CS things you've learned in the past, such us biology, chemistry, physics, math, etc, to a varying degree.
Because everyone does, most IT people don't even use UML in practice ¯\_(ツ)_/¯
Schools have too much focus on enterprise stuff that not even the enterprises care about.
Just more working memory. If you know which things that you forgot you need when to remember, again it's not harder but just refresh and the next is easier. Sometimes to learn a new conception you have to suspend few others. Harder way you learn with every step back to refresh, that you need to cross-reference.
I find it comes back quickly - with a brief review
I find the most useful thing about CS knowledge (and especially algorithms & data structures) is having a hunch for the shape of a problem and knowing what to google for. It can save a lot of thinking and stave off performance problems before they occur. But you’re there to deliver business value and it’s only right that those concerns should dominate. That doesn’t mean you won’t have “this database is completely unmanageable and we can’t add new features fast enough” or “this complicated request is incredibly slow and customers are angry” moments that your knowledge can solve though.
Exactly what I am doing. The job is still technical but not so academic
It's normal. And the point weren't to always recall those specific pieces of knowledge, it was to get you to understand those concepts once. Once you did, understanding similar concepts will be easier, you will be able to spot more intricate patterns. Your intuition will be better in situations, where you spot or create things seemingly out of nowhere.
Exactly. I can not remember all of the isolation levels for each type of database engine but I know what can go wrong and that my application has to be somewhat aware of them. I have to research each particular engines' isolation level against my application requirements every time. Yet, I manage to forget the behavior of the common ones readily despite having studied them in-depth numerous times.
You should invert the question: since EVERYONE forgets all of this CS stuff then perhaps teaching this CS stuff to us programmers is a complete waste of our time in the 1st place?

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.

(comment deleted)
I don't think it's a waste. Some people going into web development, some into compiler design, some into database optimisation, some into IT management, some into AI, some into 3d game development etc etc. CS is a broad subject. It's pretty much like studying general science in college.
Then why do we not study debugging, naming, maintenance, reading code etc... specifically?
There needs to be an entire class devoted to working with Product Managers without killing anyone...
Because in most universities it's a Computer Science degree, not a Software Engineering degree. I suppose in those universities that offer SE degree, they have more courses focusing on programming and managing software projects.
I had a class titled "Software Engineering" that prepared me very well for software dev life cycle, maintenance etc...

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 would interview kids nowadays who want $100k but have no idea what Agile is.

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.

I wouldn't write them off, but certainly as you dig deeper you can see there's more than "one specific thing" and there's a disconnect between theoretical computer science vs practical programming. It would require more than an afternoon to be ready for the workplace and our company ended up having several weeks of bootcamps for all incoming college students...and still hear complaints that something is "too hard".
> I would interview kids nowadays who want $100k but have no idea what Agile is.

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.

Right...because someone who went through 4 year of a computer science program and doesn't know anything about any software development life cycle (Agile was just one example) sure shows a lot of passion & initiative to explore outside of what's taught in school or outside their comfort zone. Exactly the type of person to hire.
Because those are all closely tied to the specific programming language, editor, complier etc that you use, which will change repeatedly over your career.
It depends on the college/university. I went to Stony Brook University (SUNY) in NY and we had an excellent CS program where we not only learned theory but did plenty of real world programming challenges including learning how to use version control (we used cvs circa 2002-2004) etc. We even had one specific class called Software Engineering where we designed a software from scratch and it was great learning. We did decent amount of HTML/CSS/JS as well. At the time, our server side language of choice was Java and Swing for GUI etc. We had assignments where we had to literally just design and not code (I kinda thought it was strange) but made us think more abstract.

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.

No, the universities are right. We need academia to advance our knowledge, this also includes teaching.

The programmers should take one level or so below that level of education (which has different names depending on where you live).

Most knowledge advencements come from real world, not academia.

Academia has mostly devolved to intellectual dick measurement contenst by entrenched academics/professors who cannot be fired.

I think in every decent university you get to choose most of the courses, so you can fit it to your interests. Now it can be that somebody did the wrong choice, and now does not find a job where what he learned is useful. I think the university’s curriculum is not bad as it is. More specifically, you do not need to be a CS graduate to be a programmer.
I have a CS bachelor + masters and the only actually real-world useful courses were on the masters levels (and only 3 courses out of many, the rest were time wasters), 99% of the other stuff before it was a total waste of my time.
That sounds rather unlikely, unless you've somehow ended up in a job that could be done by someone who doesn't really know anything about anything, in which case I don't think your education was the issue.
Which three courses, that might help the discussion. I can think of many more than 3 courses that helped me directly or indirectly later on:

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.

I had a similar education starting around 25 years ago, and my experience is different than yours. Very few of the courses I took have been directly helpful, and the ones that were indirectly helpful were very indirectly helpful.

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.

An even better question is why do people go to college, expecting it to be a trade school?

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.

They expect it to be a trade school because it's so expensive that there needs to be some kind of payoff. Most people aren't the sort of elites that universities were once founded upon whom money was not much of a concern for.

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?

Because strangely enough, most people don’t spend tens of thousands of dollars to be a better citizen of the world. Most people have an insatiable addiction to food and shelter and need to be able to trade labor for money to support that addiction.
I think this is part of a more general problem with universities: they are designed to teach you academia, not practical industry knowledge. They don't teach you what you need to know because that was never their goal. (maybe this isn't true for every field, but in my experience it seems to be for most)

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.

I agree, and it would also make it easier on teachers in university; its a royal pain dealing with students who aren't really interested, but are merely seeking a certificate of some kind so they can get a decent job.

Most plumbers don't need to be theoretical experts in hydraulics and pneumatics; but there certainly is time when such expertise is called for.

Well, we don't really "forget" the knowledge; the shallower and more explicit aspects of it just fade away. The roots are still in there, and still inform how we understand problems and act on them. I'm not saying that a costly college education is essential; just that this is not proof that it's worthless.
The universities don't have it backwards, you do. Computer Science fundamentally isn't Software Engineering. If you have a degree in computer science and a job in (some particular subfield of) software engineering, it makes quite a lot of sense that the degree and the day to day aren't perfectly aligned. At any rate, not directly and frequently using all the theoretical underpinnings of networking/databases/etc hardly means learning them was useless.
People go to universities to learn how to tackle real world programming problems.

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?

I maybe in minority here but I regularly use CS, networking, OS internals statistics, discrete math (I could go own) knowledge I was taught in school and I work in infrastructure. Ofc if you let that knowledge falter and forget all this stuff you’re never gonna use it bc you won’t even know when it was useful
I have a CS degree, and the main thing I developed that stuck with me is the ability to pick up most any programming language and separate the syntax from the fundamental concepts such as objects, functions, loops and flow of control, lists, arrays, other data structures, etc.

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.

That’s how you get all those apps that are dog slow bc developers didn’t know better and implemented everything with squared or worse complexity where it wasn’t necessary
Not really. If the app is essentially pulling data out of the UI and calling a SQL query to put some fields into a database (or vice-versa), there isn't much to it.

Yes, if it's doing something more complex, algorithmic complexity can be a factor. The vast majority of "enterprise" or business apps aren't.

I still don’t understand the disconnect that many posters on HN have from the real world. Most of the 2.7 million developers in the US are working at banks, insurance companies, etc writing boring line of business CRUD apps.
Maybe you should try EnterpriseNews then ;)
Just because you are in one sub field doesn’t mean you should lack a general understanding of the overall industry.
> People go to universities to learn how to tackle real world programming problems.

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 universities don't have it backwards, you do. Computer Science fundamentally isn't Software Engineering. If you have a degree in computer science and a job in (some particular subfield of) software engineering, it makes quite a lot of sense that the degree and the day to day aren't perfectly aligned.

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).

Well said.

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.

Isn't it the employer's demand that everyone holding a position even somewhat related to software development have a CS degree the real mismatch?

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).

> EVERYONE forgets all of this CS stuff

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?

Ah yes, you’ll forget almost everything learned at school, so just close down close right? Why stop smoking and getting drunk all the time when you die anyway?
In some specializations of programming, you're going to need a lot of those things. For instance, working with game engines, scientific simulations, image or signal processing, finance, or simply making the base software and libraries that other people use, can involve a lot of CS.

In larger corporations, the programming is often much higher level, and consists more of stringing together libraries and frameworks and entire systems so that they fulfill a business purpose. Even simple programs can take hundreds of megabytes of memory and have tens or hundreds of dependencies beyond anyone's control.

If you want to keep practicing your algorithm skills, you might try something like https://projecteuler.net/ , which is very mathy, or https://checkio.org/ , which is a bit more user-friendly, and get some practice there. As for OS theory, there are always open-source operating systems one can contribute to, though I suspect many of them would consume a lot of a person's time.

I was surprised to see database normalization in OP's list. Working at a modest-size company, database normalization was something I dealt with all the time. It was up to the devs to do table design, if you didn't normalize you'd end up with a mess.
I've never seen someone even mention the word normalization when working with databases, but the knowledge is useful to intuitively design more sensible tables. Perhaps many people don't realize they are doing it?
I know I didn't until I took a database class in grad school. (I'd worked with databases before and was taught them as a kid by my dad, but I needed some kind of 'proof' for CV purposes). I didn't call it 'normalization', I just considered it to be part of future-proofing/not wanting to be bothered if new uses showed up.
All I know is don't store duplicated data in different tables
I had an interview the other day and they asked a question on Big O notation to which I didn't really know the answer so guessed it. In 10 years of web dev, backend engineering work I've never needed to use it.
You have, you just don’t call it that. You probably know that accessing an array list is faster than a linked list, and a binary tree search is faster than an array list search. What you may not remember is the specific big O notation for those, but that’s not the important thing anyways. The important thing is being able to reason over relative complexities of various operations. When I interview people, I ask the question, but don’t penalize them for not knowing. I penalize them for not being able to re-derive them after reasoning through the algorithm.
After working for years, you will have gut feeling on whether an implementation is slow or fast. This is done with testing on large N dataset
Except on modern architectures your intuition about what is actually faster is likely wrong if it’s based on just Big O operation counts.

Memory locality, prefetching and branch prediction are all likely more important to actual performance than Big O complexity and those things can change from architecture to architecture.

When I was learning big o notation numa architectures where just becoming commercially viable. You’d get dramatically different performance results in one lab to the other based on which machines were in it.

Maybe, but for a given machine, a O(n) algorithm will certainly be worse than O(log n), for non-trivial sizes of n. For trivial sizes, those other things will definitely dominate, and are also good to keep in mind.
unless you're working with large datasets, big O hardly matters for most products/business logic
n^2 or worse is so easy to accomplish with embedded for loops. And adding indexes to a DB is a fairly common thing to do with even medium sized DBs.

But I do work for a very large company (not FAANG, but close) and so admittedly, the scale there is far larger than in most jobs, and knowing this stuff really does matter a lot more.

As you progress in your software engineering career, the level of abstraction of the knowledge you use on a daily basis gets higher and higher. The academic CS concepts underpin everything, but rarely do you need to go below a few levels of abstraction to solve problems in the real-world (at least in most non-cutting edge jobs).

For example, to build a web app the level of abstraction your job requires is probably on the level of web frameworks and API's. Now and then you'd need to understand the web protocols. Rarely would you need to write software involving the low level transport mechanisms. Rarely would you inspect packets yourself and perform verification and decoding through pen and paper. Even rarer still would you need to use maths to design the signaling procedures between hardware components. Point being that it's normal to now know off-hand all the lower level CS stuff, but you recognize the patterns, and in the rare occasion you need to actually access all that information you wouldn't be at a complete loss.

yet CS stuff is exactly what they ask you for on interviews. I really don't know how interviewers keep up with this or they just read the answers of their own questions
Normal, yes.

The nice thing about forgotten knowledge is that it's much easier to jog the memory and get it back than to learn it from nothing. You likely still use a lot of the fundamental concepts without realizing it.

I am someone who came from a non-traditional, self-taught path ~25 years ago. I did get some formal schooling in electronics, which you'd think was useless, but I can think of a few times solid digital logic understanding has served me well in the past, for example. On the other side of that, I designed some shitty databases early in my career! Understanding normalization could have saved me a lot of headaches when I was new.

But you don't know what you are studying is important or not until you are confronted with a real world problem
That is not how "Education" works.
That's not how any of this works.
Yup, I can't tell you what 6th normal form is anymore, but I can tell you if a database looks poorly designed or not. lol
Which of those helps day to day? I’m always going to say the latter lol
I always think self taught is a better pathway. You gain more experience making mistakes and learning from them that way. You also pick up more “best practices” by learning how shitty your bad practices of the past were.
I was trained in EE, and I’ve been surprised at how many times I’ve reached for Karnaugh Maps while coding. It’s really helped simplify some gnarly conditions I’ve come across.

Each time I’ve forgotten how to construct them and use them from scratch, but a five minute skim of some grad student’s PowerPoint was all I needed to get right back into it.

I watch videos and read wikipedia to try to keep those things fresh in my mind. Do I still remember the Greek alphabet? What's the formula for (k choose n)? What's the difference between permutation and combination? Can I still write a Turing machine? What about a Turing with multiple tapes?

I have a bunch of those "questions" that I try to always remember.

My YouTube history is a bunch of those types of videos with some best moments clips from my favorite comedy shows in between them.

Yes, totally normal. If you want to brush up on that knowledge it won't take much time either; maybe couple of weeks and you'll be able to recollect.

The thing though is most of the thing we (at least I) learned are outdated by at least 10 years. So if you want to learn how things work out in the field I suggest reading about actual implementation. For instance this book is terrific about Linux OS [1], and this is a classic on concurrent programming [2], this one about MySQL [3] and so on.

[1] https://www.amazon.com/Linux-Kernel-Development-Robert-Love/...

[2] https://www.amazon.com/Art-Multiprocessor-Programming-Mauric...

[3] https://www.amazon.in/Understanding-MySQL-Internals-Discover...

I tend to be a somewhat slow learner but once I've learned something, I seem to remember it forever (I only lose a little bit of detail).

I remember most of the stuff from university 10 years ago including the brand and model of the microcontroller I programmed (ATMEL ATMEGA8-16PU) and the names of the I/O registers on that chip, the name of the program I used to program it with (AVR Studio). I also remember most stuff I learned in Discrete Mathematics, pretty much every ADT (Abstract Data Type) I learned about in my Algorithms and Data Structures class and I remember pretty much everything I learned in Machine Learning (decision trees with minimax algorithm, alpha-beta pruning, heuristic functions, Artificial Neural Networks, step functions, sigmoid functions, backpropagation algorithm)... Time and space complexity...

Except for time and space complexity and ADTs, I haven't really used the other stuff.

That sounds like unusually good memory, almost like Michael Ross level. Make good use of that!
My ability to learn and remember stuff seems to be related to how interesting (how valuable) I find the information. The reason why I'm a slow learner is that I find it hard to remember things when I can't see their utility value. It takes a while to understand the full utility value of something.

On the flip side, sometimes I don't even notice (much less remember) certain things. When I'm visiting a new city with someone else, I never seem to be able to remember how to get back to the starting point - I recognize almost none of the streets or landmarks on the way back (aside from a few particularly interesting ones). My mind just delegates the full responsibility of finding the way back to the other person. It's not a problem if I'm visiting a city alone though.