Sunday, June 18, 2006

Computer science and creativity

One of the themes I hear over and over again is that computer science is at odds with the more creative-type endeavors. Computer science is not equal to art; there is no art in programming a computer. I hear this from students, from colleagues, and recently, from high-school teachers. "We are losing students from our AP/programming-intensive courses. They all want to take the more creative courses, the computer application courses."

As someone who was attracted to this field *because* it is such a creative endeavor, this really disheartens me. There is a great amount of artistry involved in programming a computer, from the intense amount of creativity required to find good solutions to problems to the poetry involved in constructing algorithms and code to be efficient, elegant, and self-documenting. Not to mention the more obvious ties between art and technology--the music, and pictures, and movies, and user interfaces that we create using computer technology and computer programs.

But most people think of computers, and programming, as sterile and boring. Is it PR--the image of the lone computer nerd trying to hack into the computers of corporate America? Probably. But could it also be the way we're teaching it--that we're taking all the joy and artistry and elegance out of programming by focusing on the wrong things? I suspect so.

I'm thinking about this lately because I'm doing a presentation for some high school teachers very soon, many of whom have repeated the "computer science is not creative" lament to me. I want to help them see that creativity *does* and *should* have a place in their classrooms. I plan on showing them some assignments that I use in my own classes (and how I fit them into the overall fabric of the classes--related in-class activities and such) that are both pedagogically strong but also allow for a fair amount of creativity on the part of the students. The ideas for these assignments have come from other people who also are thinking very deeply about creativity and its (central) place in the CS major. I'm not sure how effective this presentation will be, but if it gets some of these teachers fired up again, then that's a start.

13 comments:

FemaleCSGradStudent said...

Stumbled across this once. Looks like a neat course. "Programming for artists."

http://www.rosemarshack.com/teaching.html

It appears that Rose Marshak, in addition to being the bassist for Poster Children, teaches about art and programming.

Anonymous said...

You may want to show the teachers Alice (www.alice.org) which really allows some creativity. Also a friend of mine who teachers HS CS shows off some screen images of a pocket PC version of the game Risk that one of his students did at his blog http://thespoke.net/blogs/mr_i/archive/2006/06/18/961845.aspx

Anonymous Economist said...

One problem may be that so many beginning programming courses teach programming inside-out: students spend most of their time learning a general-purpose language and how to implement the basic data structures and algorithms. That might make sense for CS students, but I don't think that it is a good idea for non-CS people. While I have never had a chance to try this, I have been thinking of a course that approaches programming from the outside-in by having students start out by writing in high-level, application-specific languages. Artists might start out by writing scripts for Gimp, economists can be taught how to use a data-analysis language like 'R' and business majors can write Excel macros.

Anonymous said...

Programming is not creative?????
I have always found writing programs very creative. You have to decide what you want the computer to do, and then figure out how to make it do it. There are so many different ways to write programs, it is amazing.

A student wrote a letter of the editor of our campus paper a few years back. The student was complaining of having to take math classes, since they were an art student and math stifled their creativity. You see, there is only one correct answer. Yeah, but there are an infinite number of ways to get to that correct answer!!!

Anonymous said...

Great post! I'm in pure math, and get so frustrated with the "no creativity in math" argument. Math, as done at the professional level, is pretty much entirely creativity -- but I think laypeople fail to see the difference between proving theorems and being a human calculator.

Anonymous said...

Anonymous #1 has the right idea, I think - we need to allow studetns to build something that they feel is their own - a game, a web application, something that automates something that they hate doing rather than focusing on solving toy problems they have no interest in (ok, I'll admit that I liked toy problems that had multiple possible solutions - like coding a prime number generator - but I'm a serious math/CS geek).

The problem is - how do we get them enough foundational information in an intro class in order to allow them to do a "real" project of their own choosing on their own?

Anonymous said...

One of the best aids to creativity is to let students program in a higher level language like Alice (mentioned above), Haskell, Python, Ruby, Scheme, Smalltalk, etc. where they spend most of their programming time accomplishing their goals instead of satisfying the compiler or figuring out how to reduce their thoughts into extremely low level concepts. It's much easier for students to map a list or iterate through it with foreach instead of figuring how to construct a counter, construct a loop that modifies it, then make a test to detect the end of the list without being off by one. They also shouldn't waste their time figuring out the complexities of typing when the compiler can do it for them. Students also should have an environment that offers immediate feedback instead of having to go through the edit, compile, test, fix cycle. Smalltalk's environment is especially good for immediate feedback with its ability to alter running programs and ability to store an image of your entire environment.

Garbage collection, type inferencing, higher functions, and rapid feedback environments aren't new technology. There's no real excuse for not using languages with these features, other than the overwhelming popularity of the C-family of languages in the workplace and that's a non-starter too. Even if we assume that C++ or Java is a better language for the workplace than Lisp or Smalltalk, that doesn't mean that students best learn to be programmers by starting with C++ or Java. Look at what other fields like physics do: students learn the much simpler concepts of classical mechanics, even though we've known quantum mechanics provides a better account, and they use simple differential calculus instead of the Lagrangian techniques that people actually use to solve mechanics problems in the real world. Why? Because no one would ever learn physics if they were started with a Lagrangian and partial differential equations.

