How to Design Programs: An Introduction to Programming and ComputingThis introduction to programming places computer science in the core of a liberal arts education. Unlike other introductory books, it focuses on the program design process. This approach fosters a variety of skillscritical reading, analytical thinking, creative synthesis, and attention to detailthat are important for everyone, not just future computer programmers.The book exposes readers to two fundamentally new ideas. First, it presents program design guidelines that show the reader how to analyze a problem statement; how to formulate concise goals; how to make up examples; how to develop an outline of the solution, based on the analysis; how to finish the program; and how to test. Each step produces a welldefined intermediate product. Second, the book comes with a novel programming environment, the first one explicitly designed for beginners. The environment grows with the readers as they master the material in the book until it supports a fullfledged language for the whole spectrum of programming tasks.All the book's support materials are available for free on the Web. The Web site includes the environment, teacher guides, exercises for all levels, solutions, and additional projects. 
What people are saying  Write a review
User ratings
5 stars 
 
4 stars 
 
3 stars 
 
2 stars 
 
1 star 

see http://www.htdp.org/
Review: How to Design Programs: An Introduction to Programming and Computing
User Review  Gregory Blake  GoodreadsThis book is essential for any mathematicallyinclined programming novice. Read full review
Contents
Processing Simple Forms of Data  3 
Programs are Function Plus Variable Definitions  21 
Conditional Expressions and Functions  29 
Symbolic Information  46 
The Varieties of Data  79 
Syntax and Semantics  97 
Processing Arbitrarily Large Data  117 
More on Processing Lists  137 
Generative Recursion  357 
Designing Algorithms  368 
Variations on a Theme  381 
Algorithms that Backtrack  406 
The Cost of Computing and Vectors  417 
Accumulating Knowledge  441 
Designing AccumulatorStyle Functions  450 
More Uses of Accumulation  466 
Natural Numbers  153 
Composing Functions Revisited Again  168 
List Abbreviations  183 
More on Processing Arbitrarily Large Data  189 
Mutually Referential Data Definitions  209 
Development through Iterative Refinement  221 
Processing Two Complex Pieces of Data  228 
Local Definitions and Lexical Scope  259 
Abstracting Designs  283 
Functions are Values  299 
Designing Abstractions from Examples  306 
Designing Abstractions with FirstClass Functions  319 
Mathematical Examples  334 
Defining Functions on the Fly  350 
The Nature of Inexact Numbers  478 
Changing the State of Variables  491 
Designing Functions with Memory  507 
Examples of Memory Usage  521 
The Final Syntax and Semantics  548 
Changing Compound Values  573 
Mutable Structures  587 
Designing Functions that Change Structures  608 
Equality  637 
Changing Structures Vectors and Objects  642 
Epilogue  677 
683  