對優秀程式設計師的思考

慶亮的部落格發表於2016-05-07

關於技術人員知識體系的思考

PS:網上已經有很多類似的文章,但我依然要再造一次“輪子”,因為多少有些不同的心得。

人生總有目標和追求

不管是誰,活著總是有方向和追求的,差別可能是有些人“高尚”一些,有些人“低俗”一些,有些人對自己的方向沒有那麼堅定、今天定了明天可能就變了。 無論是短期或長期、高尚或低俗的目標或追求,都無關對錯,只是個體的選擇。(恩,我也不知道自己說了什麼)

優秀的程式設計師應該有什麼特徵

特徵 說明
興趣 也可以說好奇,保持對計算機相關領域的興趣甚至是激動,這是一個程式設計師的原動力
方法 優秀的人有一半是因為有好的方法或者好的習慣,如何學習、反思、總結、歸納
邏輯 不是程式設計師邏輯,而是理性邏輯
極致 優秀是“對比”之後才能體現出來的,追求極致才能更好,才可能優秀
耐性 無論學習什麼,都是一個過程,熬不住的自然看不到下一個山峰,通常專家至少需要2年
迎難 優秀說明你做到了多數人做不到的事情,所以難題才能證明和驗證你自己
視野 站得高看得遠、站得高窺全域性,可怕的不是你不會,而是你連不會什麼都不知道
謙虛 不論如何強大,總有更強大;即使你最強大,變化也會讓你不再強大;多學多看多聽多思考
實踐 理論和實踐會幫助你強化興趣、記憶、理解、掌握

興趣

興趣是原動力

興趣是一個程式設計師進步的原動力,促使你不斷學習、不斷積累、不斷進步;
興趣可以讓你更大可能的打破環境約束,去嘗試自己喜愛的技術方向;
興趣可以讓你在遇到困難時有更強的戰鬥力,提升突破難題的可能性;
興趣可以讓你抵禦各種誘惑,保持對技術的專注;
興趣可以自然而然的讓你追求把事情做的更好;

培養興趣

培養興趣最簡單的做法是“獎勵”,當你完成一個看起來有難度的事情時,大腦會獎勵你:“哇塞,我好厲害”;當你完成一個工作上的難題時,老大會表揚你:“哇塞,你好厲害!”。

簡單的來說,興趣培養可以通過不斷的自我認可和外部認可來達成。 為了避免培養過程中你被打敗,應當儘量去選擇做一些“超出你能力一些、但是努力是可以達成、短期內可以看到成果”的任務。

以學習Erlang為例(把下面的內容當做清單寫下來,每做完一個打一個勾):

期間不做任何無關緊要的事情,例如看電影、KTV、同學一起去聚餐

  • 3天內看完語法
  • 1天內搭建好環境
  • 1天把前面1和2的事情寫個部落格公佈出去,記得:不要複製貼上,字要自己打,圖要自己截
  • 3天的時間學習HTML+JS+Ajax,然後寫個簡單的Todo網頁應用介面
  • 1天的時間學會使用cowboy或者mochiweb,作為webserver使用
  • 2天的時間完成 HTML+Erlang的Todo應用的前後端
  • 2天時間把3、4、5、6的事情發表到部落格上去
  • 3天時間學習PhoneGap引擎的基本使用
  • 2天時間修改你的web頁面以適應PhoneGap,然後打包為Android/iOS應用
  • 2天購買一個vps(大概幾百塊一年)並配置好Erlang執行環境
  • 將你的應用安裝到自己的手機上、傳送給同學,根據反饋做修改

方法

  • 善用搜尋引擎,google必須保證隨時可用
  • 學會找到優質的資訊來源:微訊號、微博號、知乎精華帖、部落格、郵件列表、github
  • 不斷逼迫自己做的更好
  • 隨時記錄筆記,推薦:印象筆記
  • 不斷實踐
  • 多做總結和思考(按天、周、月、年)
  • 做好知識管理(KM)
  • 十五分鐘工作法和兩小時工作法
  • 看二手資訊,但是不要過於信任二手資訊

邏輯

邏輯大概是指人們思考問題的過程和方式,而程式設計師思維經常被當做貶義詞,因為多數情況下程式設計師思考問題像個計算機,並把這種思考模式帶到了生活當中。

然而我接觸到的大多數優秀程式設計師都並非如此,他們邏輯清晰、條理分明、表達順暢,也許他們的詞語不見的華麗,但是基本都是易於理解。

優秀程式設計師並不僅僅要求有很強的數理邏輯能力,也要有很好的生活、溝通邏輯能力,很多人先天性的認為程式設計師就不應該是善於溝通的,不太明白為何有這樣的看法(也許是因為某些天才程式設計師很孤僻?然而天才孤僻很正常,不管是不是程式設計師)。

至於誰是優秀程式設計師,這裡不敢隨便列舉,免得被扔磚還引發別人誤傷。大概的標準有:

  • 多數並不熱衷各種會議,更加偏愛純技術會議
  • 在各自的領域都非常有建樹,看得見的成果
  • 知識廣博不狹隘,不會是某某語言粉這樣
  • 寫出來或者講出來的東西不會停留在入門階段,往往乾貨可以讓一個團隊或者公司消化很久