Anonymous said...

One more note: To help students understand that programming is creative, it's important for your assignments to offer them choices which allow them to be creative. The factor of choice is what makes Nifty Assignments so nifty (and if you haven't checked out the Nifty Assignments page yet, do so.)

Jane said...

Wow! Great discussion so far!

For those of you who mentioned Alice, I am a huge fan of it (I've even used it in a class previously, and plan on using it in one of my fall classes); showing it to the HS teachers is a great idea.

FCSGS, that course looks intriguing; thanks for the link! (Some of that stuff may be useful for one of my classes next year, so I'll have to take a closer look.)

Alfred, thanks for the Risk game link! I'm a huge fan of letting students program games...I find that games teach a lot of the core concepts of CS very well while allowing for a lot of creativity on the part of the students. (Graphics and image processing assignments, like the ones Georgia Tech does or did at one point, are also good ones in terms of encouraging creativity.)

Anon (#3?), one of the ways I get around the "can we do something relevant in intro and still get all the concepts in" issue is to assign mini-projects that build upon each other, like games or image processing or something like that. But it is a tricky line to walk.

Anon (#4?), the Nifty Assignments web page is a treasure trove of good ideas--and a great way to procrastinate for a few hours! :) Thanks for bringing that up.

Anonymous said...

Hello,

I am not sure how this idea that programming is not creative gets into the mindset of people. I mean, seriously, what human endeavour (sp?) isn't creative. If it wasn't creative people wouldn't do it.

You know it's great that people have suggested a bunch of languages for people to learn about programming to show that it is creative but analysis has to come before synthesis. By this I mean people have to learn the constructs of a language before using it. Remember in grade 3-6, when you learned about English and how to decontruct a sentence into verbs, adjectives etc. How can one be creative in the English without knowing this?

The same goes for programming. You can't program without understanding the basics. In a similar manner that one gets better in English (primarily through reading from people who are better than you) you get better in programming by reading code and then practicing it. That whole Newton standing on giants thing.

Also one thing to note, that inside a computer anything is possible. You are not bound by the laws of the universe. I mean how great is that. Almost all forms of engineering butt into real physical limitations but inside a computer anything is game. How can that not be creative.

Regards,
SV

P.S. I have no clue why people teach C in school as an intro language. Lisp should be taught all the time. {comic book guy} Best Programming Language ever {/comic book guy}.

Anonymous said...

Jane,

To reinforce what others have said, there are plenty of ways to emphasize creativity while teaching programming. Yes, it usually happens with a functional language like Lisp or Haskell, but it could probably be done with a more traditional CS 1 language. Mark Guzdial has a new Java textbook out that stresses multimedia apps while teaching Java. Also, look at Paul Hudak's Haskell book. He also takes a multimedia approach to teaching a programming language. Finally, take a look at Brian Harvey's books on Logo and Paul Goldenberg's book on Language and Logo. These types of activities can be taught with an imperative/OOP language without losing too much of the creativity.

Jane said...

SV, you've hit upon an analogy that I like to use in my intro classes: that learning a computer language is just like learning any other language. That just like any other language, you have to learn the vocabulary and grammar rules of [insert programming language]. For some students, this makes the task seem a bit less frustrating, because they've experienced language limitations in another context. And your point of anything being possible inside a computer is an excellent one--mind if I quote you to my classes? :)

Mike, I just received a desk copy of the Gudzial book, and am looking forward to reading through it. I will check out those other books too. Thanks for the info!

Anonymous said...

Jane,
great post and comments. I think there is such a widespread of academic misconceptions linked to creativity, e.g. that it is limited to the subject of arts (wonderful book by Ken Robinson about this issue entitled: "Out of our minds").
I am a researcher at the intersection of arts education, media technology and computer science, based in an arts education institute co-operating with computer scientists in Germany. I was working in a model project bringing together arts and computer science in education at school level. Art teachers and compuper scientists worked together in a project-oriented, aesthetic context, e.g. developing and programming interactive environments and installations using iconic programming tools such as Lego Mindstorms, the kids programmed a web cam by themselves using image recognition software. It was quite sucessful, kids using the computer for storytelling and developing their dreams with a variety of media in different ways. As we experienced, kids - also those who are not so experienced with computers - like programming in an aesthetic/artistic context and learn about the computer being a shapable medium rather than a closed system they use by learning how to handle a particular software. I like to facilitate processes to make them find their own medium of expression which may be an interactive concept, a self made virtual /mixed reality environment, a play or hypermedia story.
We have continued a follow-up project called MediaArtLab@School which is again addressing the issue of Mixed Reality learning spaces looking at different areas of digital media which can be shaped and constructed by the kids (and the students of arts education. (http://www.uni-flensburg.de/iaekb/kunst/MediaArtLab/eng.php)

Programming seems to be the first tool most artists did not explore very well yet (for different reasons, such as education etc.) - except those with a computer science background. Artists have always explored the borders of a particular tool or a medium, and thereby invented new genres and forms of expression in the arts. Digital media technology now brings it all together and that to me is the challenge for an education crossing the borders of the curricula.

best,

Daniela