Bret Victor – Learnable Programming
大家是否还记得之前酷壳向大家介绍的苹果设计师Bret Victor一种可视编程的视频《Bret Victor – Inventing on Principle》,最近,他写了一篇文章—— Learnable Programming,写这篇文章的原因是因为“可汗学院(Khan Academy)”近期上线的一个在线编程环境,根据他的演讲提供了一堆基于Javascript的“实时编程”的环境,因为这个环境是引用了他的想法,所以,他有必要出来喷两句。
这篇文章的开头就是一个问题——“How do we get people to understand programming?”,我们怎么让人们懂得编程?
然后,他说了两条——
- 编程是一种思考,而不是一种死记硬背的技能!你学会了“for循环”并不是说你就学会了编程,这就好像你知道有铅笔这个东西,但是你对绘画还是什么不懂。(对于这一条,正好这两天我在微博上和人辩论“基础算法面试题是否好”(还有微博一,微博二),而且我以前也写过一篇《为什么我反对纯算法面试》,这里借用Bret的话再加强一下我的观点——“我们一方面在骂中国的应试教育毁了学生,另一方面我们又在把我们的面试变成“考八股文”式的考试! 你会qsort有什么用?你只不过是会用一支高级铅笔而已罢了。”)
- 人只有看得见,才能理解。如果一个程序员不能看到他的程序在干什么,那么她就不能理解程序。(对于这一条,让我想到了Donald Knuth的话——“An algorithm must be seen to be believe!”)
所以,Bret 觉得编程软件的目标是——
- 支持并激发强大的思考。 To support and encourage powerful ways of thinking.
- 让程序员可以看得见程序的运行过程。To enable programmers to see and understand the execution of their programs
他说,可汗学院的“实时编程环境”并没有达到上面的任何一个目标。他还说用Javascript这样设计得很垃圾的语言根本不能支持强大的思考,而且还忽略了近十年来的成果,可汗学院这些东西完全是毫无价值的。
Bret认为,Alan Perlis的名言——“要学会编程,你必需得同时变成机器和程序”是错误的,这句被广为流传的错误名言,让我们把编程变成很难,并且掩盖了编程的艺术。人并不是一台机器,我们也不应该强迫自己变成那样。
接下来,他说明了一个编程系统应该有两个部分——
- 编程的“环境”,是其中一部分需要安装在电脑上的。
- 编程的“语言”,是另一部分需要安装在程序员大脑里的。
他随笔给出来了一些Design Principles——
对于“编程环境”,应该能让学习者干下面的事:
- 阅读程序词汇 read the vocabulary — 这些单词意味着什么?是不是显而易见不用思考的?是不是很自然地被上下文解释了?
- 跟进流程 follow the flow — 在什么时候会发生什么?流程的时间过程是不是看得见摸得着的?流程的粒度是否有意义?
- 看见状态 see the state — 电脑在想些什么?你能不能看到电脑里的数据?并可以看到不同状态的比较?没有任何状态会隐藏?
- 通过交互来创造代码 create by reacting — 从粗糙开始,然后开始雕琢程序。交互是否实时显示在屏幕上?有多少组件我可以用来做实时交互?
- 通过抽像来创造代码 create by abstracting — 从一些hard code开始,然后开始抽象成变量,抽象成公式,抽象成函数。从一个开始作模板,然后做多个不同的东西。
对于“编程语言” 来说,它应该提供下面的事:
- 同一性和比方 identity and metaphor — 我怎么把电脑的世界和我的世界联系起来? 推荐了一本书《“Mindstorms”》
- 分解 decomposition — 怎么把我的想法分解成碎片?how do I break down my thoughts into mind-sized pieces?
- 重组 recomposition — 怎么把这些碎片重组起来? how do I glue pieces together?
- 可读性 readability — 这一大堆程序单词是什么意思?what do these words mean?
然后,他说“The Features are not the point”,我们很多时候会关注编程环境和编程语言提供的功能,这就好像我们在看一本书有哪些单词一样,有哪些单词不重要,重要的是我这些单词组合起来传达了一个什么信息?一个设计的好的系统并不是一堆功能,一个设计得好的编程环境是激发特定的思考方式。所有的功能都是非常小心翼翼地组合起来为之服务。(不好意思,我又要插一句。我觉得这和我在《抄袭,腾讯和产品》一文中,我所理解的“什么是真正的产品”有点类似——真正的产品不是功能的组合,而是要表达的价值和对某一特定问题端到端的解决方案)
接下来,Bret用大量的示例告诉了大家上面所说的那几条是具体是什么。大家一定要去读一读!(我把这些东西总结果在上面的那些条目中了)
最后,Bret说了一下,他被问过很多次——这些漂亮的想法怎么应用到现实世界中?他说这个问题问的是对的,但是这些问题问的就好像是——“怎么能让一匹马从内燃机引擎受益”一样,其假设的改变是错误的。他回答到,更准确的是——“Programming has to work like this”,所以他说,他的这些东西不是一种“Training”,也不是一种“银弹”,只不过是拿开了眼罩。
更新:一楼回复的朋友给了一个中译版的链接:http://chengyichao.info/learnable-programming/