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 语言: 春节回家, 我发现只有我没有对象
来源: https://juejin.im/entry/5c809c17e51d452a4f6c06d8