about summary refs log tree commit diff stats
path: root/js/games/nluqo.github.io/~bh/bridge.html
diff options
context:
space:
mode:
authorelioat <elioat@tilde.institute>2023-08-23 07:52:19 -0400
committerelioat <elioat@tilde.institute>2023-08-23 07:52:19 -0400
commit562a9a52d599d9a05f871404050968a5fd282640 (patch)
tree7d3305c1252c043bfe246ccc7deff0056aa6b5ab /js/games/nluqo.github.io/~bh/bridge.html
parent5d012c6c011a9dedf7d0a098e456206244eb5a0f (diff)
downloadtour-562a9a52d599d9a05f871404050968a5fd282640.tar.gz
*
Diffstat (limited to 'js/games/nluqo.github.io/~bh/bridge.html')
-rw-r--r--js/games/nluqo.github.io/~bh/bridge.html470
1 files changed, 470 insertions, 0 deletions
diff --git a/js/games/nluqo.github.io/~bh/bridge.html b/js/games/nluqo.github.io/~bh/bridge.html
new file mode 100644
index 0000000..73492dd
--- /dev/null
+++ b/js/games/nluqo.github.io/~bh/bridge.html
@@ -0,0 +1,470 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
+<!--Converted with LaTeX2HTML 96.1 (Feb 5, 1996) by Nikos Drakos (nikos@cbl.leeds.ac.uk), CBLU, University of Leeds -->
+<HTML>
+<HEAD>
+<TITLE>Symbolic Programming vs. the A.P. Curriculum</TITLE>
+</HEAD>
+<BODY LANG="EN">
+<H1>Symbolic Programming vs. the A.P. Curriculum</H1>
+<CITE>Brian Harvey<BR>University of California, Berkeley</CITE>
+<P>
+A popular metaphor in recent years compares the process of writing a
+computer program to that of designing and building a bridge.  The point
+of the metaphor is that it's not acceptable to debug a new bridge
+design by building the bridge, opening it to traffic, and waiting to see
+whether or not it collapses.  People who use this metaphor argue that the
+analogous technique isn't acceptable in computer programming either.
+The phrase <I>software engineering</I> was coined to evoke the comparison
+with civil engineering and other, similar disciplines.  The view of
+programming as software engineering has had a profound influence on
+computer science education.  The purpose of this paper is to examine that
+influence, particularly at the high school level through the College Board
+Advanced Placement curriculum, and suggest an alternative view.
+<P>
+(I am focusing attention on the A.P. curriculum to make the point concrete,
+but it is just one of many similar influences.  The College Board did not
+invent the software engineering view; it tries to follow the lead of its
+client colleges.  At the college level, the ACM curriculum standard could be
+cited instead.  I teach at both levels, but I feel most strongly about the
+inappropriateness of the software engineering approach in secondary
+education.)
+<H2>Software Engineering: Programming as Discipline</H2>
+<P>
+What are the characteristics of the software engineering approach?  One
+fundamental assumption is that <I>the goal of a project is given in
+advance</I>.  It is not the civil engineer's job to decide where a bridge
+should be built, or whether a bridge should be built in the first place.
+Those decisions are made by someone else--politicians, traffic flow
+experts, perhaps railroad owners.  The engineer is employed to carry out
+a predefined project, and is given a formal specification of the
+requirements.
+<P>
+A natural consequence of externally-provided goals is a <I>top-down
+design</I> technique.  Ideally, beginning with the formal goal specification,
+the engineer maps out large subtasks, then develops each subtask into more
+and more detailed structure by a process called ``stepwise refinement,'' one
+of the central elements of the <I>structured programming</I> methodology.
+Mastery of this technique is the main content, apart from programming
+language syntax, of most introductory computer science courses.
+<P>
+If a bridge falls down, its designer can be sued for damages.  A similar
+standard of <I>professional liability</I> should apply to the authors of
+computer programs, if lives or property are endangered by their failure.
+Some professional societies have begun to propose uniform standards for
+licensing of software engineers.  If programmers are held liable for their
+failures, it pays to use <I>conservative techniques</I> in the design of
+new programs.  Just as civil engineers rely on a few well-understood
+designs for bridges, programmers should use proven algorithms to ensure
+program correctness.  Mistakes should not be debugged by trial and error,
+but should be prevented in advance by redundant error checking, strict
+adherence to design standards, and formal proofs of correctness, techniques
+that one popular text calls <I>antibugging</I> [Cooper and Clancy, 1985].
+<P>
+One person can't build a bridge alone.  Bridges are built by large teams,
+and it's important that each team member have a well-defined job.
+Similarly, software engineering emphasizes the needs of <I>programming
+teams</I> in which each programmer is assigned a subtask.  The top-down
+design approach is particularly important in a team environment so that
+each program segment has a well-defined interface to the rest of the project.
+Rigid standards are required about things like scope of variables and
+documentation of subprocedures.
+<P>
+Finally, an <I>emphasis on product</I> has been implicit throughout this
+description.  What is most important is the program, rather than the style
+of work of the programmers.  A software engineer derives job satisfaction
+from seeing people use the product, more than from the programming itself.
+<P>
+(In a recently-published polemic, Edsger Dijkstra, one of the founders of
+the structured programming methodology, dissociates himself from the name
+``software engineering'' because he thinks that it evokes a methodology
+based on testing, rather than on the formal mathematical reasoning that
+Dijkstra prefers.  Still, from the point of view I am presenting, Dijkstra
+and the software engineers are in the same camp because they both focus
+on producing a program that meets a prior specification, rather than on
+the development of that specification.)
+<H2>Artificial Intelligence: Programming as Art</H2>
+<P>
+Some computer programs actually do control processes in which a malfunction
+could threaten human life.  In those cases, I agree that programmers should
+regard their work as closely analogous to other engineering disciplines,
+with the same professional standards and the same conservative techniques.
+Much programming, though, does not have this character.  If a video game,
+for example, malfunctions, no lives are lost.  Reliability is still
+desirable, of course, but other characteristics, such as creativity in
+the design of the game, are equally important.  Unlike bridge-building,
+much computer programming is done by hobbyists for their own personal
+satisfaction, and professional liability does not apply in this case.
+<P>
+Among professional programmers, research work is in some ways more like
+hobbyist programming than like civil engineering.  Reliability may be less
+important than the flexibility to explore new techniques.  (Of course,
+reliability is itself the topic of some computer science research, but even
+then the research cannot proceed by invoking already-known
+methods.)  In particular, artificial intelligence research is
+characterized by the desire to extend the limits of what can be done with a
+computer; the researcher typically does not have a body of well-understood,
+reliable methods to follow.  It is not surprising, then, that AI researchers
+have developed programming tools and approaches quite different from those
+of software engineering.
+<P>
+In a research project, <I>the goal of a project evolves in the work</I>.
+That is, the programmer starts with a broad idea, but often cannot specify
+the detailed behavior of the program until it's written.  She starts with
+a partial understanding, attempts to program some better-understood corner
+of the project, and then interacts with the resulting program to see in what
+direction to proceed.  The goals are chosen by the same person doing the
+programming.
+<P>
+If the goal is not precisely known in advance, a strict top-down design
+process is impossible.  Researchers use <I>interactive design</I>
+techniques, which may include some top-down components but also may
+include a bottom-up approach in which the work already done provides
+a software toolkit that itself suggests new higher-level modules.
+Instead of a single programming methodology like stepwise refinement,
+the researcher uses <I>eclectic techniques</I>.
+<P>
+Since the result of a research project is rarely destined to be used
+directly in real applications, there is <I>no danger</I> and no
+liability.  Instead of following conservative, well-understood patterns,
+the researcher is encouraged to <I>take risks</I> and invent new
+methods.  Program debugging can be interactive; other members of the
+research community are often encouraged to try out the program, not
+only discovering coding bugs but also contributing to the incremental
+design process by suggesting improvements.
+<P>
+Research programs are rarely written by large teams.  One reason is that
+you can't get a Ph.D. for writing one percent of a program; another is
+that it's hard to coordinate large teams without a precise, formal
+design document.  But the most important reason is that large teams
+are rarely creative.  Instead, <I>individual creation</I> is required to
+solve new problems.
+<P>
+To summarize, there must be an <I>emphasis on process</I> in the research
+programming environment.  The resulting program may be demonstrated once
+and never used again, since it will probably be slow and clumsy, but by
+writing it, the researcher learns new ideas that can be refined and
+applied later.  In education, too, the actual programs written by students
+are unimportant; the student, not the program, is the ``product'' of the
+teaching and learning activities.  We should not be surprised if
+process-centered approaches to programming turn out to be most helpful
+in education.
+<P>
+Even when a program is developed for practical use, the development
+process may include steps that are more like research than like
+building bridges.  Consider spreadsheet programs.  The history of
+their development, starting from VisiCalc and continuing to current
+products like Lotus 1-2-3, has been a classic software engineering effort,
+with large development teams and precise goals.  But the first step,
+starting from nothing and getting to VisiCalc, took two people, one
+of whom had the idea, ``here is a new thing we can do with a computer,''
+and the other of whom was a virtuoso computer hacker, trained in the
+MIT research environment.
+<P>
+(By the way, I do not mean to suggest that there is no research among
+civil engineers!  No doubt new bridge designs grow out of a development
+methodology much like the one I'm describing for programming research.
+The contrast I am making is not between programming and civil engineering,
+but between research of any kind and the one-sided caricature of civil
+engineering that provides the metaphor for the software engineering school.)
+<P>
+The metaphor of bridge-building powerfully captures the spirit of the
+software engineering view of programming.  As an equally powerful metaphor
+for this alternative view, I suggest considering programming as an art form,
+and the programmer as an artist.
+<H2>How to Train an Artist</H2>
+<P>
+I am discussing the nature of computer programming to make a point about
+the nature of computer programming education.  There are two very different
+kinds of programming activity, bridge-building and art.  I suggest that our
+standard computer science curriculum does a good job of preparing students
+for the first kind, but not for the second.  If we want to develop
+computer programming artists, we should explore the training of other
+kinds of artists.
+<P>
+(Both of these approaches are extremes.  Some
+readers may feel more comfortable with an intermediate position,
+representable in metaphor by professions such as medicine and architecture
+that combine the need for individual creativity with careful attention to
+conservative techniques.  Still, I am trying to call attention to an
+imbalance in our current educational practice, and in this context I think
+it is valuable to show what the opposite extreme would be like.  I hope that
+even this extreme will not seem impractical, even if we ultimately settle on
+a compromise view.)
+<P>
+The training of artists is not the exact opposite of the training of
+engineers; art schools do not merely throw the student into a room full of
+materials and say, ``go to it!'' There is a discipline to art also,
+including a collection of well-understood, conservative techniques.
+<P>
+I suggest that the training of an artist can be divided into three
+categories of learning.  There is <I>technical knowledge</I>, such as
+the differences between oil paints and water colors, or the rules of
+perspective.  There is <I>technical skill</I>, such as the ability to
+draw a straight line freehand without wiggling, or the ability to
+stretch a canvas evenly before painting on it.  And there is <I>
+inspiration</I>, seeing the world with an artist's eye and finding something
+worth painting at all.
+<P>
+All three of these are essential to a great artist, but inspiration
+comes first!  I am not an artist, and my personal experience of art
+instruction has been limited to a couple of introductory courses when
+I was in high school.  In those courses, though, the teachers made a
+big fuss about staying away from technique.  ``Never mind what it
+looks like'' was a frequent comment.  One beginning exercise was to draw
+a chair with our eyes closed; the point was to overcome our anxiety about
+photographic exactness and get us to enjoy moving a pencil over paper in
+broad strokes.  The teachers promised that technical instruction, for
+those of us who did develop a deeper interest in art, would come later.
+<P>
+Art instruction that began with endless practice at drawing straight lines
+and perspective cubes would chase away any true potential artists.  At best
+it would produce ``commercial artists,'' a classic oxymoron.  This is the
+risk we run in computer science education.  (Commercial artists are socially
+useful, and so are the members of software engineering teams.  But there
+could be no commercial art without true creative artists to invent the
+language and the tools of art.)
+<H2>The Programming Language Paradox</H2>
+<P>
+Software engineers believe in constructing a program top-down.  That is,
+they start with the broad ideas of the program, and fill in the details
+later.  You would think their design tools would support programming in
+terms of broad ideas.  Yet the programming languages of software engineering,
+of which Pascal is the prototype, focus attention on low-level details.
+They use explicit storage allocation, so the programmer must think about the
+size, location, and extent in time of each data aggregate.  They use strong
+typing, encouraging the programmer to concentrate on the precise encoding
+of symbolic information rather than on the meaning.  They provide half a
+dozen specific, hardwired control structures, emphasizing the sequence of
+events in a computation rather than the input-output behavior of functions.
+Complex data structures are manipulated with explicit pointers, a common
+source of confusion and bugs.
+<P>
+Some of these low-level properties of software engineering languages are
+the result of their early history as merely an abbreviation for machine
+language instructions.  But, for example, the transition from C (a hacker's
+language) to C++ (a software engineer's language) has brought more attention,
+not less, to these low-level details.  The improvement is that in C++ the
+details can be represented more rigorously, with less need to rely on
+<I>ad hoc</I> escape hatches such as type casting.
+<P>
+Software engineers recognize the inadequacy of their programming languages
+as design tools.  That is why they develop their programs using
+``pseudocode,'' essentially English with indentation to indicate block
+structure.  English is a good high-level design language precisely because
+it does not require the programmer to think about memory allocation, variable
+types, and so on.  The difficulty is that if one really designs in English,
+it's possible to write an instruction that has no obvious translation (or
+even no translation at all) into any programming language.  To end up with
+useful pseudocode, the programmer must actually cheat, writing the program
+mentally in something like Pascal and then translating into English and
+leaving out most of the details.
+<P>
+There are programming languages that don't require such extreme attention to
+low-level details as the ones software engineers love.  These symbolic
+programming languages can readily express overall design as well as
+details.  Why don't the software engineers choose higher-level languages?
+The reason is that they overemphasize their concern with reliability, and in
+particular with possible low-level bugs.  For example, although a language
+with explicit variable typing forces the programmer
+to be concerned with low-level details, it also may help catch bugs in which
+an incorrect value is assigned to a variable.
+<P>
+The educational cost of the software engineering languages is that much
+of the time and effort in introductory courses goes into syntactic details,
+and into such low-level semantic issues as binary representation, word
+length, ASCII codes, and pointer arithmetic.  By contrast, an introductory
+computer science course that uses Lisp [Abelson and Sussman, 1996], coming
+from the artificial intelligence research tradition, can focus attention
+on such high-level semantic issues as functional programming, object-oriented
+programming, and logic programming methodologies, data abstraction, and
+higher levels of abstraction such as the design and implementation of a
+programming language.  There is no pseudocode in this text; a Lisp procedure
+written in terms of subprocedures that may not yet be defined provides the
+right level of abstraction, while retaining technical rigor.
+<P>
+The title of this paper is ``Symbolic Programming vs. the A.P. Curriculum.''
+It could equally well have been ``High-Level Semantics vs. the A.P.
+Curriculum'' or ``Programming as Art vs. the A.P. Curriculum.'' For my
+purposes, what's important about symbolic programming is that it allows us to
+step back from technical details, in a way somewhat analogous to blindfold
+drawing exercises.  There are technical ideas in the curriculum, but they
+are high-level ideas, and they don't deaden the hacker spirit (that is, the
+artistic spirit).  In fact, as an introductory college-level course, I think
+the Abelson and Sussman course works better than the traditional curriculum
+even from a bridge-building perspective, because even software engineers
+should start with the big ideas.  Data abstraction, for example, is part of
+the structured programming approach as well as the artificial intelligence
+approach to program development.
+<P>
+I want to address a possible misunderstanding of the point I'm making.  The
+choice of programming language is not the central issue in designing an
+educational process.  It would be possible to teach a software engineering
+curriculum in any language, including Lisp.  (Indeed, these curricula
+generally make a point of not specifying a language, and the authors of the
+curricula respond to accusations of language chauvinism by pointing that
+out.)  Such a curriculum would be just as bad as the same course taught in
+Pascal.  Rather, my point is that an examination of the programming
+languages that the adherents of each approach actually do choose sheds light
+on how these approaches work out in educational practice.  The principle of
+top-down design sounds great when expressed in the abstract, but the real
+teaching done in its name too easily gets bogged down in low-level technical
+details.
+<H2>What High School Students Need</H2>
+<P>
+In the United States at present, high school computer science education is
+strongly affected by the accidental fact that there is no official secondary
+curriculum, but there <I>is</I> an official college-level curriculum for
+secondary schools in the form of the College Board Advanced Placement exam.
+The result is that most high school students who are interested in
+programming are now taught from a model that was designed (and badly
+designed, as I have argued above, at that) for a college population.
+The problem is not the College Board's fault; a lack of creative leadership
+at the secondary level has allowed what should be an advanced curriculum for
+a minority of students to set the tone for all programming instruction.
+<P>
+At the college level, where we are engaged in the training of professional
+programmers, the software engineering approach is sensible, even if not
+the whole story.  I have not suggested abandoning concerns about professional
+liability, conservative design, and teamwork in the context of programming
+projects in which lives or property are at risk.  Rather, I have argued that
+software engineering concerns should be balanced by a lively sense of the
+artistic, creative side of professional programming, and that large ideas
+should come before technical details in the curriculum.
+<P>
+At the high school level, I want to argue for a more extreme view.  High
+school students are not about to enter the job market as professional
+programmers.  Rather, they are exploring a possible interest in programming,
+and preparing for further instruction at the college level.  <I>They can
+learn discipline later</I>.  Now they need a kind of apprenticeship: real tasks
+to work on, the freedom to experiment and to risk failure, but in an
+environment that models respect for commitment.  They need teachers who
+serve as experts available for consultation, rather than lecture on
+technical knowledge or set exercises of technical skills.
+<P>
+(I am concerned here with the needs of those students who are interested in
+computer programming.  The design of a ``computer literacy'' curriculum for
+all students is a separate issue.  I have argued elsewhere that it is
+really a non-issue; students should be quite comfortable with word processors
+and other utility programs long before they leave elementary school.  The
+widely perceived need for a secondary school ``literacy'' curriculum is a
+temporary result of the fact that computers have only recently entered the
+schools in significant numbers.)
+<P>
+Not every teenager wants to program computers, but many do.  Computers are
+powerful, responsive tools.  Apart from reading, few intellectual skills
+appeal so strongly to young people, especially not formal, technical ones.
+We educators are lucky that computer programming ranks almost as high as
+skateboarding and playing the guitar!  We should teach programming in a way
+that nurtures this excitement, not turning it into one more academic
+subject full of facts to be paraded on exams.  Instead, high school
+programming instruction should be project-based, with projects chosen by
+the students themselves as much as possible.  The A.P. curriculum is
+particularly bad, because of its emphasis on conservative technique and
+correspondingly low-level details, but <I>any</I> fixed curriculum would
+interfere.
+<P>
+Of course the student's apprenticeship can't begin without an initial period
+devoted to learning the rules of a programming language.  But I think we
+should look upon this early work as an unfortunate necessity, rather than as
+the focus of our curriculum, and we should try to get it over with smoothly
+and quickly.  (In practice the division into stages is not so
+clear-cut.  Students can be working on independent projects in parallel with
+formal instruction in the language.  Still, the two are very
+different in style, and will probably be experienced by students as separate
+activities.)  To this end, we should choose a high-level language such as
+Lisp to minimize the time spent on syntax and machine representation
+issues.  (Abelson and Sussman use the Scheme dialect of Lisp in their text;
+for high school students I prefer the Logo dialect, which provides many of
+the same high-level mechanisms along with a user interface that is less
+intimidating to a beginner.)  I also like to minimize formal lectures,
+relying instead on a self-paced format and scheduling advanced students into
+the lab at the same time as the beginners to allow for informal one-on-one
+tutoring.
+<P>
+In this early stage, I have come to think that debugging (and antibugging)
+should <I>not</I> be a large part of the student's experience.  It's true
+that debugging is excellent mental exercise, but real beginners tend to make
+uninteresting mistakes.  Spending 15 minutes struggling with an unnoticed
+punctuation error just teaches frustration, and so I will often debug a
+beginner's program myself and encourage the student to get on with the big
+idea that the bug interrupted.  Only if the bug seems to indicate a serious
+conceptual misunderstanding do I make any fuss about it.
+<P>
+The second stage of the student's apprenticeship focuses on projects.  This
+effort should be supported structurally with a curriculum-free lab course
+that can be repeated for credit; interested students may enroll in the lab
+throughout half a dozen semesters.  (One problem with the ``back to basics''
+movement is that it has encouraged a uniform set of courses for all students.
+One semester of programming is more than many students need, but not nearly
+enough for many others.)  If the school will allow the course to be taught
+without assigning grades, so much the better.  The teacher's role at the
+beginning of the semester is to ensure that each student takes on a project
+that is challenging but not overwhelming; later, the teacher serves as a
+consultant, looking over shoulders when that feels appropriate.  It is also
+appropriate to make concrete suggestions about programming style, pointing
+out how a particular student program could be organized more clearly, but I
+think teachers should not insist on universal adherence to broad <I>a
+priori</I> rules.
+<P>
+For most high school students, this second stage can last through the senior
+year.  If the programming projects are selected well, each student will learn
+certain universally important ideas (such as recursion), and also each
+student will learn many other ideas that happen to be relevant to his or
+her projects but are different from another student's learning.  This project
+laboratory will be excellent preparation for a more rigorously structured
+computer science curriculum in college.  Some students, however, will
+eventually get tired of projects and will ask for more formal instruction
+about meatier ideas.  For them, a third-stage course can introduce computer
+science topics such as automata theory or compiler construction;
+alternatively, a true Advanced Placement course can be offered using the
+Abelson and Sussman text.
+<P>
+I have written a series of three texts, using Logo, to support these three
+stages [Harvey, 1997].  The first (introducing the language)
+and the third (computer science topics) are meant to be read sequentially,
+like most texts.  The second is primarily a collection of projects,
+intended to serve as an inspiration and to provide starting points
+for student projects rather than to be read from cover to cover.  A series
+like this has the advantage of a uniform style and the ability to rely on
+earlier learning in the later volumes, but alternatives are available for
+each of the three stages.  In particular, there are many collections of
+programming projects available, and the computer lab should have a wide
+assortment.  In the third stage, even a Pascal-based text covering the
+official Advanced Placement curriculum wouldn't be too harmful; my concern
+is that that curriculum has become, by default, the only programming
+experience for many high school students.
+<H2>Conclusion</H2>
+<P>
+To summarize, I am presenting for computer science an argument that has
+come up before in many other areas of science and mathematics education.
+Our official curricula, I think, run the same risk as the official
+physics curriculum that caused Albert Einstein to drop out of school.
+Such rigidity would be particularly regrettable in a subject like
+computer programming, which lends itself so readily to a flexible,
+experimental approach.
+
+<P>[Note added 30 May 2003:  An interesting related but independent paper
+is <A HREF="http://www.paulgraham.com/hp.html">"Hackers and Painters"</A>
+by Paul Graham.]
+
+<H2>References</H2>
+<P>
+Abelson, Harold, and Gerald Jay Sussman.  <I>Structure and Interpretation
+of Computer Programs</I>, Second Edition, MIT Press, 1996.
+<P>
+Cooper, Doug, and Michael Clancy.  <I>Oh! Pascal!</I> Second Edition,
+Norton, 1985.
+<P>
+Harvey, Brian.  <I>Computer Science Logo Style</I>, Second Edition,
+MIT Press, 1997.
+<UL>
+<LI>Volume 1: <I>Symbolic Computing</I>
+<LI>Volume 2: <I>Advanced Techniques</I>
+<LI>Volume 3: <I>Beyond Programming</I>
+</UL>
+
+<P><ADDRESS>
+<A HREF="index.html"><CODE>www.cs.berkeley.edu/~bh</CODE></A>
+</ADDRESS>
+</BODY>
+</HTML>