每个程序员都可以懂一点 Linux

2021-02-08    分类: 网站建设

大家好。我先简单介绍一下自己,我是李鸿,目前负责马蜂窝内容中心的技术研发和团队管理。

(1)使用软件

最里面的圆代表的就是一个最小的视野,它对应的是用户拥有的视野。因为作为软件的使用人员,用户是不会去关心背后的开发原理、逻辑实现的,用户只关心这个软件是不是好用。

(2)开发软件

对于我们学计算机、做研发的人来说,去使用一个软件其实是比较容易的。因为我们所在的是「开发软件」这个圈子,相对于用户来说,我们站在一个更外围的视角,我们对使用软件这件事看得更加透彻,角度更开阔。

聊一个生活中的例子,我有一次去参观南京中山岭的宋美龄宫,在去之前听别人说,美龄宫像一颗宝石一样,被许多由不同颜色树叶构成的项链包裹在中间。听起来就很美,也我非常好奇,于是去了之后我一直在找这条「项链」。结果当然是找不到。因为大家所说的「项链」是通过航拍看到的图形,我是走在树林中,那肯定看不到。

计算机一个最本质的地方就是「自动化」,所以大家要真的能够理解「自动化」这个词的意义。我们写软件、做管理系统,都是为了要解决以前需要人工来做的事,更好地解放我们的大脑。

既然自动化是最本质的,我们就应该反思在自己的工作和学习中,是不是用到了自动化的思想,你是不是还可以忍受机械、繁琐、低效地处理问题?现在的方式是不是应该改进?通过去学 Linux,可以帮助我们构建一个高效的学习和工作环境,去解决这些问题。

3. 借鉴优秀的学习样板和实例

第三个就是对 Linux 的借鉴。其实所有的计算机工程问题,无非都是围绕架构设计、技术选型、代码质量、设计风格、工作流程,自动化程度等相关的问题。如果可以做到理解 Linux,你就会发现在这个操作系统上的很多组件,其实就为我们提供了如何解决计算机工程问题非常多有益的实例。

就如大家在关注一些优秀的开源项目的讨论列表时,你也会觉得有一些人提出的建议并不好,但你可能说不清原因。这时有人做出了一些列举,论证这个建议为什么不好,你就会非常认同,并且吸取他思考问题和解决问题的方法。学习操作系统的过程也一样,Linux 本身就是一个很好的样板和实例,包括它的设计理念、代码质量、文档编写、协同、软件工程、演进以及它的文化,方方面面都会为我们提升非常好的借鉴。

这里我想再展开说一下演进和文化。

演进是什么?其实我们很多人在做项目的时候是很容易走偏的,因为计算机世界每增加一个维度,它可选择的结果都会带来级数级别的增长。而我们在一个软件项目的推进实现中,要考虑的维度可能成百上千。要在这些纷繁复杂的选择中真的找准方向去演进,需要非常清晰地思考。通过去看一个软件的发展历史,你可以去体会那些优秀的人是如何在一些关键的点上把握方向,来为你自己在做判断的时候提供指导。

另外就是文化。我认为包括 Linux 在内的开源项目,核心的文化就是「就事论事,有技术情怀,追求极致,Open 的沟通」。这些理念对每个技术人员的成长都非常重要。比如当我们身处一个规模比较大的公司,成员之间难免会存在沟通上的障碍,可能就会导致误解的产生和对对方的不认可。如果大家以一个统一的文化作为前提,就会用彼此认同的理念和方式去思考问题,也就更容易达成协作。

How 怎么做到懂 Linux

最后我们看看用什么方法去学习,才能够越来越懂 Linux。

1. 理解设计哲学

我们只有对一件事有了深刻的认识,并且认同之后,才有可能去花时间学好。所以首先我认为要深刻认识到 Linux 背后的设计哲学是什么。

关于 Linux 的设计哲学很多地方都有介绍,我这里也特意没有进行翻译,希望大家对表述中关键的英文单词也建立起认知:

下面我把每个点简单地说一下。

"Everything is a process; if it's not a process, it's a file"

