Fundamentals of Programming/Computational Thinking Subcommittee
Computational Thinking
Co-chairs: Laurent Demanet (ldemanet@mit.edu), and Rob Miller, Electrical Engineering and Computer Science (rcm@mit.edu)
For the purpose of the Common Ground, the Fundamentals of Programming/Computational Thinking Subcommittee considers subjects in the context of the following definition and examples.
Computational thinking consists of the skills and modes of thinking involved in formulating a problem and expressing its solution in such a way that a computer can effectively carry out that solution. A computational thinking course should cover many of the following learning objectives:
- Learning the fundamental constructs of computer programming. Examples of constructs in an introductory course include: loops for iteration; recursive functions; basic data structures such as lists, arrays, sets, and dictionaries; function definition for procedural abstraction; defining types or classes for data abstraction.
- Managing complexity with good design. Examples include use of abstraction mechanisms as a means of suppressing detail; supporting modular design; testing and debugging; ways to design programs that are easier to share, understand, test, and debug.
- Developing skills in a modern programming language. Skills include reading, writing, modifying, and debugging programs in the language.
- Understanding and using algorithms. Understanding and implementing general-purpose approaches for solving computational problems. Examples might include: greedy algorithms, divide and conquer, Monte Carlo methods (randomization and stochastic sampling), hill climbing, neighborhood search, interval bisection, and others. Introductory courses might expect students to understand and implement specific algorithms, while advanced courses might ask students to apply a general approach to invent algorithms for novel problems.
- Communicating a program and its results. One aspect of this communication is articulating the ideas represented in a program, by writing code that is clear, organized, and effective. Another aspect is presenting results of computational experiments effectively, using tables and appropriate visual representations, and statistical analysis of uncertainty. Another aspect is interaction with a human user, for example through interactive data visualization, or an interactive user interface.
- Modeling the world computationally. Understanding and implementing computational models of physical or biological or social systems. Examples might include: mechanical properties of objects and their physical interactions; search algorithms for genomic data; patterns of behavior in large-scale systems (transportation, communication, energy, social); autonomous robotic systems with feedback and control; and others. This should include learning the limits of computer modeling: understanding what computers can’t do (or can’t do yet), and using domain knowledge and common sense to recognize nonsensical output. Introductory courses might expect students to understand and implement specific models, while advanced courses might ask students to adapt or invent models for novel problems.
- Expressing creativity using programs. Using computation to engage and augment human creativity in new ways, enhancing expression in art and design through the creative application of algorithms and code. Examples might include: computer-generated poetry using natural-language modeling; generative grammars for architectural spaces; creating music through live coding; procedurally generated graphics and animation; and others.