《程式設計師的自我修養》-讀書筆記

4Ark發表於2019-01-03

前言

最近在看《程式設計師的自我修養》,作者陳逸鶴,這是一本值得深讀的書。前半冊較詳細的介紹了一個程式設計師成長所需要經歷和學習的內容,從工作、溝通、生活協調等方面給出了不同建議,其中也介紹了一些有用的網站和工具,

而後半冊則是關於作者自學設計的經歷以及如何教導孩子學習程式設計,對於我這樣的年輕程式設計師可能暫時沒多大興趣,最後只能匆匆看完,或許以後會有機會再來翻閱一下。

然而即便是前半冊,給我的感觸也是很大的,同時也該慶幸在我步入社會前能讀到一本這麼好的書,在此對作者表示由衷的感謝。

如果你是一個職場新人、或像我一樣準備步入社會工作的話,那麼我推薦你去讀一下這本書,這會給你帶來很大的幫助。

下面我將總結一下書中對我影響較大的部分內容以及我個人的感想。

大綱

  • 第一章 談職業生涯
    • 一、寫給年輕程式設計師的啟示
    • 二、那些程式設計師後知後覺的職涯經驗
    • 三、如果招到一個靠譜的程式設計師
    • 四、每個程式設計師都應該瞭解的一件事
    • 五、程式設計師的煩惱
    • 六、提給年輕程式設計師的職涯建議
  • 第二章 談實踐與認知
    • 一、突破程式設計師思維
    • 十、我似乎理解了程式設計的意義
  • 第三章 談個人發展
    • 一、那些優秀程式設計師身上的共同特質
    • 六、建立自己的個人品牌

正文

第一章 談職業生涯

一、寫給年輕程式設計師的啟示

  1. 正確認識自己

    在網上形容程式設計師的詞彙有很多,其中大部分都略帶貶義,然而不管別人如何稱呼你,最重要的是你內心如何形容自己,如果連自己都將自己當成一個碼農,那你可能就真的是一個碼農。這裡作者說到他更喜歡用技匠來形容自己,因為程式設計師應該是那些不斷追求更高技術,並有著自己的產品夢想的工匠。一個程式設計師,應該有自己的目標,自己的期待,並通過不斷地努力去實現那些夢想。

  2. 比一般人努力

    這裡作者講述了一個故事:一個普通人每天都很努力,而另一個天才卻整天不務正業,過了一段時間,天才終於醒悟並開始努力,不久便超越了普通人,普通人很羨慕他,但他回過頭才發現,他也已經成為了大部分人眼中的佼佼者。

    程式設計師往往會被稱為天才,那只是因為在你看不到的時候人家花了更多時間工作或者學習而已,當你也堅持這麼做時,你也會變得和他們一樣優秀。

  3. 適時建立個人權威

    當你開始抱怨自己的職業生涯毫無起色時,不妨想想你是否已經習慣了聽命於人,而缺少自己的觀點和主觀,久而久之便成為了別人眼中的平庸之人。你應該在適當的時機表現自己,讓別人看到你的不同之處。

  4. 遵循最佳實踐

    無論新興技術如何發展,技術的本質是不變的,你應該去理解那些軟體領域最本質的東西,比如最佳實踐,那些最佳實踐是無數優秀程式設計師通過大量實踐總結出來的,通過理解它們,能夠讓你站在前人的肩膀之上,從而對軟體開發本身有更深入的理解和認識。

  5. 保持好奇心並樂於探索新的事物

    優秀的程式設計師往往不會滿足於對手頭工作的認識和理解,他們會去理解更深入的東西,也樂於探索那些看似於工作無關的技術,通過對其他事物的學習,也能對你目前的工作有所幫助。

  6. 拋開程式碼與人溝通

    不要忽視與人的溝通,當你的能力不斷提升,被賦予更多職責時,你更需要與人溝通來管理好自己的團隊,所以嘗試離開你的電腦桌去與人溝通,這會給你的工作和生活帶來積極的變化。

  7. 要為優秀的人工作

    當你發現你所處的環境和周圍的人已經無法讓你獲得提升時,那麼你應該去選擇一個更好的環境,儘可能與那些優秀的人一起工作。

  8. 生活、睡眠、旅行

    我們時常聽到關於程式設計師因疲勞過度而猝死的新聞,這從側面說明程式設計師不懂得生活。每個程式設計師都應該明白,工作、技術、寫程式碼這些並不是你存在的意義,而生活才是,你需要懂得生活,並且學會生活。

    生活:你需要合理規劃自己的時間分配(學習、閱讀、寫程式碼)並持之以恆地去做。

    睡眠:不要熬夜,充足的睡眠會使你更有效率地投入到新一天的工作,你也會變得更優創造力。

    旅行:旅行不是為了輕鬆,往往旅行比工作還累,但你還是應該出去走走,去感受新的東西,而這些是無法從電腦螢幕前獲得的。

    人生不應該只有工作,還應該去感受更多更美好的東西,有一個愛好,有一項堅持的事情。

  9. 相信自己的天賦和創造力

    每個人都有屬於自己的天賦和創造力,但它們絕不是與生俱來,你需要在生活中不斷地培養和發掘它們,比如閱讀優秀的書籍、記錄和收集、嘗試動手。

