每個程序員都可以懂一點 Linux

2021-02-08    分類: 網(wǎng)站建設(shè)

大家好。我先簡單介紹一下自己,我是李鴻,目前負(fù)責(zé)馬蜂窩內(nèi)容中心的技術(shù)研發(fā)和團隊管理。

(1)使用軟件

最里面的圓代表的就是一個最小的視野,它對應(yīng)的是用戶擁有的視野。因為作為軟件的使用人員,用戶是不會去關(guān)心背后的開發(fā)原理、邏輯實現(xiàn)的,用戶只關(guān)心這個軟件是不是好用。

(2)開發(fā)軟件

對于我們學(xué)計算機、做研發(fā)的人來說,去使用一個軟件其實是比較容易的。因為我們所在的是「開發(fā)軟件」這個圈子,相對于用戶來說,我們站在一個更外圍的視角,我們對使用軟件這件事看得更加透徹,角度更開闊。

聊一個生活中的例子,我有一次去參觀南京中山嶺的宋美齡宮,在去之前聽別人說,美齡宮像一顆寶石一樣,被許多由不同顏色樹葉構(gòu)成的項鏈包裹在中間。聽起來就很美,也我非常好奇,于是去了之后我一直在找這條「項鏈」。結(jié)果當(dāng)然是找不到。因為大家所說的「項鏈」是通過航拍看到的圖形,我是走在樹林中,那肯定看不到。

計算機一個最本質(zhì)的地方就是「自動化」,所以大家要真的能夠理解「自動化」這個詞的意義。我們寫軟件、做管理系統(tǒng),都是為了要解決以前需要人工來做的事,更好地解放我們的大腦。

既然自動化是最本質(zhì)的,我們就應(yīng)該反思在自己的工作和學(xué)習(xí)中,是不是用到了自動化的思想,你是不是還可以忍受機械、繁瑣、低效地處理問題?現(xiàn)在的方式是不是應(yīng)該改進?通過去學(xué) Linux,可以幫助我們構(gòu)建一個高效的學(xué)習(xí)和工作環(huán)境,去解決這些問題。

3. 借鑒優(yōu)秀的學(xué)習(xí)樣板和實例

第三個就是對 Linux 的借鑒。其實所有的計算機工程問題,無非都是圍繞架構(gòu)設(shè)計、技術(shù)選型、代碼質(zhì)量、設(shè)計風(fēng)格、工作流程,自動化程度等相關(guān)的問題。如果可以做到理解 Linux,你就會發(fā)現(xiàn)在這個操作系統(tǒng)上的很多組件,其實就為我們提供了如何解決計算機工程問題非常多有益的實例。

就如大家在關(guān)注一些優(yōu)秀的開源項目的討論列表時,你也會覺得有一些人提出的建議并不好,但你可能說不清原因。這時有人做出了一些列舉,論證這個建議為什么不好,你就會非常認(rèn)同,并且吸取他思考問題和解決問題的方法。學(xué)習(xí)操作系統(tǒng)的過程也一樣,Linux 本身就是一個很好的樣板和實例,包括它的設(shè)計理念、代碼質(zhì)量、文檔編寫、協(xié)同、軟件工程、演進以及它的文化,方方面面都會為我們提升非常好的借鑒。

這里我想再展開說一下演進和文化。

演進是什么?其實我們很多人在做項目的時候是很容易走偏的,因為計算機世界每增加一個維度,它可選擇的結(jié)果都會帶來級數(shù)級別的增長。而我們在一個軟件項目的推進實現(xiàn)中,要考慮的維度可能成百上千。要在這些紛繁復(fù)雜的選擇中真的找準(zhǔn)方向去演進,需要非常清晰地思考。通過去看一個軟件的發(fā)展歷史,你可以去體會那些優(yōu)秀的人是如何在一些關(guān)鍵的點上把握方向,來為你自己在做判斷的時候提供指導(dǎo)。

另外就是文化。我認(rèn)為包括 Linux 在內(nèi)的開源項目,核心的文化就是「就事論事,有技術(shù)情懷,追求極致,Open 的溝通」。這些理念對每個技術(shù)人員的成長都非常重要。比如當(dāng)我們身處一個規(guī)模比較大的公司,成員之間難免會存在溝通上的障礙,可能就會導(dǎo)致誤解的產(chǎn)生和對對方的不認(rèn)可。如果大家以一個統(tǒng)一的文化作為前提,就會用彼此認(rèn)同的理念和方式去思考問題,也就更容易達成協(xié)作。

How 怎么做到懂 Linux

最后我們看看用什么方法去學(xué)習(xí),才能夠越來越懂 Linux。

1. 理解設(shè)計哲學(xué)

我們只有對一件事有了深刻的認(rèn)識,并且認(rèn)同之后,才有可能去花時間學(xué)好。所以首先我認(rèn)為要深刻認(rèn)識到 Linux 背后的設(shè)計哲學(xué)是什么。

關(guān)于 Linux 的設(shè)計哲學(xué)很多地方都有介紹,我這里也特意沒有進行翻譯,希望大家對表述中關(guān)鍵的英文單詞也建立起認(rèn)知:

