0002 Computational thinking and programming
This competency covers the knowledge involved in designing programs and using computation to solve problems, and its sixteen sections follow roughly the path a problem takes from the world into code and back out as a finished, shared program. Because the sections that follow quote code throughout, the part opens with a bridge from Python to the typed pseudocode used in much writing about algorithms. The first three sections then look at programs that represent and investigate the world: 0002.a covers models and simulations, 0002.b how data is collected, and 0002.c the tools used to store, prepare, and display it. The next two sections, 0002.d on decomposition and functions and 0002.e on abstraction, describe how a problem too large to hold in mind is divided into parts and how each part hides its details from the others. The central and longest group is about algorithms and programming. It starts with control structures and common algorithmic patterns in 0002.f, steps back to compare programming paradigms in 0002.g, and then examines the materials programs work with: data types and data structures in 0002.h, the ways algorithms are represented in 0002.i, and expressions and operators in 0002.j. Section 0002.k asks how an algorithm's use of time and memory grows with its input and how to compare algorithms on that basis, and 0002.l returns to the object-oriented ideas that organize many larger programs. The last four sections concern the process of building software over time: iterative design in 0002.m, errors, testing, and debugging in 0002.n, performance, readability, and documentation in 0002.o, and the tools and collaborative practices that let people build programs together in 0002.p.