Louis Better than before

代碼之外的生存指南 I

書單

Soft Skills: The software developer’s life manual 這本書在Amazon 網路書店中獲得5顆星好評,作者在本書講述軟體開發人員程式碼以外,所經歷許多不同的旅程,將自身學到的和經歷過的經驗分享出來。幫助身為軟體開發人員的讀者們,在漫長人生旅途中,不至於迷失方向。關於此書:

“Soft Skills: The software developer’s life manual is a guide to a well-rounded, satisfying life as a technology professional. In it, developer and life coach John Sonmez offers advice to developers on important “soft” subjects like career and productivity, personal finance and investing, and even fitness and relationships. Arranged as a collection of 71 short chapters, this fun-to-read book invites you to dip in wherever you like. A Taking Action section at the end of each chapter shows you how to get quick results. Soft Skills will help make you a better programmer, a more valuable employee, and a happier, healthier person.”

紀錄與心得

其實很早之前有朋友就推薦這本書,但是因為工作和日常生活瑣事忙碌,一直斷斷續續沒有讀完,直到這個月才將這本書大略看完。這本書涉及的內容算蠻廣泛,涉略職業、人際交往能力、學習、生產力、理財、健身及愛情與戀愛。結合工作中累積的經驗或經歷,對於某些章節的概念能與之共鳴。以下就大略紀錄認同的章節內容吧!

章節概要

章節

  1. 思考未來
  2. 人際交往能力
  3. 破解面試之道
  4. 攀登晉升階梯
  5. 成為專業人士
  6. 學習怎樣學習:如何自我教育

思考未來

軟件開發人員需要為自己的職業生涯設定目標,因為沒有明確的方向,你走的每一步都是徒勞的。不要隨心所欲地生活,不要隨遇而安行走在職業生涯的漫長道路上。起步階段最簡單的就是在心中樹立一個大目標,然後再建立及制定通往大目標的小目標。較小的目標可以讓你航行在自己的軌道上,激勵自己保持航向更大的目標前進。

Note:

  • 把你的大目標寫在自己每天的必經之地,每日三省吾身-我在追求什麼。

人際交往能力

作為一個軟件開發人員的工作就是與人打交道。當你和別人打交道的時候,你應該知道的最重要的一個概念就是:以自己為核心,每個人都希望自己很重要。這是人類最深邃、最致命的慾望之一,也是社會和生活中取得偉大成就的主要動機。請謹記一個準則,一但你貶低他人,削弱他們的成就感,在某種程度上就如同切斷他們的氧氣補給,獲得的回饋完全是抓狂和絕望。

破解面試之道

某種程度上,面試不可預設,無法確切知道自己會被問什麼問題。許多技術過硬的開發人員都在競爭同一個工作崗位時,決定勝負的最大因素已經不再是技術能力。簡而言之,通過面試最快捷的方式是讓面試官對你懷有好感。

一般而言,大量工作崗位來自個人推薦。如果是被他人推薦去面試,因為有推薦人的社會公信力做背書,面試官自然而然地高看你一眼。推薦人的聲譽及他與面試官的交情,有一部分就延伸到了作為應聘者你的身上。當進入面試環節,面試官早就對你有所偏愛,因為你是由他們喜歡和信任的人推薦來的。

無論如何,你都需要了解在面試時自己該做什麼,以及需要從技術能力上證明可以通過技術面試。接下來要關注的事情是展示自己的能力,面試的時候要集中精神證明自己就是無需督促也能自動自發做好事情的員工,以及證明技術上你確實勝任工作。如果能說服面試官相信不會被困難阻擋,那麼他們不僅會喜歡你,而且更有可能會錄用你。

進行行為面試環節,基本上面試官手上拿著應聘者的簡歷,因此自我介紹不用花很多時間,用30秒到1分鐘的時間介紹自己主要學習、工作經歷即可,要突出介紹自己完成的工作及取得的成績。如果面試官對你的某一段經歷或參與的某一項目很感興趣,會有針對性地提幾個問題詳細了解,建議採用STAR模型(situatuin, task, action, result)描述自己經歷的每一項目。面試的過程中,要展示敏捷的思維能力和追求完美的激情,不妨在第一時間告訴面試最直觀的算法,至少會覺得思維比較敏捷,但也不能輕言放棄,而要表現出積極思考的態度,努力從不同的角度去思考問題。