下面我把每個點簡單地說一下。

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

Linux 操作系統(tǒng)認(rèn)為「任何事都是一個進程,或者說一個線程,是一個執(zhí)行體;如果它不是一個線程,那么它就是一個文件?!?/p>

大家不要認(rèn)為這句話理所當(dāng)然,其實很多操作系統(tǒng)都沒有這樣一個概念,但是在 Linux 的世界,大量的東西是以進程的概念存在的。如果你認(rèn)為它不是一個可以運行的東西,那它極大可能就是個文件。你會發(fā)現(xiàn)很多新的技術(shù)都是在這樣的設(shè)計思想之上,比如說容器。

這種思想的好處是什么呢?我們說解決計算機的問題有一個重要的技巧,就是當(dāng)你能夠把各種復(fù)雜的事情都看成是一碼事兒,能夠從統(tǒng)一的視角去概括它,并且面對它、處理它,那解決起來就會容易很多。因為當(dāng)計算機面對復(fù)雜的現(xiàn)實世界,它能做的就是一層一層的抽象,最后抽出一個非常簡單且統(tǒng)一的視角,可以直接地去處理。這是大家在寫代碼的時候可以去思考的。當(dāng)你發(fā)現(xiàn)你做出的設(shè)計能夠把兩、三個不一樣的東西,從一個更高的視角進行統(tǒng)一,這時的你就會比很多人了不起。

"One tool to do one task"

第二點,一個工具解決一個問題。它的理念是說要把東西做好、做到極致,就要去做專。如果你做的不能比別人更好,你就不要去做,而是要去想如何通過一種方式讓用戶可以在你的應(yīng)用上調(diào)用自己喜歡的東西,這就是 One tool to do one task。對我們在做程序的時候也有很多幫助,比如是不是能把現(xiàn)在的應(yīng)用做得非常內(nèi)聚,而不是去做更多的東西。

"Three standards I/O channel"

第三點是說每個進程都有三個標(biāo)準(zhǔn)的 I/O:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯誤,好處是你就會清楚地知道任何終端進程默認(rèn)都有這三個數(shù)據(jù)交流的端口,可以自由的進行拼裝或者 I/O 重定向,進行功能組合,這其實也就是第四個哲學(xué)所說的——

"Combine tools seamle

第一個層次就是 Use,先用起來。但前提是用的時候要符合上面提到的那些標(biāo)準(zhǔn),也就是要了解它的設(shè)計哲學(xué),要知道它的優(yōu)勢,而不是只聽別人說怎么配、怎么選才好。

如果把懂 Linux 分為十個「檔」,那么 Use 對應(yīng)的大概是 1-3。其實對于我們 70-80% 的程序員來說,到這里已經(jīng)非常不錯。

第二個層次是 Code。這里的 Code 不是指在后臺寫一個 Java 的業(yè)務(wù)程序,或者是前臺寫一個網(wǎng)頁,而是指系統(tǒng)編程(System Programm),通過編碼的方式和操作系統(tǒng)直接對話,而不再是點擊鼠標(biāo)去控制。

雖然系統(tǒng)編程跟大部分人的工作不會強相關(guān)。但是通過在應(yīng)用層用語言(主要是 C 語言)去跟操作系統(tǒng)對話,你會看到在整個操作系統(tǒng)背后的一系列東西是怎么構(gòu)建起來的,去我們提高視野、提升效率,以及得到更多優(yōu)秀的借鑒都有很多幫助。除了 Code,如果大家有時間和精力,我建議還可以去了解一下 C 語言。C 語言非常純粹,就是來告訴你內(nèi)存長什么樣,怎么去控制內(nèi)存、指令、堆棧,怎么去進行參數(shù)傳遞的方法調(diào)用等,你會學(xué)到大量計算機架構(gòu)相關(guān)的原理。

第三層是 Hack,它的檔到對應(yīng)到 8-10, 這可能是每個希望做到極致的技術(shù)人最后的追求,去了解內(nèi)核這一層。

第一階段:Use Linux

(1)終端、鍵盤、命令。剛才在講 Linux 的設(shè)計哲學(xué)時,我們提到過一條——「CLI, not GUI」。所以對于程序員來說,在學(xué)如何跟 Linux 操作系統(tǒng)對話的時候,一定是使用終端、鍵盤、命令。我想跟大家說,如果你現(xiàn)在還習(xí)慣用鼠標(biāo),那你可能要反省,看看自己對自動化理解的程度是不是太低了。

(2)一個字符編輯器。要去找一款自己喜歡的字符編輯器,并且用起來。

(3)SHELL。第三,如果要用 Linux 理論去提高我們的視角,就一定要掌握一版 SHELL 腳本,并且去深刻理解。至于用哪個版本大家可以根據(jù)自己的喜好決定,目前我用的是 ZSH,感興趣的同學(xué)可以去了解下。

(4)文件系統(tǒng)、進程線程、IO 組合、用戶權(quán)限、資源管理。再往下我們可以嘗試通過編程的方式去調(diào)用文件系統(tǒng)、進程線程、IO、用戶權(quán)限、資源管理等等,去更加系統(tǒng)的了解。這些都會了之后會發(fā)現(xiàn)慢慢,以后再寫一種高層的代碼也就沒那么難了。

