Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I have many degrees in computer science, and have used almost none of the knowledge in programming jobs. So, the content is fairly useless, practically speaking. I've also found the more I focus on theoretical elements while at work, the more useless I become. The actually useful elements are big picture, and can probably be taught in one or two classes. Much more useful than technical knowledge are the abilities to reason about systems and solve problems. In my opinion, the CS classes seem to be almost purposefully obtuse.


I use my CS education every day. The trick was to take the bare minimum of theory and stuff my schedule with Systems:

- Thinking about and fixing bugs related to OS scheduling, like, why doesn’t my time.Sleep work as expected? (Intro to Systems, Operating Systems).

- Understanding the protocol layers involved in a network performance problem; writing network services to RFC specs (Networks and Distributed Systems).

- Selecting, working with, and understanding the limitations of distributed databases (Advanced Distributed Systems).

- Shifting the bulk of tricky computing into pure functions; borrowing design patterns like the state monad (Functional Programming).

- Parsing serialized data (Formal Languages for basic theoretical grounding, Programming Languages for compiler and interpreter implementation).

- Dealing with concurrency and using synchronization primitives (Intro to Systems).

- Awareness of security concerns and techniques, respect for the subtlety of crypto implementation, literacy when reading HN on subjects like ASLR or the Juniper RNG compromise (Intro to Security).

- Basic comfort with C, Make, vim, bash, awk, etc. (Intro to Programming).

The vast majority of my education was spent on programming projects to implement key components up and down the stack. Having a decent understanding of what they’re doing and how to approach writing them has been invaluable. The only thing I truly haven’t touched since college is discrete probability.


There's IMO a kind of quadrant going on.

People without CS background who don't see where it would be useful

People with CS background who don't know how to use it

People without CS background who realizes where the science can be useful.

People with CS background who know where and how to apply it to every day problems.

Unless someone is building forms all day long (and even then), it's going to be useful. Sure, you can build apps without it. but they'll be mediocre instead of good.


I have very little training in formal CS (like, I dropped out of a CS program as a sophomore to get a BA in Philosophy and an MA in Lit).

I learned almost all the basis for what I do on a day-to-day practice of being a programmer from:

- my high school programming classes - my grad school practice of learning how to research and read - a bunch of middle school classes in formal logic - playing with a ton of programming tasks

The CS stuff that I've read in the decade since quitting the pursuit of a PhD in literature has been way less helpful than simply trying to fix bugs in my code.

I don't know if my career is representative of other folks' work, but at my "level" I consider programming to be a lucrative trade, and much of the CS stuff is almost totally irrelevant to that, compared to having awareness of the specific of whatever larger system I am trying to diagnose or modify.

I agree that the basis for this profession can be taught in a couple of classes; I feel that almost all of what I do comes down to playing with the actual technology and trying to solve problems with it; theory is only useful after you have a fundamental feel for the nature of the problems at hand.


Agree with the last sentence. All the different data structures for example. Where do they come from? Presumably because in doing some practical tasks we realize it would be a lot more efficient if we organize data that way. To acquire proficiency with those concepts by seeing a genuine need for them in the task at hand imo follows a much more logical order of introduction.


I don't concur. A few examples:

I was working on a iOS App that connects to a GraphQL API. All GraphQL are POSTs. POSTs aren't cacheable. I had to implement a client-side cache. Implementing a cache, understanding the pros/cons of an implementation, is an exercise in CS.

I was implementing an animation. I drew the animation out on graph paper and worked out the transformations using stuff I learned in my linear algebra and computer graphics classes.

And in general, thinking through the tradeoffs of Swift vs Objective-C or REST vs GraphQL or Ruby vs Elixir, etc, etc is an exercise in CS.

Unfortunately, we seem to live in a cargo cult world. Good enough for Facebook/Google/Etc? Good enough for us. ¯\_(ツ)_/¯


They’re called heuristics, and everybody would be paralyzed without them. Good enough for Facebook? Probably will work for my use case, and now I can focus on things that actually add value to my application.


How do you know you used nothing? Wouldn't that be hard to tell, perhaps you should work with someone who got a degree in somewhere unrelated vs a recent cs grad. I find the difference can be massive. Not realizing what is basic knowledge


Seeing that I got my degree over 20 years ago and even then it was from a state school with a horrible comp. sci. department, I am sure my CS degree did nothing for me even for my first job.

I was lucky that by the time I git to college, I already been hacking around with AppleSoft Basic and 65C02 assembly language for six years. I picked up C on my own and that carried me through the first 12 years of my career. Knowledge of algorithms helped me a little bit since we had to do everything from scratch but most modern developers wouldn’t even need that.


Is that surprising? Computer Science isn't meant to be a Practical Programming degree.


I doubt that parents or students who are spending tens of thousands of dollars on college and more than likely are leaving college with tons of debt are not expecting to be able to learn practical, marketable skills.