進行專業面試過程中,越是簡單的題目,面試官總會格外關注邊界條件、特殊輸入等看似細枝末節但實質至關重要的地方,以考察應聘者是否注重代碼質量。有些時候會有意出一些比較複雜的問題,通常面試官不期待應聘者能在面試不到一小時的時間裡給出完整的答案,更看重的可能還是應聘者是否能否在短時間內形成清晰的思路並解決問題。通常不喜歡應聘者在還沒有形成清晰思路之前就草率地開始寫代碼,這樣寫出來的代碼容易邏輯混亂、錯誤百出。另外,技術面試的面試官一般都是程式員,通常只認一個理:題目作對、做完整了,就讓你通過面試;否則失敗。

通常寫代碼的時候都會遇到問題,當應聘者運行代碼發現結果不對的表現,也是面試官關注的重點,因為應聘者此時的反應、採取的措施都能體現出他的調適功底。如果熟練地設置斷點、單步追蹤、查看內存、分析調用線,能很快發現問題的根源並最終解決問題,那麼面試官將會覺得他的開發經驗很豐富。除了展示自己的編程能力和技術功底之外,還需要展示自己的軟技能,面試官會觀察應聘者在介紹項目經驗或算法思路時是否觀點明確、邏輯清晰,並以此判斷其溝通能力的強弱。另外,面試官也會從應聘者說話的神態和語氣來判斷是否有團隊合作的意識。通常不會喜歡高傲或者輕視合作者的人。

此外,因為IT行業知識更新很快,因此程序員只有具備很好的學習能力才能跟上知識更替的步伐,所以通常面試官也會考核應聘者的學習能力,第一種方式是詢問應聘者最近在看什麼書,從中學到哪些新技術。第二種方式是拋出一個新概念,接下來會觀察能不能較短時間內理解這個新概念並經由提問、思考、再提問的過程,最終找出解決相關的問題。還有不少面試官喜歡考核應聘者的抽象建模能力和發散思維能力,評測能不能把問題抽象出來用合理的數據結構表示。

最後進行應聘者提問環節,不妨為每一輪面試準備2~3個問題,通常面試官讓應聘者問幾個問題,主要是想了解他最關心的問題有哪些。推薦問的問題是與招聘的職位或者項目相關的問題,例如:問一些關於時間、空間效率的問題,這能夠體現一個應聘者較好的編程素質與能力。

Note:

  • 如果剛下崗位,現在就需要找到一份工作,最好儘早與面試官建立聯繫,盡最大可能做好如下工作:面試之前得到預面試的機會,在坐下來進行真正的面試之前請求跟面試官見面,談談公司狀況,或者問一些問題。所以最好還是有備而來,不要走捷徑。
  • 通過面試只是邁過一個門檻而不是目的,真正的較量是在入職後的成長。就像學釣魚,你可能在有經驗的垂釣者指導下能釣到幾條魚,但如果沒有學到垂釣的真諦,離開了指導者你可能就很難釣到很多魚。
  • 回答為什麼跳槽這類的問題,不要抱怨,也不要流露出負面的情緒,通常負面情緒能夠傳染的。通常給出的答案是現在的工作做了一段時間,已經沒有太多的激情,因此希望尋找一份更有挑戰的工作,然後具體論述為什麼有些厭倦現在的職位,以及面試的職位為何有興趣。
  • 面試被拒有很多可能,比如面試官認為你性格不適合、態度不夠誠懇等。
  • 幫助自己形成清晰的思路方法:首先是舉幾個簡單的具體例子讓自己理解問題,其次可以試著用圖形表示抽象的數據結構。
  • 通常越是簡單的問題,期望在不需要提示的情況下,除了完成基本功能之外,還要考慮到邊界條件(最大的正整數和最小的負整數以及溢出)、錯誤處理以及特殊輸入(NULL Pointer或空字串等)等各方面,完整地解決問題。

攀登晉升階梯

在任何公司內能讓你脫穎而出的最重要法寶就是承擔更多的責任,而金錢總是追隨著責任。有任何機會去承擔更多責任時,就試著承擔起來。但是,假如沒有被賦予更多責任,有時候不得不去主動尋找機會,去負責一項任務,或是牽頭一個項目。只要深入挖掘,總能找到一些被忽視的業務領域去發揮自己的聰明才智。沒人願意涉足的領域是搜尋機會最好的地方。可能有一個沒人願意碰的遺留應用,或是代碼庫裡的某個特別令人討厭的模塊。正因為沒人願意碰,所以你也無需去搶,這些就成為你日益強大的帝國領地。如果你能把沼澤變成良田,也就能展現自己的價值。

另一種間接承擔責任的方式是成為團隊中其他人的導師,自願幫助新人加速成長,為任何有需要的人提供幫助。通過介入和解決別人的問題,不僅可以學到更多自己專業之外的知識,而且隨著時間的推移,你還能在團隊中逐步樹立及時雨的名稱。最終,這樣的聲譽可能會令你成為團隊領導或者其他管理職位,只要你願意走這條路。還有另外一種方法,就是不斷增加自己的技能和知識,制定一份下一年的自學計畫,嚴肅對待自己的職業生涯。

