序:最近看了一篇谷歌工程師總結自己十年來所學到的軟技能,感覺說的很棒,特地翻譯成中文,希望能分享給更多的人,原文內容非常多,計劃分幾篇翻譯出來,個人的水平有限,感興趣的朋友也可以進去看英文原文。原文地址是:software-engineering-soft-parts(Addy Osmani)
正文:
前言
今天我將分享一些我在谷歌瀏覽器團隊中作為高階工程師在10年間學到的一些軟體工程“軟技能”。在我的10週年紀念日,我想反思一些一直伴隨著我的經驗。我希望這些在你的職業生涯中對你有所幫助。
在我看來,成為一名優秀的工程師就是不斷積累經驗。專案無論大小,都是一個往你的工具箱新增新技術和工具的機會。當你將在一個專案中學到的技術與在另一個專案中學到的工具配對來解決問題時,這會為你帶來更大的進步。
學習新事物
以下建議有助於大多數初級或中級開發人員向前發展,用來應對不斷變化的技術,構建複雜系統,同時遵循軟體工程正規化中的標準流程並發現新的最佳實踐。儘可能應用第一原則。學習將問題分解成更小的部分是生活中最重要的技能之一。
精通
精通意味著高效的工作
這意味著您可以分辨出能帶來價值的任務,並幫助您的團隊將精力集中在這個方向上。這也意味著您知道如何避免一些無法為團隊或者公司帶來價值的工作——最好的工程師甚至可以引導整個團隊遠離那些無意義的工作。
我經常被問到,“我怎麼知道我是否充分利用了我的時間?”。幾乎總是有一些任務可以讓你“感到”忙碌。這裡真正的訣竅是確保你在做正確的事情。如果您想移山,請專注於移動針的任務,即使這任務很小。
你可以問自己一些問題:
- 我的目標是什麼?我關注的任務是否與這些目標一致?
- 有什麼我可以做不同或更好的事情嗎?
批判性思考並提出合理的論點
批判性思維是獨立思考以做出深思熟慮的決定的能力。投資於這項技能,以提高你的思路清晰。
作為工程師,我們有時會急於立即解決問題,因此感覺就像我們正在取得進展,或者看起來我們正在對利益相關者做出響應。如果我們沒有充分考慮原因和後果,這可能會帶來風險。換句話說,批判性思維是有目的地思考並形成自己的結論。這種以目標為導向的思維可以幫助您專注於根本原因問題,從而避免未來因沒有思考造成問題的原因和後果而出現的問題。
概括地說,我喜歡根據批判性思維提出的一些問題是:
- 我們怎麼知道我們正在解決真正的問題?
- 我們怎麼知道我們正在以正確的方式解決問題?(即平衡嚴謹性和效率,考慮到我們對問題和約束的理解)
- 如果我們不知道問題的根源,我們如何確定根本原因?
- 我們如何將關鍵問題分解為可以進一步分析的更小問題?
- 一旦我們有了一個或多個假設,我們如何來評估它們?
- 如果我們受到限制(時間壓力)而又不過度損害我們圍繞問題的分析嚴謹性,我們可以採取哪些捷徑?
- 證據是否充分支援結論?
- 我們怎麼知道什麼時候能解決?什麼時候解決方案才是“足夠好”?
- 我如何向所有利益相關者清晰、合乎邏輯地傳達解決方案?
我發現這些問題通常會有所幫助。有時我們會解決問題的症狀,卻發現還會出現其他症狀。在其他時候,我們可能會很快釋出一個解決方案,但會在以後產生更多問題。從批判性思維的角度來看,我們可能會挑戰假設,仔細研究風險/收益,尋找矛盾的證據,評估可信度並尋找更多資料來建立我們做正確事情的信心。
例如,我見過工程師犯的一個常見錯誤是假設相關性意味著因果關係(即,僅僅因為兩件事相關並不一定意味著一個導致另一個)。一個批判性的思考者可能會反駁這樣的假設,問我們為什麼相信它們是正確的。
批判性思考者:
- 提出有意識的問題,清晰而準確地提出問題
- 收集和評估相關資訊,驗證他們可能如何回答問題
- 得出合理的結論和解決方案,根據相關標準和標準對其進行測試
- 在不同的思維繫統中開誠佈公地思考,根據需要識別和評估它們的假設、影響和實際後果
- 與他人有效溝通,找出複雜問題的解決方案
注意:批判性思維具有“軟技能”和“硬技能”兩個方面,因此包含在本文中。
建立強大的基礎
掌握基礎知識並反覆應用以獲取新技能。
學習基礎知識的長期價值在於它們是可轉移的。短期而言,它們可以幫助您做出更好的決策,並使程式碼更有效率。
可轉移的技能
可轉移的技能是您可以從一個專案帶到另一個專案的技能。讓我們從基本面來談談它們。
基礎知識是任何軟體工程師的根本。它們巨集觀和微觀兩層。巨集觀層是軟體工程的核心,微觀層是實現(例如技術棧、庫、框架等)。
在巨集觀層面上,您學習的程式設計概念在很大程度上可以轉移,而與語言無關。語法可能不同,但核心思想仍然相同。這包括:資料結構(陣列、物件、模組、雜湊)、演算法(搜尋、排序)、架構(設計模式、狀態管理)甚至效能優化(例如急切與惰性評估、記憶化、快取、惰性載入等)。這些是您將經常使用的概念,以至於往後瞭解到它們可能具有很大的價值。
在微觀層面上,您將學習這些概念的實現。這可能包括:您使用的語言(JavaScript、Python、Ruby 等)、您使用的框架(例如 React、Angular、Vue 等)、您使用的後端(例如 Django、Rails 等)以及技術您使用的堆疊(例如 Google App Engine、Google Cloud Platform 等)。其中涉及的細節對於獲得有效的專業知識可能很有價值,但並不總是可以轉移的。
沒有人有時間在職業生涯開始時學習所有內容。我們不應該過度索引基礎知識,要去學習實際應用程式所需的內容。這就是“邊做邊學”。
效率
掌握基礎知識可以幫助您編寫更高效的程式碼。這包括時間複雜度(執行程式碼所需的時間)、記憶體使用以及效能和可維護性之間的權衡等概念。這些想法允許您在構建任何相當大的應用程式時做出有用的權衡。速度對於現代應用程式而言通常至關重要,並且通常會以明顯的方式影響終端使用者體驗。
更好的決策
對巨集觀和微觀基本面有很好的瞭解可以幫助您做出更好的決策。
您可以利用所獲得的知識,根據任何專案的目標和限制,更好地決定使用哪些技術以及避免使用哪些技術。這可以幫助您避免為工作選擇錯誤的技術或錯誤的工具的陷阱。
“在你明白什麼時候不應該使用它之前,你還沒有掌握一個它。” -@kelseyhightower
軟體工程涉及考慮許多不同的層次——核心語言、實現、基礎設施、工具和人員。對這些層次有一個表面的瞭解,可以讓你編寫程式更快。但真正瞭解基礎知識(包括 O(n) 時間複雜度)可以幫助你走得更遠,尤其是當語言和框架的格局隨著時間而變化時。
相關閱讀:
- The value of fundamentals in Software Engineering
- Why learning the fundamentals matters
- Learn the fundamentals of a good developer mindset