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?
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.
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 **
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.
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.