What Makes a Good CS Program?
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?
FYI, I'm the CTO of my second successful internet start-up and I majored in Music :-)
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.
Matt. Want XML + Apache + Stylesheets? Get AxKit.
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.
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.
** Sig-a-licious **
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.
"This message is composed of 100% recycled electrons."
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:
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.
What is an overlay?
How would you implement a sparse two-dimensional matrix of values, given 10K in each dimension?
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.
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.
-----
Planning to be moderated ± 1: Bad Pun.
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!
Tongue-tied and twisted, just an earth-bound misfit, I
Learning to fly, Pink Floyd.
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.
*whup* "Get along, little electrons. Heeyah!"