極致

計算機是個可量化的學科,因此我們容易知道一件事情做的如何:差、一般、較好、優秀。

對於程式設計師來說,極致大約可以包括四大方面:

以下大量反問,預警!

程式碼開發效率

  1. 庫和框架熟悉嗎?讀過並掌握對應的原始碼嗎?
  2. 介面設計合理嗎?
  3. 自動化程度如何?
  4. 語言熟悉程度如何?是否掌握語言的各種高階特性?
  5. 複雜到看不出問題還是簡單到明顯沒有問題?
  6. 熟悉git嗎?熟悉svn嗎?他們的原理如何?最佳實踐呢?

程式碼執行效率

  • 統計過CPU/GPU/磁碟IO/網路IO/記憶體的消耗嗎?
  • 一次磁碟IO耗時多少?
  • 玩家更新一次資訊,背後發生了什麼?
  • 一次system call通常耗時多久?
  • GC時發生了什麼?可控嗎?

團隊協作效率

  • 瞭解團隊中的協作節點在哪來?如何提升協作點的效率?
  • 團隊的研發管理方式如何?有何利弊?
  • 我們真的需要這麼多人嗎?

全域性把控程度

  • 整個產品是如何開發、測試、釋出、更新的?
  • 整個產品用到了哪些技術棧? 哪些是你掌握的?

這麼多反問,其實不太友好。

程式設計師應該想辦法保證自己所做的每一件事情都至少是“較好”的,而不僅僅是“剛剛好”。

耐性

中國社會由於種種問題,相對於西方已開發國家來說社會整體比較浮躁、急於求成。無論一個人有多麼的天才,總是需要一個積累的過程。

你得知道,越是希望獲得越是要學會忍耐,快往往意味著犧牲了質量(可以一定程度克服)。

沒有多少人是年輕有為的,這個價值觀本身也不見得是對的和好的,年輕人應該奮勇激進,但是不應該追求儘早的“學有所成”。

慢即是快,簡單即複雜,簡單即強大!

迎難

人們對於困難的事情會有本能的畏懼,但是我們依然需要去克服困難。有段大概是這樣的觀點:

人類有很多生理本能,造就了很多不好的習慣,例如遲到、拖延、貪吃、貪睡、貪玩、不愛學習;
學習、減肥等對人類來說是個偽需求—因為“逆本能”,然而能夠克服這些“生理本能”的影響的人往往都是優秀的人

要想優秀,保持迎難而上的心態!

視野

“站在巨人的肩膀上”,不僅僅告訴我們應該去繼承前人,更加重要的是這樣可以看得更遠、看得更多,站的高不一定格局高,站的低則往往格局低。

設想一下:假設你回頭15年前,但是你的記憶都保留(彩票號碼當然你得忘記掉),你對這15年的規劃是否會更加合理?

學科通常都是成體系的,對一個學科要認識的更深,沒有好的辦法,只有認識的更全面才可以。

對於程式設計師的學習內容,我有幾個建議(可能這需要花5年、8年、10年或者更多):

1. 至少一門靜態程式語言,一門動態程式語言,一門函式性語言

2. 會web程式設計、app程式設計

3. 會大資料相關的技術:儲存、挖掘、分析

4. 掌握基礎:計算機體系結構、作業系統原理、資料結構與演算法、編譯原理、計算機網路、資料庫原理

關於程式設計師的資訊來源,也有幾個建議:

1. 看看綜合資訊類的技術網站,現在有各種聚合技術媒體,例如:開發者頭條、碼農週刊、推酷等

2. 看看國內外先進技術的關鍵字,然後搜尋關鍵字去了解新的動向

3. 關注一些社群,例如github、各種郵件列表等

合理的花一些時間,保持大致計算機軟體技術相關的內容心裡有數即可。

並非鼓勵程式設計師都變為全棧,全棧並不先天優於非全棧,而是鼓勵去看的更多、看的更廣,閱歷對任何工種都是重要的,只是閱歷的內容有所不同而已。

謙虛

謙虛直接影響了一個人接收外界資訊的能力,嬰兒學習能力強大的原因之一在於:不做判斷,統統都接收了。 謙虛程度就像一張濾網,可能會過濾不對的東西,也可能會過濾很多其實很好的東西。

謙虛到什麼程度? 不要謙卑就好。 謙虛也可以自信,不要自負就好。

實踐

其實這只是變為優秀程式設計師的一個步驟而已,根據我的觀察,多數人學習程式設計時死在了這個山頭。

實踐是一種快速驗證學習內容、強化學習結果的方式,大腦很複雜很難搞明白它的所有,不過我們至少知道:做過的事情大腦會更加記憶深刻

最後

有人說,怎麼沒有提到數學、英語、人際什麼的,這些並非不重要,如果具備了上面的特徵,這些都應該是水到渠成的(方法和結果不要混淆了)。

歡迎給我建議:  )

相關文章