怼天怼地怼空气的Linus 喜欢和什么样的人一起工作?

2,975 阅读5分钟
原文链接: mp.weixin.qq.com

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, 那样的代码,难以理解,难以维护。

优雅的代码不仅仅是格式规范,命名良好,更重要的是思维方式和抽象层次,以及由此带来的良好的设计。

你可能会喜欢

关于老刘和码农翻身

我是一个线程

我是一个Java Class

面向对象圣经

TCP/IP之大明邮差

CPU阿甘

负载均衡的原理

一个故事讲完HTTPs

编程语言的巅峰

Java:一个帝国的诞生

JavaScript:一个屌丝的逆袭

C语言:春节回家,我发现只有我没有对象