如何成長爲高級工程師?

{"type":"doc","content":[{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"本文首發於:","attrs":{}},{"type":"link","attrs":{"href":"https://xingzheai.cn/details/ec8f5f5330c","title":"","type":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"行者AI","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"“形而上者謂之道,形而下者謂之器。”","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這句話是筆者在拜讀《計算機心智:操作系統之哲學原理》時看到的,結合以前師傅的教導,感觸良多。授人以魚不如授人以漁,我願和大家分享自己學習到的思維模式。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"筆者是一名勵志成爲卓越程序員的前端開發工程師,因爲不喜歡把自己限制在前端開發中,所以在這裏和大家討論如何成長爲高級工程師。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"按照德雷福斯模型,技術人員可以分爲五級:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"新手:只能按照指令一步步地走。新手沒有接觸過當前行業,所以只能按照指令一步步地走完過程。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"初級:能夠完成局部工作。只需給出局部工作的目標而非指令,初級便可達成這一目標,但初級沒有形成全局概念,不知道自己所做的內容在全局所佔據的份量有多重。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"中級:能夠完成全局工作。這一層面的技術人員對一個領域的各方面都有所瞭解。他可以在給定目標的情況下獨立完成項目,可以帶人,不會頻繁求助高級。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"高級:具備主動性,能夠根據環境糾正自己的目標和手段。高級能夠站在一箇中立的層面考慮什麼應該做,什麼不應該做,怎麼做代價最小,需要權衡付出與收益。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"專家:憑直覺工作,每擊必中要害。在長期的解決問題過程中,專家形成了豐富的經驗積累,可以快速抓住問題的關鍵點。","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可以看出,解決問題的能力是決定技術人員級別的根本。你能解決別人所不能解決的問題,你在團隊的分量自然更重。而解決問題的能力是自己在學習工作中不斷培養的,是不斷解決自己的問題,亦或是幫助別人解決問題以後,不斷覆盤、歸納總結出來的一套思維模式。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"在此之前,我想先和大家討論學習方法。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以前我剛接觸前端開發,在實驗室老師指導下,拜讀《JavaScript權威指南》,學習了Js底層知識。私認爲自己基礎不錯,開始研究當時盛行的JQuery框架,不曾想處處碰壁,強行看完一篇JQuery框架源碼系列文章之後,不僅沒感覺到任何技術提升,還讓我更加懷疑自己。也是在這個時候,認識了我的師傅,在師傅指導下,掌握了一套通用的學習方法:螺旋上升迭代學習法。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"螺旋上升迭代學習法:該方法與敏捷開發的思想有點類似:具體是通過看書系統學習理論知識並運用到開發中,在實踐中加深理論的認識,發現新的問題;再針對性地複習相關理論知識,解決發現的問題,形成一個迭代上升的循環,並且每一輪的起點都比上一輪高。在學習任何知識,尤其是在掌握面向對象思想、設計模式、重構思想、代碼設計、抽象封裝思維等抽象性的理論知識時,此種方法效果尤爲顯著。每次解決問題都需要自己主動思考,解決完問題以後會帶來巨大的成就感,以此來保持對學習的樂趣。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"具體實踐是通過寫H5小遊戲,從中提煉2D遊戲引擎。在這個過程中學習抽象思想,並通過不斷地迭代實踐,熟練掌握此學習方法。爲了更好地掌握抽象思想,《冒號課堂》我看了四遍。此後,我發現學習生活中各種技能都能夠使用此種方法做到觸類旁通,在不熟悉的領域也能比大多數人做的更好。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在這個過程中,我開始在師傅指導下使用前端類型化語言TypeScript和vim指令,尤其是vim配合vscode的快捷鍵,編程如同鋼琴演奏一般美妙。這些工具的使用改變了我的編程方式以及思考模式,拋開工具,人與人之間的差距是不大的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"多年以來,我不斷探索世界。但直到我看了《刻意練習:如何從新手到大師》這本書,才瞭解到我所掌握的學習方法原來很久以前就被人提出:刻意訓練的本質是長時工作記憶,這種能力可以通過一定的訓練進行激活,通過不斷增加難度的重複訓練,在每次訓練中收到反饋,不斷糾正自己的錯誤,不斷提升大腦的適應能力。這個訓練是歷經痛苦的過程,每次當你適應這種痛苦以後,你的能力也就得到提升。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"接着我們來聊聊計算機理論基礎的重要性。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在計算機科學裏,可以分爲兩個維度:工程和科研。“工程”中最核心的知識包括:數據結構、體系結構、架構設計;“科研”中最核心的知識包括:算法、數學基礎、快速閱讀論文的能力、將理論經過簡化後應用到工程中的能力。所謂萬變不離其宗,掌握了計算機核心的底層原理以及思想,具備了抽象設計的思維,這樣不管你學習哪種語言都能快速抓住其本質。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"彼時,我畢業進入一家創業公司,當我技術水平達到能夠獨立完成前端項目,並保證各種前端優化都已經盡善盡美的時候,我開始思考如何成爲一名合格的程序員。在看了知乎很多博主的文章以後,我啓動了補充計算機理論基礎的計劃。在創業公司的半年時間裏,我每天早上和晚上都在學習數據結構和算法,並在LeetCode上做題,只有下午才寫公司業務代碼。也正是因爲熟練使用vim指令讓我的編程速度提高了2-3倍,才能在當時的環境下完成此次計劃。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最開始的時候,我寫遞歸算法題需要一整個上午的時間,有時候理不清楚,需要在紙上寫下每一步執行結果,逐步剖析才能理解當前執行到哪一步。歷經半年,看了數據結構、算法、計算機網絡、Webkit內核、操作系統相關書籍,刷了158道題,我終是達成了目標。在經歷這次技術洗禮以後,我感覺非常踏實,思維方式得到很大改變,常常深入思考程序的更優解決方案。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"隨後我離開創業公司,和師傅一起創業。師傅對代碼有極高的追求,在他嚴格的CodeReview下,我瞭解到高級程序員的重要技能:如何寫出讓別人易讀的代碼以及如何保證你的代碼質量,可以歸爲工程化思想。通過學習《計算機程序的解釋與構造》《重構-改善既有代碼設計》和《代碼整潔之道》三本書以及和師傅不斷爭論,我們的編程風格越來越相近,每次CodeReview的重構點也從最開始的50多個逐步減少。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"現在我們來聊聊如何成長爲高級程序員。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從初級到中級過程中,我們需要掌握一套高效的學習方法,你可以學習任何一門語言,深入瞭解其運行機制,然後學習計算機理論基礎:數據結構、算法、計算機網絡、操作系統。其中,操作系統和計算機網絡不是必要的,但是學習這些知識可以讓你認識到計算機底層執行原理,開闊視野。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"從中級到高級過程中,需要看到問題和技術的本質,善於思辯、獨立思考,思維方式需要從被動完成任務轉變爲主動解決問題。前面提到,只有不斷解決問題,在解決問題的過程中彌補相關知識,尋找更好的解決方案,並不斷覆盤、總結,才能提高你解決問題的能力。所以,如果中級在主動性沒有根本性的改變,中級就會留在原地,如果有了轉變,就能夠有着越來越多的機會提升自己,進而與中級拉開距離。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"高級程序員重視工具的使用,更願意花時間去研究新的工具、新的手段讓解決問題的方式變得更加簡單,從而提高自己的生產能力。最重要的是,工具也包含了擴展思維能力的思維模式,這種思維模式讓你總是爲同一類型的問題尋找更好的解決方案。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"高級程序員不會輕視任何一個項目,每次項目都是表達自我的機會。需求不清晰,沒有關係,我可以通過溝通來將需求弄清楚,這樣可以鍛鍊溝通能力;框架有問題,沒有關係,我可以修改源碼來讓框架更適合當前項目,這樣可以鍛鍊我的源碼閱讀能力;以前老代碼很亂,沒有關係,我可以通過重構思想來簡化項目,這樣可以鍛鍊我的抽象能力;無論是用戶體驗還是代碼格式都需要做好,這纔是高級程序員表達自己的方式。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以上都只是高級程序員所應該具備的硬實力,這些年我開始學習軟實力,包括產品思維和領導能力。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"產品思維:能夠充當半個產品經理,站在產品的層面思考問題、設計程序。能夠與產品、質量部門出色的完成溝通。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"優秀的領導能力:能夠凝結團隊力量,獲得團隊的肯定與支持,確定技術方向。領導能力並不是說你一定是經理或者老闆,而是在團隊中大家認可你的技術實力以及爲人,自然而然地願意聽你指揮。","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我始終相信越努力越幸運,期待自己能夠在30歲以前進階成爲一名高級工程師。","attrs":{}}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章