原文連結:エンジニアの次のステップへの勉強法 - Qiita
接下來會針對職涯部分,依序介紹學習方法、履歷撰寫方式、以及面試準備方向等文章。即便是從日本環境的角度撰寫,道理還是大致相通。
本篇首先介紹的是「學習方法」,技能方面較偏向後端技術,未來求職可以作為參考。
以下正文開始。
那些能夠根據指示完成工作,對不同程式語言大多能夠上手的工程師,有時會發現他們在這種環境下,反而成長停滯不前。
他們熱愛技術,也熱愛創造,卻發現自己的成長受制於環境。
在這些的環境中,將可能導致成長停滯:
- 缺乏互相討論新技術資訊的工程師
- 工作對於技術水平需求不高
- 改善週期緩慢
- 缺乏整合開發流程的人
簡而言之,這是一個能夠穩定工作,但停滯不前的職場環境。
由於業務上已經能足夠獲利,因此不需要追求更多的成長。
當然,這種生活方式也是一種選擇,如果認為這樣過也不錯,那就不需要再繼續往下閱讀。
本文將提供一些方向,給喜歡拓展技術,並且樂於創造的工程師,同時卻也對現狀感到困惑的人。
前言
以下內容,基本上是目前我所身處的環境中,經常會談論的 基礎
內容。
雖然不能說是完全理解,但這些詞彙和概念,都是經常出現在對話中的內容。
作為一名工程師,不能只是瞭解框架和追求趨勢,更需要的是強化基礎能力。
如何提升工程師的基礎能力
學習設計模式
有些以 GoF 為代表的設計模式,如多線程編程模式,函數式編程模式。不論是哪種物件導向的語言,都可以應用 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 敏捷式開發
- Scrum 開發
- XP = Extreme programming 極限開發
- Lean Software Development 精實軟體開發
- Pair programming 結對程式設計
- Mob Programming 群體程式設計
- KPT = Key Performance Indicators 關鍵績效指標
學習大數據處理
面對每天增加數十億件數據的系統,至今為止的傳統架構可能已無法應對這種情況。雖然這取決於業務需求,但瞭解大數據處理,將能夠帶來一些優勢。
多數情況下,使用 BigQuery 或 RedShift 等工具可能就已足夠,但對於 Web 應用程式伺服器來說,必須注意延遲的問題。解決延遲並實現可擴展的架構,將使系統更為突出。
此外,瞭解專門用於大規模處理的環境,如 Hadoop、HIVE、ECS、Spark 等框架,也將有所幫助。
儘管也能自行操作來驗證,但要進行大規模數據實驗仍有一定難度。因此,透過學習來改變環境,尋找能夠提供這些設備的公司,或許是提高自身工程師水平的一條近路。
通過機器學習獲取額外知識
在雲端服務中,提供能夠輕鬆使用機器學習數據的服務。
此外,還有可執行機器學習的基礎設施,這些也能夠自行建立。
視情況也會使用到 GPU 處理或 FPGA 等技術。
雖然統計和機器學習,可能不同於工程師具備的技能,但我認為這是目前流行的技術組合之一。
順帶一提,我自己本身不太會這些(>_<)。
瞭解技術以外的趨勢,尋找能發揮技術的機會
利用區塊鏈技術的虛擬貨幣,如 Bitcoin(比特幣)、Fintech(金融科技)等,以及個人化廣告技術、EC 電子商務和各種媒體的推薦引擎、搜索引擎等。
技術水平 + 商業應用,對於工程師來說,是一個充滿挑戰的環境。這有助於提升工程師的技術水平,瞭解哪些環境能夠最大化個人技術價值,對於自身成長是有必要的。
追尋新技術的五種方法
由於技術不斷在進化,光是提升基礎知識,可能還是會有不足的部分。
為了成為更強大的工程師,我們需要擴展技術的視野,以下提供一些追蹤資訊的方法。
參加研討會
研討會可能不會深入探討技術細節,通常會提供一些使用案例。
透過這個場合,能夠建立對未知領域的基本概念,有機會瞭解之前不曾聽過的知識內容。
若想要更深入瞭解,就必須自己動手操作,但參加研討會對於獲得新知識和技能來說,也是一個不錯的機會。
此外,有些研討會可能設有交流會,可以和平時不會接觸到的工程師進行交流,甚至找到轉職的機會。人脈關係是非常重要的。
在 Twitter 上關注最新資訊
一些知名人士經常會在 Twitter 上發布訊息,這些訊息通常會談論到最新技術。
因此透過關注這些 Twitter 帳戶,即可掌握最新的技術動態。每個領域都有一些知名的人,可以一點一點累積,慢慢擴大關注人數。
查看官方文文件
最新資訊通常會記錄在官方網站上。包括 AWS 的新服務、GCP 的新服務、其他框架的開發進展、ISSUE、Pull Request 的處理情況、未來的願景等等。
也許不會馬上導入這些最新服務,不確定什麼時候會需要使用,但定期查看官方文件將有助於累積知識。
此外,Google、AWS、Microsoft 等公司網站上,還提供雲架構的相關解釋,構成管理的概念說明,以及開發流程和管理方面的資訊。不僅提供有關雲服務的知識,還提供提高基本知識的文章,因此有空時也可以翻閱看看。
查看 GitHub
這部分與閱讀開源程式碼有關,但 GitHub 有個頁面能夠查看趨勢。
不一定是閱讀開源程式碼,也能透過查看星數多的專案,閱讀 README 等內容,瞭解有哪些產品正在被開發,以及掌握目前的趨勢,這將有助於提高對技術的構想與感知能力。
頻率不用很高,偶爾查看或許就會有有趣的發現。
查看 Qiita 的文章
最近的趨勢頁面,經常會出現受到大眾歡迎的文章內容,這導致探討核心且有趣的文章不容易排行在上位,但可以透過追蹤自己喜歡的作者,即可在時間軸頁面查看更新的文章。
我自己也有在 Qiita 上寫文章,建議可以試試看w
結語
我一直希望能夠為有幹勁的工程師,創造一個有利於成長的環境。
建立一個能讓有幹勁和實力的工程師,充分發揮其價值的系統。
如果有任何問題、評論或需要提供方向,歡迎隨時留言,我會進行答覆。
希望提供這些想法給願意實際執行,而非只停留在空想的人,讓他們在學習上有個方向。
此外,如果有其他方法或想法,請在評論或引用等方式分享!
15th鐵人賽目錄傳送門:https://ithelp.ithome.com.tw/users/20135558/ironman/6290