Less Wrong is a community blog devoted to refining the art of human rationality. Please visit our About page for more information.

On the Fence? Major in CS

18 Post author: talisman 07 May 2009 04:26AM

I talk to many ABDs in math, physics, engineering, economics, and various other technical fields.

I work with exceptional people from all those backgrounds.

I would like to unreservedly say to any collegians out there, whether choosing an undergrad major or considering fields of study for grad school: if you know you want a technical major but you're not sure which, choose Computer Science.

Unless you're extremely talented and motivated, relative to your extremely talented and motivated peers, you probably aren't going to make a career in academia even if you want to.  And if you want a technical major but you're not sure which, you shouldn't want to!  Academia is a huge drag in many ways.  When a math ABD starts telling me about how she really likes her work but is sick of the slow pace and the fact that only six people in the world understand her work, I get to take a nice minute alone with my thoughts: I've heard it over and over again, in the same words and the same weary, beaten-down tone.  You shouldn't be considering a career in academia unless you're passionately in love with your field, unless you think about it in the shower and over lunch and as you drift off to sleep, unless the problem sets are a weekly joy.  A lesser love will abandon you and leave you stranded and heartbroken, four years into grad school.

What's so great about CS, then?  Isn't it just a bunch of glorified not-real-math and hundreds of hours of grimy debugging?

Let's start with several significant, but peripheral, reasons:

  • CS majors learn to really program.  There's an ocean of difference between the power of a decent, desultory programmer and that of a real programmer.  If you're not a programmer, the power of real programmers to create good stuff borders on magic. 
  • Not least among the good stuff is time.  It's disgraceful, the amount of human effort that goes into work that could be done by a Perl one-liner.
  • CS majors learn to be at home with the guts of computers.  This seems to come in handy in a hundred little ways.
  • CS majors are significantly more likely than other technical majors to get involved in startups, which are one of the best ways around to create wealth.
  • While having abstract and intellectual sides, the good kind of CS is strongly tied to the practical.
  • CS people can do fun side projects.   I've never heard of an engineer doing a bit of engineering on the side from their management consulting job; with CS people it's rare that they don't have a little something cooking.

None of that gets to my real point, which is the modes of thought that CS majors build.  Working with intransigent computer code for years upon years, the smart ones learn a deeply careful, modular, and reductionist mindset that transfers shockingly well to all kinds of systems-oriented thinking--

And most significantly to building and understanding human systems.  The questions they learn to ask about a codebase--"What invariants must this process satisfy?  What's the cleanest way to organize this structure?  How should these subsystems work together?"--are incredibly powerful when applied to a complex human process.  If I needed a CEO for my enterprise, not just my software company but my airline, my automaker, my restaurant chain, I would start by looking for candidates with a CS background.

You can see some of this relevance in the multitude of analogies CS people are able to apply to non-CS areas.  When's the last time you heard a math person refer to some real-world situation as "a real elliptic curve"?  The CS people I know have a rich vocabulary of cached concepts that address real-world situations: race conditions, interrupts, stacks, queues, bandwidth, latency, and many more that go over my head, because...

I didn't major in CS.  I saw it as too "applied," and went for more "elevated" areas.  I grew intellectually through that study, but I've upped my practical effectiveness enormously in the last few years by working with great CS people and absorbing all I can of their mindset.


Comments (57)

Comment author: MendelSchmiedekamp 07 May 2009 01:21:28PM *  10 points [-]

I'm someone who has been educated in CS, as well as other fields. I both perform and manage industrial-scale programming and research programming, and I hire programmers of varying skill-levels for projects.

In my experience, there are a few caveats to your advice:

1) Strong programmers, fun side projects, and deep understanding comes from the pre-Computer interest which many of the die-hard CS people have. It is rarely, if ever, taught in academic programs and is something I specifically look for in my heavy-duty programmers whether or not their major is or was in CS.