Linux 操作系统认为「任何事都是一个进程,或者说一个线程,是一个执行体;如果它不是一个线程,那么它就是一个文件。」

大家不要认为这句话理所当然,其实很多操作系统都没有这样一个概念,但是在 Linux 的世界,大量的东西是以进程的概念存在的。如果你认为它不是一个可以运行的东西,那它极大可能就是个文件。你会发现很多新的技术都是在这样的设计思想之上,比如说容器。

这种思想的好处是什么呢?我们说解决计算机的问题有一个重要的技巧,就是当你能够把各种复杂的事情都看成是一码事儿,能够从统一的视角去概括它,并且面对它、处理它,那解决起来就会容易很多。因为当计算机面对复杂的现实世界,它能做的就是一层一层的抽象,最后抽出一个非常简单且统一的视角,可以直接地去处理。这是大家在写代码的时候可以去思考的。当你发现你做出的设计能够把两、三个不一样的东西,从一个更高的视角进行统一,这时的你就会比很多人了不起。

"One tool to do one task"

第二点,一个工具解决一个问题。它的理念是说要把东西做好、做到极致,就要去做专。如果你做的不能比别人更好,你就不要去做,而是要去想如何通过一种方式让用户可以在你的应用上调用自己喜欢的东西,这就是 One tool to do one task。对我们在做程序的时候也有很多帮助,比如是不是能把现在的应用做得非常内聚,而不是去做更多的东西。

"Three standards I/O channel"

第三点是说每个进程都有三个标准的 I/O:标准输入、标准输出、标准错误,好处是你就会清楚地知道任何终端进程默认都有这三个数据交流的端口,可以自由的进行拼装或者 I/O 重定向,进行功能组合,这其实也就是第四个哲学所说的——

"Combine tools seamle

第一个层次就是 Use,先用起来。但前提是用的时候要符合上面提到的那些标准,也就是要了解它的设计哲学,要知道它的优势,而不是只听别人说怎么配、怎么选才好。

如果把懂 Linux 分为十个「档」,那么 Use 对应的大概是 1-3。其实对于我们 70-80% 的程序员来说,到这里已经非常不错。

第二个层次是 Code。这里的 Code 不是指在后台写一个 Java 的业务程序,或者是前台写一个网页,而是指系统编程(System Programm),通过编码的方式和操作系统直接对话,而不再是点击鼠标去控制。

虽然系统编程跟大部分人的工作不会强相关。但是通过在应用层用语言(主要是 C 语言)去跟操作系统对话,你会看到在整个操作系统背后的一系列东西是怎么构建起来的,去我们提高视野、提升效率,以及得到更多优秀的借鉴都有很多帮助。除了 Code,如果大家有时间和精力,我建议还可以去了解一下 C 语言。C 语言非常纯粹,就是来告诉你内存长什么样,怎么去控制内存、指令、堆栈,怎么去进行参数传递的方法调用等,你会学到大量计算机架构相关的原理。

第三层是 Hack,它的档到对应到 8-10, 这可能是每个希望做到极致的技术人最后的追求,去了解内核这一层。

第一阶段:Use Linux

(1)终端、键盘、命令。刚才在讲 Linux 的设计哲学时,我们提到过一条——「CLI, not GUI」。所以对于程序员来说,在学如何跟 Linux 操作系统对话的时候,一定是使用终端、键盘、命令。我想跟大家说,如果你现在还习惯用鼠标,那你可能要反省,看看自己对自动化理解的程度是不是太低了。

(2)一个字符编辑器。要去找一款自己喜欢的字符编辑器,并且用起来。

(3)SHELL。第三,如果要用 Linux 理论去提高我们的视角,就一定要掌握一版 SHELL 脚本,并且去深刻理解。至于用哪个版本大家可以根据自己的喜好决定,目前我用的是 ZSH,感兴趣的同学可以去了解下。

(4)文件系统、进程线程、IO 组合、用户权限、资源管理。再往下我们可以尝试通过编程的方式去调用文件系统、进程线程、IO、用户权限、资源管理等等,去更加系统的了解。这些都会了之后会发现慢慢,以后再写一种高层的代码也就没那么难了。