二、那些程式設計師後知後覺的職涯經驗

  1. 你的薪酬與工作量無關

    你的薪酬其實取決於很多因素,技術能力、經驗資歷、工作量等,但最本質的卻是,你對公司是否重要,簡單說就是你是否具有不可替代性。所以努力讓自己變得越來越重要,相信你的薪資也會隨之提升的。

  2. 儘可能持續做一件事

    總是跟隨新興技術或框架,那你很難在某一項技術上達到理想的深度,同樣,在一個公司裡,如果你總是更換專案,那你也很難提升自己的價值,也不會具有不可替代性。所以你應該追求技術深度和具有完整專案經驗。

  3. 唯一不變的就是變化本身

    總所周知,我們使用的技術更新迭代很快。那麼我們該如何去應對這些變化呢?你需要培養自己持續學習的能力,當你學的越多,往往就能學的越快,因為知識之間總是存在關聯性的。

  4. 你的聲譽很重要

    優秀的程式設計師除了一些常見的良好特徵之外,最重要的一點就是嚴謹。嚴謹的程式設計師會非常認真地對待分配自己的任務,這能大大減少工作中的出錯率,從而給團隊或公司中的其他人留下良好的印象。

  5. 理解溝通的意義

    接到任務時不要著急幹活,而應該去儘可能多地與客戶溝通,去理解他們真正希望解決的問題,如果我們是這方面的專家,應該有負責去引導他們接受我們更專業的方案或設計

  6. 你的右腦將是你成功的關鍵

    一個成功的技術人員,除了寫程式碼外,往往還會伴隨著其他方面的能力,如編寫文件、演講、說服他人等等,這將成為你與其他水平相當的競爭對手脫穎而出的關鍵。

  7. 不要輕易說簡單或不可能

    不要輕易做出過於絕對的判斷,應儘可能去使用科學方法進行有效的表達,這樣你提出的觀點才能讓大家感到信服。

  8. 你不應該總是單打獨鬥

    不要總是單打獨鬥,要學會在團隊中協作,並儘可能讓優秀的人圍繞在你身邊,這將擴充套件你的能力範圍,讓你變得更加強大。

  9. 你的能力顯而易見

    程式設計師的能力來自大量的編碼實踐,以及持續學習的能力和勤于思考的習慣。任何自作聰明,不懂裝懂,以及投機取巧在明眼人看來都只會是東施效顰,顯得如此微不足道。

