Why CS Majors Should Have Minors
The first generation of computer scientists weren’t. They came from engineering, mathematics, physics, and other disciplines. And they brought their problems with them! A “computer scientist” could apply computer skills to engineering or math or physics and still be a computer scientist. As the discipline of computer science has grown, so has the population of folks who are actually trained in computer science. But that training has come in part at the loss of more general training in other disciplines. The result is that the new breed of computer scientists have nothing to apply computers to. Worse, they lack the sophistication, gained from other disciplines, that allows them to write interesting applications. For example, numerical analysis, long considered a branch of computer science, is more a branch of mathematics at my institution. Few of our students have the mathematical sophistication to do it. Computer graphics also requires mathematical sophistication, evan parts of mathematics that many computer scientist educators would like to see eliminated from the curriculum–like calculus. Is this good for computer science? Is this good for computer scientists? I think the answer to both questions is a resounding “No!”
What can we do about it? The first step is to recognize the problem. A colleague recently described computer science as the disciplines of creating algorithms, as solutions to problems. OK, I’ll buy that. But the question becomes, to what do we apply those algorithms? Moreover, what do you need to be able to develop algorithms useful in, say, engineering mechanics, or cryptography?
The answer, as I see it, is that computer scientists need to acquire knowledge not just about algorithms, but also about the area in which they plan to apply them. A computer scientist can not develop useful algorithms in computational biology unless she learns a little about biology first. Nor can she do much useful work in numerical relativity, unless she learns a little physics (and math) first. Most people would accept these statements as fact, and most people would also agree that learning about biology or physics requires some training.
What this means to you is this: if you want to work in these types of applications, you must learn about the domains as well, whether that is biology, physics, math, or engineering. You may have no interest in these applications, and that’s fine. Maybe you want to write software for a commercial entity, like a bank or insurance company.
If that’s what you want, then you need to learn about business! You need to know what budgets are, and what financial statements are, and what return-on-investment is. You need to know a little about marketing, maybe some accounting. Why? Because you will be asked to write applications that support these endeavors. If you don’t understand the business needs, you will program the wrong features, and you will program the features wrong. In short, you will develop the type of software that people hate, the type of software that puts roadblocks in front of users instead of helping them do their jobs.
That is not to say that you need to know everything about business, or everything about science, or everything about engineering, etc. You need to know enough, so that you can learn and understand the bits you will need in a particular application. We have ways of helping you get this knowledge in college: minors and double majors.
This week is advising week, so this is my advice to you. If you are studying computer science, take a moment to think about what type of job you want to have five or ten years from now. That will help you identify the skills you need to get there, and that in turn will let you pick a minor that will help you learn those skills.