Hacker Newsnew | past | comments | ask | show | jobs | submitlogin
Ask YC: do you use what you learned in school?
14 points by supahfly_remix on Feb 21, 2008 | hide | past | favorite | 37 comments
How many of you actually get to use any of the information you learned in your CS classes in college? E.g., implementing red-black trees, operating systems, writing compilers, etc.

From reading this site, I get the impression that people write a lot of web GUI code, but that doesn't require a CS background. That's not to say web applications aren't interesting, and there aren't technical challenges to be addressed.



Few people have to do all the specific algorithms stuff we learned, because now that's all in libraries, but it's still useful to know how those things work, just as it's useful to a pilot to know how all the systems in his plane work.

I think the most useful thing I ever learned in a CS class was from Michael Rabin: that the best way to solve a problem is often to redefine it as something that's easier to solve. This turns out to be applicable to practically every kind of work.


Universities seem to be struggling to cope with the depth of knowledge that has accumulated. It is empowering to "know how those things work" from first principles, but as time progresses, the volume of such knowledge grows towards and beyond the capacity of the courses that convey it. Universities must then (as they are now) make a delicate balance between covering fundamentals (which most practitioners consider too "academic") and preparing graduates with skills that they can immediately apply in practice. Many graduates seem dissatisfied with the balance that universities choose.


I would suggest reading this great short story by Asimov. Its called "Profession". http://www.abelard.org/asimov.htm


Thanks for the link; I've always been an Asimov fan. The short story format is fine for entertainment, but takes a while to get to the point:

Tapes are actually bad. They teach too much; they’re too painless. A man who learns that way doesn’t know how to learn any other way. He’s frozen into whatever position he’s been taped. Now if a person weren't given tapes but were forced to learn by hand, so to speak, from the start; why, then he’d get the habit of learning, and continue to learn.

I've never questioned the goal of schools to develop learning and thinking skills, rather than just convey content. However, the question is with what content should those skills be developed? It is that choice that requires a delicate balance between fundamental and practical content.


I don't disagree at all, but I'm interested in if you have a particularly memorable example where this sort of thinking helped you.


It would be hard to think of something I'd done that didn't use this trick. There are lots of examples in Arc. I chose quite different problems to solve than language designers usually do. It's not that common to design a language by writing applications in it, and making the language have whatever features are necessary to make those applications short.

In this case the difference isn't so much that I chose a different problem to solve as that I chose any problem at all. I get the impression most language design is driven not so much by explicit goals as by a collection of half-formulated principles.


The most useful thing I've learned in CS is to define and keep stringent rules while programming. These can be time/space constraints, programming time constraints, keeping the code modular, readable, or reusable, etc. Define rules that make the most sense for the project you have to do and write code with these rules in mind regardless of your own personal coding preferences. All CS knowledge learned enables you to keep to these rules. Of course, good rules to follow can be 'learn as much as possible' or 'enjoy yourself', but when it comes down to building something, enjoying yourself doesn't mean you've written good code.


All the time, believe it or not. For example, in one class, I learned about garbage collection algorithms, which I used to explain to a coworker why he was seeing a certain memory usage pattern in the JVM. I'm also glad I learned about DFAs and NFAs in my theory of computation class, because they come in pretty handy for figuring out some problems. My favorite incident was when the same coworker was suggesting project ideas, I used Turing's halting theorem to show him that his idea was impossible. Granted, that doesn't happen every day.


I should be finishing my degree this summer, and I knew going into the program that I wanted to be doing web startups when I was done. So, I chose a program the focused more on Software Engineering than straight CS.

So, tailored my education along the lines of creating startups. My classes the last 2 years have included Intro to Database systems, Unix programming, Perl, Web Database Programming, Advanced Database systems, Distributed Systems, and Systems Programming. I've avoided Java and Microsoft technologies whenever I've been able to.

Every time that I get a semester break, I work on learning Django, or Ruby on Rails, and every semester web development comes a little easier to me. I've also been doggedly pursuing my own education, and I'm not relying on my school to give it to me on a silver platter. School is there to give you a framework, on which you continue your self-education. So, when I was taking my Distributed systems class, I read up on Erlang, and the other students had no idea what that language was for.

There are people in my advanced database classes that are editing SQL with notepad on windows. I was trying to tell them that a decent text-editor might improve their quality of life a little bit. Several of them didn't know what the difference between notepad and a decent text editor was. Sigh... I guess that it goes to show that it's not the school, it's the student.


Operating Systems and assembly-level courses taught me the foundation for what I need for low-level and kernel debugging that I do now quite frequently.

