1. 程式人生 > >每個程式設計師都可以「懂」一點 Linux

每個程式設計師都可以「懂」一點 Linux

提到 Linux,作為程式設計師來說一定都不陌生。但如果說到「懂」Linux,可能就沒有那麼多人有把握了。到底用 Linux 離懂 Linux 有多遠?如果決定學習 Linux,應該怎麼開始?要學到什麼程度?懂一點 Linux,對於程式設計師有什麼價值?通過馬蜂窩內容中心高階研發總監李鴻的這次內部分享,你會得到一些答案。

 

(本文根據馬蜂窩技術研發團隊內部分享整理,搜尋馬蜂窩技術公眾號,後臺回覆 「linux」獲取 PPT 全文。

大家好。我先簡單介紹一下自己,我是李鴻,目前負責馬蜂窩內容中心的技術研發和團隊管理。

接到今天這個任務的時候,我就在思考要分享什麼內容。在座的同學應該有一些工作的時間比較久,也有一些剛從學校畢業。所以今天所講的東西,如果能讓不同階段和技術背景的同學產生共鳴,讓大家改變了一些對技術的看法,甚至是產生了一點對職業規劃上的影響,我認為這次分享才有意思。

出於這些考慮,我選擇了今天的主題——每個程式設計師都可以「懂」一點 Linux。

 

主講人:李鴻

馬蜂窩旅遊網內容中心研發高階總監

(李鴻,現為馬蜂窩內容中心技術團隊負責人。擁有十餘年移動網際網路從業經驗,多年從事移動地圖 App、LBS 企業級服務和智慧交通相關產品研發。個人技術興趣聚焦在 Linux 生態,包括 Linux 核心等底層技術。)

 

Question 1  :為什麼講這個主題?

想到這個內容,也是基於我自己在技術成長上的一些感悟。

我比在座大多數同學年長几歲,大概十幾年前大學畢業。今天我在跟很多面試候選人聊的時候,我會問他們「為什麼選擇計算機專業」,大部分人給我的答案都是碰巧選了計算機,或者聽說這個專業的就業前景不錯。

當然也會有同學和我一樣,是出於喜歡。我最早接觸到計算機還是讀初中的時候,當時電腦很貴,家裡也沒有。有一次在商店裡我看到了一臺「小霸王」學習機,有人通過在鍵盤上敲一敲,就能真的在螢幕上出現一點東西,我覺得簡直太有意思了,就在當時,我知道自己以後一定會學計算機。

大學之後,基本大一大二接觸的都是 Windows。一天偶然看到一些 Linux 程式碼,從那之後我就開始自學 Linux,直到鑽研 Linux 的核心。十幾年後我再來看,還是會感嘆 Linux 世界的神奇,而且慶幸自己的選擇沒錯。

所以今天,我想分享下在學 Linux 這個過程中的一些思考:什麼才是真正的 Linux、它為什麼好、我們應該從哪裡入手開始學習,希望大家可以有所收穫。

 

Question 2 :你 「懂」Linux 嗎?

當問到是不是懂 Linux 的時候,包括我身邊的很多朋友都會說「還可以啊,我一直都在用」;也可能會說「懂一點,我聽說過 Linus 這個人」,等等。但至少我認為,如果你只是在說以下這些,真的不叫「懂」Linux:

 

 

 

那什麼才叫「懂」Linux ?如果把這件事講透,我認為核心要解決的就是三個「W」——What,Why,How。 

What:一些同學在開始投入某個技術領域的時候,可能基礎比較薄弱,會很辛苦地學習。學了一段時間以後自己覺得學到了好多東西,但其實很多人並沒有學到這個方向的關鍵、核心和本質。比如我遇到過很多做大資料分析的人,說到 Hadoop、Spark,相關的單詞可以說不少,但問到「Spark 和 Hadoop 有什麼本質的區別」,「Spark 對資料的界定有什麼本質的不一樣」這些問題的時候,還是說不上來。

每個程式設計師的時間和精力是很寶貴的。在我們整個職業生涯中,可能用十年、二十年去學透一、兩個東西已經很不容易了。如果決定花時間去學習某個技術之前,一定要想清楚學的是什麼,千萬不要學偏了,甚至都沒走在自己規劃的職業方向上。

Why:為什麼學?是出於興趣愛好?是對實施架構很重要?是會影響你的職業規劃?是這項技術將來會有很好的市場收益?……不管你的答案是什麼,自己要比較清晰。

有一些同學技術學得很雜,問哪個都說比較熟。但問他哪個技術他比較有研究,是他比較資深的,好像又都沒有。這就是他沒想清楚「Why」,也就想不清楚自己的重心要放在哪裡。

How:前兩個問題解決完,就應該去思考「How」。到底應該怎麼學,才能學得越來越好。

今天我們是圍繞 Linux 在解決這三個 W,換成任何別的技術,其實都有相通之處。最近 7、8 年我面試過不下 500 個 Java 研發,幾乎每次我都會問「能不能用七八個概念說說你對 Java 的認識,或者你為什麼喜歡 Java」,很少有候選人人能真的把這個問題說清楚。

所以我建議各位同學,以後再投入一項技術的學習之前,都先從以上三個 W 去審視一下,看你是不是真的清楚要學的是什麼,為什麼學,怎麼才能學好。

(1)使用軟體

最裡面的圓代表的就是一個最小的視野,它對應的是使用者擁有的視野。因為作為軟體的使用人員,使用者是不會去關心背後的開發原理、邏輯實現的,使用者只關心這個軟體是不是好用。

(2)開發軟體

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

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

 

圖:宋美齡宮

(來源於網路)

 

你會發現,站的高度不一樣,你的視角就會不一樣。同樣的道理,研發同學之所以理解和使用軟體更快,就是因為與使用者相比站的角度更高,看的範圍更廣,我們知道軟體設計背後的原理,以及它的互動邏輯,就會很快上手。

(3)開發框架和庫

如果大家去聽一個前端的講座,為什麼當介紹到講師是某個框架的作者時,我們就會覺得這個分享很厲害?

絕大部分研發,可能 80%~90% 甚至 95% 的同學都是處在「開發軟體」這個層面的,我們使用各種現存的框架、開發庫去實現業務邏輯。

但是一定有少部分研發關注的是更外圍的事情,去做一些開發框架、開發庫的實現。這一層的研發需要的能力確實要更強,因為他要思考整個框架怎麼拆分模組,怎麼樣去適應介面讓程式設計師用更好地用起來等等,所以要考慮得更深、更廣,挑戰也更多。

細心的同學可能注意到了我在「開發軟體」與「開發框架和庫」中間畫了一條紅線。我想表達什麼意思是,軟體研發同學會做出一些很棒的軟體,是因為你有這樣的能力,也是因為大家頭上是戴上了一頂那些開發框架和庫的同學給的安全帽的。比如 Java 開發會考慮記憶體的管理和回收,但這個機制其實是做 Java 開發環境的人幫你做了考慮,幫你提供了應對問題的策略,可以讓你更「安全」地做事情。

(4)作業系統

再往下看,所有的開發庫和開發框架,都是放在一個作業系統上的,與之對應的這一層的研發人員考慮的東西會更加複雜,因為他們要提供的是最基礎的環境,是上層實現的基石。

(5)硬體、規範、協議

大家看到再往下我畫了一個骷髏,也就是說這一層是真正厲害的人,他們做的是硬體、規範和協議,比如說指令系統,我們說的複雜指令系統和簡潔指令系統這兩個大的指令系統的陣營,在二三十年的時間裡都一直在為自己的陣營 PK,目的是為了討論出更適合軟體發展的規範。再比如發明 TCP/IP 協議的人,他們最初在一片混沌的狀態下,居然能夠提出 TCP/IP 的概念,讓我們現在可以非常簡單地去做通訊。所以達到這一層的人,我們已經稱為天才了。

(6)數學

再往下就是數學。我認為計算機回到最後一定是數學,比如說在大學我們都要學習的離散數學、統計學、正規化、邏輯學、圖靈機等等。數學是對整個計算機體系提升一個最基礎的支撐。

所以通過這個圖形我們還可以看到,研發同學如果要持續地成長,是絕對存在路徑的。我覺得有兩個角度是大家可以思考,一是你在專注的方向持續地積累,形成自己的競爭壁壘;同時你可以嘗試走入下一個更大的層面,看一看是不是會你的視野,對服務的一些思考,對解決問題的能力都帶來一些幫助。

2. 構建高效的工作和學習環境

學習 Linux 另外一個非常有用的地方就是「效率」的提升。研發同學每天都要和作業系統打交道,在上面做大量的工作和學習,不管是寫程式碼、看文件、自動跑一些任務、做一些搜尋、寫一些東西等等。如果懂一點 Linux,懂它的設計哲學,你能更好掌握怎麼去用 Linux 更高效。

不誇張地說,如果你真的能夠成為一個 Linux 的 Hacker,我認為你的工作和學習效率提升十倍以上是沒問題的。我自己就會用 VIM 的話來解決幾乎所有問題。

 

 

搞技術做工程,如果思想越高、越巨集觀、越系統,能達到的能力就會越強。懂一點 Linux,首先就是為我們提供這樣一種提升視角的方法,幫我們站在一個更外圍的角度思考每天的工作和專攻的技術,它們背後是什麼樣的實現原理和設計思想,它處在怎樣的一個體系中,獲得了怎樣的支撐。 

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

既然自動化是最本質的,我們就應該反思在自己的工作和學習中,是不是用到了自動化的思想,你是不是還可以忍受機械、繁瑣、低效地處理問題?現在的方式是不是應該改進?通過去學 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 seamlessly

把工具無縫地拼接起來。

Plain text preferred

這一點也是我非常喜歡的,就是能用 Text 一定要用 Text。Text 是一種人可以讀,機器也可以處理的內容,可以解決好多問題。我們一般說 Plain Text 是指英文。比如說大家寫註釋要用英文寫,它帶來的好處是,我們可以通過指令碼自動化分析各種 Comment,誰的 Comment 寫得多,誰的單詞拼錯了,誰的 Comment 中包含非常重要的資訊,需要重點去跟蹤等等。

CLI, not GUI

提倡用命令列,不要用圖形化介面。因為命令列可以非常高效進行人機對話,圖形化介面對程式設計師來說是非常低效的。如果做一次更改,我們更希望通過敲鍵盤的方式來快速告訴計算機應該做什麼。

Provide the mechanism, not the policy

這點我建議大家背下來,就是如果你做一個好的大型框架,應該去提供機制,而不是提供策略。也就是要提供創造更多可能性的能力,不要把需要適應到特殊場景下的定製化的內容寫死在程式碼裡。所有的軟體在這種設計上這點是非常相通的,好的軟體一定是為大家提供更多的靈活性和適用場景。

2. 學習 Linux 的三個層次

以上的設計哲學都非常重要。那麼知道了這些,該怎麼學 Linux 呢?大家不要在一開始學的時候就一定要去學核心,或者想要全都懂,於是就認為 Linux 很難。關於「懂」Linux 的階段,我簡單分成了三個層次:

 

 

第一個層次就是 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 年的努力去沉澱、去積累的,要持續地參與到社群當中。

(8)最後一個就是持之以恆,去融入到你的工作、學習和生活當中。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

提到 Linux,作為程式設計師來說一定都不陌生。但如果說到「懂」Linux,可能就沒有那麼多人有把握了。到底用 Linux 離懂 Linux 有多遠?如果決定學習 Linux,應該怎麼開始?要學到什麼程度?懂一點 Linux,對於程式設計師有什麼價值?通過馬蜂窩內容中心高階研發總監李鴻的這次內部分享,你會

Java程式設計師需要反射

前言 只有光頭才能變強。 文字已收錄至我的GitHub精選文章,歡迎Star:https://github.com/ZhongFuCheng3y/3y 今天來簡單寫一下Java的反射。本來沒打算寫反射這個知識點的,只是不少的讀者都問過我:“你的知識點好像缺了反射阿。能不能補一下?” 這週末也有點空

每個程式設計師應當瞭解的11句話

1.技術只是解決問題的選擇,而不是解決問題的根本 我們可以因為掌握了最新的JavaScript框架ahem、Angular的IoC容器技術或者某些程式語言甚至作業系統而歡欣雀躍,但是這些東西並不是作為程式設計師的我們用來解決問題的根本——它們只是用於幫助我們解決問題的簡單工具。 我們必須非常謹慎

為什麼程式設計師應該大資料技術?另送一大波學習資料!

總有一些人、一些公司能改變世界、引領世界。   07年蘋果釋出iphone、08年穀歌釋出android。將人類社會帶入了移動網際網路時代。   十年間,移動網際網路風起雲湧,徹底改變了人們的生活方式,同時催生了一批知名企業。   可以說是蘋果、

[轉]國外程式設計師推薦:每個程式設計師應該讀的非程式設計書

五年前有網友在 Stackoverflow 發帖提問:『程式設計師應該讀哪些非程式設計方面的書?』。有很多程式設計師響應,他們在推薦的同時也寫下了自己的評語。本文摘編其中 29 本書,下面就按照各書的推薦數排列。另外,本月初我們在伯樂頭條也發起了相同的討論帖《你最喜歡的非程式設計書是哪一本?》,已有很多的朋友

程式猿養生方法(每個程式設計師應該看一看)

前言 程式設計師職業生涯中,健康問題尤為突出。隨著時間的流逝,夢想可能漸漸暗淡,激情可能慢慢消退,但是,有一點卻很肯定,我們的身體大不如前,視力下降,慢性腸胃炎,頸椎病,失眠,神經衰弱,此類慢性疾病接踵而來。 身體是自己的,也是一輩子的事情,人的自我恢復能力並不是很強;所以我向來不建議為了事業,而犧牲身體。

學習C語言的教材、如何成為一名優秀的C程式設計師、激發程式設計師創意的6本書、國外程式設計師推薦:每個程式設計師應讀的書

學習C語言的教材 我的C語言是自學的,這些年看過不少教材。 下面,我對其中一些教材做個點評。 1. How to Think Like a Computer Scientist: C version 這是我讀過最易懂的C語言教材。 雖然它只講

Java 程式設計師的 Java8 HashMap

HashMap 一直是非常常用的資料結構,也是面試中十分常問到的集合型別,今天就來說說 HashMap。 但是為什麼要專門說明是 Java8 的 HashMap 呢?我們都知道,Java8 有很多大的變化和改動,如函數語言程式設計等,而 HashMap 也有了一個比較大的變化。 先了解一下

國外程式設計師推薦:每個程式設計師應該讀的非程式設計書

【伯樂線上導讀】:五年前有網友在 Stackoverflow 發帖提問:『程式設計師應該讀哪些非程式設計方面的書?』。有很多程式設計師響應,他們在推薦的同時也寫下了自己的評語。本文摘編其中 29 本書,下面就按照各書的推薦數排列。另外,本月初我們在伯樂頭條也發起了相

小黃鴨除錯法,每個程式設計師要知道的

花了一下午(或一天)在試圖解決某個 Bug,後來才知道解決方案很簡單,當時就是沒有想到。 有個同事正好路過,看到你愁眉苦臉的,問你“怎麼了呀?” “噢,是這樣的。我遇到了一個問題,點選這個控制元件的時……” 當你正準備和同事詳細解釋的時候,突然靈光一現,你話都沒說完

國外程式設計師推薦:每個程式設計師應讀的書

【更新】:近日(2012年8月17日)重看 StackOverflow 的原討論帖,發現於今年年初被關閉了。不過有人做了彙總,把其他回覆中提到的書籍,放在投票數最高的回覆中。新更新新增 59 本書,詳情可見文章後半部分。 編者按:2008年8月4日,StackOve

每個程式設計師應該具備的除錯能力。

首先,除錯是⼀個程式設計師最基本的技能,其重要性甚⾄超過學習⼀門語⾔。不會除錯的程式設計師就意味著他即使會⼀門語⾔,卻不能編制出任何好的軟體。 VC/VS除錯快捷鍵: F9 //設定斷點和取消斷點 F10 //開始除錯//單步執⾏ F11 //進⼊

每個程式設計師應該知道的 15 個最佳 PHP 庫

1. PChart PChart是一個令人印象深刻的PHP庫,可以以一種視覺化圖表的形式生成文字資料。資料可以展示為柱狀圖,餅狀圖,以及其他格式。使用SQL查詢可以幫助PHP指令碼建立令人驚歎的圖表和圖形。 2. PHP CAPTCHA PHP CAPTCHA是另一個偉

【Spring】每個程式設計師使用Spring(四)——Aop+自定義註解做日誌攔截

一、前言       上一篇部落格向大家介紹了Aop的概念,對切面=切點+通知 、連線點、織入、目標物件、代理(jdk動態代理和CGLIB代理)有所瞭解了。理論很強,實用就在這篇部落格介紹。       這篇部落格中,小編向大家介紹springAop很常見的

每個程式設計師應該學習使用Python或Ruby(選Python)

每個程式設計師都應該學習使用Python或Ruby 如果你是個學生,你應該會C,C++和Java。還會一些VB,或C#/.NET。多少你還可能開發過一些Web網頁,你知道一些HTML,CSS和JavaScript知識。總體上說,我們很難發現會有學生顯露出掌握超出這幾種語言範

每個程式設計師應該瞭解的記憶體知識(二)

http://web.itivy.com/article-347-1.html 接下來的章節會涉及更多的有關訪問DRAM儲存器的實際操作的細節。我們不會提到更多有關訪問SRAM的具體內容,它通常是直接定址。這裡是由於速度和有限的SRAM儲存器的尺寸。SRAM現在應用在

十大程式語言之父——每個程式設計師應該記住!

Dennis Ritchie(丹尼斯•裡奇)被世人尊稱為“無形之王的C語言之父”、“偉大的UNIX之父”,開創了計算機網路技術的先河,為喬布斯等IT巨匠提供肩膀的巨人。1978年與布萊恩•科爾尼幹(BrianW Kernighan)一起出版了名著《C程式設計語言》,被翻譯為多種語言,是C語

為什麼每個程式設計師應該學習使用命令列

大學畢業以後我就成了一名JAVA程式設計師,在之後的很長一段時間裡,我每天上班的流程基本都是一樣的: 早上來到公司 -> 開啟電腦(啟動Windows) -> 開啟Eclipse(我是一名JAVA程式設計師) -> 寫一天程式碼(期間我通過IDE整合的Tomcat伺服器來除錯我的應用

不是每個程式設計師是適合創業,即使你工作了十年

前天晚上看吉日老師的部落格,讓我突然找到生命的動力了,熬夜看到3點左右(哥哥我一向都是十點鐘睡覺的),最近有看到園子裡一個關於程式設計師創業的文章,不免要淺談一下自己的一點想法,歡迎各位拍磚,但是是請看完再拍,謝謝。 正文 為什麼要創業? 原因: 1.給人打工只能解決溫飽問

每個程式設計師應該瞭解的 CPU 快取記憶體 英文原文:Memory part 2: CPU caches

現在的CPU比25年前要精密得多了。在那個年代,CPU的頻率與記憶體匯流排的頻率基本在同一層面上。記憶體的訪問速度僅比暫存器慢那麼一點點。但是,這一局面在上世紀90年代被打破了。CPU的頻率大大提升,但記憶體匯流排的頻率與記憶體晶片的效能卻沒有得到成比例的提升。並不是因為