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/
(全文完)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《 Bret Victor – Learnable Programming 》的相关评论
这里有个翻译: http://chengyichao.info/learnable-programming/
via:http://blog.chengyichao.info/2012/10/04/learnable-programming/
Light Table 粉丝前来报道
这些对于咱们国内的开发人员来说有点超前,或许是悲哀,看看咱们在公司都在做啥?疲于交付功能,纯粹码字母,流于形式的开发流程,以及面对不懂代码的主管。。。。
在中国编程,基本上碰到一个问题.就是程序能用就行,而不会过多考虑程序的实用性与艺术性.
而且设计文档都写的不全.重视代码,而轻视文档记录.
但是可喜的是,我们都已经发现了这个问题,至少现在的我们已经做的很好了.
没怎么看明白。。。。
编程,就是针对某种开发环境、平台、语言而言的
否则,就是甲方:需求的提交者
几个感想:
1. 不知道Bret眼中适合用来学习的语言是什么样的,是不是只能新发明一种语言了……他只说了JavaScript不好,但从文章后面的内容来看,他的演示和改进也都在用JavaScript,似乎也没看出JavaScript带来了什么问题。
2. 如果用这个系统来进行编程教学,方便是方便了,但是什么东西都放在你面前了,实在太自动了似乎也感觉少了点什么,一时还说不清。
3. 做这么一个系统代价实在很高,但是很好玩,有空可以做着玩,活活。
4. 楼上一些同学是不是把编程实践和编程教学混起来了?这里的做法都是针对教学的,目的是学编程,而不是真正用编程来做事情,障碍还有不少,效率也不一定高。
@老赵
不过从“教学”和这个教学系统“实现难易度”出发来看,的确JavaScript不是一个好的选择,因为它过于灵活,有闭包,弱类型等等,外延太大。这对于开发和实践有好处,但不容易理解和学习,实现更加复杂了。感觉要教学,还是得静态类型语言,功能少,最好实现一个逻辑没有两种选择……例如SmallBasic那样。要不就从SmallBasic下手吧……
@skip 译文的视频少了个播放按钮,这样,看文章的时候以为是图片,然后有点迷惑。跑去看原文才发现区别,回到译文把鼠标移到那才发现原来是可以点击播放的视频
不错 An algorithm must be seen to be believe!
@老赵 看了视频,看到 xcode 出没(虽然只看过一点点 xcode 的操作视频)
Bret Victor的主页非常酷!
“如果一个程序员不能看到他的程序在干什么,那么她就不能理解程序。”博主,你就算很重视女程序员,也不必这样吧?呵呵
看过原文再来喷吧,原文通篇用She指代程序员。
@陈皓
我不是喷,只是觉得前后人称不一致,联想你以前发过的关于女程序员的文章,开个玩笑而已。其实我完全没有轻视女程序员的想法,也没有嘲笑你的意思,抱歉让你误会了。我只是想以这样的方式指出一点无关紧要的错误而已。
文字里看不到语气,哎。没事了。谢谢你。
我不针对他的其他想法,只说一下可视化编程。其实有的时候人们故意不看过程来显示自己是高手。比如下棋的时候,棋盘和旗子就是过程的显示,而有些高手喜欢下盲棋。所有的计算以及中间的步骤,都是自在胸中。
一个月前从John Resig的博客看到那个视频,当时很是震撼,貌似很多人从中有所启发。
这种开发环境的基础架构实现起来应该有不少难度,个人认为可汗教育引入processing这种可视化形式已经让教学更有趣了,虽然和作者的理想实现还有差别。
顺便找到个专门介绍实时编码的网站 toplap.org
Objective-C 的函数声明、调用就是天然具备「上下文解释」的环境+语言啊
@老赵
似乎文末给出了答案——
「本节会引用四种有极富创造力的编程系统,它们的设计目的都是用来学习,所以我强烈推荐你学一下它们。」
Khan那边稍微体验过一下,一个明显的感觉就是是在教programming language而不是programming。觉得一般编程语言都是和现实妥协的结果。并且运行期的栈或者堆上的数据,更一般到各种数据结构,都是只靠代码本身就能清晰的表现出来的。可视化的程度感觉还远远不够。
很想知道 Bret Victor 认为什么语言才是优秀的,是 C 还是什么?