The other courses all been used quite a bit towards opening doors for me in starting businesses and job opportunities.

I honestly have to say that there's not a single CS course that didn't provide me a valuable tool which I've used. I'm not sure if that's normal, or if I am just the sort of person who finds uses for the tools in my toolbox.

I think the course (in the last 7 years) that has offered me the least would have been Linear Alegbra, but that's primarily because I didn't go deep enough after it to really broaden my skills to apply to those sorts of opportunities. I see lots of cases where I could use it, I just regret that I didn't improve my grounding in it because it would have opened more doors for me.

I'd say that the first 2-3 years of engineering, I used very little of what I learned in school. Very strange, but now that I'm working as a principal engineer/architect or on my own projects, that CS schooling has been incredibly valuable. It helps that I covered areas like AI, languages, graphics, and networking in my electives.

If you want a generic software engineering job, I don't think a CS degree is really ideal (depending on the school). For me, (i.e. someone who loves computer sciences), it was a perfect choice and I use those building blocks all the time now.


To touch on your "web gui code" comment-- I think that may be marginalizing people a little bit.

Hackers can do web GUI code. Nowadays they pretty much have to do so, because it's often the ideal front-end for whatever backend software you produce.

Computer-oriented businesses that build up a long-term business advantage are going to start with some solid technology behind them that is difficult to reproduce without knowledge. For example, new search engine technologies, new streaming codecs, new AI prediction routines, etc, etc.

For a less grand example, our site, http://bug.gd is pretty simple from a web design point of view, but I learned from my CS courses that full-text indexing isn't something to take lightly in large quantities. So I know enough to search out tools (like sphinx or lucene) that implement algorithms I can literally understand to be reliable, fast, and memory efficient.

The CS schooling also allows us to write more client software for different OS's that help catch and report error conditions into the global error database. We'd be stuck with only a web frontend if we didn't have people with good CS/os backgrounds to work on lower-level API to catch what we need there.

Secure coding is another area in which core computer science compentencies are worth every penny.

Anyway, sorry to ramble, but I think your question comes from a perspective of misunderstanding just how many zillions of doors open to a computer scientist that are harder/closed/lost/hopeless for those who don't dive into the technology. It's not all lost on web GUI development.

Not that other hackers (non-CS) couldn't do the things I described, but I know those tools come in incredibly handy for me in trying to help shape this computer-heavy world.


Glad to hear that such opportunities are open to the CS-knowledgeable. Where do you find such jobs? (Not on Dice -- they seem to just be about buzzwords).


Just the other day I had to use a non-trivial string algorithm for some batch string searching (searching for occurrences of any of a few million different strings on a large text corpus). A colleague is working on creating a little language for doing batch image processing, requiring use of undergrad-level compilers material.

As for the string problem I faced, I found an existing implementation in the language I was using, but I wound up having to modify it in order to cope with changing requirements.

If I hadn't learned about algorithms and automata in college, it probably would have been impossible for me to understand what I was using and I'd be flying blind. I probably would have instead not even known about the algorithm and would have believed that an inefficient naive solution was the only way, therefore making the project essentially infeasible (at first glance, anyway).

I'm also thankful that I had the opportunity to learn about functional programming because it made me a better programmer in imperative languages.


100% of what I use is from work.

0% is from school.

Not a judgement. Just an observation.


CS classes? I studied Italian in school, and yes, I use it every day to speak to my wife, who is Italian.


Its hard to answer because honestly I can't remember what I learned in uni specifically. As for using advanced CS topics let me give an example.

I'm writing a web app at the moment for orthodontics. On one hand its just overlaying a template on an image, but its using and manipulating a scene graph for the various parts of the template. The templates are defined by the relationship of various landmarks - these relationships (like the angles and distances between certain points) are represented in my own language so that I can send them to client for evaluation (as they move parts of the template) or to R so that I can generate a set of landmark locations that fit the relationships.

I probably make things more complicated than they need to be but I can't imagine not understanding these concepts. The power and beauty of those advanced CS topics is worth learning for itself. If they don't give you any insight as a programmer (whether you use them directly or not) then I don't think you've really understood them.


The main thing I gleaned from undergraduate university (applied math) was how to collect and structure data in such a way that useful information can be derived from it. This has helped me in writing software for image processing programs to doing market research for new products. The key courses in this were signal processing courses along with the math and numerical analysis to understand the analysis techniques. The computer science courses I took in programming languages, compilers, hardware, etc. were very good practice in how to abstract a problem and codify it. I have not used too many of the specific languages or techniques in my professional life however as that tends to more or less keep up with the industry.

