Quiero recomendar el siguiente curso de coursera "Introduction to Systematic Program Design", que explica como diseñar programas. Esta muy orientado a la programación funcional, se usa un lenguaje llamado racket que es un derivado de Lisp, también se basa en un libro: "How to Design Programs". A primera vista esta muy bueno.
Dejo un video:
Dejo links:
https://class.coursera.org/programdesign-001
http://www.ccs.neu.edu/home/matthias/HtDP2e/
http://htdp.org/
http://racket-lang.org/