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.cn ,请勿用于任何商业用途)
相关文章
- 2012年03月09日 -- bret victor – inventing on principle
- 2012年08月27日 -- 一次ajax查错的经历
- 2012年09月14日 -- 对九个超级程序员的采访
- 2012年10月16日 -- xkcd 神图“click and drag”
- 2012年08月22日 -- 为什么我反对纯算法面试题
- 2012年04月17日 -- 挑战无处不在
- 2012年04月11日 -- 我们需要专职的qa吗?
- 2012年08月16日 -- 对技术的态度
-
skip2012年10月14日19:06 | #1回复 | 引用
这里有个翻译: http://chengyichao.info/learnable-programming/
via:http://blog.chengyichao.info/2012/10/04/learnable-programming/
-
jiyinyiyong2012年10月14日19:34 | #2回复 | 引用
light table 粉丝前来报道
-
茶话汇2012年10月15日08:02 | #3回复 | 引用
这些对于咱们国内的开发人员来说有点超前,或许是悲哀,看看咱们在公司都在做啥?疲于交付功能,纯粹码字母,流于形式的开发流程,以及面对不懂代码的主管。。。。
-
榕树下2012年10月15日09:30 | #4回复 | 引用
在中国编程,基本上碰到一个问题.就是程序能用就行,而不会过多考虑程序的实用性与艺术性.
而且设计文档都写的不全.重视代码,而轻视文档记录.
但是可喜的是,我们都已经发现了这个问题,至少现在的我们已经做的很好了. -
haitao2012年10月15日10:23 | #5回复 | 引用
没怎么看明白。。。。
编程,就是针对某种开发环境、平台、语言而言的
否则,就是甲方:需求的提交者 -
老赵2012年10月15日10:42 | #6回复 | 引用
几个感想:
1. 不知道bret眼中适合用来学习的语言是什么样的,是不是只能新发明一种语言了……他只说了javascript不好,但从文章后面的内容来看,他的演示和改进也都在用javascript,似乎也没看出javascript带来了什么问题。
2. 如果用这个系统来进行编程教学,方便是方便了,但是什么东西都放在你面前了,实在太自动了似乎也感觉少了点什么,一时还说不清。
3. 做这么一个系统代价实在很高,但是很好玩,有空可以做着玩,活活。
4. 楼上一些同学是不是把编程实践和编程教学混起来了?这里的做法都是针对教学的,目的是学编程,而不是真正用编程来做事情,障碍还有不少,效率也不一定高。 -
老赵2012年10月15日11:24 | #7回复 | 引用
@老赵
不过从“教学”和这个教学系统“实现难易度”出发来看,的确javascript不是一个好的选择,因为它过于灵活,有闭包,弱类型等等,外延太大。这对于开发和实践有好处,但不容易理解和学习,实现更加复杂了。感觉要教学,还是得静态类型语言,功能少,最好实现一个逻辑没有两种选择……例如smallbasic那样。要不就从smallbasic下手吧…… -
流年2012年10月15日16:07 | #8回复 | 引用
@skip 译文的视频少了个播放按钮,这样,看文章的时候以为是图片,然后有点迷惑。跑去看原文才发现区别,回到译文把鼠标移到那才发现原来是可以点击播放的视频
-
痞子宇2012年10月15日17:15 | #9回复 | 引用
不错 an algorithm must be seen to be believe!
-
流年2012年10月15日17:34 | #10回复 | 引用
@老赵 看了视频,看到 xcode 出没(虽然只看过一点点 xcode 的操作视频)
-
chris2012年10月17日12:52 | #11回复 | 引用
bret victor的主页非常酷!
-
杨林_snartssy2012年10月17日13:14 | #12回复 | 引用
“如果一个程序员不能看到他的程序在干什么,那么她就不能理解程序。”博主,你就算很重视女程序员,也不必这样吧?呵呵
-
陈皓2012年10月17日15:34 | #13回复 | 引用
看过原文再来喷吧,原文通篇用she指代程序员。
-
-
杨林_snartssy2012年10月18日00:25 | #14回复 | 引用
@陈皓
我不是喷,只是觉得前后人称不一致,联想你以前发过的关于女程序员的文章,开个玩笑而已。其实我完全没有轻视女程序员的想法,也没有嘲笑你的意思,抱歉让你误会了。我只是想以这样的方式指出一点无关紧要的错误而已。-
陈皓2012年10月18日15:39 | #15回复 | 引用
文字里看不到语气,哎。没事了。谢谢你。
-
-
冯大宝2012年10月18日10:18 | #16回复 | 引用
我不针对他的其他想法,只说一下可视化编程。其实有的时候人们故意不看过程来显示自己是高手。比如下棋的时候,棋盘和旗子就是过程的显示,而有些高手喜欢下盲棋。所有的计算以及中间的步骤,都是自在胸中。
-
michael2012年10月24日14:10 | #17回复 | 引用
一个月前从john resig的博客看到那个视频,当时很是震撼,貌似很多人从中有所启发。
这种开发环境的基础架构实现起来应该有不少难度,个人认为可汗教育引入processing这种可视化形式已经让教学更有趣了,虽然和作者的理想实现还有差别。
顺便找到个专门介绍实时编码的网站 toplap.org -
钢盅郭子2012年11月6日13:18 | #18回复 | 引用
objective-c 的函数声明、调用就是天然具备「上下文解释」的环境+语言啊
-
钢盅郭子2012年11月6日13:49 | #19回复 | 引用
@老赵
似乎文末给出了答案——
「本节会引用四种有极富创造力的编程系统,它们的设计目的都是用来学习,所以我强烈推荐你学一下它们。」 -
kenhu2012年11月6日17:16 | #20回复 | 引用
khan那边稍微体验过一下,一个明显的感觉就是是在教programming language而不是programming。觉得一般编程语言都是和现实妥协的结果。并且运行期的栈或者堆上的数据,更一般到各种数据结构,都是只靠代码本身就能清晰的表现出来的。可视化的程度感觉还远远不够。
-
ju2ender2012年12月23日20:07 | #21回复 | 引用
很想知道 bret victor 认为什么语言才是优秀的,是 c 还是什么?
-
2012年10月15日14:59 | #1可学的编程 – 陈皓的donews博客 – 陈皓
-
2012年10月16日12:59 | #2xkcd 神图“click and drag”
-
2012年10月18日23:21 | #3definite digest » xkcd 神图“click and drag”
-
2012年10月30日11:51 | #4hustcalm's starred items of googlereader » xkcd 神图“click and drag” – shared from hustcalm
-
2012年11月30日18:21 | #5gweekly[20,21] = 当他们举手流泪之时, 你在做什么 – 我住包子山
-
2012年12月28日11:30 | #6read.guoruei » blog archive » xkcd 神图“click and drag”
-
2013年4月29日13:28 | #7“作环保的程序员,从不用百度开始” | 午后小憩
-
2013年5月2日00:38 | #8definite digest » “c++的数组不支持多态”?