[Edu-sig] How do we tell truths that might hurt
John Zelle
john.zelle at wartburg.edu
Thu Apr 22 11:17:28 EDT 2004
My grades for the term are in, so I have a bit of breathing room
before the next round of classes start on Monday. I've been following
a number of recent threads with interest, as they touch on several
themes that I've been mulling over lately. My comments are mainly in
the context of how we design and deliver high-school and college level
introductions to programming and computer science, but perhaps they
speak to lower levels as well.
I heartily agree with Dean Lake's comments that the vast majority of
our students will not become computer scientists, and trying to teach
them the craft of programming in depth is likely to meet with
considerable resistance. That is a fact, and rightfully so. At the
same time, the information paradigm has become so pervasive in our
science and culture that I think every student needs a very solid
introduction. We need to figure out what the "Hamlet" of computing is.
As I see it, the deep intellectual contribution of computing is the
idea of describing processes (i.e. algorithms). Sure, using computers
as a tool is important, but today's killer applications are a passing
fad. It is the fundamental principlces of computing underlying these
tools that is at the same time revolutionary and enduring. The very
notion of precisely and unambiguously describing processes and data so
that information processes can be mechanized is what makes computing
universal.
I don't think you can really understand both the strengths and
shortcomings of the computing paradigm without wrestling at least a
bit with the fundamentals of programming. To put it in Dean's terms,
without this fundamental understanding, our future professionals won't
know when it's wise to seek out a blacksmith or know when that
blacksmith is selling them ox-shoes for their horse. So that's one
reason that I think lots of students should get programming
experience. Another argument is that we need all the talented computer
scientists that we can get, and broad exposure to programming would
help students who might have a genuine aptitude find their way into
the field. We pick up a couple good new CS majors every year from the
pool of liberal arts students who've "dabbled" their way into our
intro course.
I think it is possible to introduce students to programming in a way
that makes it useful and compelling to both majors and nonmajors. In
fact, I believe in many ways computer science is easier to teach than
math or the natural sciences, because we can actually get our students
involved with the tools and techniques of the discipline starting
virtually day 1. Most students actually enjoy the creative process of
programming and are very proud of the artifacts that they create.
So, how do we get and keep students interested? One line of argument
is that we need to get students working on applications they are
interested in (HTML, multi-media, games, etc.). I am sympathetic to
this argument, and one of the reasons I like Python as a teaching
language is that it allows students to work on interesting projects
early on. My students especially like working with graphics. But, my
experience shows that this is only a part of the issue. Even if the
projects are interesting, students will not pursue them if the
barriers to understanding are too high. Dean's analogy is again apt,
the students will see the bewildering complexity and simply turn to
the tool-builders to do things for them.
Even more important than compelling projects is designing a curriculum
that meets students where they are at. I see a lot of criticism of
"silly" and "uninteresting" programs such as helloWorld and
Celsius-to-Fahrenheit, but these are basic programs that are easy to
understand. If you use a language like Python that makes these
programs easy to express, then students actually enjoy starting with
these examples. Of course, they can quickly branch out and program
more interesting calculations like giga-barn-parsecs to teaspoons.
I don't apologize for starting with simple mathematical examples
because Dijkstra was right, it's the easiest sort of computing. Plus,
it meets students where they're at; they are _used_ to computing with
numbers, since they've been doing it in math classes for years. One of
the themes that I try to hammer home is that algorithmic thinking
allows students who are not mathematically inclined to answer
mathematical questions that they could not otherwise tackle like
calculating the odds of actually winning at Craps or Blackjack or
determining the trajectory of a projectile. This helps them appreciate
some of the power of algorithms.
The real failing of most introductory programming courses, as I see it,
is the rush to abstraction early on. As we have put more and more
object oriented design into these classes, it seems we have started to
raise the level of abstraction to the point where I now go to CS
education conferences and see educators who are doing abstraction
solely for the abstraction's sake. They argue that "real" programmers
need to learn sophisticated design patterns and every algorithm should
be "expressed at the most abstract level." Our students are not ready
for this level of abstraction, and frankly, most of them will never
need it.
What we really need to do is separate "learning to program" from
"programming to learn." In an introductory CS class, programming is
important because it helps (forces) students to understand fundamental
principles of computing. The same could be said of using programming
in math and science courses as others have suggested. Students write
programs to learn math concepts in a very concrete way. These students
do not need to "learn to program" in the sense of learning to be
professional programmers. Bringing all of that baggage into early
classes makes them overly complicated and destroys the natural
enthusiasm students have for producing working programs.
Where does Python fit into the mix? Well, its simplicity and elegance
make programming to learn possible. It's very easy to experiment with
and try out ideas quickly and easily. Industrial-strength languages
such as Java and C++ are important to those who must learn to program
(although not as important as some might have you believe). I think
that programming to learn makes subsequent learning to program much
easier.
So, start with Python, keep things concrete as long as possible, use
abstraction as it becomes necessary and useful, and let the students
have fun. That's the road to universal computer literacy. Comments?
--John
Arthur wrote:
>>Learning to print 'Hello World' in a programming language is comparable
>>learning the Latin name for 'foot' - interesting, but not useful unless
>>the
>>knowledge is built into something more robust.
>>
>>
>
>I think you misinterpret me, because you seem to be arguing against the gist
>of my post, when I seem to see myself in some fundamental agreement which
>much of what you are saying.
>
>Programming, as such, is not the point to me, at all. And I see myself very
>much off the CP4E bus. And am vocal about it - knowing quite well that it
>would easier, here, to be less so.
>
>The fascination with programming as a children's activity repeatedly
>expressed here a major issue of concern particularly mystifies me. I will
>leave it at that.
>
>What I do think is important is a vastly improved math and science
>curriculum, particularly for the non math and science specialist. And I
>think about it mostly at the college level.
>
>Bertrand Russell, again:
>
>"""
>I am convinced that all higher education should involve a course in the
>history of science from the seventeenth century to the present day and a
>survey of modern scientific knowledge in so far as this can be conveyed
>without technicalities.
>"""
>
>Why?
>
>It is simply part of being awake in the world. Or should be.
>
>The people calling the shots - with all the best intentions let's assume -
>are the lawyers, the MBAs, the journalists, etc. Not the mathematicians and
>scientists.
>
>It would better for all of us, if they were more awake. And if the
>educational process, in fact, insisted upon it.
>
>I believe a rudimentary understanding of programming - in a language like
>Python - can be leveraged to achieve much more important goals, in the
>educational process, than that of a rudimentary understanding of programming
>in and of itself. In math and science education.
>
>This may be nothing more than my own version of the pie-in-the-sky that
>seems to be the bread and butter of edu-sig. But I haven't given up on my
>sense of things here, as of yet.
>
>Art
>
>
>
>_______________________________________________
>Edu-sig mailing list
>Edu-sig at python.org
>http://mail.python.org/mailman/listinfo/edu-sig
>
>
>
>
More information about the Edu-sig
mailing list