来自 技术 2019-04-15 的文章

怼天怼地怼空气的Linus喜欢怎样的工作方式?

八年Java开发的感悟:什么才是程序员的立身之本>>>   

Linus Torvalds的“暴脾气”是出了名的,看到令自己不爽的事情就会怼过去,比如:

他曾经说Intel提交的漏洞修复程序是彻底的垃圾!

当别人说Git没用C++开发的时候, 他反击说“C++是一种可怕的语言”

他喷别人的Pull Request : Your code is shit .....

他吐槽XML可能是有史以来最糟糕的格式......

甚至直接对着摄像机说了一句“So NVIDIA, Fxxk you.”同时给了一个中指。

有人说这是天才的个性,但是这种性格确实是得罪了不少人,去年9月份,他发邮件做了一个反省,说自己也许要照照镜子,为自己的人身攻击言论道歉。

我是有点好奇,领导着世界上最大的开源项目,Linus欣赏谁,尊重谁,喜欢和谁一起共事?

TED上对Linus 的一段访谈视频“The mind behindLinux” 给出了一点线索。

(ps. Linus 不喜欢在公众面前演讲,如果非要参加一些活动的话,他更喜欢和主持人一对一地对话,这会让他感觉到舒服)

在这段访谈中展示了两段完成同样功能的代码(伪码), 第一段是这样的:

remove_list_entry(entry){prev = NULL;walk = head;// Walk the listwhile (walk != entry){prev = walk;walk = walk -> next;}// Remove the entry by updating the// head or the previous entryif (!prev)head = entry->next;elseprev->next = entry->next;}

学过数据结构的同学(即使你没学过C语言中的指针),估计也能明白这段代码的大致意思: 这是在删除一个单向链表中的某个节点。

(这段代码没有考虑待删除的节点不在链表中的情况。)

由于是单向链表,在寻找某个节点的时候,需要不断地记录下这个节点前面的节点(prev)

另外,这段代码还考虑到了一个特殊情况, 待删除的节点不是中间节点, 而是头节点(head)。 即使有这个特殊的情况,这段代码还是相当容易理解的,绝大部分人都会写出这样的代码,学校的老师也会这么教我们。

然后Linus给出了另外一段代码(伪码),完成了同样的功能。

remove_list_entry(entry){// The "indirect" pointer points to the// *address* of the thing we'll updateindirect = &head;// Walk the list, looking for the thing that// poins to the entry we want to remove_list_entrywhile ((*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, 那样的代码,难以理解,难以维护。

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

标签:   Linux      php数据类型和变量      html引入日历   
上一篇:使用Harbor配置Kubernetes私有镜像仓库
下一篇:没有了