编程人生读书笔记(6):Joe Armstrong

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身上学到了很多有价值的经验。

从访谈的点滴能看出,先热爱,再勤奋,最后找到自己喜欢的和适合做的事情。

这样的编程人生真是乐在其中。

时间: 2024-12-23 18:30:32

编程人生读书笔记(6):Joe Armstrong的相关文章

编程人生读书笔记(4):Bredan Eich

Bredan Eich是JavaScript设计者,Mozilla首席技术官,ECMAScript标准的制定者.Breda有着坚实的理论基础和较强的工程实践能力,本科物理专业,数学底子很好.在学校里主要做科研编程,毕业后从事网络.系统内核开发.专长是编译器,内核开发,设计了JavaScript语言. 0.总结从语言设计者的角度看待编程.学习和实践的关系:- 编程要实践,选择合适的工具(语言),有自己的态度(动力)坚持练习.- 设计代码的方法:用伪代码理清思路,再着手底层实践.实践多了,最后总结成

【转】《windows核心编程》读书笔记

这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯. 海量细节. 第1章    错误处理 1.         GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖. 2.         GetLastError可能用于描述成功的原因(CreatEvent)

《C#高级编程》读书笔记

<C#高级编程>读书笔记 C#类型的取值范围 名称 CTS类型 说明 范围 sbyte System.SByte 8位有符号的整数 -128~127(−27−27~27−127−1) short System.Int16 16位有符号的整数 -32 768~32 767(−215−215~215−1215−1) int System.Int32 32位有符号的整数 -2 147 483 648~2 147 483 647(−231−231~231−1231−1) long System.Int

Unix编程艺术读书笔记(一)

 Unix编程艺术读书笔记(一)这本书是一位面试官告诉我的,很感谢他的指点,关于面试的详细过程,我想以后再写,当然我也意识到自己的不足,一方面是面试的技巧,还有一方面就是学习的方法.阅读这本书很享受,加上之前的积累,一些疑惑,还有一些基础的不足,在这本书里找到了归宿. 下面,一起来享受这本书的精华吧 Unix诞生与1969年,那时候我们还在闹文革吧,可一个可以改变21世纪甚至更远的未来的操作系统问世,至少现在的Linux是基于Unix的设计哲学.Unix是唯一一个在不同种类的计算机,众多厂商

Javascript DOM 编程艺术读书笔记16/04/01

愚人节快乐 开始用webstorm了,随着学习深入,代码越来越长,因为不借助ide还真是挺难的 今天发现了一个严重的误区,text和textNode是完全不同的两个概念,之前没有特别注意,写代码很容易跳过createTextNode直接用parentNode.appendChild(text) 单独拎出来晒一晒,以后引以为戒 Javascript DOM 编程艺术读书笔记16/04/01

《Unix环境高级编程》读书笔记 第7章-进程环境

1. main函数 int main( int argc, char *argv[] ); argc是命令行参数的数目,包括程序名在内 argv是指向参数的各个指针所构成的数组,即指针数组 当内核执行C程序时(使用exec函数),在调用main前先调用一个特殊的启动例程.可执行程序文件将此启动例程指定为程序的起始地址——这是由连接器设置的,而连接器则是由C编译器调用.启动例程从内核取得命令行参数和环境变量值,然后按上述方式调用main函数做好安排. 2. 进程终止 有8种方式使进程终止,其中5种

JavaScript DOM编程艺术 读书笔记

3 DOM DOM分别指document,object和model. DOM中包含的节点主要分为三种:元素节点.文本节点和属性节点.DOM的原子是元素节点,标签的名字就是元素的名字,元素可以包含其他的元素.没有被包含在其他元素里的唯一元素是<html>元素,它是树节点的根元素:在XHTML文档里,文本节点总是被包含在元素节点的内部.但并非所有的元素节点都包含有文本节点:属性节点用来对元素做出更具体地描述. 有3种DOM方法可获取元素节点,分别是通过元素ID.通过标签名字和通过类名字来获取. 1

JAVA并发编程实战 读书笔记(二)对象的共享

<java并发编程实战>读书摘要 birdhack 2015年1月2日 对象的共享 JAVA并发编程实战读书笔记 我们已经知道了同步代码块和同步方法可以确保以原子的方式执行操作,但一种常见的误解是,认为关键之synchronized只能用于实现原子性或者确定临界区.同步还有另一个重要的方面:内存可见性. 1.可见性 为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制. 在没有同步的情况下,编译器.处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整.在缺乏足够同步的多线程程

《Unix环境高级编程》读书笔记 第3章-文件I/O

1. 引言 Unix系统的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close 本章描述的函数经常被称为不带缓冲的I/O.术语不带缓冲指的是在用户的进程中对其不会自动缓冲,每个read和write都调用内核中的一个系统调用.但是,所有磁盘I/O都要经过内核的块缓存区(也称为内核的缓冲区高速缓存).唯一例外的是对原始磁盘设备的I/O. 2. 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数,其变化范围是0~OPEN_MAX