(5)解剖 Linux。通過解剖 Linux 可以知道 Linux 是怎么裝拼起來的,對它會有一個更直觀的認(rèn)知。我大概在十年前開始接觸 LFS(Linux From Scratch LFS),現(xiàn)在它已經(jīng)演化出了無數(shù)個版本,它會告訴你如何開始從零構(gòu)建一個 Linux 系統(tǒng),而且它好的地方在于是從源代碼的方式去講怎么編譯,最后拼成一個操作系統(tǒng)。這個工作因為需要比較多的精力,所以建議大家三個月到半年的時間跑一次,會很有成就感。

(6)深刻理解背后的文化和哲學(xué)。關(guān)于 Linux 背后的文化和哲學(xué),可能總結(jié)起來就是那么簡單幾句話,開始會比較難理解。但是大家如果把這幾句話當(dāng)成一種「信仰」,每次在學(xué)和用的時候都能再深刻地體會一遍,可能過了半年,說不定某一天你會突然發(fā)現(xiàn)想通了。

(7)參與社區(qū)。大家在參與社區(qū)的時候,一定要知道知識的價值是要通過 10 年、20 年的努力去沉淀、去積累的,要持續(xù)地參與到社區(qū)當(dāng)中。

(9)最后一個就是持之以恒,去融入到你的工作、學(xué)習(xí)和生活當(dāng)中。Linux 學(xué)習(xí)曲線的特點是一開始就很陡,不像 Windows,一開始很平滑。但一旦爬過這個陡坡,就會看到一個全新的世界,并且可以一直持續(xù)往上走。

第二階段:Code Linux

這個階段就是剛才我們講到的,要用編程語言去和 Linux 對話,通過 Code 開始了解二進制 ELF。ELF 是在 Linux 世界的執(zhí)行文件格式,通過了解 ELF 可以知道一個執(zhí)行文件是怎么拼寫的,它的內(nèi)存是怎么存在的,指令是怎么跑的,數(shù)據(jù)是怎么取的,動態(tài)庫是怎么加載的……如果把這些都搞定,至少在 Linux 領(lǐng)域,就不會再有什么是讓你覺得理解起來比較吃力的事情。

第三階段:Hack Linux

關(guān)于如何 Hack,這個問題非常龐大和復(fù)雜。如果大家有嘗試走到這一層的勇氣和愿望,我非常愿意和大家一起交流。

總結(jié)

總結(jié)一下今天創(chuàng)新互聯(lián)講到的一些內(nèi)容:

  • 知道為為什么要學(xué) Linux:視野、效率、借鑒
  • 知道要構(gòu)建什么樣的 Linux 知識架構(gòu),并對自己專攻的技術(shù)方向提供源源不斷的能源:三個 W(What, Why , How)
  • 知道學(xué)習(xí) Linux 最優(yōu)方法:確定層次 (Use, Code, Hack),實踐,持之以恒,融入每天的工作、學(xué)習(xí)和生活
  • 知道 Linux 背后的設(shè)計哲學(xué)、優(yōu)點、歷史和文化
  • 喜歡上 Linux,愛上她

在分享最后,我想和大家聊聊最近經(jīng)常思考的一個問題?,F(xiàn)在我們總會聽到身邊一些人在抱怨,說計算機行業(yè)已經(jīng)非常飽和,互聯(lián)網(wǎng)也已經(jīng)發(fā)展到了一定階段,再過五年十年計算機就要被淘汰了,研發(fā)人員也會面臨失業(yè)。

我對這個觀點是非常不贊同的。

每個人都可以不用工作,每天很開心地享受生活,這應(yīng)該是大多數(shù)人理想的狀態(tài)。但是人類總要養(yǎng)活自己,唯一能達到這種理想狀態(tài)的情況,就是由計算機、機器人、電腦幫我們?nèi)祟愅瓿纱蟛糠值墓ぷ?,不管是做家?wù)、交通出行、蓋房子等等。如果這個理想狀態(tài)的標(biāo)準(zhǔn)是 100 分,對比我們現(xiàn)在,可能僅僅處在 0.1 分的階段。所以怎么可能會存在純粹的失業(yè)呢?

為什么大家還要進行這樣一個討論?我只能認(rèn)為有些程序員還沒有喜歡計算機,擔(dān)心自己學(xué)不好。學(xué)習(xí)這個過程的確不容易。就像我們看一本哲學(xué)書,開始想要讀懂非常困難,但隨著人生閱歷的增長,隨著我們在生活、學(xué)習(xí)和工作中不斷驗證書中的道理,你就會體會到其中的道理,提升自己看問題的視角和解決問題的能力。所以最后,我希望大家不要害怕學(xué)習(xí),并且相信這個行業(yè)的前景,和程序員這份職業(yè)可以創(chuàng)造的價值。

網(wǎng)站欄目:每個程序員都可以懂一點 Linux
本文地址:http://www.muchs.cn/news15/99915.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、網(wǎng)站建設(shè)Google、網(wǎng)站排名、電子商務(wù)、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營