2) My personal take on things is: The best programmers take innate talent and a lifetime of experience and turn it into super-star ability - don't expect to become one by majoring in CS. The second best programmers have a strong mathematics background (i.e. proof writing), because their code requires less debugging, which is the most costly part of software development. Any programmer can do better by analyzing their process and learning from that, but that form of software engineering seems to have become less popular, since it takes more work and makes you vulnerable to bad managers. Algorithm design is, of course, an entirely different matter.

In short, I'd suggest a CS/Mathematics double major. It's a good idea to be able to speak more than one technical language after all.

Oh and, my usual answer to:

When's the last time you heard a math person refer to some real-world situation as "a real elliptic curve"?

Well there was the time Heisenberg came back from his honeymoon where he had, of course, spent the entire time trying to puzzle out quantum mechanics. He was about to give up because of the non-commutative multiplication when he talked to a mathematician friend who said, "Wait, let me tell you about these things we call matrices."

Mathematics gives you very useful models, it just doesn't tell you how to use them. CS gives you the tools to implement solutions, but it tends to leave the solutions rather ad hoc. Bringing the two together is one good mix. I could suggest a half-dozen others - but this will do for now.

Edited to add: This is a mix if you want to achieve the goals laid out in the post. Not suggesting that it is either trivial to get such a pair of degrees or desirable for everyone to head in that direction.

Comment author: talisman 07 May 2009 01:50:05PM 0 points [-]

I don't at all disagree that for those who can do it, the CS/math parlay is excellent.

Comment author: MendelSchmiedekamp 07 May 2009 05:20:09PM 4 points [-]

But to be clear, if you're not already a showing talent as a programmer, and you want to be skilled as one, if you have to pick between mathematics and CS, pick mathematics and learn a programming language on the side (give yourself a challenging, sizable project which you care about - and get it done, even if it takes a year or two). The cognitive skills you will learn in mathematics will do more to cover for your gaps as a programmer than most CS programs will teach you.

Bear in mind, I'm talking about effectiveness, rather than credentials. Credentials are an entirely different matter - and like most status games it is a constantly evolving mess.

Comment author: lix 07 May 2009 05:34:26AM 6 points [-]

As a post-doc biologist who works in a CS school and with a bunch of mathematicians and physicists - I partly agree. I do think the CS culture has an excellent combination of practical skills and rigorous training in abstraction. However, in my experience, many CS graduates are weak on empiricism; they can build fantastic systems, but they don't understand (or care) what data mean; they are lazy about analysis and hypothesis testing. Half my current batch of honors students didn't know what a hypothesis was. I'd encourage budding rationalists to take both some empirical science and some CS subjects and major in whatever they like most.

Comment author: billswift 07 May 2009 07:54:58AM *  4 points [-]

"The most valuable acquisitions in a scientific or technical education are the general-purpose mental tools which remain serviceable for a lifetime. I rate natural language and mathematics as the most important of these tools, and computer science as a third."

-- George E Forsythe, quoted in Donald E Knuth, "Selected Papers in Computer Science", p.9

Comment author: Jordan 07 May 2009 05:32:20AM *  4 points [-]

Seconded. Random bits I couldn't manage to form into a cohesive comment:

I'm a math ABD on the verge of dropping out (to pursue a software project, no less) . I actually am doing really good research and probably have a promising academic career ahead, it's just not exciting.

I'm always dumbfounded by how much more interesting CS grad students seem (not necessarily their work though, the kings there would have to be the physical sciences).

Math has definitely restructured my brain in great ways. I program a lot too, and programming has done likewise. I think the best thing I've gained from math, though, is the perseverance necessary to do good research, which comes in handy elsewhere for sure.

My recommendation: if you major in CS, take some real math courses on the side.

Comment author: IlyaShpitser 25 May 2012 07:45:39PM 0 points [-]

Seconding this recommendation.

Comment author: AnlamK 07 May 2009 05:17:53AM 4 points [-]

I also want to ask: How can one lead an intellectually active life besides reading books? Is it common for non-PhDs to publish in some fields?