If they expect to learn practical programming skills then they've completely misunderstood what comp sci is. They want to be spending their money on vocational education instead.


And be at a disadvantage in the market....


As a self-taught developer, I used to think that some of the theoretical elements were overhyped. I can build iOS apps that work, and I did just that for the last 2-3 years. However, many of the programs that I wrote have not been as easy to maintain as I would like and some difficult to fix bugs have popped up overtime, both of which are due to a lack of deeper understanding of CS fundamentals. Last year I started interviewing and was ridiculed at one company in particular for a lack of CS knowledge. Afterwords I started exploring a lot of the CS concepts listed in this link and I have since found numerous ways to improve my code quality and have a better understanding of how CS best practices came to be. I also used to think that algorithms and data structures were relatively useless for an iOS developer, and I was able to do the job without them, thus proving my point. However, after gaining a better understanding, it quickly becomes clear that things like view hierarchies are simply trees and understanding ways to traverse these hierarchies can lead to much cleaner code. With the open sourcing of Swift, I also became more interested in understanding the language, but a lot of the language design decisions didn't make sense to me until I gained a better understanding of CS fundamentals. I have found the programming languages course on Coursera [1] to be particularly useful, and have also greatly enjoyed the book Designing Data Intensive Applications [2]. There's also a great video from this year's WWDC that really inspires algorithm study and use in everyday applications [3].

[1] https://www.coursera.org/learn/programming-languages

[2] https://www.amazon.com/Designing-Data-Intensive-Applications...

[3] https://developer.apple.com/videos/play/wwdc2018/223/


> I have many degrees in computer science

If you have many I'm going to assume that's at least three. Surely that's a PhD then? Otherwise you've been standing still doing multiple bachelors or masters degrees, which wouldn't make any sense.

If you've done a PhD and then go into a field which didn't need that research, then that's unusual. Why did you bother with the PhD?


I have a BS, MS and PhD in CS and Comp. Eng. I needed a job. Turns out my PhD wasn't such a hot commodity, at least in the DC area. For a GS type job, it can translate to automatic pay grade, and a contracting company may want a PhD on paper for their bids. Coding interviews might be a bit easier.

But, the actual dev ops work I do, while I use a bit of distributed systems theory to understand things, is mostly orthogonal to my education. The theory I do use I can easily explain to non CS background employees in about 10-20 minutes. The practical knowledge I use (Linux, coding, s/w eng.) I picked up in my own time and one or two classes.

Why did I get the PhD? Primarily for pie in the sky reasons. The knowledge and research. Not in order to get a job or teach in academia.


Would you do it again? Get the PhD, I mean.


I don't think it is that unusual for grad students to research a try during PhD, decide it is not for them, and then move onto other things afterwards. This is from a physics grad school perspective though.


"I know sorting algorithms so intimately that I know to always reach for the built in .sort()" - hypothetical person in my head.


"I know sorting algorithms so intimately that I know to not reach for the built in .sort() when the array is already 99% sorted"

Built-ins are made to work well on the most common case. Often, you can use domain knowledge to come up with better solutions. But you need to know how common sorting algorithms work to understand if and when that domain knowledge can be used to speed up your program.


You're right. I'm being more tongue in cheek about how like 95% of the time just do the default. Your education is really to know when it's important to donut differently.


Do you think Software Engineering is a more relevant degree vs Computer Science? I would think the former would focus on the more practical rather than Pie in the Ski stuff you will rarely if ever use.


I read this a lot. I am currently studying CS and I kind of regret it for that reason. Sure, the topics tend to be very interesting and I gained some real insights from some classes, such as OS, but I probably won't ever use this stuff when I start working. I kind of wish I did EE/ME or Math instead, especially because I actually quite enjoyed my math classes.


Having worked as a SFE while going to school I can say there are times where I had wished I didn't have this mentality. Don't know how many times I thought "I'll never use this" and blew it off only to a couple months later run into an edge case where I had to go back and relearn some stuff. OS was specifically one of the classes I've been going back over recently and frequently. I kinda realized as I've gotten older that I'll spend a decent amount of time reading over a lot of material that doesn't immediately click as being useful or is terribly interesting to read but when it comes up I get a lot of satisfaction out of the fact that I can say "OH READ ABOUT THIS" even if it was drudgerous. Plus I'd have to agree that it opens more doors and more interesting work, not just CRUD/web apps, when you have an in depth knowledge. Also if you're not challenging yourself to do difficult work then you're not going to have to dive that deep into the knowledge they teach you.


But do you like what you're studying? I think most people end up not using what they learn in university, whether it's CS or one of the other hundreds of degrees people get....


I used what I learned in my linear programming class (i.e. optimizations of a linear function under a system of linear constraints) not too long ago to solve a problem involving multiple non-trivial constraints.

Also, CS is different from programming, just like Math is different from bulding a house.


