[![hackmd-github-sync-badge](https://hackmd.io/Gc4cVWswTnOr5K_FCXQukg/badge)](https://hackmd.io/Gc4cVWswTnOr5K_FCXQukg) ###### tags: `2023鐵人賽` `qiita` `Learning` # [2023 15th鐵人賽] Day13 - 工程師邁向下一階段的學習方法 > 原文連結:[エンジニアの次のステップへの勉強法 - Qiita](https://qiita.com/newta/items/f4aff8cdd8706d5d08c5) 接下來會針對職涯部分,依序介紹學習方法、履歷撰寫方式、以及面試準備方向等文章。即便是從日本環境的角度撰寫,道理還是大致相通。 本篇首先介紹的是「學習方法」,技能方面較偏向後端技術,未來求職可以作為參考。 以下正文開始。 --- [toc] 那些能夠根據指示完成工作,對不同程式語言大多能夠上手的工程師,有時會發現他們在這種環境下,反而成長停滯不前。 他們熱愛技術,也熱愛創造,卻發現自己的成長受制於環境。 在這些的環境中,將可能導致成長停滯: - 缺乏互相討論新技術資訊的工程師 - 工作對於技術水平需求不高 - 改善週期緩慢 - 缺乏整合開發流程的人 簡而言之,這是一個能夠穩定工作,但停滯不前的職場環境。 由於業務上已經能足夠獲利,因此不需要追求更多的成長。 當然,這種生活方式也是一種選擇,如果認為這樣過也不錯,那就不需要再繼續往下閱讀。 本文將提供一些方向,給喜歡拓展技術,並且樂於創造的工程師,同時卻也對現狀感到困惑的人。 ## 前言 以下內容,基本上是目前我所身處的環境中,經常會談論的 `基礎` 內容。 雖然不能說是完全理解,但這些詞彙和概念,都是經常出現在對話中的內容。 作為一名工程師,不能只是瞭解框架和追求趨勢,更需要的是強化基礎能力。 ## 如何提升工程師的基礎能力 ### 學習設計模式 有些以 [GoF](https://zh.wikipedia.org/zh-tw/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E5%8F%AF%E5%A4%8D%E7%94%A8%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%BD%AF%E4%BB%B6%E7%9A%84%E5%9F%BA%E7%A1%80) 為代表的設計模式,如多線程編程模式,函數式編程模式。不論是哪種物件導向的語言,都可以應用 GoF 的設計模式。 如果是多線程編程,可以試著了解 CyclicBarrier、CountDownLatch 等。 如果是 Java,那麼參考 java.util.concurrent 套件中的實作應該會有所幫助。 如果是函數式編程,可以學習 LoanPattern 或在 Scala 中使用 mixin 的 CakePattern,以及 Monad 等。 依循這些模式的程式碼,不僅能夠實現預期功能,也能寫出更好的風格,同時提高靈活性和穩健性。 ### 理解基礎架構和網路知識 在當今的時代,即便是開發應用程式,通常也需要處理網路連線相關問題。瞭解協議的特點,以及 HTTP(瀏覽器)的規範,並優雅地完成實作。 - TCP - HTTP Protocol - DNS - Routing - Middleware 此外,還有近期不斷發展的 Immutable Infrastructure(不可變基礎設施)和虛擬化技術。 學習 docker、kubernetes 和 CloudFormation 等工具,例如錯誤監視系統、統計訊息管理等中介軟體和服務。 藉由理解這些領域的知識,將有助於提升開發速度,並加強穩健性。 一旦能構思出理想的基礎設施配置,對於建構在這之上的應用程式也會有不同的見解。 ### 閱讀開源軟體的程式碼 現今,有許多優秀的工程師選擇公開程式碼。(真是美好的時代啊⋯⋯) GitHub上許多知名框架的程式碼,也是以開源方式進行開發。 透過閱讀我們熟悉的框架程式碼,瞭解其中的機制、思維,以及程式碼風格。 如果是 Java,試著閱讀 JDK 類別的程式碼也是不錯的選擇。 和至今所寫的程式碼相比,說不定能發現更好的寫法,此外也有機會學習到,符合框架理念的類別分割方法等內容。 ### 體驗雲端環境服務 使用雲端系統以迅速啟動服務,已經變成常態。 根據不同情況,可能需要具備雲端系統相關的知識。試著瞭解有哪些可利用的服務,並實際動手使用看看吧。 由於能夠以小時為單位租借,投資知識的費用只需要數百日幣,能以相當低的成本取得新知識。 如果連這筆金額都無法投資,那對工程師自身的成長又能投注多少熱情呢? 不論哪種雲端服務, AWS、GCP 或 Azure 都可以。 如果可以,除了基本的 EC2 等伺服器實例,也可以試著使用特定功能的雲端服務。 以 AWS 為例,還有像是 CodeBuild 和 CodeDeploy 等的 CI 環境,以及 CloudFormation 等服務。並且提供了多個儲存選項。為什麼提供多個選項呢?在什麼情況下,使用這些服務能夠提升開發速度?為了成為能夠提供建議的工程師,瞭解這些知識是有必要的。 如果能夠深入瞭解,這將成為一種優勢。 在這個時代,使用雲端服務已成為常態,並且將會是工程師必備的基本知識。 ### 學習架構模式 在 GoF 等設計模式中,定義每個類別的角色,如果想實作成一個應用程式,將會在程式中產生大規模的數據流動。 - Layered Model(階層型架構) - DDD(Domain-driven design = 領域驅動模型) - Clean Architecture 整潔架構 - Cloud Architecture 雲計算架構 - Microservices Architecture 微服務架構 過去主要關注應用程式中的封裝結構,但最近開始思考伺服器以外的架構。架構是程式碼的基礎,如果基礎穩固,即使是尚未成熟的工程師,也能夠編寫易於維護的程式碼。 在建立應用程式系統的過程中,為了擁有更廣的視野,開始學習架構模式吧。 ### 學習開發流程 在公司開發,通常需要多人合作進行。 若希望能最大化開發團隊的產出,和提高個人開發能力相比,更重要的應該是改善團隊流程。雖然不是必備知識,但學習敏捷開發以及思考如何應用,將有助於提高團隊和自身的表現。 - [Agile 敏捷式開發](https://zh.wikipedia.org/wiki/%E6%95%8F%E6%8D%B7%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91) - [Scrum 開發](https://zh.wikipedia.org/wiki/Scrum) - [XP = Extreme programming 極限開發](https://zh.wikipedia.org/wiki/%E6%9E%81%E9%99%90%E7%BC%96%E7%A8%8B) - [Lean Software Development 精實軟體開發](https://zh.wikipedia.org/zh-tw/%E7%B2%BE%E7%9B%8A%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91) - [Pair programming 結對程式設計](https://zh.wikipedia.org/zh-tw/%E7%BB%93%E5%AF%B9%E7%BC%96%E7%A8%8B) - [Mob Programming 群體程式設計](https://en.wikipedia.org/wiki/Team_programming) - [KPT = Key Performance Indicators 關鍵績效指標](https://zh.wikipedia.org/zh-tw/%E9%97%9C%E9%8D%B5%E7%B8%BE%E6%95%88%E6%8C%87%E6%A8%99) ### 學習大數據處理 面對每天增加數十億件數據的系統,至今為止的傳統架構可能已無法應對這種情況。雖然這取決於業務需求,但瞭解大數據處理,將能夠帶來一些優勢。 多數情況下,使用 [BigQuery](https://zh.wikipedia.org/zh-tw/BigQuery) 或 [RedShift](https://zh.wikipedia.org/zh-tw/Amazon_Redshift) 等工具可能就已足夠,但對於 Web 應用程式伺服器來說,必須注意延遲的問題。解決延遲並實現可擴展的架構,將使系統更為突出。 此外,瞭解專門用於大規模處理的環境,如 [Hadoop](https://zh.wikipedia.org/zh-tw/Apache_Hadoop)、[HIVE](https://zh.wikipedia.org/zh-tw/Apache_Hive)、[ECS](https://zh.wikipedia.org/zh-cn/%E9%9B%B2%E7%AB%AF%E9%81%8B%E7%AE%97)、[Spark](https://zh.wikipedia.org/zh-tw/Apache_Spark) 等框架,也將有所幫助。 儘管也能自行操作來驗證,但要進行大規模數據實驗仍有一定難度。因此,透過學習來改變環境,尋找能夠提供這些設備的公司,或許是提高自身工程師水平的一條近路。 ### 通過機器學習獲取額外知識 在雲端服務中,提供能夠輕鬆使用機器學習數據的服務。 此外,還有可執行機器學習的基礎設施,這些也能夠自行建立。 視情況也會使用到 GPU 處理或 FPGA 等技術。 雖然統計和機器學習,可能不同於工程師具備的技能,但我認為這是目前流行的技術組合之一。 順帶一提,我自己本身不太會這些(>_<)。 ### 瞭解技術以外的趨勢,尋找能發揮技術的機會 利用[區塊鏈](https://zh.wikipedia.org/wiki/%E5%8C%BA%E5%9D%97%E9%93%BE)技術的虛擬貨幣,如 [Bitcoin(比特幣)](https://zh.wikipedia.org/zh-tw/%E6%AF%94%E7%89%B9%E5%B8%81)、[Fintech(金融科技)](https://zh.wikipedia.org/zh-tw/%E9%87%91%E8%9E%8D%E7%A7%91%E6%8A%80)等,以及個人化廣告技術、EC 電子商務和各種媒體的推薦引擎、搜索引擎等。 技術水平 + 商業應用,對於工程師來說,是一個充滿挑戰的環境。這有助於提升工程師的技術水平,瞭解哪些環境能夠最大化個人技術價值,對於自身成長是有必要的。 ## 追尋新技術的五種方法 由於技術不斷在進化,光是提升基礎知識,可能還是會有不足的部分。 為了成為更強大的工程師,我們需要擴展技術的視野,以下提供一些追蹤資訊的方法。 ### 參加研討會 研討會可能不會深入探討技術細節,通常會提供一些使用案例。 透過這個場合,能夠建立對未知領域的基本概念,有機會瞭解之前不曾聽過的知識內容。 若想要更深入瞭解,就必須自己動手操作,但參加研討會對於獲得新知識和技能來說,也是一個不錯的機會。 此外,有些研討會可能設有交流會,可以和平時不會接觸到的工程師進行交流,甚至找到轉職的機會。人脈關係是非常重要的。 ### 在 Twitter 上關注最新資訊 一些知名人士經常會在 Twitter 上發布訊息,這些訊息通常會談論到最新技術。 因此透過關注這些 Twitter 帳戶,即可掌握最新的技術動態。每個領域都有一些知名的人,可以一點一點累積,慢慢擴大關注人數。 ### 查看官方文文件 最新資訊通常會記錄在官方網站上。包括 AWS 的新服務、GCP 的新服務、其他框架的開發進展、ISSUE、Pull Request 的處理情況、未來的願景等等。 也許不會馬上導入這些最新服務,不確定什麼時候會需要使用,但定期查看官方文件將有助於累積知識。 此外,Google、AWS、Microsoft 等公司網站上,還提供雲架構的相關解釋,構成管理的概念說明,以及開發流程和管理方面的資訊。不僅提供有關雲服務的知識,還提供提高基本知識的文章,因此有空時也可以翻閱看看。 ### 查看 GitHub 這部分與閱讀開源程式碼有關,但 GitHub 有個頁面能夠查看趨勢。 不一定是閱讀開源程式碼,也能透過查看星數多的專案,閱讀 README 等內容,瞭解有哪些產品正在被開發,以及掌握目前的趨勢,這將有助於提高對技術的構想與感知能力。 頻率不用很高,偶爾查看或許就會有有趣的發現。 ### 查看 Qiita 的文章 最近的趨勢頁面,經常會出現受到大眾歡迎的文章內容,這導致探討核心且有趣的文章不容易排行在上位,但可以透過追蹤自己喜歡的作者,即可在時間軸頁面查看更新的文章。 我自己也有在 Qiita 上寫文章,建議可以試試看w ## 結語 我一直希望能夠為有幹勁的工程師,創造一個有利於成長的環境。 建立一個能讓有幹勁和實力的工程師,充分發揮其價值的系統。 如果有任何問題、評論或需要提供方向,歡迎隨時留言,我會進行答覆。 希望提供這些想法給願意實際執行,而非只停留在空想的人,讓他們在學習上有個方向。 此外,如果有其他方法或想法,請在評論或引用等方式分享!