Hacker News new | ask | show | jobs
by mhogomchungu 4568 days ago
Fundamentally,computer science = data structures + algorithms.

in a data structure class,you learn the basic structures like PODs,structs,vectors and linked lists.

in algorithm class,you learn various basic sorting algorithms plus the big O notation and thats pretty much it.

Then you will take a few physics classes,then chemistry classes,then maybe calculus one and two,then probably discrete mathematics class,one or two writing class,if you a lucky,maybe a single semester of operating system class.

you may learn the basics on haskell in one class,the basic of java in another,maybe assembly in another class and you get your degree.Basically,you will leave school knowing only the basics of a bunch of things but not enough of anything.

The above it how it felt to me as a CS major.

3 comments

People are incredulous when I tell them I use 90% of the stuff learned while getting my CS degree.

Stuff I've done in the real world:

AI: I've lost count of the number of times I've had to implement A*

Graphics: wrote a ray tracer; matrix transformations

Data structures and algorithms: wrote an approximation algorithm for the travelling salesman problem (christofides); fancier data structures like bloom-filters, lru caches; and just every day coding

Databases: query optimization

OS: Made me aware of systems (context switching, caching performance,...). Scheduling algorithms and how they affect the embedded software I write. Concurrent programming.

Networking: Super helpful for everyday stuff when you understand the underlying principles. I've had to implement an RFC from scratch (DNS).

Linear algebra: Used extensively in a path planner I wrote---with it I was able to reduce the state space by orders of magnitude compared to the standard grid approach.

Statistics: wrote an online algorithm for adaptive windowed linear regression

Even computability theory has been helpful, as it has strengthened my proving and reasoning skills---helping me find holes in requirements, or proving algorithms/invariants. Same with all the theoretical math courses I took (Analysis, Set Theory, First Order Logic ...)

The list goes on...

Above all, my CS degree taught me how to learn CS and beyond.

Sometimes I worry about the potential solutions I am overlooking, because I never fully branched into the continuous domain (control theory, etc).

Sounds like you've had a very interesting career; I'm curious where you've worked. My impression is that most programming jobs are about CRUD-like problems, adapting well-known technology to solve business problems. CS seems like it could only help if there's a well-known algorithm (that would be taught in CS), but no existing implementation available - but in these days of open-source libraries that practically never happens.

FWIW I switched out of CS into Mathematics after one year. I've never implemented A*, I've used raytracers but not implemented my own, used a bloom filter but not implemented it, used an lru cache but not implemented one, used adaptive windowed linear regression but never implemented it myself. When optimizing database queries I've never needed more than EXPLAIN SELECT; when optimizing performance I've never needed more than a language-level profiler. I did actually implement an RFC from scratch (SMTP), but that was easy enough to do by, well, reading it and implementing it.

...and I officially envy you...
Fundamentally,computer science = data structures + algorithms.

You know, I keep hearing that, but nobody has ever been able to convince me of it. Those are, indeed, the things that fall sideways out of "computer science" (for want of a better name), but it's a near-equivalent to the statement fundamentally, fluid dynamics = boats and airplanes.

"Computer science" is about developing a method for reasoning about process. For the most part, we're still stuck in a world where intuition plays a larger role than it ought to when developing processes, both in the computing world and in the physical world. Investigations into process have yielded algorithms and heuristics (what to do), of course, and those, in turn, depend upon data structures (what to do it to), but we're still pretty much at the level where we're dealing with specific instances rather than a more general formal language. Chemistry without knowing much about the atom yet, in a way.

What you learn in school (at least at the undergrad level) is "here's what we've found out so far" (as it is in any subject). And while that can be a big help, allowing you to more easily recognise classes of problems, there is still more intuition than reason involved in attacking the really hard problems. Both "software engineering" and "computer science" are about reducing the amount of fuzzy, squishy, intuitive parts, but in different ways. "Software engineering" is about robust application (finding and understanding the use of the equivalent of "materials" in the field); "computer science" is about understanding the fundamentals of process (and may well extend beyond computing).

My experience was similar to yours, though even more basic. I went for a 2-year degree at a community college, and it felt as though every course was a refresher in "This is a variable, and what a variable does. This is syntax, and syntax means…" Etc…

It wasn't until getting into the "real world" that I realized the full value of my data structure courses. Those were the ones I kept returning to when trying to learn and understand new skills on the job. (Sadly, my 2-year degree didn't cover any algorithm learning.)

So, now I have the advantage of a few years of "real world" experience to try and plot a course for how to get formal education on the remaining pieces that seem to actually have direct correlation to a career in computer programming.

Not sure if it's a blessing or a curse for me, but I just have to keep moving forward.