(5)解剖 Linux。通过解剖 Linux 可以知道 Linux 是怎么装拼起来的,对它会有一个更直观的认知。我大概在十年前开始接触 LFS(Linux From Scratch LFS),现在它已经演化出了无数个版本,它会告诉你如何开始从零构建一个 Linux 系统,而且它好的地方在于是从源代码的方式去讲怎么编译,最后拼成一个操作系统。这个工作因为需要比较多的精力,所以建议大家三个月到半年的时间跑一次,会很有成就感。

(6)深刻理解背后的文化和哲学。关于 Linux 背后的文化和哲学,可能总结起来就是那么简单几句话,开始会比较难理解。但是大家如果把这几句话当成一种「信仰」,每次在学和用的时候都能再深刻地体会一遍,可能过了半年,说不定某一天你会突然发现想通了。

(7)参与社区。大家在参与社区的时候,一定要知道知识的价值是要通过 10 年、20 年的努力去沉淀、去积累的,要持续地参与到社区当中。

(9)最后一个就是持之以恒,去融入到你的工作、学习和生活当中。Linux 学习曲线的特点是一开始就很陡,不像 Windows,一开始很平滑。但一旦爬过这个陡坡,就会看到一个全新的世界,并且可以一直持续往上走。

第二阶段:Code Linux

这个阶段就是刚才我们讲到的,要用编程语言去和 Linux 对话,通过 Code 开始了解二进制 ELF。ELF 是在 Linux 世界的执行文件格式,通过了解 ELF 可以知道一个执行文件是怎么拼写的,它的内存是怎么存在的,指令是怎么跑的,数据是怎么取的,动态库是怎么加载的……如果把这些都搞定,至少在 Linux 领域,就不会再有什么是让你觉得理解起来比较吃力的事情。

第三阶段:Hack Linux

关于如何 Hack,这个问题非常庞大和复杂。如果大家有尝试走到这一层的勇气和愿望,我非常愿意和大家一起交流。

总结

总结一下今天创新互联讲到的一些内容:

  • 知道为为什么要学 Linux:视野、效率、借鉴
  • 知道要构建什么样的 Linux 知识架构,并对自己专攻的技术方向提供源源不断的能源:三个 W(What, Why , How)
  • 知道学习 Linux 最优方法:确定层次 (Use, Code, Hack),实践,持之以恒,融入每天的工作、学习和生活
  • 知道 Linux 背后的设计哲学、优点、历史和文化
  • 喜欢上 Linux,爱上她

在分享最后,我想和大家聊聊最近经常思考的一个问题。现在我们总会听到身边一些人在抱怨,说计算机行业已经非常饱和,互联网也已经发展到了一定阶段,再过五年十年计算机就要被淘汰了,研发人员也会面临失业。

我对这个观点是非常不赞同的。

每个人都可以不用工作,每天很开心地享受生活,这应该是大多数人理想的状态。但是人类总要养活自己,唯一能达到这种理想状态的情况,就是由计算机、机器人、电脑帮我们人类完成大部分的工作,不管是做家务、交通出行、盖房子等等。如果这个理想状态的标准是 100 分,对比我们现在,可能仅仅处在 0.1 分的阶段。所以怎么可能会存在纯粹的失业呢?

为什么大家还要进行这样一个讨论?我只能认为有些程序员还没有喜欢计算机,担心自己学不好。学习这个过程的确不容易。就像我们看一本哲学书,开始想要读懂非常困难,但随着人生阅历的增长,随着我们在生活、学习和工作中不断验证书中的道理,你就会体会到其中的道理,提升自己看问题的视角和解决问题的能力。所以最后,我希望大家不要害怕学习,并且相信这个行业的前景,和程序员这份职业可以创造的价值。

网站栏目:每个程序员都可以懂一点 Linux
本文地址:/news15/99915.html

成都网站建设公司_创新互联,为您提供响应式网站网站建设Google网站排名电子商务搜索引擎优化

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

网站托管运营