什么是好代码,Linux大神来告诉你

简介: 在工作中经常有同学在讨论,到底什么是好代码?对于好代码,相信每个人都有自己的理解,可能它是包括以下几个维度:关于代码结构本身;关于功能实现;关于学习成本;关于程序可读性...

在工作中经常有同学在讨论,到底什么是好代码?对于好代码,相信每个人都有自己的理解,可能它是包括以下几个维度:


  • 关于代码结构本身;


  • 关于功能实现;


  • 关于学习成本;


  • 关于程序可读性...


但是全面清晰的将所有标准都一一列举出来又是非常困难。记得某一期的TED邀请了 Linus,里面讲到了他个人对生活的品味,以及为啥有 Linux 等等。其中Linus 提到了对 “好代码”的一些看法,一起整理分享给大家。


1. Linus Torvalds 介绍


Linus Torvalds 是Linux内核的缔造者,22岁他还在上大学的时候,就把Linux内核写出来了, 在他购买IBM PC的时候,第一想法是为这个PC写一个操作系统,而不是像普通人一样地去装这个系统装那个软件。Linux 内核基本上全部是C语言实现的,底层的/boot由汇编实现,大量的移位运算,按位运算,定点移位运算,速度极快!特别在很多没有乘法指令的RISC结构CPU上,这样做是极其高效的,也是硬件容易接受编程方式。


注意: Operating System 可不是谁想写就能写的。尤其是OS内核部分,单会编程语言是远远不够的, 硬件知识的储备也是必不可少的。

Linus Torvalds两次改变了技术,第一次是Linux内核,它帮助互联网的发展;第二次是Git,全球开发者使用的源代码管理系统。


Linus 本人同样是Git的缔造者, Git目前世界上最牛逼的分布式版本控制系统(没有之一)

2. 关于好代码


Linus Torvalds说:“有时候你可以换个角度看问题,重写代码,排除特例,完美覆盖所有情况,这就是好的代码。同时也很简单,这是最基本的原则。细节非常重要。”


在采访中,Linus Torvalds对比了以下2个函数:


1. 不怎么漂亮的代码

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;
    } 
}


上面的代码,需要区分要移除的成员是否为链表的头一个成员。需要单独处理特例情况(要移除的成员为链表的头一个成员)。 


2. 好的代码

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
    // points to the entry we want to remove 
    while ((*indirect) != entry))
    {
        indirect = &(*indirect)->next;
    }
    // .. and just remove it
    *indirect = entry->next;
}


这个代码完全不需要单独处理特例情况,程序整体更加整洁、优雅。其实现原理为:指针变量indirect保存的是链表成员结构体中的next成员的地址(head指针也可这样看),如下图所示:所以变量*indirect就相当于是前一个链表成员的next成员(相对于要移除的成员来说)。当找到要移除的成员后,进行如下操作即可:


*indirect = entry->next;


3. 访谈中的其他观点


3.1、关于工作方式


在本次TED的采访中,Torvalds以极其开放的态度讨论了他独特的工作方式和性格特点。Linus Torvalds说:“我不是一个空想家,我是一名工程师,我非常乐意跟梦想家在一起,他们行走四方,仰望苍穹,看着满天星辰说,“我想到那儿去。”但我是低头看路的那种人,我只想填好眼前这个坑,不让自己掉进去,这就是我。”


3.2. 关于开源


Linus Torvalds说道:Linux并不是一个合作的产物,它是我一系列项目中的一个,纯粹出于自己当时的需要,部分原因是我需要得到结果,但更重要的原因是我享受编程。当年我只是想做一个完全属于自己的项目,我压根就没想过开源这件事。但在那之后,随着项目越来越大, 你会开始想让别人知道。感觉就像 “哇,快来看看我的成果!”成千上万的人想参与进来(Linux内核项目),但很多时候,我成为了那个断点,我无法让自己跨出那一步,同上千人合作。因此Git是我的第二个大项目,它存在的意义就是维护我的第一个大项目。我编程是因为好玩,但我也想做一些有意义的事情,因此我设计每一个程序仅仅是因为我自己需要。而我喜欢开源软件的一点就是,它能让形形色色的人在一起合作。我们不必相互喜欢,有时候我们甚至互相讨厌。是真的,我们经常吵得不可开交。


科学界的开源显然是一种回归,科学最初是开源的。 但之后变得越来越封闭,只存在那些昂贵的科学期刊上。 开源让科学 回归了,我们有了arXiv和开放期刊。


相关文章
|
15天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
1月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
206 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
2月前
|
Java Linux Python
Linux环境下 代码java调用python出错
Linux环境下 代码java调用python出错
53 3
|
2月前
|
Linux Shell Python
9-7|salt代码在linux机子那个目录
9-7|salt代码在linux机子那个目录
|
3月前
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
139 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
3月前
|
Linux 程序员 开发者
源社区的兴起:从“代码隐士”到Linux引领的“全球编程嘉年华”
在编程的古老森林中,曾有“代码隐士”默默耕耘,惧怕智慧外泄。直到“开源”春风拂过,源社区如全球编程嘉年华盛开!开源文化颠覆了“独门秘籍”的传统,像“武林秘籍共享”般在网络上公开,鼓励知识传播与智慧碰撞。程序员组队开发,分享代码,提升科技实力。Linux则从“首席大厨”变身为“总导演”,以强大内核调制出诱人应用,引领潮流并推动技术创新。加入这场没有血腥厮杀,只有知识盛宴的“编程版《饥饿游戏》”吧!与全球开发者共享编程的乐趣与成就感!别忘了带上你的“独门秘籍”,可能下一个改变世界的创意就在其中!
66 7
|
2月前
|
Linux 开发者 Python
从Windows到Linux,Python系统调用如何让代码飞翔🚀
【9月更文挑战第10天】在编程领域,跨越不同操作系统的障碍是常见挑战。Python凭借其“编写一次,到处运行”的理念,显著简化了这一过程。通过os、subprocess、shutil等标准库模块,Python提供了统一的接口,自动处理底层差异,使代码在Windows和Linux上无缝运行。例如,`open`函数在不同系统中以相同方式操作文件,而`subprocess`模块则能一致地执行系统命令。此外,第三方库如psutil进一步增强了跨平台能力,使开发者能够轻松编写高效且易维护的代码。借助Python的强大系统调用功能,跨平台编程变得简单高效。
40 0
|
2月前
|
机器学习/深度学习 Linux 开发工具
Linux内核开发流程指南 - 5. 编写正确的代码【ChatGPT】
Linux内核开发流程指南 - 5. 编写正确的代码【ChatGPT】
|
2月前
|
缓存 编译器 Linux
Linux内核开发流程指南 - 4. 编写正确的代码【ChatGPT】
Linux内核开发流程指南 - 4. 编写正确的代码【ChatGPT】
|
3月前
|
存储 Linux 网络安全
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)