linus 指针 linux,怼天怼地怼空气的Linus喜欢怎样的工作方式?

article/2025/9/19 8:07:13

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

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

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

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

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

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

f7073fb700a749b580fe3a9206452745.png

有人说这是天才的个性,但是这种性格确实是得罪了不少人,去年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语言中的指针),估计也能明白这段代码的大致意思: 这是在删除一个单向链表中的某个节点。

07038f76cb2d29fef93d993f623292a4.png

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

由于是单向链表,在寻找某个节点的时候,需要不断地记录下这个节点前面的节点(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, 那样的代码,难以理解,难以维护。

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


http://chatgpt.dhexx.cn/article/b0mwA48Y.shtml

相关文章

跑步机上的精彩人生——Linus大神传奇

全面学python的时代,作为程序员你怎么看? https://edu.csdn.net/topic/python115?utm_sourcecsdn_bw 本文来自微信公众号:格友 在这样的软件时代里,越来越多的人工作时离不开电脑,于是便有了各种各样的操作电脑的方式…

Git源码(Linus 版本)详解

温馨提示:建议打开目录观看 Linus 发疯文学欣赏 👾 Git 是 Linux 之父 Linus Torvalds 于2005年开发的用于帮助管理 Linux 内核开发的开源版本控制软件。 美好的一天从阅读 Linus 的发疯文学开始。 (1) Linus 教你学习 Git (2) Linus 评价 CVS (Concur…

linux定时器王贤才,Linux之父Linus Torvald评价C++

Linux之父:C一无是处 不适合LINUX内核开发 Linux之父Linus Torvalds曾经在三年前,因为微软的一位同学质疑Git用C语言开发,而将C痛批了一顿。当时,他是这样评论的: C正处在困境当中,它既无助于简化,以实际用…

好书推荐--Linux之父Linus的自传《Just for Fun》

这本书非常有趣,它让你不由感到,在这个浮躁的社会,兴趣爱好是多么的重要!至少能让你收获快乐。巴菲特说过这样一段话:“没钱没人脉时,请逼自己做好这三件事。第一,找到自己的兴趣爱好&#xff1…

linus 用的linux版本,Linus Torvalds的重大消息

Linux创始人Linus Torvalds在内核邮件列表上宣布正式释出Linux Kernel 4.9,这个版本被称为时尚改进最大的版本,同时4.10合并窗口已经开启。但值得注意的是,为期两周的合并窗口预计将在圣诞节这天关闭,因为假期的原因Torvalds考虑缩…

Linus基础

1.使用whereis查找locate命令 使用which查找whereis命令 使用locate查找rm命令 2.使用find命令查找当前路径下的所有普通文件 使用find查找file1.txt,file2.txt,file3.txt 3.cut命令的使用 4.uniq新建uniq_data.txt 使用uniq命令输出的结果 使用uniqming输出值重复的行 使用…

Linus:我终于在 M2 芯片的 MacBook 上发布了 Linux 最新版本!

整理 | 彭慧中 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 近日,Linus Torvalds(以下简称“Linus”)宣布Linux Kernel 5.19正式版终于可以和大家见面了。这一版本意义重大,虽然它比原计划晚了…

Linus系统的详细安装教程:

第一步 首先创建虚拟机 1.打开VMware,点击左上角新建虚拟机如下: 2.选择相关选项(也可以选自定义,自定义完成下一步即可)如下图: 3.选择“稍后安装操作系统(S)"如下图: 4.版本也可以选择其他的Red Hat版本(CentOS是Red Hat中的一个开放版本)如下图: 5.…

为何 Linus 一个人就能写出这么强的系统,国人却做不出来?

点上方蓝色“菜鸟学Python”,选“星标”公众号 重磅干货,第一时间送到转自:默然 Coldwings(知乎) www.zhihu.com/question/63187737 他是谁,Linus! 林纳斯・托瓦兹(Linus Torvalds,…

Linux之父:Linus

林纳斯本纳第克特托瓦兹(Linus Benedict Torvalds),是Linux之父,是Linux内核的缔造者。 1991年,年仅22岁的芬兰程序员Linus Torvalds发布了自己独创的操作系统—Linux。他将代码公布在网上,爱好者们也贡献者…

关于 Linux 之父,你可能不知道的 7 件事

如果让你现在说出三个程序员的名字,Linus 很可能就在其中。作为世界上最著名的电脑程序员、黑客之一,Linus Benedict Torvalds 写出了 Linux 内核 1.0 版,发起了开源运动,开发了代码管理工具 Git。 这三个成就中的任意一个&#x…

润乾报表中API自定义数据集

报表的数据来源大部分来自数据库,正常情况润乾报表都能自动处理,但是也会有特殊的情况,例如通过中间件连接数据库而非直连?通过业务程序算出的数据传递给报表进行展现等等。因此需要用户自定义数据集,我们看一个例子。…

使用Java随机划分数据集为训练集和测试集

在做机器学习,推荐系统等等实验的过程中,我们难免会自己来手动划分数据集,一般都是用一些python开源库来划分,今天我们使用Java自己写代码来随机划分数据集。以下数据集的格式为user item rating ,如图: 下面为代码&am…

Java项目使用Redis缓存数据

Java项目使用Redis缓存数据 一、Redis的下载安装 1、下载gcc编译器 yum install gcc-c安装完成后检查是否安装成功,查看版本 gcc --version2、使用weget下载redis wget http://download.redis.io/releases/redis-6.2.4.tar.gz下载成功后使用 ll 或 ls 命令查看…

Java数据结构及原理实现

程序设计主要是数据结构算法,而数据结构在面向对象思维里是“容器”的意思,数据结构主要负责数据的添加,删除,修改,查找及对数据的其他操作。编程里面对着不同问题场景,选择哪种数据结构进行操作就非常重要…

Java数据集总结

Java数据集关系图(来自网上) 红色是接口,绿色是实现。其中 HashSet是通过内部持有HashMap实现TreeSet是通过内部持有TreeMap实现 除了上述基础数据集,还有一些其他数据集 LinkedHashMap 继承HashMapLinkedHashSet 继承HashSet&…

Java常见数据集合list、set、map

线性表 由零个或者多个数据元素组成的有限序列。第一个元素无前驱,最后一个元素没有后继,其他元素有且只有一个前驱或者后继 栈、队列 栈Queue队列Stack先进先出先进后出LinkedList:可以用它来实现双向队列。PriorityQueue:基于…

java数据集合

一)Collection接口:存储单列数据: (1)List:单列有序集合(可以重复): A、ArrayList:底层结构是数组,底层查询快,增删慢(非线程安全)&am…

windows VM12虚拟机安装苹果系统(Mac OX 10.11)

windows VM12虚拟机安装苹果系统(Mac OX 10.11) 本人最近需要使用苹果电脑生成请求文件,由于没有苹果电脑,只能安装个黑苹果对付一下了,以下是本人的经历。 首先需要工具 1、vm12安装包下载 提取码tcua; 2、unlocker208工具下载 提…

vm16安装macos12的详细配置

文章目录 版本情况macos安装unlock创建虚拟机虚拟机安装配置安装tools 优化部分参考文档部分 版本情况 VM16 macos 12.01 unlocker(破解) Github上的大佬Dr. Donk分享的Unlocker: https://github.com/DrDonk/unlocker/releases 资源相关链接&#xff1…