Comment author: ciphergoth 07 May 2009 08:08:50AM *  7 points [-]

I am effectively a cryptography dilettante: I have a handful of publications despite zero formal instruction or tutelage in crypto of any kind. So you don't have to be part of academia to participate in an academic field, so long as the field mostly publishes online.

(edited to add "in crypto" above in case it wasn't clear, sorry)

Comment author: AnlamK 07 May 2009 06:11:17PM 0 points [-]

Wouw, that's really impressive and encouraging. Thanks for sharing.

Comment author: MrHen 07 May 2009 01:23:12PM 6 points [-]

Whoa... you are suggesting that everyone else do what you didn't and the reasoning is a list of ideas with no data? No offense, but how do I know this is not a grass-is-greener, I-wish-I-would-have moment?

I would beware of other-optimizing. As soon as I graduated with a CS degree I realized I should have been in philosophy the whole time. I love my CS major and agree that it is an excellent choice and do not regret the work I put into the process. I also agree with your points. But choosing a major is not a small thing that should be tilted by a post based on anecdotal evidence from someone who didn't do it.

After watching math and physics majors struggle in CS101 I realized that CS is not an intuitive field for everyone. They were not stupid or lazy people. They just didn't "get it". You can graduate with a CS degree and never "get it" and not know jack shit about coding, systems, or any of the other great things you mentioned. I learned about those things. But right now I am working with someone who graduated with a CS degree and did not.

This isn't meant to be a rain-on-your-parade comment; I just want to warn the bloke who reads this post and thinks, "God, math is that useless? I guess I will go CS." The key part in your post they may have skimmed over is this:

You shouldn't be considering a career in academia unless you're passionately in love with your field, unless you think about it in the shower and over lunch and as you drift off to sleep, unless the problem sets are a weekly joy. A lesser love will abandon you and leave you stranded and heartbroken, four years into grad school.

If you are passionately in love with your field, go for it. If you are not, find a different field. CS is not something everyone can fall in love with and think about in the shower and over lunch and drifting off to sleep. Neither is Math, Physics, Engineering, Psychology...

Comment author: talisman 07 May 2009 01:45:08PM *  1 point [-]

I am very successful in my secret identity life, so no, this is not some kind of grass-is-greener observation; rather, it's an attempt to give practical advice to my younger selves out there. I majored in math and physics, and did well, and am in the world now, and can concretely see the ways that a CS education would have helped me, ways that people less smart than I am think better!

As soon as I graduated with a CS degree I realized I should have been in philosophy the whole time.

I'm comparing CS only to other technical majors.

CS is not something everyone can fall in love with and think about in the shower and over lunch and drifting off to sleep.

I'm not proposing CS as an academic discipline, but as a discipline for training the mind for work in the world.

Do I know the intricate details of every reader's intellectual life? Do I claim that everyone who's currently majoring in math or econ drop it and switch to CS?

To quote Robin:

[S]harp people ... distinguish themselves by not assuming more than needed to keep the conversation going.

Comment author: MrHen 07 May 2009 02:17:47PM 1 point [-]

Fair enough. I just wanted to be sure. :)

Comment author: thomblake 07 May 2009 01:30:00PM 0 points [-]

As soon as I graduated with a CS degree I realized I should have been in philosophy the whole time.

This matches my experience. I was a CS major for a bit but ended up graduating with a degree in philosophy. It was much more relevant, even to working in computing.

Comment author: jscn 13 May 2009 10:03:39PM 1 point [-]

Thirded. I completed half of my degree in CS before switching to Philosophy. I'm finding it significantly more stimulating. I don't think I learned anything in my CS classes that I couldn't easily have taught myself (and had more fun doing so).

Comment author: asciilifeform 07 May 2009 03:49:54PM *  3 points [-]

I strongly disagree.

Statistically speaking, salt mines await most CS majors.

I regret my CS degree every day of the week.

