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?
Re:Don't rely on college for education... (Score:1)
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.
Don't rely on college for education... (Score:2)
FYI, I'm the CTO of my second successful internet start-up and I majored in Music :-)
I thought the same too! (Score:3)
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.
Good professors (Score:2)
Re:Remember, this IS a science (Score:1)
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).
University is not about the courses (Score:1)
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
Take what you like (Score:1)
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.
please pay attention to details (Score:1)
Re:please pay attention to details (Score:1)
Actually though, I'm really surprised at the amount of response over my nitpicking of his lack of details!
simple answer (Score:3)
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.
Re:simple answer (Score:1)
Avoid those courses that centre on specific technologies. They'll be obsolete by the time you graduate.
Basics, problem solving, and projects (Score:2)
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 ... (Score:1)
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.
Re:Remember, this IS a science (Score:1)
"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".
Re:Don't rely on college for education... (Score:1)
The best CS program is in your basement/garage/bedroom...
Now hiring experienced client- & server-side developers
Djikstra Re:That's why I read this site. (Score:1)
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)
--
Any project not out of a college course (Score:1)
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
Several semesters of Writing, Engineering, and... (Score:3)
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.
Re:Keep (Score:1)
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
other electives (Score:2)
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.
-----
A few ideas (Score:3)
- 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!
Keep (Score:1)
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.
Re:please pay attention to details (Score:1)
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.
That's why I read this site. (Score:1)
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.
Remember, this IS a science (Score:2)
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.