三、如何招到一個靠譜的程式設計師

  1. 簡歷看人

    閱讀簡歷永遠是面試的第一步,你的簡歷中不應該包含錯別字、文字不通或沒有邏輯性,因為如果一個程式設計師連自己的簡歷都不願意去仔細檢查並完善的話,很難想象他寫出來的程式碼質量會如何。然後你需要用簡練的文字去描述自己,優秀的程式設計師往往善於歸納,並能夠一針見血地發現問題或把一個問題說清楚。

  2. 給面試者10分鐘介紹自己最擅長的

    這樣做的好處在於,可以很快地發現面試者的亮點,他能否有效地進行溝通,是否適合這個團隊。

  3. 基礎打牢了嗎

    有經驗的面試官往往能夠通過幾個最簡單的技術問題,判斷出面試者的技術基礎是否牢固,這不是為了證明他有多優秀,而是是用來判斷他是否是一個合格的程式設計師。

  4. 技術的深度夠了嗎

    具備牢固的技術技術,一般可以滿足專案中普通程式設計師的要求了,但如果你需要找的是一個資深的程式設計師,那麼你還需要對面試者的技術深度進行考察。

  5. 選擇適合所在企業文化的人

    一個常見的誤區是,總是希望能為團隊招到技術能力最強的人,而忽略了他是否與整個公司和團隊的文化相匹配。這往往會造成不久後因為理念不同而不歡而散的結果。因此,在招聘程式設計師時,選擇合適的往往比選擇最優秀的更重要。

  6. 行為面試法

    一個程式設計師是否能夠很好地工作,不僅取決於他能否順利完成開發任務,更重要的是在遇到一些特殊場景或問題時,他能否合理有效地處理和解決。因為程式設計師除了技術能力外,最應該具備的就是較強的獨立解決問題的能力。

  7. 給他們一個虛擬任務

    給面試者一個虛擬的任務,你能夠看到很多細節,比如,面試者是否有良好的編碼習慣,異常處理是否規範,程式碼邏輯是否縝密高效,以及他的開發效率是否足夠高。

四、每個程式設計師都應該瞭解的一件事

  1. 讀與技術無關的書

    例如讀一些,歷史、經濟、人文、藝術類的書籍,它們都能夠幫助你豐富自己的知識和思想,使你變得更加全面和完善。

  2. 會寫文件

    當程式碼實現了它的功能之後,就很少有人會再去看它。但文件被閱讀的概率就會大很多,優秀的文件能夠讓人們對你產生信任和好感,相反,質量差的文件則會使你的聲譽受損。

  3. 學會包裝

    包裝並不是一件壞事,通過包裝自己可以非常有效的自我營銷,包裝之前我們需要知道什麼是優秀的,然後精心製作。

  4. 嘗試多講

    程式設計師的性格特點大多是內斂含蓄的,在一些正式的場合他們會顯得對自己缺乏信心,這需要通過平時多鍛鍊來克服,比如可以在一些不那麼重要的會議上去有意識地鍛鍊講話,另外你還需要注意你講的意思一定與你內心所想表達的是一致的。

  5. 建立社會化聯絡

    一個完全封閉的程式設計師一定不是一個優秀的程式設計師。優秀的程式設計師往往願意並善於與他人交流,分享自己的經驗和想法,並在交流中獲得有益的東西。

