Become a fan of Slashdot on Facebook

 



Forgot your password?
typodupeerror
×
Education

What Makes a Good CS Program? 25

dobratzp asks: "I am in the middle of my undergraduate studies and I somewhat dissapointed in the quality of some of the Computer Science classes that I have to take. I have just had a great internship this summer and I learned so much more than I have in any CS class. What should be considered the minimum requirement for completion of a Bachelor's in CS?" Additionally, what non-CS electives are good choices for CS majors to take to broaden their knowledge, yet are still relevant to the field?
This discussion has been archived. No new comments can be posted.

What Makes a Good CS Program?

Comments Filter:
  • by Anonymous Coward
    All great examples, except for "Extreme Programming"

    XP is just most of the previous best practices that were already in use (test as you go, iterations) plus some WHACK ASS, useless shit.

    XP is a vehicle to sell expensive seminars to management, and nothing more.
  • As a matter of fact, don't rely on it for much at all, besides having fun. Internships are a great start, but you also need to find some mentors (network for future job opportunities) and hit the books. I'm not talking about textbooks (ugh), I'm talking about the "Bibles of Our Industry" <shame>the title of my article in JavaWorld next month</shame>. Head over to Amazon and search for Design Patterns, Refactoring, Extreme Programming, Code Complete, Antipatterns, Designing Web Usability, etc. Also, poke around the Wiki/Portaland Pattern Repository and read anything and everything that interests you.

    FYI, I'm the CTO of my second successful internet start-up and I majored in Music :-)

  • by Matts ( 1628 ) on Tuesday August 29, 2000 @11:28PM (#818339) Homepage
    Before I graduated from Durham University [dur.ac.uk] I took a summer internship at a small company in London (that has now pretty much been subsumed by a larger company). The things I learned there were amazing and much more interesting to me than the things I learned on my degree course: SQL optimisation, C++, shell scripting, Windows MFC programming, etc. And I went back fairly unhappy about my course.

    I graduated the next year and joined that company, and did more of the same - SQL, C++, MFC, etc. Eventually I quit that company and went out on my own doing web development on a freelance basis, and did more fun stuff - Perl, HTML, more databases, etc.

    Now I've finally come full circle. This year I started working on an implementation of the XML Path language, XPath, in Perl. Lo and behold, I became so glad that I never threw out all my old text books. I needed to go and re-learn parsing and algorithm optimisation, and all that stuff I thought was mostly irrelevant for the work I was doing. I've actually now re-read most of my old text books, and all of them are still relevant today.

    So the point is two things:

    1. The stuff you are learning will serve you for life. The fun stuff you learned as an intern somewhere will probably serve you for part of your career, but not likely all of it, unless you're happy to go into management!

    2. Have fun while you're an undergrad. Go to parties. Get drunk. Have lots of sex if you can. Make friends. The most important part of University life is the social aspect, not the learning. The relationships you form at Uni should be ones you form for the rest of your life. Its very hard to find people on the same intelectual level as you in your home town. Thats not the case with Uni. Take advantage of that. As far as the learning goes - don't skip classes. Learn what you can but don't let your parents or peers push you too hard. Keep your textbooks and the learning can be re-done at a later stage.

  • I've found that the curriculum in and of itself isn't that important. Some may be better than others, but I've ultimately found that a school with a number of professors committed to undergraduate research have helped me to learn more than I ever could have in classes. Getting to know professors you can talk to about your interests in CS can help you learn a lot. They can recommend good books, give you background on subjects, and quite often even allow you to get involved in very interesting research that can expand your horizons far more than any class could. If I were looking into schools, I'd try to find some self starters in the program (look on the CIS dept's webpage, under undergraduate research or CIS-related clubs, such as ACM etc.), and try to talk to them to find out about these things. If you're motivated, opportunites for learning outside the curriculum end up teaching you a lot more than any classes will.
  • that's log base 2 of n... log(n) implies log base 10 of n, which is incorrect

    Not if you're talking about asymptotic complexity. Constant coefficients are ignored, and the only difference between log_2(n) and log_10(n) is a constant factor of log(10)/log(2). (Again, the base of the logarithm doesn't matter because it just introduces a common factor that'll cancel itself).

  • Unfortunately. Which makes things really hard. Really, really hard, actually.

    The real point to University is not learning *things*, it's learning how to learn and how to think. Most people think that when they've made it out of high school, they now how to learn. Or perhaps that learning is something innate in people. It isn't.

    I've taken a bunch of courses, and all of them have been useful. Even the ones I hated. Not because of the things that I learned in them - I forget a lot of things that I've learned - but because I now can look at problems from so many more angles than before.

    There's nothing that's taught in those courses, in general, that you can't get from a book. But by being in them, you learn that there's always a lot of ways to do something. Given a problem, it's terribly likely that I won't be able to solve it off the top of my head. But give me a day, and I can have 3 possible solutions researched, and I can attack the actual implementation from dozens of angles.

    Everybody else is recommending courses, though, so here's one that no CS student should go without: A course in Graph Theory. It's applicable to damn near any situation, and it's possible to forget most of the theorems involved, and still use the basics to get some sort of worthwhile answer.

    That, and any course with a lot of girls in it. :)

    --
    "I don't know if anyone has noticed, but I derive no small amount of pleasure from telling people where they can cram it." -Me
  • Almost any class can be applied to a career with computers, it all depends on what you end up working on.

    If you are going to end up working in a corporate IT group implementing accounting or finance software, then accounting and finance classes will help out. These classes would also be useful if you are going to begin your own startup.

    If you are going to develop games then art, music and creative writing classes would be useful.

    What it comes down to is that you will not learn all the skills for any given job in school. You will learn them on the job. So you should take the time you have to broaden your exposure to other areas that interest you. Take art, music, biology, physics, food science, weight lifting, philosophy, history, etc. Whatever you find interesting that is not part of your requirements.
  • If your array is sorted on a good hash key, it's not O(log(n)), it's O(1). That's still 2 seconds in your example.

  • That's just the number from his example, so it's correct. Just to show it's not unrealistic, consider doing a search accross a distributed system, 1 sec to send request, .01 to do search, .99 to return results is 2 seconds.

    Actually though, I'm really surprised at the amount of response over my nitpicking of his lack of details!
  • by ct.smith ( 80232 ) on Tuesday August 29, 2000 @12:50PM (#818346) Homepage
    technology changes, theorems don't.

    On that idea, take lots of math & philosophy of logic courses. Likewise courses on design are also helpful. You will use these things in your career as a programmer.

    Avoid those courses that centre on specific technologies. They'll be obsolete by the time you graduate.

    The exception, of course, is to do tech courses that are just really cool projects. For example, I'll never again have to do real-time systems programming under DOS, but the progect was much fun. In these cases, just research the prof ahead of time.

  • Not always - Unix system programming is always in style (unless you think Unix is already obsolete, of course).

    Avoid those courses that centre on specific technologies. They'll be obsolete by the time you graduate.
  • It's been said before, but bears repeating: it doesn't matter much what specific technologies you know. Any company is just going to train you in their methods/tools anyway. Instead, focus on the basics that stay constant; good program design/coding, principles of operating systems, designing and analyzing algorithms. Everything else is bonus.

    That said, I think the best CS education comes from hands-on projects, working both alone and with others to design and produce a product that meets specific requirements. This is the sort of thing that is more relevant than any specific technical class. Problem-solving is key; memorizing every intricacy of the C language is not. You should be able to look at a problem and not only come up with a solution, but be able to argue why the approach you used was better than another approach. I was disappointed that my CS degree did not involve a "senior project" as part of the curriculum, for these reasons.

    Outside of technical classes, take courses that broaden your basic knowledge, or help your problem-solving ability, or even just give you something interesting to talk about at an interview. Technical/business writing, public speaking, graphic design, literature are all good ideas. Even physics can be useful. Anything that teaches you to think through your approach.

  • But first, you have to tell us what you want to do with your CS degree. Describe to us the job you expect to get upon graduation. What do you expect your job to look like five years after graduation? Is your BS-CS a step to graduate school? Do you want to be a coder, translating specifications into programs and products? Do you think you will be designing games? Writing code to control automobile fuel injection systems? Inventing the algorythms that make graphics boards fly? Writing Drivers? Maybe you are confusing Computer Science with creating Web Pages, installing/maintaining networks or creating MS Office applications.

    From some of the answers, it's clear that the colleges and universities have different opinions on what a CS degree should be; what a successful graduate should know. And they're not giving you the real information you need to make the decisions.

    My suggestion is to find people who are doing now, what you want to do upon graduation. They'll tell you what is important and what is not. They will also give you the straight scoop about their job and what it is about -- and what the future holds. Contact Human Resources (or personnel) at a company you think you'd like to work for. The will be glad to get you in to see some real engineers. Maybe it will give them a leg up on hiring you at the end of your four years of higher education.
  • "If it takes two seconds to find an entry in a sorted array, how long will it take if the list is ten times the size it presently is?"

    That depends on your search method. Yes, a binary search will be log_2(n) (that's log base 2 of n... log(n) implies log base 10 of n, which is incorrect). If you are doing a linear search then it depends on where the item is in the array. If you set up a hash then lookups may be practically immediate, depending on how good your hash function is (i.e. is it guaranteed to return unique indices into the array, and if not then how have these conflicts been handled?) and system resources/performance. The typical answer to most computing questions is "it depends".

    I'm a Computer Science major at Western Washington University. This stuff is all part of the lower-division courses. I don't know where your interviewees are getting their degrees! Perhaps via mail order?? :-)

    Eric R. Turner

    BTW, your quote reminds me of the one from Dijkstra (my hero) who said: "Computer Science is no more about computers than Astronomy is about telescopes".

  • Very True.

    The best CS program is in your basement/garage/bedroom...

    Now hiring experienced client- & server-side developers

  • He is actually a teacher where I go to school (UTexas @ Austin). Then again, we have lots of really famous profs in their fields working here, suprisingly so for a state U. (c.f. Steven Weinberg in physics)


    --

  • Disclaimer: I just started my second year at the local community college.

    The way I see it, doing anything outside of class is the way to go. I learned more about ANSI C (stdin/stdout/stderr, #define, malloc/free, buffering, and '\n' character translations under DOS) in a week of playing with a text filter than I could learn in a month of a computer course at college. Of course, the "Computer Organization" course I'm taking this semester might change that, as we are expected to do this type of stuff (cgi-bin controlled robot, serial port communications program) as part of the curriculum.

    For related classes, the suggestions of logic, philosophy, etc. are probably good. You need to be able to come up with an idea/algorithm before you can possibly express it (in any language).


    --
    LoonXTall
  • As a 30-year practitioner who refused to continue coursework in what passed for "Compute Science" back in my college days (and ended up joining the Association for Computing Machinery to try to clean up the model curriculm) I have a few thoughts:

    1. Writing: I have found that I ended up writing more prose than code once I graduated from a coder position. This was especially true when the company I was working for decided to build their own version of a discontinued minicomputer to preserve 19 man-years of commercial software development.

      I was tagged to document exactly how the commercial computer worked, and to write the functional specification for the new computer based on probing. In that effort, I generated and estimated 70,000 words of text -- and during the same period I generated less than 10,000 debugged lines of assembly code.

      The ratio of prose to code tipped in favor of the former when I started doing technical team lead tasks. (Part of the reason was we moved to PL/M from assembler for our 8086 work.) At one point, I was generating upwards of 9,000 words per day: in specifications, in detail design reports, in interface specifications, in "application notes", in testing suite documents, and in memos to my team trying to solve knotty interaction problems before they became of concern to management.

    2. Engineering: One of the most sobering statements I ever heard was this one from a long-time manager: "I would rather take an electrical engineer and teach him how to write software than to take a 'software engineer' and teach him cost-effectiveness." Even though this was said in the 1970s, during the minicomputer boom, I'm finding that many CS/CE grads still don't understand how to utilize the hardware effectively, and to select approaches based on cost (development, debugging, maintenance) instead of "niftyness". As an experiment, I took some fresh CEs aside and asked them a few questions:
      • What is an overlay?

      • How would you implement a sparse two-dimensional matrix of values, given 10K in each dimension?

      • If I had a 1200 document per minute scanner (like a bank check reader-sorter) how much time do you have for each document, on average? How would you go about writing software to operate such a beast?

      As you might imagine, the answers I received to these questions were far less than satisfactory. No one put forward any scheme for the spare-matrix problem that didn't require huge amounts of RAM. No one knew what an overlay was, let alone how you would implement overlays in the development environment they were supposed to have 3-5 years experience in. And not one of the people I asked got the right answer for the processing time available on that sorter: 20 documents per second, or 50 milliseconds per document.

    Am I being hard? I don't think so. Many of the techniques I learned in those days when "8 kilowords is enough" are still valid today. New concepts have been developed as well, and I've integrated them. Any coursework that doesn't include both old and new is, in my opinion, not worth the time.

    Which leads me to my last suggestion: the local computer club. Formal coursework is not a replacement for one-on-one discussions with peers, side-by-side experimentation, coding contests, and the society that you will find when you go for the almighty paycheck.

    No club? Form one. Check with the student activies office on your campus and find out what it takes to start one.

  • Wow. I didn't realize that there was another double-degree CS/Religion major out there.

    I'm glad I studied CS because I gained important knowledge about how computers work, the mathematics behind computation, and the theory which forms the basis behind the work that I do.

    Despite this, I think I got more out of my Religion degree. Why? Besides the fact that I was older and more mature for my second degree, I really feel that the critical thinking and analysis skills I learned while examining religious texts and history are more important in the long run. I may not need to explain the relevance of Sankara to Hinduism on a daily basis at my job, but if you need a business report written or analyzed quickly, I'm more than up to the task!

    I've also found that despite their vast computer knowledge, many of today's technology employees lack basic written communication skills. These people are in a position where they need to be able to communicate technical concepts to non-technical people via documentation, reports, etc., but few have any idea how to perform such a task. The ability to tell a team member what you're working on and what you've accomplished is 50% of the job. Taking some good courses in the humanities and social sciences will broaden your skillset in the job market and make you more employable. /EJS

  • Well, I took other real-world related classes like econ and poli-sci, but also took a lot of pure knowledge classes like history or music appreciation. I know this sounds like a cliche, but you really want a well rounded curriculum. That was one of my complaints about my school's (U of M - Ann Arbor) B.S. vs B.E. program and the engineering school in general was that it was too focused on the degree and not on a well balanced education.

    Try to think about what you want to do once you get out of school. Business classes will almost always help, since the principles will be applicable to your job. As for specific classes, like the other poster said, try to stay well rounded and get a good idea of how the whole system works together. You may not need to be able to write a compiler, but knowing the basics of RAM vs disk I/O is quite helpful.

    -----
  • by Vuarnet ( 207505 ) <luis_milan.hotmail@com> on Tuesday August 29, 2000 @04:17PM (#818357) Homepage
    Mind you, this is only my opinion. Your mileage may vary.

    - Basic computer programming skills. Even though there's lots of people who despise such "baby" languages such as plain C and Visual Basic, these can be used as a starting point in order to learn new languages. If you get the basic _logic_ behind these plain vanilla languages, you'll make it OK with more advanced ones.

    - As several people have commented, try to get into Math classes. In my school, sadly, they're dumping the advanced Math classes I had to take (such as Numerical Methods, Differential Equations, and Statistics) in order to make space for Windows Networking, HTML (4 whole months just to learn how to make a decent web page?) and ASP Programming.

    - Try to get into a few classes which have absolutely nothing in common with CS, but which you think you'd like to learn. Ecology, Religion, Arts and Crafts. You'll get to meet some people outside the CS circles, have an at least slightly better social life, and maybe even get to impress some people of the opposite sex with your intelligence (let's be honest, it's every computer geek's dream to be noticed like that!).

    - Try taking a few sports classes or extra-curricular activities. It'll help you relax when you're all stressed out during the tough assignments, you'll be healthier, and maybe even look better. See above point re: being noticed by people of the opposite sex.

    - Logic and Philosophy clases are a plus. I know several people who studied CS, and which have troubles grasping the fact that if A precedes B, and B precedes C, then logically C CANNOT HAPPEN before A.

    - Speaking and Writing courses! They may sound silly at first, but believe me, once you're out there, the fact that you can code incredibly well can be obscured by the fact thay you can't explain to the user just how to operate the final application you've built.
    Besides, good speaking skills and a good disposition will usually get you on the good side of the user, saving you hours of discussions and arguments.

    Well, that's just a few pointers I'd like to share with you all. Good luck on your classes!

  • at it. I just graduated myself. I found that strict computer science was wasting my life so I found...Religion. Laugh what you will, I took up the double major and became enthralled with the subject. Taking Philosophy classes within the Religion degree helped me see problems from a different light (since most of the classes consisisted of good founded arguments and discussions).

    I would seriously try to branch out in your school and take some fun classes like I did. You can easily get burnt out from classes that are incredibly difficult and can easily get disgruntled. Oh and..Calc 2 sucks. Just thought I'd let you know. Don't take it. No, seriously...DON"T.

  • I wish I had the time.

    I agree, and that's the sort of answer I was hoping to get out of the folks being interviewed. It was not to be, however.

  • It's got some folks who actually read and think.

    As far as the log thing goes, exactly so, although when figuring some types of search time the factor of log 2 vs. log 10 is a constant offset. It was the understanding of the logarithm idea that was missing from most of those applying.

    The point though, is that you read the book, got instructed, THOUGHT ABOUT IT, and remembered it.

    You have no idea how many of your concurrent CS students will never even recognize "Dijkstra" as a person's name, rather than random characters.

    The difference, in my opinion, is not so much the school, but the individual. Schools only provide an opportunity to think and learn. Some people take advantage of them, and some people don't.

  • Math, logic, writing. Art classes help, not only from a "other forms of information" perspective, but also stress relief. Check the history of what you are studying. You've never felt doomed until you've just repeated a mistake that was nailed down fifty years ago.

    That said, I cannot count the number of resumes that I have seen from "computer science" majors. Most of them cannot reason, very few of them can write or do basic research, almost none of them understand the relevant math behind the technology they pretend to study.

    Right about now, a bunch of you out there are getting geared up for "short X-ray temperature flame mode". Please, hear me out. I have no degree in any subject, yet I found it necessary to learn the math, and do the reasoning simply in order to be able to do a good job.

    Here's an example: I once asked a bunch of job candidates this question: If it takes two seconds to find an entry in a sorted array, how long will it take if the list is ten times the size it presently is? Out of fifty-six, one of them got it right. Most of them didn't even know what log(n) means. The most common answers were "ten times as long" and "the same". Close third was "does it matter, just get a faster computer..." Mind you, this is from people who claim to have degrees in this stuff.

    As a consultant and engineer, I have the onus to make sure that whatever I recommend or build will work, safely and to the customer's satisfaction. This is just plain business. Just one good hit on your E&O insurance can wipe you out but good.

    The industry is full of folks who would otherwise be used car salesman or shoe clerks attempting to cash in on the "technology boom" that USA Today keeps telling them about.

    "Computer science is to science as plumbing is to hydrodynamics". I am not sure who first put this forward, but it is most certainly true. There is science in computing, but the main body of knowledge is really engineering. Either way, engineering or science, to qualify as either one requires a firm grasp of the math. If you can't qauntify it, it's an opinion. Working in this field is more than just sorting through a stack of vendor's lit. and going to management lunches. Some of us actually have to make the damn things go.

Elliptic paraboloids for sale.

Working...