Unless your grades are exceptional (or you have the business acumen and extroversion to deal with startups) a CS education dooms you to the career of a human robot.

I will also note that it is possible to be passionately in love with your field without also being passionately in love with homework or exams. For people like this, some of whom want to pursue a life dedicated to chasing knowledge possibly more than most of the academically excellent, universities offer only a savage self-esteem beating.

Comment author: thomblake 07 May 2009 03:55:30PM -3 points [-]

I will also note that it is possible to be passionately in love with your field without also being passionately in love with homework or exams. For people like this, some of whom want to pursue a life dedicated to chasing knowledge possibly more than most of the academically excellent, universities offer only a savage self-esteem beating.

Fortunately, universities aren't about 'your field'. A university education exists to begin the path towards wisdom, in part through experiencing a wide variety of perspectives and methods.

Comment author: asciilifeform 07 May 2009 04:11:33PM *  2 points [-]

A university education exists to begin the path towards wisdom

In practice, it is a credentials mill and "meatgrinder" filter.

Think realistically. If you want to spend your life's prime waking hours creating knowledge instead of languishing in an unrelated day job, academia (or something which demands similar credentials for admission) is the only ticket I know of.

So whatever else the university has to offer, it will be served with a generous helping of defeat, depression, and permanent career damage, if you aren't "grind" material (or intelligent enough to ace classes without grinding.)

Comment author: thomblake 07 May 2009 04:57:11PM 0 points [-]

If you want to spend your life's prime waking hours creating knowledge instead of languishing in an unrelated day job, academia (or something which demands similar credentials for admission) is the only ticket I know of.

This seems to contradict your sentiments. If academia is the ticket to the not-grind, then why is it also the source of the 'grind'?

In my experience, one can do passably well in university while giving little thought to trivialities like what your grades are. Of course, it depends upon the college program, and what you expect to get out of it. Some universities these days seem to be of the opinion that they're technical schools, out to train people for particular careers.

Comment author: asciilifeform 07 May 2009 06:02:46PM *  5 points [-]

The contradiction you are seeing isn't in my post; rather, it is in the way academia (at least in the US) is actually structured. Ostensibly, graduate programs want to recruit candidates who will do creative, original research. Yet, the qualifications they demand (grades) have little to do with creativity and everything to do with being the best human emulation of a computer that you can be.

What undergraduate schooling mostly tests: excellence in rote memorization, speed of solving trivial problems, performance on demand and to spec every day, the willingness to carry out a meaningless task on somebody's say-so - these abilities are mostly orthogonal to aptitude for original research. And yet they are the primary entry criteria.

And doing "passably well" typically won't get you into a Ph.D. program.

Comment author: thomblake 07 May 2009 06:52:24PM 2 points [-]

What undergraduate schooling mostly tests: excellence in rote memorization, speed of solving trivial problems, performance on demand and to spec every day, the willingness to carry out a meaningless task on somebody's say-so

This is not my experience. It sounds to me more like you're describing elementary school. Of course, it could be that you went to an exceptionally bad school, or that I went to an exceptionally good one.

And doing "passably well" typically won't get you into a Ph.D. program.

No, but making the right kind of professional connections and being brilliant will get you into a PhD program, regardless of your grades. Though there are some schools that have a grade cut-off before the department is even allowed to consider a student; I think that sort of thing is criminal. If you find yourself in that unfortunate situation, consider entreating your professors to inflate your grades, or better yet, choose a different graduate school.

Comment author: asciilifeform 07 May 2009 07:04:25PM 1 point [-]

you're describing elementary school

I'm describing a large public US university which I attended, one considered fairly respectable in the sciences. And I have seen scarcely any reports of experience different from my own in this respect. The people with nothing to complain about tend to be the ones with sufficient rote learning / calculation talent to avoid having been burned in the way I describe.

consider entreating your professors to inflate your grades

Are you joking?

choose a different graduate school.

Almost every graduate program in the country has the GPA cutoff.

Comment author: thomblake 07 May 2009 09:32:51PM 0 points [-]

