Some time last year my boss and I were discussing the possibility of adding computer science classes to our curriculum. One of the things we talked about is how much computer science should someone know before they go out and get a job in the “real world”? Should they all know how to implement quicksort and know a stack from a queue? Or should they all know binary and hexadecimal and maybe some RPN and Lisp?
I’m paraphrasing and simplifying here: her opinion is that a college graduate should know enough computer science to know how hard computer science is.
And I completely agree with it.
If you are considered proficient in some computer-related task—not just programming, but perhaps web design, graphic design, making Excel pivot tables, or even typesetting a letterhead in Microsoft Word—you probably had a supervisor or manager who at some point grossly underestimated the amount of time you need for a project. For example, think of an editor who “needs” 300 photos edited in a day or a manager who thinks that writing a custom PHP/mySQL payroll system from scratch takes a day or two. (Note to previous employer: I’m not saying you’re an idiot. In fact, you aren’t. I’m just using that payroll system as an example because I know how much work went into it.)
The problem is that, just like a flying car or Jesus turning water into wine, a computer is a magical box that can do things instantly with pixie dust and ether to folks who don’t understand computers at all. It doesn’t help that folks who don’t dig into computers only sees the new, instant, fast things available to everyone. Twitter is instant, right? So computers are instant! Microsoft X lets you generate a Y in T seconds by using the Z Wizard, so shouldn’t creating a custom software package take a similar amount of time?
It’s easy to see that making a physical object like a painting or an automobile takes a lot of work. On a computer the work is not easily visible. The amount of time that goes into writing a program, for example, does not vary directly with the number of lines or characters. Lots of it go into planning, debugging, and just pure thinking.
Remember the post about that guy who wants a custom OS similar to Windows written in ten hours? It was floating around the Internet for a while. A visit to a site like The Daily WTF only confirms this trend.
Anyway, a good, mandatory, basic computer science education isn’t there to make sure everyone knows the difference between pointers and variables. It’s there to make sure everyone can appreciate the folks who do. Just like how elementary schools and middle schools take kids on field trips to see firefighters or construction workers at work—okay, at least they talk about what they do—a good high school or college education should include letting kids know exactly what goes on in the more abstract jobs of today. This does not include just programmers. I mean, do even half our high school students know exactly what scientists or actuaries or civil engineers do? Does anyone in the world know what hedge fund managers do? Do they even know what they’re doing?
Back to programming. Here’s a list of what I think a college graduate should know (either from being taught, or led to the discovery of) about computer science before she graduates and is allowed to interact with professional computer folks:
- The difference between 1, 10, 100, 1000, 10000, etc. people-hour jobs. She should know that implementing a quick formula and running a table of numbers takes an hour or two. Maybe writing a custom web app takes a team of four a week. And she needs to know what kinds of projects will bankrupt the company if they actually did it in-house.
- What computers cannot do easily. She doesn’t need to know the difference between O(log n) and O(2^n) or what NP-complete means. But she needs to know that while cropping 5,000 photos by the same amount in the same places is a quick Photoshop automation but it may be easier to hire a couple cheap interns than to write a piece of software to rate each image as PG or R.
- Nothing is perfect and no techno-buzzword is going to solve all your problems. Open source software does not mean no implementation cost. Web-based does not mean it’ll always be accessible. New versions of software introduce new bugs. Very simple sounding features can take a lot of time to implement for a variety of reasons and not all of them can be blamed on the people involved.
- Programming is a skilled trade; in fact, it’s hard. Just because it’s invisible, runs on the backend and doesn’t come with animated GIFs does not mean there’s no work. It’s not something that everyone can do and programmers deserve respect and time like everyone else. Remember the time they made you program in college? Glad you don’t have to do it again? Good.
Anything else you can think of that would be lessons that a “computer science appreciation” curriculum should teach? Not that I’ll implement this any time in the near future (why shouldn’t I, though…) but it’s nice to just have this list floating around in my head.
Wing :: May.27.2009 ::
Posts ::
1 Comment »