五、程式設計師的煩惱

  1. 是否還應該留在一線城市

    對於這個問題,我是無法給出正確答案的。買房本身並不會給你帶來持久的快樂,因為當你買完房後,你會欠一大筆債,需要用幾十年才能還清;當你終於把欠款還清時,你又會覺得這套房子太小,已經不夠一家人住,需要換一套更大的房子。你不會得到快樂,因為這些客觀條件(錢財、房子)總是無法與你的主觀期望相符。相反地,如果買房能夠給你的家庭帶來更穩定的生活,為孩子提供更好的成長環境,而這一切都能為你的生活賦予意義,並讓你感到更加快樂的話,那你還是應該更堅定地留下,而非選擇離開。

  2. 小公司做的事情太繁雜

    在小型公司工作經常需要處理各種各樣與開發無關的事情,這讓他們無法專心專研技術。然而你卻可以從中獲得溝通能力、管理能力、建立更廣的人脈、建立影響力,況且小事雜事更能體現你的能力,想站得越高,越需要具備解決各種繁雜問題的能力。

  3. 創業公司中的危機感

    如果你所在的創業公司長時間沒有起色的時候,你可能會想著換一份工作,但參與創業的過程對你來說仍會是一份寶貴的經歷,是你應該加倍珍惜的,無論成功與否,經歷一次完整的創業都會讓你受益匪淺,你將學到很多在大公司僅僅做一顆螺絲釘所學不到的東西。

  4. 技術單一,想學習更多

    程式設計師很應該去涉獵不通的技術甚至領域,但前提是你必須首先在某一門技術中扎得很深,技術是需要深耕的,深入學習一門主流的開發技術,並不斷提升程式設計思維,比對很多技術棧都淺嘗輒止要好很多,甚至當你學好一門技術後再去學習其他技術後你會發現會變得容易許多,因為它們之間往往都是相通的。

  5. 我想自學程式設計,應該學習哪一門語言

    每一種程式語言都有它特定的目標和應用場景,你應該要有一個方向並選擇適合的程式語言,但如果你真的沒有任何思路,只是希望你學的這門程式語言能夠有用,那麼我推薦你學習JavaScript,因為它看起來是唯一可能在未來所有領域內得到應用的程式語言,從我們的移動裝置,到傳統的Web應用,再到服務端開發甚至硬體程式設計,它幾乎無處不在。

  6. 大專學歷,能進大公司嗎?

    目前所有大公司都以全日制本科學歷作為最低要求,所以學歷上的缺失缺失會成為你進入大公司的障礙。但也有一些例外情況:

    • 通過內部員工的推薦。
    • 通過外包公司進入後,再轉為內部員工。
    • 努力成為某一領域的專家,或者建立個人影響力。
  7. 非計算機專業學生,未來想從事軟體開發

    事實上,非計算機相關專業的學生很難與科班出生的應屆生競爭,你應該慎重考慮自己是否真的有興趣從事這一行業,而不是隻是單純為了高薪,因為沒有足夠的興趣你將很難學好程式設計,而如果你已認清自己的方向,那麼你應該努力學好一門程式語言,然後儘可能地做出一些實際的專案。

  8. 總是熬夜,睡眠不足

    不要熬夜,通過犧牲睡眠來獲得一兩個小時的時間,到頭來只會是惡性迴圈,得不償失。合理安排時間,提升效率,保證有充足的睡眠,這將更有效率地投入到第二天的工作中。

六、提給年輕程式設計師的職涯建議

  1. 儘早確定你想做的事情

    那些成功的人,往往是有著堅定目標,並持續努力的人。

  2. 10000小時定律

    無論你在哪個領域,只要能堅持為同一目標持續不斷地努力,花費超過10000小時進行練習和鑽研,那麼你也一定能夠成為該領域的傑出人才,併成為他人眼中的異類。

  3. 提高工作效率

    對於提高工作效率,有兩個建議:嘗試不斷加快自己的工作節奏,善於尋找或創造可以提高你工作效率(也可以是減少重複工作)的工具。

  4. 簡明的溝通方式

    嘗試使用更簡明的溝通方式,這不僅能使自己的工作更清晰,也能顯著提高你與他人的溝通效率。

  5. PKSS與持續學習

    PKSS也就是說在業餘的時間進行比拼,如果你把每天的碎片時間拿來進行學習,持續一段時間,你將比大多數人優秀。

  6. 學會情緒控制

    如果提高自己的情緒控制能力,一個簡單的方法就是對事不對人。當你對某一件事非常氣憤時,首先,你需要問問自己發火有沒有用,如果答案是否定的,那麼為什麼不靜下心來想想怎樣去解決問題呢?其次,你需要換位思考,你會發現很多時候對方不是故意為難你,而是也有他的考量和存在的現實問題。

  7. 讓最優秀的人圍繞在你身邊

    世界上大多優秀的作品,都是由很多非常優秀的人共同創造的,所以你需要和優秀的人結伴,他們能夠指出你的錯誤,幫助你朝著正確的方向前進。

  8. 善於歸納和表達

    很多情況需要你去彙報或發表,這時歸納與表達能力將顯得非常重要,如果你不善言辭,你可以創造機會來進行訓練,比如每天模擬進行一次講演,經過一段時間,你會驚訝於自己所取得的突破。

  9. 掌握英語

    英語能力對於程式設計師來說非常重要,所以你非常應該學習英語(這也是本人的痛點)。