The most important things I gleaned from my graduate work about 10 years later (MBA and some more applied math) were how to present interesting data to people in a way that they too could interpret it and derive value from it, and how to manage social networks effectively.


The best thing I learned in school was typing in middle school. It is by far the most useful thing I have ever had taught to me.


Is this useful for hacking or for writing mail?

I type slowly, but this gives me time to think about what I type. Can you produce code at touch typing speed?


lol, forgot about that. Agreed!


I learned (initially) from Mario Teaches Typing, at home.

I imagine this was considerably more enjoyable than learning at school.


I wish I had Mario. Instead I was stuck with Mavis Beacon.


I don't think anything beats this... http://en.wikipedia.org/wiki/The_Typing_of_the_Dead


I actually played this in the arcade! I was doing well until I got to hydra, where it posed questions in japanese that I didn't know how to read.


Ok, that game wins. Now I want to play it. Apparently it's on GameTap.


and it's freely available abandonware hosted at the Underdogs! Though it probably doesn't count as abandonware now that it is on GameTap. I won't tell anyone if you don't.

http://www.the-underdogs.info/game.php?id=4973


school taught me the grind and to not shy away from a challenging problem, seriously.


well, what your experience was is that you learned that while at school. but that doesn't necessarily mean school taught it to you. it could also be that school actually makes it harder to learn that, but also puts so much pressure on people to learn it, that they figure it out anyway, despite that added difficulty.

This alternative view is consistent with the evidence in general, and with what you related about your experience.


Good point. The question is do you use what you learned at school, but if it was do you use what you were taught at school, the answers could be quite different.


I use high school algebra more than any other school learning aside from English.

I use a lot of the principles from 6.001 (Structure and Interpretation of Computer Programs) at MIT. I think there were other classes with useful learnings, but it's hard to remember specifically.


It really depends on what you're working on. One thing that I've figured out is that you don't learn software engineering in college at all. Even if you took a bunch of courses in it.

However, a knowledge of algorithms can be invaluable. I've been out of college for six years and I can remember using at least:

- String search algorithms

- B-Trees, Tries

- A handful of graph algorithms

Other times stuff that I learned in college put me in quick striking distance for stuff that would be more work to understand without a CS background:

- Open key cryptography

- Word stemming algorithms, text coding

- Writing a query optimizer

- Digital signal processing

You can always find cool stuff to hack on without drifting into that territory, but if you actually dig CS-nerdiness, and are good at it, you'll sometimes get some of the more fun problems thrown in your direction.


All the time. Just recently one of guys I work with got stuck because he was using an STL priority queue to maintain a scheduler's data. The data was keyed on the time a scheduled event needed to run. The problem was that sometimes an event's time needed to change. Normally theses priority queues do not let you change items on the fly. Things get added and they come out based on their priority. He figured out how to override this behavior but couldn't understand why the priority queue was broken after he modified an item inside the queue directly. So, I had to explain to him how heaps and priority queues worked.


Even if it doesn't look it, you should, unless you went to school for nothing. Broad exposure to a particular subject, if anything, hones your intuition about it, such that even if you make "blind guesses" about solutions, they are better suited than those without the education.

At the very least, you will know the names of things and where to start looking, which prevents you from reinventing the wheel. This difference, in my experience, is significant.

Don't overstate the importance of a degree, but don't understate the value of knowledge from school; it's knowledge, after all.


Yes, you can get away with doing web programming without a CS background, so this practice does not "require" such a degree - but having a CS background will only make you better at what you do. In addition, you will utilize some of the knowledge you acquired in college in places where you would least suspect.

That and the real point of education is to learn how to learn and think. View it as a mental workout if you truly do tell yourself "this is pointless, I am never going to need to know this". Remember that it will only make you stronger in the end.


Well, I'm not 100% sure you are asking for my experience, but here goes anyway (I'm a mathematician/physicist, by training and profession, and I don't write web GUI's except for fun).

However, I'd say that I regularly use stuff from about 4-5 of my college/grad school classes. Virtually everything else I learned "on the job" (i.e., in grad school, doing research).

Oddly enough, I recently found myself using some tricks I picked up from a machine learning class for something completely different (the philosophical kind of quantum mechanics).


1) algorithms and distributed systems

2) my negotiation class (although practice is more useful :P)

3) getting used to busting my ass/grinding through problems


I work on a compiler for a living, so yeah I kinda use my compilers course. And pretty much all the other CS courses.

I think people who say their education hasn't been valuable just picked the wrong education.




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

Search: