Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

(Ovid) Re: (OT?) Usefulness of CS

by Ovid (Cardinal)
on Dec 25, 2001 at 00:28 UTC ( [id://134209]=note: print w/replies, xml ) Need Help??


in reply to (OT?) Usefulness of CS

Update: I see that social_mandog is getting downvoted for /h(er|is)/ post. I can understand why, but I want to explain why I gave it a ++.

social_mandog, from what I read in the above post, seems to be suggesting that a CS degree is useless (at least, if you accept the anology that critics can't create). So, social_mandog made a post, stated a thesis, and asked for others to comment. Now, if you're downvoting the post because it's off-topic, I can see that. If you're downvoting because social_mandog is apparently stating a view that you don't agree with, then I don't agree with that - though it's your prerogative. An argument was put forward and discussion was asked for. I like that.


You're absolutely correct. Literary criticism can be useful for writing a good story :)

I've definitely met CS majors who couldn't tell you the difference between a global variable and a lexically scoped one -- or why the latter is preferred. I've met CS majors who are programming language bigots and forget that different languages have different strengths. In fact, many of the CS majors that I have met seem clueless about programming.

Programmers that I have met without a CS degree are even worse.

Everyone knows that the bubble sort is useless, right? What, you didn't learn that when you studied algorithmic efficiency? Oh, wait, you did learn about it. Did you know that the bubble sort is often the fastest possible sorting algorithm on nearly sorted data? Do you know the difference between a b-tree and a binary tree? Have you used a heap? What about a linked list, double linked list and the like? Why are linked lists so common in other langauges but seldom used in Perl?¹

It's questions like the ones above that trip up people who aren't CS majors. Personally, I only have an Associate of Science degree. I'm working my tail off trying to make up for it. I think this is the difference between "coders" and "programmers". Many coders can tell you, down to minute detail, why pseudo-hashes were invented, how to implement one, what's wrong with them, and why their apparent performance gain was illusory. Of course, these same coders often can't program their way out of a paper bag (whatever that means). Programmers, on the other hand, won't necessarily know everything about a language (but they often do), but they know how to develop programs. They know when to optimize, when not to optimize, when to break rules, and - more importantly - what the rules are.

Having a CS degree probably means that you have studied algorithmic efficiency. You probably understand how different data structures work² You might just know that the particular graph software that you are working on would be better off using adjacency lists than adjacency matrices. By being exposed (hopefully) to a wider variety of ideas and programming languages, you bring a greater set of tools to any given language. Perl, for example, may be the swiss army chainsaw, but you are the one using Perl, not the other way around; you have to know exactly where Perl has the corkscrew hidden.

This isn't to say that CS majors make better programmers, per se, but they have a much better foundation to build on. People who learn to program but don't study computer science³ have a great knowledge gap but often don't know what they don't know, so they sneer at those who do.

It reminds me of a famous quote by a chess grandmaster (whose name escapes me right now) when he was commenting about Bobby Fisher's brilliance at chess. He said that he could also see the brilliant moves that Bobby Fisher found in any given position, he just couldn't figure out how to get to that position. Many of us see the brilliance in the work of Dominus, TheDamian, or merlyn, but if you read the above post again very, very carefully, you might get a glimmering of how to reach their positions.

Cheers,
Ovid

1. To be perfectly fair, I'm just learning about many of these things myself. I realized that one of my greatest weaknesses as a programmer is lack of knowledge of algorithms, so I'm trying to make up for. I have Mastering Algorithms with Perl sitting beside me now (as if you couldn't tell :)

2. Knowing about data structures is at least as important as knowing about algorithms. And when I say data structures, I'm not talking about something as trivial as an array of arrayrefs of hashrefs or anything like that. I'm talking about deques, stacks, doubly-linked lists, etc.

3. When I say "study computer science", I don't necessarily mean "at university". There are plenty of excellent programmers out there who know "computer science", but never went to school for it. We can learn anywhere.

Join the Perlmonks Setiathome Group or just click on the the link and check out our stats.

Replies are listed 'Best First'.
Re: (Ovid) Re: (OT?) Usefulness of CS
by shotgunefx (Parson) on Dec 25, 2001 at 14:58 UTC
    While it's hard for me to say how useful a CS degree would be (high school dropout 'cause of Math of all things... ), I don't think by any means it's a necessity. I've met plenty of CS Majors that were bigger hacks than Danielle Steele.

    I don't think anything is a replacement for experience (and books). With the abundance of computing power today, it's really easy to churn out bloated code that merely functions. This has it's place in some limited situations, but it's also why even though PC's are 20 times faster than 6 years ago, the actual performance gains lag far behind. (Windoze anyway). On the other hand, "Premature optimization is the root of all evil."

    Slightly OT, I think the fundamental picture of PC Computing is lost on many a college student. I think a great project for someone new to computing would be to have write a game or some similarly complex simulation on an old 386/486 (or something with constraints) that was way too ambitious to actually run on such an old system.

    They would get their hands dirty. Once they got it running (slowly), they'd be forced to look at the efficiency of their algorithms. Once that was tweaked, they'd have to turn to look at the operation of the system itself for further speed, then finally, compromise features. I can only speak from my own experience but these are issues that come up quite routinely in the programmers line of work and are hard to teach from a book.

    I also think every programmer should do some assembler, at least for awhile. While it's tedious as hell, it gives you a great feel for what is actually going on under the hood.

    my $two_cents && 'Happy Holidays';

    -Lee

      First, let me say this is not a rant at shotgunefx. I replied to this post because it hit several topics that I wanted to touch on. I don't think anyone disputes the fact that college systems turn out an inordinate number of hacks, whether CS or literary. I also doubt that many would dispute that there are a goodly number of bad CS and Literary university programs.

      However, some of these examples listed above actually represent the basics of any decent CS curriculum:

      • CIS students on a systems information track usually have to write a multitasking operating system simulation. I had to do this in Advanced Operating systems.
      • <OLDFART>I was in college from 1983-1987. When I graduated, we still had IBM PC Jr.s in the PC labs and an IBM 4341 mainframe with 8MB of core memory. Do you think that the scope of our assignments were limited because of the hardware constraints? Mind you there was no such thing as CPAN back then, we had to write everything from scratch using the quaint data structures Ovid mentioned.</OLDFART>
      • Students in the systems information track were also required to take Compiler Construction and Design. I was exempted from this because I requested to take a graduate course in Artificial Intelligence instead. My project was a 3d tic-tac-toe game on a 5-by-5 cube. with graphics.
      • Assembler was required for all CS majors and was a prerequisite to Data Structures. Digital Logic, required for systems information, also provided valuable insights on how computers work.
      One of the points I'm trying to make is that universities are a lot like computers: Garbage in, garbage out. Those that apply themselves and learn the required material will benefit from a college degree.

      Colleges do provide the opportunity for real hands on (paid) experience for their students, it called co-op. I had one friend that worked with the local Corps of Engineers and two at QMS (Quality Micro Systems) R&D. One is currently upper management at Adobe.

      People should also consider the fact that most intelligent college students do more than just attend class and do homework. Some work, have families, belong to professional organizations and also find time to further personal projects or research as well (computer related or not).

      Here are some interesting statistics lifted from here:

      Table 1. Highest level of school completed or degree
               received, computer programmers, 1998
      
          Level completed                                  Percent
          ------------------------------------------       -------
          High school graduate or equivalent or less          10.6
          Some college, no degree                             20.5
          Associate degree                                    10.2
          Bachelor’s degree                                   45.3
          Graduate degree                                     13.4
      
          About 3 out of 5 computer programmers had a bachelor’s
          degree or higher in 1998 (see table 1). Of these, some hold a
          degree in computer science, mathematics, or information
          systems, whereas others have taken special courses in
          computer programming, to supplement their study in fields
          such as accounting, inventory control, or other areas of
          business. As the level of education and training required by
          employers continues to rise, this percentage should increase
          in the future.
      

      --Jim

Re: (Ovid) Re: (OT?) Usefulness of CS
by edebill (Scribe) on Dec 26, 2001 at 08:01 UTC

    Interesting. When I read mandog's post my first interpretation was "CS doesn't teach people how to program" and I agreed with it.

    Because my definition of "programming" is getting your code down, tested thoroughly and working properly.

    Knowing when to break things into a module, just how much you can code before you need to test it, what a good variable name is, and why. These are the things I think of as "programming". And since I haven't seen anyone try to teach them outside of "The Practice of Programming" by Kernighan and Pike and "Large Scale C++ Software Design" by Lakos, I tend to think of them as things you learn through experience.

    Picking algorithms, mapping out data structures, choosing an overall program architecture that works with everything else. I think of all these things as "Software Engineering". In a way they're easier to learn. Most are things that people can measure easily (e.g. testing the performance of various sorting algorithms). Much of it has a strong scientific basis and there are a million books about it. It's covered in every CS curriculum.

    I don't think you can be good at developing software without both. The two parts are like the difference between architects and carpenters. One can tell you what to do, the other how to do it, and you aren't going to get a good building without both.

    I've got a Computer Engineering degree (not quite CS - but the only relevant difference was that I had EE classes instead of electives, and a few extra semesters of math) and I must say that it didn't teach me anything about programming. Professors lectured on data structures, analysis of algorithms, language syntax, etc. But nobody ever tried to sit a class down and say "this is how you write code".

    Nobody ever mentioned that you shouldn't write 2000 lines of code, then see if it compiles. And I saw CS students just about to graduate do exactly that. People in their last semester, with good grades, who didn't know how to break a C program up into more than one .c file and still get it to compile, much less use multiple files to make the code more reuseable.

    This is a very real problem. Did anyone else go to a school where the CS department didn't offer a class, or even a lecture on debugging? Debugging isn't a big research topic. People don't write theses about whether debuggers are more efficient than print() statements. It won't make a professor's career. But you can't be a professional programmer without it.

    You can't be a good professional without the theory of algorithms, different development cycles, a good gut feel of what happens when someone makes a O(n^2) algorithm, etc. CS is where you learn that. I'm just not sure that it's "programming".

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://134209]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (3)
As of 2024-04-18 00:36 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found