第二章 談實踐與認知

一、突破程式設計師思維

  1. 什麼是程式設計師思維

    程式設計師思維是一種常人的思維+程式設計思維,在長期相互作用下產生的一種思維模式。它能夠幫助程式設計師快速找到以程式方式解決現實問題的最優解。

    對於有助於提升程式設計師思維的幾點建議:

    • 長期不間斷地程式設計實踐。
    • 持續學習與借鑑(參考)。
    • 學會反思,並像專家一樣思考。
  2. 為什麼要突破程式設計師思維

    既然程式設計師思維對我們如此重要,那麼我們為什麼要突破它呢?有以下一些原因:

    • 新一代程式設計師不僅需要具備很強的程式設計能力,還需具備從設計、運營、測試等各種不同角度去進行分析和判斷的能力。
    • 當你從程式設計師轉變為高階程式設計師、架構師等更高的職位時,需要你突破程式設計師思維,從更加人性化的角度去識別和解決問題。
    • 突破程式設計師思維對你的生活也有幫助,多數程式設計師隨著程式設計時間的增加,他們會變得不善與人溝通、甚至排斥與人交流,這使他們無法扮演好自己在生活中的角色。

    程式設計師思維是一把雙刃劍,它既能幫助程式設計師寫出優秀的程式碼,也能會阻礙程式設計師們的發展,成為進階路上過不去的一道坎。

  3. 如何突破程式設計師思維

    突破程式設計師的幾種方法:

    • 透過技術發現問題的本質:

      思考問題出現的原因,採用真正能解決問題的手段,而不是一味使用技術解決。

    • 像專家一樣給出意見:

      溝通需求時,去理解使用者所提出需求背後的真正原因,並像專家一樣給出最優方案。

    • 雜學並從中獲得不同的視角:

      要做到以上兩點其實並不簡單,這不僅需要你具備極強的技術功底,更需要你對問題所涉及的相關領域有足夠的認識。你必須通過大量地學習程式設計之外的各種知識來完善自己的知識體系,並從中獲得不同的視角。

    • 找回創造力:

      不可否認的是,目前的開發工作需要我們的創造力的情況並不多了,但我們仍需要創造力。關於如果找回創造力,有很多方法,關鍵在於你是否願意堅持那樣去做,比如:每天閱讀、記錄下那些轉瞬即逝的想法。

十、我似乎理解了程式設計的意義

  1. 程式設計是一項技能

    在初學時,我們熱愛程式設計技術,我們需要不斷程式設計去提升技術,此時,程式設計的意義在於技術本身。

  2. 程式設計是去解決問題

    在工作時,需要利用程式設計去解決一些問題,此時,程式設計的意義就不再侷限於技術本身,而成了解決問題的理想工具。

  3. 程式設計是在表達,也是在創作

    在進階時,彷彿感受不到那些技術上的牽絆,開始自如地運用程式設計來實現那些你認為優秀的東西,此時,你是在通過程式設計進行著自我表達與創作。

  4. 程式設計是為了留下痕跡

    在退休時,可能你以前寫的優秀程式碼現在還執行在世界上的某個系統,支撐著一些人日常生活使用的工具。這些優秀程式碼是你留下的痕跡。

