# 後端工程師學習路線圖 (Part 1) ## 前言 之前有在分享過一些技能學習和找工作的建議,但發現自己沒有寫太多關於技術方面的內容,所以決定記錄和分享自己從零開始學習的路線圖。 ## 主線 主線這裡會寫比較核心的技術。支線一起寫的話會很長所以決定分開。 ### IDE 寫程式用的編輯器,有些會比較多功能。我一開始是用 Sublime Text,之後就一直用 VS Code 到現在。有些 IDE 會特別針對某個語言設計,個人覺得 VS Code 比較泛用。 > [name=某朋友] VS Code is all you need. ~~嚴格來說只要可以文字編輯的都可以,曾經看過有人用 Word 寫 Python。~~ ~~啊我找到連結了 https://youtu.be/X34ZmkeZDos~~ ### 程式語言 找工作看過要求的後端語言有 Python、C#、Java、PHP、Rust 和 Golang 等等等等等非常多,體感比較多職缺的大概是 C#、Java、PHP 和 Python。 如果是完全沒有寫過程式建議從 Python 入門培養程式邏輯。語法本身比較接近英語,大概會長下面那個樣子。 ```python= if tired: drink_coffee() else: continue_coding() # 翻譯成白話就是如果累了就喝咖啡,否則就繼續寫程式。 ``` Java 會啰嗦一點。 ```java= if (tired) { drinkCoffee(); } else { continueCoding(); } ``` 有了程式邏輯,學其他語言也會比較好上手。先學 Python 會養成忽略資料形態的壞習慣,不過學其他語言時適應一下就好。 學習方式建議買書或課程,我學 Python 幾乎都是自己摸索以致於很多基本的內容我寫了很長時間的程式才知道。 基本語法學到差不多了就可以開始做一些小作品。後面會再給一些個人作品的例子。 再補充一些課程好像不會特別教的事情。程式語言會有自己或共通的 coding style,像 Python 有 PEP 8 建議變數名字怎麼寫、縮排、參數順序等等。一般上不會影響程式的正確性但會影響程式的可讀性。 給個 PEP 8 建議的變數命名例子: ```python= lower_case_with_underscores lowercasewithoutunderscores # 這就不建議,看了會很傷眼。 ``` 可以參考:[PEP 8](https://peps.python.org/pep-0008/#descriptive-naming-styles) Coding style 也不需要特別學,多看其他人的程式就可以體會到了,但一開始建議變數名字要取得有意義,只放 x 和 y 會比較難懂。還有等號前後記得空格。~~不空格的都是邪魔外道。~~ > [name=某學長] 程式是寫給人看的,如果是寫給電腦看的話,那大家就寫 binary 的 machine code 就好啊。 ### Git Git 是一個版本控制的工具,簡單來說就是幫你做歷史記錄的感覺。除了記錄之外也可以當做備份。應該沒有軟體工程師不會用到。 初學者大概知道 add、commit 和 push 就差不多了,可以稍微知道怎麼復原成某個版本。branch 相關的操作等和其他人合作前再學也不遲。 大概在開始做第二第三個作品時可以開始用,但如果很有自信的話在第一個作品也可以開始用。 另外,Git 和 GitHub 是不一樣的東西。GitHub 是類似雲端備份這樣的服務,給個類比就是電腦本地端資料夾和 Google Drive,本地端和雲端各有一份的感覺。Git 可以提供本地端和雲端備份相關操作。另一個也很常用的雲端服務是 GitLab。兩者應該是差不多就看個人喜好,個人習慣 GitHub,某學長因為不希望自己寫的程式被微軟拿去訓練模型所以會用 GitLab。 ### 資料庫 核心應該都是 SQL,我是從 MySQL 開始學,但也只是知道一些基本語法,如果只是做簡單的作品應該是足夠了。 之前面試被考各種 SQL 的問題,包含資料庫一些設計原則和原理之類的。~~然後隔天被光速拒絕~~。也是建議買書或課程,自學可能會不知道自己不知道什麼。 買課程的話要注意課程會教什麼。我買過一個課程只教了語法,個人覺得不太夠,但應該適合初學者。 後期作品做得差不多了,可以挑一種 NoSQL 的語言來學,有些公司會用 MongoDB 和 PostgreSQL 等等 NoSQL 語言。 ### 網路服務相關 我沒有學過很扎實的網路服務,大概知道什麼是 client/server、他們之間是用 http request 溝通、request 裡面的資料會是 json 格式。曾經用下面這些關鍵字去找資料: * backend server * http request * API/endpoint * Restful API 之前工作處理過 json 格式所以沒有特別搜尋,另外可以查一查 server 是如何驗證用戶名字和密碼的。 也是建議買書或課程,但不確定有沒有專門教這些的課程。 之前面試被問什麼是 Restful API,我說 client 和 server 間溝通的一種 API,裡面有一些格式要遵循。然後就被建議面試結束後去 google 一下。 ## 個人作品 撇開修課需要的,作品類型可以分為單純練手感和實際會用到的類型。兩者各有優缺點。 前者可以直接讓你學到未來工作可能會用到的技術。但除非有人在使用,否則要完整地驗證程式正確性會比較困難。 後者是有人實際會使用,用的時候會知道這軟體應該要長什麼樣,缺點是不一定會和未來工作有關係。 我的作品都是以前者為出發點。後者是某次面試的時候面試官建議的。他說自己有個朋友轉職時寫了一個 app 來記錄自己看過的漫畫進度,這 app 很廢但至少他知道這 app 應該要有什麼功能。 有些公司似乎會比較希望是前者那樣的經驗,只能說每家公司在意的點不太一樣。 我的作品基本就用到上面的技能,但在開始寫會員系統 server 之前,在修課和工作時都有在寫程式,大概累積有三年時間了,所以有些基礎可能沒特別提到,如果有問題或建議也歡迎討論。以下是我做過和朋友寫的的一些作品題目,歡迎參考。 ### 手寫數字辨識 這是之前修課寫的,用的是 Python,資料集是 MNIST,方法是 Singular value decomposition (SVD)。不過當初剛學 Python,也不是很懂 SVD,但寫出來蠻有趣的。 現在手寫數字辨識大概都直接 CNN 之類了吧?不過這需要一點 ML/DL 基礎。 好像很多 Python 課都會教爬蟲,自己沒上過不是很理解為什麼教這個,希望有人可以解惑。 ### terminal-based big two card game 自學 Java 想要了解 OOP 的概念時寫的,大概會是下面這樣: ```shell= Enter player 1 names: Alice // user input Enter player 2 names: Bob Enter player 3 names: Carol Enter player 4 names: Dave Dealing cards... New round begins. Next turn: Alice 0 1 2 3 4 5 6 7 8 9 10 11 12 C[3] D[3] C[4] H[5] S[5] H[7] H[10] S[10] H[J] C[K] D[K] S[K] H[A] 0 // user input Player Alice plays a single C[3]. Next turn: Carol 0 1 2 3 4 5 6 7 8 9 10 11 12 H[4] D[5] D[6] S[6] S[7] C[8] S[9] C[J] S[J] D[Q] C[A] D[A] S[A] -1 // user input Player Carol passes. ... ``` 流程大致上是: 1. 玩家們輸入名字。 2. 程式發牌。 3. 每回合公告當前玩家名字,顯示玩家手牌,等待玩家出牌。 4. 玩家出牌或跳過,程式判斷玩法是否合法,合法就下一個玩家,否則持續等待玩家直到玩法為合法為止。 5. 重複步驟 3 和 4 直到出現贏家。 用其他語言應該也做得到一樣的事情。想要練一點前端可以想辦法去接前端,我是不太會設計所以就長這樣。 ### 會員系統伺服器 這是為了直接學 Spring 才寫的,大致上就只是開 API 讓前端去接。功能上有新增賬號、用戶登入、用戶資料 CRUD 和密碼重設的功能。 有做 Unit test 和 Integration test,蠻多公司會在意這些。 Spring 要學的東西蠻多的,可能不太適合初學者,我是看了官方的線上課程,之後就一直看技術文件、 source code 和一點點的 chatGPT 才寫出來的。chatGPT是用免費版,特別寫是因為 Spring 不久前有大改,免費版的chatGPT 根本寫不出新的東西。但換來的是學到很多扎實內容。 ### 遊戲公會戰報名 Discord Bot 這是朋友寫的。大致上是為了避免過多的人同時打boss以至於有些人被遊戲判定為無效攻擊。也可以讓其他人知道當前公會戰進度。 ~~用過的都說好。~~ ### 部落衝突 Discord Bot ~~你沒看錯,部落衝突。在你面前的可是玩了10年以上的老玩家。~~ 這是我想寫的,官方有開 API 給我們用。我是看到官方的 API 後才知道什麼叫作接 API。目前只想到要記錄部落戰防守次數高的陣型有哪些。 國外有神人寫了一個基於 COC API 的網站,裡面蠻多有趣的功能可以看看。 連結:https://www.clash.ninja/ ## 參考 https://roadmap.sh/backend 寫完發現好像和其他人建議的類似,但這個完整很多。 也有前端和其他領域版本的,可以去看看。 ## 結語和題外話 內容比預計的還長,所以其他部分會另外寫。有問題歡迎留言或私訊。 一些題外話: 網路上好像一直有種非本科就不能當工程師的風氣。雖然我是數學系畢業,但學習路上沒有想過本科或非本科的問題,只知道我想找軟體工程師的工作就應該要學習什麼技能,目前有順利找到還算滿意的工作。所以我覺得如果你喜歡寫程式,都可以開始學一學,網路上有些酸言酸語就少看些。 有些人就會說啊肯定是成功了才會分享啊,也不看看失敗的人有多少 我只想說好喔 > [name=某朋友] 這行有電腦就能學 像醫生那種專業就根本不可能讓非本科來