Linus Torvalds的“暴脾气”是出了名的,看到令自己不爽的事情就会怼过去,比如:
他曾经说Intel提交的漏洞修复程序是彻底的垃圾!
当别人说Git没用C++开发的时候, 他反击说“C++是一种可怕的语言”
他喷别人的Pull Request : Your code is shit .....
他吐槽XML可能是有史以来最糟糕的格式......
甚至直接对着摄像机说了一句“So NVIDIA, Fxxk you.”同时给了一个中指。
有人说这是天才的个性,但是这种性格确实是得罪了不少人,去年9月份,他发邮件做了一个反省,说自己也许要照照镜子,为自己的人身攻击言论道歉。
我是有点好奇,领导着世界上最大的开源项目,Linus欣赏谁,尊重谁,喜欢和谁一起共事?
TED上对Linus 的一段访谈视频“The mind behind Linux” 给出了一点线索。
(ps. Linus 不喜欢在公众面前演讲,如果非要参加一些活动的话,他更喜欢和主持人一对一地对话,这会让他感觉到舒服)
在这段访谈中展示了两段完成同样功能的代码(伪码), 第一段是这样的:
remove_list_entry(entry){ prev = NULL; walk = head; // Walk the list while (walk != entry){ prev = walk; walk = walk -> next; } // Remove the entry by updating the // head or the previous entry if (!prev) head = entry->next; else prev->next = entry->next; }
学过数据结构的同学(即使你没学过C语言中的指针),估计也能明白这段代码的大致意思: 这是在删除一个单向链表中的某个节点。
(这段代码没有考虑待删除的节点不在链表中的情况。)
由于是单向链表,在寻找某个节点的时候,需要不断地记录下这个节点前面的节点(prev)
另外,这段代码还考虑到了一个特殊情况, 待删除的节点不是中间节点, 而是头节点(head)。 即使有这个特殊的情况,这段代码还是相当容易理解的,绝大部分人都会写出这样的代码,学校的老师也会这么教我们。
然后Linus给出了另外一段代码(伪码),完成了同样的功能。
remove_list_entry(entry){ // The "indirect" pointer points to the // *address* of the thing we'll update indirect = &head; // Walk the list, looking for the thing that // poins to the entry we want to remove_list_entry while ((*indirect) != entry){ indirect = &((*indirect)->next); } // .. and just remove it *indirect = entry -> next; }
我看到这段代码的第一印象就是很简洁, 根本没有if else, 不管你删除的是头结点还是中间节点,都可以用同样的逻辑来表达。
但是这段代码使用了指针的指针,我看了一会儿才明白到底是怎么工作的。 一旦理解以后,就发现,这确实是个更优雅的方法。 消除了if else, 消除了previous。
我本来也想用图来表达一下,但是发现画出这个indirect的变化过程有点麻烦,大家充分发挥下想象力,自行脑补一下吧。
关键点就是indirect 这个指针第一次指向的是 head 的地址,第二次指向的是节点1.next的地址, 第三次指向的是节点2.next的地址。
Linus对比了这两段代码以后说道:
第一段代码并不好, 它需要区别第一个节点和中间节点,有特例。
第二段代码展示了用一种不同的方式来看待一个问题,它可以把一个特例当成正常情况来处理,这就是好的代码。
我就喜欢和这样的人一起工作,他们有着更好的代码的“品味”。
好的代码“品味” 能够让你从更大的范围来看待问题,本能地知道怎么才能把事情做对,做好。
这两段代码只是很简单的例子,它们甚至不完美, 但我理解Linus所说的意思,它给我们的启示是:在写代码的时候,要努力地从更高的层次去思考问题,找到更抽象,更通用的解决方案,而不是简单地对各种情况写满if else, 那样的代码,难以理解,难以维护。
优雅的代码不仅仅是格式规范,命名良好,更重要的是思维方式和抽象层次,以及由此带来的良好的设计。