Almost every graduate program in the country has the GPA cutoff.

I'm not familiar with this. Do you have a citation / source / study to confirm this?

I'm describing a large public US university which I attended, one considered fairly respectable in the sciences. And I have seen scarcely any reports of experience different from my own in this respect.

Well my experience can be counted as one of the 'scarce' ones then, and I hadn't until now heard any reports quite like yours. I suppose I should mention then that I went to Southern Connecticut State University, for anyone interested in avoiding the sorts of things asciilifeform refers to, in case my university really was that unique. We do have some world-renowned departments, so I suppose I shouldn't be so surprised.

Comment author: asciilifeform 08 May 2009 12:12:29AM *  0 points [-]

Do you have a citation / source

Only my own experience in trying to find places to apply to.

I hadn't until now heard any reports quite like yours

I suspect we might simply have different views on what constitutes meaningless gruntwork (as opposed to preparation for original research.) To me, this would be pretty much anything which asks for on-demand, closed-book performance, adherence to schedules, any activity involving memorization, and in essence anything short of unbridled freedom to pursue the topics which interest me at my own pace.

Comment author: thomblake 08 May 2009 02:06:45PM 0 points [-]

Indeed it seems we are just talking past each other. "unbridled freedom to pursue the topics which interest me at my own pace" is what you have outside of school. The university is there to expose you to different ways of learning and thinking about things, different sorts of tasks, different personalities and styles of work, and subjects that might not interest you at the moment.

A lot of the things you complain about are components of a happy and productive life.

I often claim that people go to college too young. One should develop the discipline and drive to appreciate a university education before undertaking it - otherwise, one will miss the point and it will just feel like more high school.

Comment author: Lojban 07 May 2009 07:43:53PM -2 points [-]

Read your Reddit post. Wow, sad. I did computer engineering undergrad, and actually didn't get into CS grad school (pre-reqs I think). I ended up doing computer engineering masters. There's a lot of stigma with CS--I'm actually happy I never got stuck with the label.

Comment author: bcheung 07 May 2009 05:20:52PM 1 point [-]

Thanks for writing this article. It would benefit the software development community to know more about this difference. I have a little more in depth description of the digital divide between programmers and computer scientists on my blog.

As an overly stereotyped generality, here are the differences I see between "computer scientists" and "programmers".

The programmer is someone writes code on a daily basis but is ignorant about how the compiler actually works. He is very familiar with the tools he uses but doesn't understand how they work or how to build them. The tools he uses is his world and he uses them to go about his daily work. He is also blinded by them and can't see past them. "If all you have is a hammer, everything looks like a nail". They never think there is a better way and just go about working on their problem the only way they know how.

In contrast, the computer scientist is someone who lives in the more academic world and understands the computer at a more fundamental level -- a machine for performing computations. He sees problems and is able to build a model to solve the problem.

In summary, the programmer uses the tools and the computer scientist makes the tools. The problem is that often these two individuals do not spend enough time in the day to day world of the other. So the programmer is ignorant that he can do things better (more efficient, elegant, etc) and the computer scientist doesn't spend enough time in the trenches to really know what would benefit the programmer or simply doesn't have an interest in solving the problem outside of intellectual curiosity.

Lisp is a great example of this. I recently learned it and it is an amazingly powerful language. Yet I find myself not able to use it because while it is interesting in and of itself, the people who worked on Lisp have done little to make it practical to use on a day to day basis. The learning curve is steep, documentation is poor (relatively) and trying to figure out how to get it up and running on a server in an easy and reliable manner is a P.I.T.A. I eventually gave up on it and switched back to PHP even though every part of me wanted to use it.

Look at PHP. Even though PHP pales in comparison with Lisp. PHP's superior documentation and ease of deployment have made it one of the most popular web development languages.

If the two communities can get together and live in each others' world more, maybe we can all benefit more.

The problem I have is that I am a self taught programmer with a keen interest in computer science but find that living in "computer science land" takes away from my ability to get real work done and pay the bills. I wish it wasn't the case. To my credit though, my PHP code has become a lot more elegant as I am able to take the CS concepts I have learned and apply them to my day to day work.

Comment author: jimrandomh 07 May 2009 06:09:40PM *  5 points [-]

This is a false dichotomy. You suggest that software people can be naturally divided into programmers who don't know theory, and theoreticians who don't program regularly. However, programming skill and theoretical knowledge are independent, continuous and positively correlated. The common cases are people with both programming skill and theoretical knowledge, and people with neither. That's why "computer scientist", "programmer" and "software engineer" are so often used as synonyms - because being one usually implies also being the other two.

Comment author: asciilifeform 07 May 2009 08:19:42PM 2 points [-]

find that living in "computer science land" takes away from my ability to get real work done and pay the bills.

This is not an accident.

Comment author: MrHen 07 May 2009 06:23:36PM 0 points [-]

I eventually gave up on it and switched back to PHP even though every part of me wanted to use it.

I think the problem is that you wanted to use it without asking if it was the proper tool for whatever task you had. PHP and Lisp have very different purposes.

The problem I have is that I am a self taught programmer with a keen interest in computer science but find that living in "computer science land" takes away from my ability to get real work done and pay the bills. I wish it wasn't the case. To my credit though, my PHP code has become a lot more elegant as I am able to take the CS concepts I have learned and apply them to my day to day work.

I find it interesting that you admit to no formal training but are making blanket statements about an entire field. With all arrogance available to me, I claim that I am a good "computer scientist" and "programmer" under your definitions. As far as I can tell, they go hand in hand. When I get better at one I get better at the other.

If I had to make a semantic distinction, programmers are a subset of computer scientists.

Comment author: MichaelVassar 08 May 2009 01:35:08PM 1 point [-]

Simply put, most people who I know who major in CS, or especially who pursue a PhD in it, come to regret it.
As a rationalist, the plural of non-selective anecdote is data... OTOH, non-selective data within me may be selective data to you, since if I didn't object to this post so strongly I might not have commented.
I'll try to correct by commenting with simple enthusiastic agreement some time soon.

Comment author: MichaelBishop 08 May 2009 02:05:15PM 3 points [-]

Why do you think this is so? Your alternative recommendations?

Comment author: loqi 07 May 2009 06:34:20PM 1 point [-]

CS majors learn to really program

I can't really point to anything I learned while getting my CS degree that was particularly instrumental to being able to "really program", and for that matter I don't think I could "really program" until some time after I had graduated. Practice counts for a lot here, especially considering how ungrounded and unreliable the current pedagogy of "software engineering" is. Practice and perfectionism did much more for me as a programmer than any course I took in college.

I grew intellectually through that study, but I've upped my practical effectiveness enormously in the last few years by working with great CS people and absorbing all I can of their mindset.

From my vantage point as a CS grad who maybe wishes he majored in math, physics, or chemistry instead, it looks to me like you're getting the best of both worlds. CS programs tend to be very focused on producing capable programmers, but programming is largely an operational set of knowledge that can't yet be reliably taught in a classroom. My wife is currently pursuing a chemistry degree, and I'm downright jealous of the information density in her courses compared to mine. CS pedagogy is simply immature compared to older fields, full of conflicting opinion, heuristics, and transient industry buzzwords. An exercise: Ask three randomly chosen CS majors what object-orientation is and why it's so great, and compare their answers.

I'm waffling on the regret because the degree did lead directly to an enjoyable, well-paying job. But most of the time I spent in CS classes feels wasted in comparison to the maturity and density of math and science classes.

Comment author: whpearson 08 May 2009 12:12:18AM *  2 points [-]

Programming is maths in a way. As evidence I give you the Curry-Howard Correspondence

I really wish my CS degree had included type theory and Coq and the like.

Comment author: MrHen 07 May 2009 07:01:16PM 0 points [-]

As a simple counter-point, my experience is nearly the exact opposite of yours. I felt that I got a lot out of my CS classes. Not every CS class, mind you, but enough that myself without a CS degree and myself with a CS degree would barely be comparable.

An exercise: Ask three randomly chosen CS majors what object-orientation is and why it's so great, and compare their answers.

While we are not strictly random, I can give 1 of 3:

Object-orientated programming is the concept of designing code around simple, efficient, and reusable objects that can work together to accomplish a larger goal. Compare this against sequential programming, which is essentially a long list of code that is only useful for one specific task.

Comment author: loqi 07 May 2009 08:10:04PM 4 points [-]

I should probably be downvoted for OT-ness, but...

Object-orientated programming is the concept of designing code around simple, efficient, and reusable objects that can work together to accomplish a larger goal.

I think this characterization is more affective than descriptive.

Compare this against sequential programming, which is essentially a long list of code that is only useful for one specific task.

This seems to be a non-standard use of the term "sequential", especially considering that most popular object-oriented languages are imperative, executing one statement after another in sequence. The usual comparison is against structured programming, which could possibly be described as the practice of designing code around simple, efficient, and reusable functions that can work together to accomplish a larger goal.

Comment author: MrHen 07 May 2009 08:48:26PM 0 points [-]

Fair enough. "Sequential" was a term from memory. I assume it came from my classes, but what you are saying makes sense. In all honesty, I am not one to define a term like OOP. I use it and know it, but mostly from the principle of "I know it when I see it" not from strict terminology.

"Sequential," to me, is not simply executing one statement after another in sequence. It is a confusing use of the word and possible non-standard. I am not one for terms in general, so take my descriptions with a lot of salt.

As for OT, I figured in a post on CS discussion CS is fair game. Especially this far down the thread. You're good in my book.

Comment author: loqi 07 May 2009 09:13:39PM *  0 points [-]

In all honesty, I am not one to define a term like OOP.

I'm not a big fan of the terminology myself. That's why I chose OO for the exercise... it's presented (at least it was when I was in school) as this critically important concept/technique/whatever, but in common use the term doesn't seem to denote much of anything. In comparison, I don't see much of this happening in chemistry or physics.

I am not one for terms in general, so take my descriptions with a lot of salt.

I'd caution against throwing the baby (concise terminology) out with the bathwater (vague industrial buzzwords) here. For example, I've seen a lot of cynicism directed at the term "ajax" because of its associated buzz, despite it having a relatively unambiguous, useful meaning. Good terminology facilitates effective chunking and communication.

Comment author: SoullessAutomaton 07 May 2009 09:30:54PM *  1 point [-]

For what it's worth, in my experience about the only different between OOP and old-school structured imperative programming is that OOP design revolves around semi-atomic, opaque chunks of data, with limited sets of operations that are allowed on a given type of data. In contrast, non-OOP imperative programming typically revolves around a hierarchical breakdown of the task into subtasks implemented as procedures, which the programmer invokes sequentially and passes smallish, transparent bits of data to.

The two are essentially isomorphic, but one or the other may be more natural depending on how well your problem domain decomposes into either 1) a series of subtasks or 2) a collection of self-contained data with a limited range of sensible actions.

For instance, procedures like C's standard string functions would be more natural in an OOP system because they define a limited set of sensible operations on a fragile data structure, whereas things like Singleton objects and static methods in OOP languages are a hack for things that are more sensibly non-OOP.

Most other details about OOP (like inheritance) will inspire more religious wars than anything else.

Comment author: Cyan 08 May 2009 02:08:02AM *  0 points [-]

OOP proponents usually claim that structured programming projects become too complex for any individual or group to manage at around 100,000 lines of code, but the only references my Google-fu was able to dig up for that claim are twenty-some years out of date:

  • C. Jones, Programming Productivity, McGraw-Hill, New York, New York, 1986.
  • C. Jones, Editor, Tutorial Programming Productivity: Issues for The Eighties, Second Edition, IEEE Catalog No. EHO239-4, IEEE Computer Society Press, Washington, DC, 1986.