此外,值得一提的是在任何公司中,最有用的就是那種看似沒有克服不了障礙的人,要勇於執行這些解決方案已獲得成果的人,成為這種人是獲得晉升的可靠方式。

成為專業人士

習慣是成為專業人士的必不可少的部分,需要培養自己的專業習慣以及時間管理技能。專業人士每天必須要做什麼工作,並且能估算出每項工作大約要花多長時間。

另外,專業人士也必須不斷改善和提高自己的工作品質,但隨著時間的推移,也需要持之以恆堅持下去及持續穩定,終究會達到設定的標準。但避免陷入當無法達到標準時,就降低標準,一旦你越過底線,選擇妥協,就很難再回頭,那麼你最終會不經意間在其他領域也降低標準。

別忘了,發揮自己的長處,當然可以改善弱點,但最好了解自己的強項是什麼並且充分發揮自己的優勢。專業人是對自己的能力和弱點有著良好、精準而又客觀的自我評估。致力於持續不斷地完善自己的技能,學習更多專業相關的技巧,不要沾沾自喜,永遠對努力成為更好的自己心存渴望。

Note: 了解、熟悉和精通的區別

  • 了解:對某一個技術只是上過課或者看過書,但沒有做過實際的項目。通常不建議在簡歷中列出只是膚淺的了解一點技能,除非這項技術應徵的職位的確需要。
  • 熟悉:在實際項目中使用某一項技術已經有較長的時間,通過查閱相關的文檔可以獨力解決大部分的問題。對已經工作過的,在項目開發過程中所用到的技能,也可以用熟悉。
  • 精通:在項目開發過程中,當同學或同事向我們請教這個領域的問題,我們都有信心也有能力解決,這個時候我們就可以說自己精通這項技術。所以應聘者不要試圖在簡歷中把自己修飾成高人而輕易使用精通。

學習怎樣學習:如何自我教育

學習知識最好的方式就是立即將其用於實踐,發揮自己心靈深處的好奇心,通過玩耍的心態,加速學習的步伐。關於快速學習的十步學習法如下:

  • 了解全局 - 粗略瀏覽內容,但不要在這一步花費太多時間
  • 確定範圍 - 集中精力去明確自己到底要學什麼,並且決定學習的重點和學習的範圍。避免在學習過程中,試圖解決太大的問題而把自己搞得不堪重負
  • 定義目標 - 好的成功標準應該是具體、無二義性,不要對自己想完成的任務進行含糊不清的描述
  • 尋找資源 - 嘗試收集到多種多樣的資源以幫助學習,而不是只讀一本關於這一主題的書
  • 創建學習計畫 - 可藉由觀察別人如何將內容分解為相同的模塊和順序,遵循這樣的方法制定學習計畫
  • 篩選資源 - 挑選最有價值的幾項資源來協助達成自己的目標
  • 循環反覆 - 循環反覆學習計畫所定義的各個模塊,透過學習、實踐、掌握及教授的方式領會知識
  • 開始學習,淺嚐輒止 - 專注於掌握自己所需的學習內容以及動手操作所需的最小知識量,避免消化學習計畫中列出的所有資源
  • 動手操作,邊玩邊學 - 親自操作和親身體驗,透過探索和實踐進行學習。操作過程中,產生的各種問題,將會引導走向真正重要的方向
  • 全面掌握,學以致用 - 藉由尋找操作中產生各種問題的答案,驅動學習的動力,進行深入學習
  • 樂為人師、融會貫通 - 將自己所學到的知識介紹或指導他人,有助於讓理解能力更上一層樓

其中,對於教授知識的途徑可透過下列幾種方式實踐:

  • 轉寫部落格文章
  • 創建Youtube視頻教程
  • 發表演講

Note:

  • 知識遷移能力是一種特殊的學習能力。如果我們能把已經掌握的知識遷移到其他領域,那麼學習新技術或者解決新問題就會變得容易。

=========== To be continued…. ==========

總結

個人認為這本書前半部所闡述程式碼以外的經歷,都是值得學習以及和內化吸收的,提升自己的軟技能。期許在漫長的職涯旅程,也可以遵循此指引,避免陷入迷失的方向,並且積極思考自己的職業生涯,豐富自己的生活,讓自己更接近成功。

Reference

[1] Soft Skills: The software developer’s life manual

[2] 劍指Offer:名企面試官精講典型編程題

Feel free to leave the comments below or email to me. Any pieces of advice are always welcome. :)