Bret Victor – Learnable Programming

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微信公众账号可以在手机端搜索文章

(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)

——=== 访问 酷壳404页面 寻找遗失儿童。 ===——
好烂啊有点差凑合看看还不错很精彩 (20 人打了分,平均分: 4.50 )
Loading...

Bret Victor – Learnable Programming》的相关评论

  1. 这些对于咱们国内的开发人员来说有点超前,或许是悲哀,看看咱们在公司都在做啥?疲于交付功能,纯粹码字母,流于形式的开发流程,以及面对不懂代码的主管。。。。

  2. 在中国编程,基本上碰到一个问题.就是程序能用就行,而不会过多考虑程序的实用性与艺术性.
    而且设计文档都写的不全.重视代码,而轻视文档记录.
    但是可喜的是,我们都已经发现了这个问题,至少现在的我们已经做的很好了.

  3. 没怎么看明白。。。。
    编程,就是针对某种开发环境、平台、语言而言的
    否则,就是甲方:需求的提交者

  4. 几个感想:
    1. 不知道Bret眼中适合用来学习的语言是什么样的,是不是只能新发明一种语言了……他只说了JavaScript不好,但从文章后面的内容来看,他的演示和改进也都在用JavaScript,似乎也没看出JavaScript带来了什么问题。
    2. 如果用这个系统来进行编程教学,方便是方便了,但是什么东西都放在你面前了,实在太自动了似乎也感觉少了点什么,一时还说不清。
    3. 做这么一个系统代价实在很高,但是很好玩,有空可以做着玩,活活。
    4. 楼上一些同学是不是把编程实践和编程教学混起来了?这里的做法都是针对教学的,目的是学编程,而不是真正用编程来做事情,障碍还有不少,效率也不一定高。

  5. @老赵
    不过从“教学”和这个教学系统“实现难易度”出发来看,的确JavaScript不是一个好的选择,因为它过于灵活,有闭包,弱类型等等,外延太大。这对于开发和实践有好处,但不容易理解和学习,实现更加复杂了。感觉要教学,还是得静态类型语言,功能少,最好实现一个逻辑没有两种选择……例如SmallBasic那样。要不就从SmallBasic下手吧……

  6. @skip 译文的视频少了个播放按钮,这样,看文章的时候以为是图片,然后有点迷惑。跑去看原文才发现区别,回到译文把鼠标移到那才发现原来是可以点击播放的视频

  7. “如果一个程序员不能看到他的程序在干什么,那么她就不能理解程序。”博主,你就算很重视女程序员,也不必这样吧?呵呵

  8. @陈皓
    我不是喷,只是觉得前后人称不一致,联想你以前发过的关于女程序员的文章,开个玩笑而已。其实我完全没有轻视女程序员的想法,也没有嘲笑你的意思,抱歉让你误会了。我只是想以这样的方式指出一点无关紧要的错误而已。

  9. 我不针对他的其他想法,只说一下可视化编程。其实有的时候人们故意不看过程来显示自己是高手。比如下棋的时候,棋盘和旗子就是过程的显示,而有些高手喜欢下盲棋。所有的计算以及中间的步骤,都是自在胸中。

  10. 一个月前从John Resig的博客看到那个视频,当时很是震撼,貌似很多人从中有所启发。
    这种开发环境的基础架构实现起来应该有不少难度,个人认为可汗教育引入processing这种可视化形式已经让教学更有趣了,虽然和作者的理想实现还有差别。
    顺便找到个专门介绍实时编码的网站 toplap.org

  11. @老赵
    似乎文末给出了答案——
    「本节会引用四种有极富创造力的编程系统,它们的设计目的都是用来学习,所以我强烈推荐你学一下它们。」

  12. Khan那边稍微体验过一下,一个明显的感觉就是是在教programming language而不是programming。觉得一般编程语言都是和现实妥协的结果。并且运行期的栈或者堆上的数据,更一般到各种数据结构,都是只靠代码本身就能清晰的表现出来的。可视化的程度感觉还远远不够。

发表评论

电子邮件地址不会被公开。 必填项已用*标注