一开始以为这是个有很多短小文章的博客...
于是边看边翻译的...
然后写到 contents 的时候傻眼了...
于是就放个开头吧...
Learnable Programming 为理解编程而设计的编程系统
走起
问个复杂点的问题“怎样才能让人们理解编程?”
Khan Academy 最近推出了一套在线的学习编程的环境。包括了一堆使用 Javascript 和 Processing 的教程,一个能够“及时”更新程序输出的编程环境。(这个东西貌似能在不重启程序的情况下修改变量啊颜色啊什么的)
因为 Khan Academy 引用了我的一些作品,所以我觉得我应该在学习编程这个题目上说上两句:
- 编程是一种思考方法,而不是一种死硬的技能。怎么用 for loop 和怎么编程就和讨论怎么拿铅笔和怎么作画一样。
- 人们要看到才会理解。如果一个程序员无法看到她的程序在做些什么,她就无法去理解。
所以,一个编程的系统应该是:
- 去鼓励与支持更强大的思考。
- 让程序员去看到并且理解程序的执行。
一个“及时”的编程环境并不能满足这两点。Javascript 和 Processing 的设计都并不是很好,并不能帮助学员们去更好的思考,而且会让他们忽略几十年来对于学习的研究。(最后半句应该是这个意思吧...)而且即使的编程环境本身就没什么价值。
Alan Perlis 写过:“要理解编程,你需要化身为程序和机器 (machine)。”这个观点是错误的,并且就是因为这个广传的错误观点让编程一直像一门难以理解的艺术。人不是机器,不应该被迫去像机器一样思考。
我们怎么样才能让人们理解编程?
改变编程。让编程变为人们理解的一些事物。
目录
一个编程系统分为两部分。编程环境是安装在电脑上的部分,而编程“语言”是装在程序员脑子里的。(语言在原文里有引号)
环境应该提供的:
- 字典:每个单词是代表了什么
- 流程:什么时间会发生什么
- 状态:电脑再想什么
- 回应 (?): 先起步 后细琢
- 抽象:先具体 后归纳
语言应该提供的:
- 象征:我怎样能把电脑的世界和我的联系起来
- 分解:我怎样能把我的思绪分解成块
- 合并:我怎样把各个部分粘合起来
- 易读:我怎样知道这个词什么意思
功能不是重点
我们总认为语言或者环境的重点在于功能 -- “这货能折叠代码” “这货推断我用的是什么类”。这就跟看到了 fortuitous 和 munificent(好像是两个很高端的单词啊...)这两个单词就膜拜一本小说一样。重要的不是逐个的单词,而是一字一句汇在一起所传达的信息。
同样,一个设计得体的系统也不应该就是把成堆的功能砸在脸上。一个好的系统应该是为了鼓励一种思考方式而设计的,所有的功能应该是精密的围绕着这个目的。
这篇文章将要展示一箩筐的功能!要点是看透他们 -- 去思考它们背后的设计,然后去领会这些原理怎样引导一名程序员的思绪。