微信号:imkuqin

介绍:本微信公众号:imkuqin,为程序员提供最新最全的编程学习资料的查询.目前已经开通PHP、C/C++函数库、.NET Framework类库、J2SE API查询功能.

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

2019-03-12 12:18 码农翻身刘欣
来自:码农翻身(微信号:coderising)



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


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



●编号3608,输入编号直达本文

●输入m获取文章

C语言与C++编程

分享C/C++技术文章

 
程序猿 更多文章 撕掉单词书,每天花10分钟做这件事,英语水平暴涨! 程序员跳槽刷题必备神器!不用打开浏览器,就能刷LeetCode 年后跳槽必看,这份书单让你分分钟拿下offer 阿里P7试用期被淘汰,主管给出的理由让人意想不到 各大高校女生节横幅来袭,个个都是段子手
猜您喜欢 程序员转行烧烤,需要做哪些准备呢? 人工智能企业自动化的关键现状和战略影响 哪些硅谷创业公司能给拜访者留下深刻印象? 9折优惠仅剩4天!沉浸式的728·GOPS北京站,海内外大咖云集 开源日常记录软件 ToDoList