Comment author: saturn 07 May 2009 11:59:20PM *  1 point [-]

Object-orientated programming is the concept of designing code around simple, efficient, and reusable objects that can work together to accomplish a larger goal.

Removing the 'fluff' from this sentence, we get: "Object-orientated programming is designing code around objects," which looks awfully close to a tautology.

Comment author: MrHen 08 May 2009 12:39:16AM 0 points [-]

Mmm... well, the "fluff" was there for a reason. "Simple" means easy to understand and not particularly complex; "efficient" means the object does one thing and one thing well; "reusable" means the object is not tied down into any particular infrastructure; "work together to accomplish a larger goal" means that an object is designed to work with other objects, not designed to solve a big problem. I suppose I could have expounded on the terms but I didn't figure anyone cared enough.

I'm still not terribly convinced anyone actually cares enough.

Comment author: anonym 10 May 2009 10:03:18PM -1 points [-]

The qualifiers -- simple, efficient, reusable -- distinguish good OO code from bad OO code. They have nothing to do with OO in general. Bad programmers will write object oriented code that is complex, inefficient, and non-reusable. Likewise, "working together to accomplish a goal" applies just as much to subroutines in an imperative language or functions in a functional programming language.

Comment author: anonym 13 May 2009 03:00:34AM 0 points [-]

Hmm, parent is at -2. I would be curious how anybody could actually believe (and justify) that OOP

is the concept of designing code around simple, efficient, and reusable objects that can work together to accomplish a larger goal.

Comment author: pjeby 08 May 2009 04:31:43AM -2 points [-]

Object-orientated programming is the concept of designing code around simple, efficient, and reusable objects that can work together to accomplish a larger goal. Compare this against sequential programming, which is essentially a long list of code that is only useful for one specific task.

I think a more accurate instrumental description of OOP is that it's code that invokes operations in terms of abstract data types, while having code organization based on concrete data types.

This definition spans everything from prototype-based OO to inheritance to interface polymorphism and generic functions, and various combinations thereof.

That having been said, I don't know very many CS people or industry programmers who would give such a concise definition, unless they've seen OO done in say, Python, Java, JavaScript, Lisp, Haskell, Eiffel, Dylan, and C -- or at least enough other languages to see the OO forest distinct from the trees. Academics are likely to babble about a bunch of stuff that doesn't matter, while industry folks are likely to babble about how cool OO is or that it's just "how it's done".

Comment author: SoullessAutomaton 07 May 2009 10:42:55AM *  1 point [-]

I would add to this a couple things, from personal experience.

First, make sure to get a breadth of exposure to CS concepts. A computer science department is an unholy abomination glued together from fragments of math and electrical engineering, and you want to understand both. Learn to speak in terms of Turing and Von Neumann as well as Church and McCarthy. Understand both the gritty details of digital logic families and the transcendent beauty of Y, the fixed-point combinator.

Second, learn something else, too. And I don't mean math--CS alone makes for interesting toys, but the true power occurs when you apply CS concepts to solving problems in other fields. Learn the ropes in some other domain, and then apply what you've learned from CS to it. Learn and apply aggressively the Three Great Virtues of a programmer in everything you do.

Comment author: AnlamK 07 May 2009 05:02:45AM 0 points [-]

Just to add my own two cents. The market for CS majors is excellent. I guarantee you; you won't have any trouble finding a job if you are a CS major. Nowadays, there isn't a company that doesn't have software people.

Comment author: talisman 07 May 2009 05:23:26AM 7 points [-]

True, but what I want to emphasize is that the CS way of thinking is extremely valuable outside of the software field.

Comment deleted 07 May 2009 07:53:58PM [-]
Comment author: AnlamK 08 May 2009 01:34:51AM 0 points [-]

Haha... No. I'm EE - and I'm just annoyed by the deluge of CS job ads. 8-)