第三章 談個人發展

一、那些優秀程式設計師身上的共同特質

  1. 至少深入理解一門程式語言

    優秀的程式設計師不僅熟練的掌握一門程式語言的語法和語義,他們還會:

    • 掌握這門語言的使用哲學:包括最佳實踐、設計模式以及它們背後所蘊含的原則。
    • 深入理解語言的特性:充分了解這些特性,能夠幫助程式設計師更準確、高效地使用它們。
    • 瞭解語言的侷限:瞭解這些侷限,並知道如何使用一些方法或技巧去繞過這些限制並解決問題。
    • 理解語言的缺陷:瞭解這些缺陷,並儘可能在程式設計中避免涉及這些缺陷,會讓你的程式在日後更易於維護。
    • 瞭解語言的未來:瞭解語言的發展未來,才能讓你更有信心地去應對未來。
  2. 看上去有點傻

    這因為程式設計師有點“傻”——知道自己不夠強大,反而能使他們變得更加強大,他們一般:

    • 不會停止學習的腳步
    • 使得他們在工作中變得更加嚴謹
    • 幫助他們獲得更好的想法
  3. 他們都是現實主義者

    那些成熟的程式設計師更加現實,他們關注於如何高效地解決問題,並在此基礎上給使用者帶來好的感受。

    • 懂得平衡:他們理解時間、人力資源有限,所以他們會選擇最簡明有效的方法去實現需求或解決問題。
    • 完成即是價值:與其進行飄無虛渺的設想,倒不如嘗試用較小的代價先實現出某一個功能或產品,然後通過實際使用去證明它,繼而在反覆的迭代中不斷完善。
    • 尊重流程:他們尊重這些流程,但在某些時候他們也會對流程中阻礙自己效率的部分做適當的裁剪。
    • 都很現實:這使得他們在不同的環境、團隊、專案中都能快速獲得成功。
  4. 從自己的失敗中學習

    如果你希望變得更加優秀,那你必須具備直面失敗的勇氣,並學會從每一次失敗中獲得進步。

  5. 很懶卻很高效

    優秀的程式設計師非常珍視自己的時間,他們會利用一切手段提高效率,主要體現在:

    • 熟練操作鍵盤
    • 熟練使用各種開發工具
    • 善於使用或發明工具
  6. 善於發現並改造輪子

    • 善於搜尋
    • 善於提問
  7. 並行工作,有效利用時間

    優秀的程式設計師能將所有的可支配的時間碎片化,利用這些時間片段,他們閱讀、學習、開發、做個人專案。他們並不比任何人有更多的時間,他們只是更會利用時間。

  8. 具備不錯的軟技能

    優秀的程式設計師往往具備:

    • 一定的語言表達能力
    • 學會聆聽
    • 有足夠的信心成為一個領導者
    • 指導他人的能力
    • 持續學習的能力
    • 謙遜的態度
    • 尊重每一個人
    • 敢於承擔責任

六、建立自己的個人品

  1. 如何建立個人品牌
    • 起一個好名字:提高你的標示性。
    • 打造一個個人網站:能方便的找到你。
    • 寫技術部落格:能讓更多人認識你。
    • 開源自己的業餘專案:獲得追隨者。
    • 參與知名的開源專案:在將關領域成為專家,提升個人品牌。
    • 參與更多線下活動:可以認識更多技術大牛、行業專家。

後記

讀一本好書,能讓你激起很多共鳴。讀一個知識閱歷比你豐富的人寫的書,能讓你少走很多彎路。

注:此文為原創文章,如需轉載,請註明出處。

相關文章