Joe Armstrong发明了Erlang语言,并用它开发了开放电信平台(OTP)。
Joe的学习生涯很特别,开始学习物理,后来因为没钱念博士转而学习计算机。学习期间接触了人工智能并撰写了机器人视觉的论文。
接下来由于行业的变故,人工智能也搞不下去了。辗转到了瑞典空间研究中心,最后加入了爱立信计算机科学实验室,发明Erlang。
0、编程启蒙
中学时代学习Fortran,苦于每次只能提交一个程序,于是想到“偷懒”的办法——并发执行。
期间为同学们调试程序,标准开价居然是一杯啤酒。
1、对开发工具的看法
Joe不认为这些小玩意会让你的生产率更高,相反地在简单的系统上工作可以强制你规范地进行思考。
比如层次化的目录结构和版本控制并不能从本质上解决问题。
似乎事实也的确如此,存有上G的资料并不能让你快速找到并给朋友或上司立刻准备一场技术介绍,更不必说你还记得它们的准确位置。
另外一个事实,过多的选择会在开始工作前消耗大量的精力,如果你有选择困难症,那会变成一场灾难。
2、是否有必要深入底层
是的,虽然现在要深入这些黑盒更加困难。但是深入的目的是去了解它们的工作机制,最好的方法就是自己实现。
在日常开发中,我们都会为自己定义”抽象边界“,比如JVM里面我是不会去关心的,还有GCC编译器。
然在,在Joe看来,抽象边界其实很容易穿越,而且一旦穿越会有很多收益。
实际操作时不用走极端,不需要门门精通。根据自己的情况,有计划地深入可以探究的黑盒子。
3、面向对象好还是函数式编程好
面向对象被认为是复用代码的最佳实践,但Joe提出了自己的看法。
他举了个例子”你要的是香蕉,结果看到的是香蕉拿在大猩猩手里,而且后面还有整个丛林“。
面向对象的问题或者说代码不能复用的最根本原因是:用复杂的方式来把问题更加复杂化。
他用硬件设计和软件开发做了对比,硬件组合的过程是购买芯片然后按照你需要的方式连接起来,而软件却无法做到这一点。
事实也的确如此。
4、编程能力是如何成长的?
开始的时候需要学习和尝试,不停地练习和总结。通过实验来学习和验证自己的想法。
后来会在解决问题之前理清思路,然后做很小的实验来回答某个问题。
最后会把这些编程的经验(程序的结构)记在脑子里,在大脑中配合纸笔来完成,不再需要做实验了。
在脑中有想法的时候,向别人讲解或者写出来是很有必要的,这是解决问题的第一步。
思考的时候可以写写画画,启发自己的思路。
开始写代码的时候应该是这样的:“就像母鸡做好准备要下蛋了,我现在也准备好下蛋了”。
在写代码的时候,要先从大处入手,先规划好框架,填充基本的实现。再深入局部,根据需要减速或者慢速来填充细节。
这个过程和画画很像,先规划好区域,再填充大片的颜色,最后把画中的每个人物划到合适的地方,最后刻画细节。
在细节方面,校对能力是很重要的,可以发现细微的错误。
当然,良好的命名规范可以减少很多差错的工作量。
编写边测试也是一种很好的办法。
5、如何提高编码效率?
疲惫的时候不要写代码,这些代码都是垃圾。
真正好的代码是完全进入状态的时候写的。
做好时间管理,在需要写代码的时候屏蔽所有干扰,一鼓作气。
6、优秀的程序员是怎样的?
首先,喜爱编程。会在编程上投入大量的时间。
大量的练习会让编程速度越来越快,可以迅速地解决简单的问题。
其次,喜欢分析事物的工作原理。编程的目的在于理解。
比如编写JPEG代码是想理解小波变换,给X Window做接口是想理解X协议。
还有,英语要好。“如果你不擅长英语,就永远不可能成为优秀的程序员”。
最后,优秀的程序员会花20%的时间学习新东西。
就像存款有复利一样,20%的复利意味着4年半以后掌握的知识会是同事的两倍,5年以后是他们的三倍。
Joe这么做了,他每天花了40%的时间学习新知识而且坚持了30年。
优秀的程序员是“问题驱动的”,他们的口头禅是“我发现了一个有趣的问题”。
还有,好的程序员记性要好。也许不是记忆到细节,但是代码模式已经记在脑子里了。
可以长时间记住代码的结构。
7、有什么好的调试经验可以分享?
就是打印语句。有个定律,“所有的错误都出现在上次程序改动的地方前后3条语句中”。
这个规律还可以应用到其它场景,比如硬件设计。
因此,如果做修改,你需要记住修改的是什么地方。
8、关于编写文档有什么要说的?
很有必要,在解决复杂问题的时候通常先写文档。
代码只告诉你它做了什么,没有告诉它应当做些什么。
如果没有文档就只能猜,而且很有可能猜错。
总结
虽然从来没有接触过Erlang这门语言,但是从他的发明者Joe身上学到了很多有价值的经验。
从访谈的点滴能看出,先热爱,再勤奋,最后找到自己喜欢的和适合做的事情。
这样的编程人生真是乐在其中。