I think you may not realize how much your education has shaped the way you think and tackle problems. Understanding goes far deeper than the direct application of knowledge.


Anyone else concur with yters experience ?


I don’t concur.

Received a comp-sci degree in 2008 from a small liberal arts college. I was one of five grads in my year, and most of the last two years were not spent learning “practical” tech, but rather theories, algorithms, etc. My liberal arts educating taught me how to write, how to discuss solutions, explore tough concepts, break problems down into smaller subtasks, and more.

Skills are important. But theory matters too. Just because one has value does not rule out the other.


I agree there is value to the theory. But, the valuable parts are fairly easy to explain, when not convoluted through academese, and many classes can probably be consolidated into one or two. Plus, most of the useful theory is encapsulated by someone else's well designed library. So, it is helpful to know, but the hard implementation part is unnecessary.

I am not so much arguing against CS theory, but CS education.


It really depends on what kind of development you're doing.

The majority of software engineers are application developers making CRUD websites or mobile apps, so that perspective is the one to come up most often. I also happen to be one of those developers.

The challenges of application development are related to transforming data, handling asynchronous operations, managing state, and picking elegant abstractions that solve your problems. The intuition for these things is mostly picked up through hours of professional development, seeing good code, and shooting yourself in the foot a couple of times.

While there are some harder problems in app dev which do require deeper computer science understanding, they're extremely rare. I suspect this is different for people doing things like video game development, although I don't have any experience there so I can't speak to that.


Even most of video game development is simply using features of the existing engine. Some basic 3D math is required, but nothing crazy. You do find some gnarly problems in engine development though. (And some of the sub-disciplines like the network and graphics programmers.)


So CS should get a job at tooling companies because that's where deep things are done ?


I don’t think it’s nearly that simple. Some teams are product teams, and they operate higher in the stack. Some teams are straight engineering teams, and they operate much lower in the stack. Lower does not always equal more technical though. A product team dealing with incredible scale can still require deep CS knowledge.

My experience is that teams that act as a platform (and I’m using this term very loosely) tend to have lower level problems to solve. Think of AWS teams vs. large companies. A large company might be dealing with high scale; something like 100k+ transactions per second. An AWS team can have many large companies as their customers, so their scale gets ridiculous; much higher than any single company. This can require more traditional CS knowledge.

Some individual engineers love shipping products though — they like writing a LOT of code and getting things out the door. Some engineers like very carefully working on MASSIVE systems, but they end up releasing way less code. Other engineers like working on very low level embedded systems or whatever.

There are a lot of problems to solve, and none of them are necessarily strictly harder than each other. Some people who can support systems at incredible scale simply cannot cope with the speed of back to back product launches, and vice versa. There are tons of types of talent.


Thanks, that's what I was curious about


I concur.

The way I think about it is that what you learn in class is valuable for understanding the abstractions that you will use in industry. If you’re working in C# or Java, most of the time you don’t care about the cost of memory allocation, method calls, reflection voodoo, file system access, etc... BUT, in those rare situations where the abstraction causes a performance or correctness issue, then all that academic knowledge becomes valuable. I find that the instances of these problems are very rare but when they occur you have an opportunity to deliver a lot of value.

For example, at my job we have a rather slow build. Looking at the logs, it’s because we spend a lot of time doing I/O. Someone had the idea to use symlinks instead of file copies. Badabing, badaboom, we got something like a 3x speed up from doing that.


Surprisingly one of the areas I use my comp sci knowledge the most is in one of the most widely applied areas - relational databases. Every programmer spends lots of time reading and writing data, and understanding a lot of the low level operations, plus linear algebra, can really help with performance and assessing alternatives.


Not exactly. I really enjoyed my undergrad and grad CS programs, but I agree I don’t get to use most of it in everyday work. I also haven’t exactly sought out places where I would yet.

I can’t speak for yters’ experience in school or work, not least since they didn’t name names.

Tech is a huge and diverse industry, but it seems to be treated homogenously when stuff like this comes up. Writing web apps in React is very different from game programming, mission-critical embedded, chip architecture, etc. I see much more demand for frontend devs than more specialized roles, and I think that should lead to lower enrollments in CS programs to match. Today it is way oversold (as I believe a lot of university is in America), but still necessary in some circumstances. For instance, someone teaching a bootcamp should probably have undergaduate level training in CS and/or teaching.

University and even bootcamps also serve as validating authorities that vouch for the abilities af the people they graduate. Maybe not perfect, but I don’t profess to know that licensure or some other method is better or worse. Programming jobs aren’t just about code, and uni/bootcamp isn’t just about learning code: you need discipline and self motivation, executive functioning, ability to research and navigate systems.

Is having a github repo with 1,000 stars now a necessary and/or sufficient condition to be talented?


I concur, with the caveat that whether you need to have a formal education in computer science depends on the types of problems you are trying to solve and the types of systems you're trying to build and maintain.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: