On the Cruelty of Really Teaching Computer Science

From Wikipedia, the free encyclopedia
Jump to: navigation, search

On the Cruelty of Really Teaching Computing Science” is a 1988 paper by E. W. Dijkstra[1] which argues that computer programming should be understood as a branch of mathematics, and that the formal provability of a program is a major criterion for correctness.

Despite the title, most of the article is on Dijkstra’s attempt to put computer science into a wider perspective within science, teaching being addressed as a corollary at the end. Specifically, Dijkstra made a “proposal for an introductory programming course for freshmen” that consisted of Hoare logic as an uninterpreted formal system.

Debate over feasibility[edit]

Since the term "software engineering" was coined, formal verification has almost always been considered too resource-intensive to be feasible. In complex applications, the difficulty of correctly specifying what the program should do in the first place is also a common source of error. Other methods of software testing are generally employed to try to eliminate bugs and many other factors are considered in the measurement of software quality.

The notion that cost of production of hardware should be a constraint in programming was foreign to Dijkstra. He viewed the cost controls as artifacts that could become excuses and the controls of nature as nonexistent in digital systems, which above the level of circuits guarantee a second, constructed nature.[citation needed]

Until the end of his life, Dijkstra maintained that the central challenges of computing hadn’t been met to his satisfaction, due to an insufficient emphasis on program correctness (though not obviating other requirements, such as maintainability and efficiency).[2]

Pedagogical legacy[edit]

Computer science as taught today does not follow all of Dijkstra's advice. Following Dijkstra's earlier writings, the curricula generally emphasize techniques for managing complexity and preparing for future changes. These include abstraction, programming by contract, and design patterns. Programming techniques to avoid bugs and conventional software testing methods are taught as basic requirements, and students are exposed to certain mathematical tools, but formal verification methods are not included in the curriculum except perhaps as an advanced topic.[3] So in some ways, Dijkstra's ideas have been adhered to; however, the ideas he felt most strongly about have not been.

Newly formed curricula in software engineering have adopted Dijkstra's recommendations. The focus of these programs is the formal specification of software requirements and design in order to facilitate the formal validation of system correctness. In Canada, they are often accredited engineering degrees with similar core competencies in physics-based engineering.[4]

While Dijkstra's observations remain noted by educators, particularly to highlight the challenging nature of programming and how its complexities can influence students, greater emphasis on the practical aspects of programming and the challenges associated with learning the craft has emerged. As such, curricula tend to focus on engaging students in forms of practice that mirror industry practice, over imparting knowledge about foundational concepts such as formal verification.[5]

References[edit]

  1. ^ Dijkstra, Edsger W. On the Cruelty of Really Teaching Computing Science (EWD-1036). E.W. Dijkstra Archive. Center for American History, University of Texas at Austin.  (original; transcription)
  2. ^ See Dijkstra, Edsger W. The end of Computing Science? (EWD-1304). E.W. Dijkstra Archive. Center for American History, University of Texas at Austin.  (original; transcription)
  3. ^ See e.g. http://web.mit.edu/6.170/www/lectures/lectures.html, and courses 6.001, 6.033, 6.042, 6.170 (requirements for undergraduate CS majors) descriptions in the MIT Course Catalog at http://student.mit.edu/catalog/m6a.html
  4. ^ http://courses.utep.edu/portals/870/parnas_seisnotcs.pdf
  5. ^ Scott, Michael; Ghinea, Gheorghita (18 April 2013). Educating Programmers: A Reflection on Barriers to Deliberate Practice (pdf). Proceedings of the 2nd HEA Conference on Learning and Teaching in STEM Disciplines. HEA. pp. 85–90. doi:10.11120/stem.hea.2013.0005. Retrieved April 9, 2016.