# 我要成為Python後端工程師
> [name=Ignacio Lee]
>
> [time=Mon, Mar 7, 2022 4:47 PM]
>
> 這篇文章都是個人看法,有不同意見歡迎留言
## 學習地圖
### Python相關
1. Python語言 - Python3
> 使用Python3,先稍微了解語言,不需要把所有的語法都背起來(背不起來拉),大概了解一下特性就好,在有一定實作經驗(大概半年)之後你就會有所體悟,然後就可以再回頭去研究Python語言的一些比較進階或是底層的東西。
2. 環境與Python Package
> 了解如何設定Python開發環境,了解如何管理Python套件,了解Virtual Environment,知道什麼是`requirements.txt`。
3. 後端框架
> 學習一或多個後端框架,了解這些框架各自的差異及想要帶來的好處為何,並且熟悉至少一個框架對於面試是有加分效果的。
>
> 你可以選擇從Django開始,Django是一個非常流行並且功能非常多的框架,之後你可以試著使用一些更輕量的框架,或是不用框架,自己思考一下你的專案真正需要的是什麼,試著依照你的需求建立你自己的專案架構,這會幫助你暸解這些框架的實作方式。
> https://www.netsolutions.com/insights/top-10-python-frameworks-for-web-development-in-2019/
4. 學習一個編譯式強型態語言(e.g. Kotlin)
> 學習其他語言?沒錯,學習一個跟Python差異比較大的語言可以幫助你了解不同語言的差異處,以及思考他們的共同點,並進一步去思考為什麼有這些差異,有什麼優缺點。
### 通用知識
1. WebAPI
> 了解前後端怎麼溝通的,什麼是網路API,熟悉Restful,熟悉前端串後端,後端串後端,了解GraphQL,WebSocket。
>
> 你要了解網路API跟API有什麼差異,不然有時候會聽不懂人家在說什麼。
2. 網路運作
> 了解網路的運作原理(網路概論),這會幫你了解一個伺服器要怎麼讓別人連進來,為什麼需要24小時運作,以及資料怎麼透過網路傳遞,了解TCP,UDP,了解HTTP與其他常用的協定,了解Socket 與 Port。
3. Git
> 知道怎麼使用Git,了解Git的操作,知道Remote Repository與本地Git Respo之間如何運作以及差異,了解協作時會使用到的功能 如:Merge, Branch, Push, Conflict, Pull Request。
>
> 要理解Git的遠端倉庫怎麼運作,可以嘗試自己架設一個GitTea或是GitLab,然後Push東西上去。
4. 作業系統(Linux)
> 跟前端工程師比起來,後端工程師更需要對作業系統有一定的理解,因為很多時候後端工程師會負責架設伺服器與系統設定(雖然這些應該是系統工程師的工作),推薦學習及使用Linux,因為他是最普及的伺服器作業系統,也是免費的,你可以不會使用Windows Server,但是你不能不會Linux。
>
> 在開始學習Linux時,你可以試著先從有桌面版本的Linux開始,使用虛擬機(如:Virtual Box),或是直接將作業系統灌在電腦裡,十分建議拿一台電腦,將他裝上Linux,然後用Linux當作你的日常開發機器,會有助於你熟悉(因為你會遇到很多問題,解著解著就熟了)。
>
> Linux有許多發行版,如果是想要運行桌面可以考慮ZorinOS(Debian),ElementaryOS(Debian),或是更著名的Ubuntu(Debian),Fedora(Red Hat),前兩個UI比較完善,後兩個是十分著名的Linux發行版。
5. SSR & CSR
> 了解前端渲染與後端渲染的差異,看看每個框架對於畫面渲染的作法,研究SSR與CSR所帶來的優缺點各自為何,你比較喜歡哪種方式?
> https://hackmd.io/@spyua/HJDJUaTSO
### 後端知識
1. 資料庫
> 資料庫,一個儲存資料的地方,一個後端工程有時需要花很多時間研究資料庫結構,特性,以及語法。這些東西都會影響到伺服器的性能,資源的利用,以及資料的正確性。
>
> 我認為一個系統最重要的就是資料庫,因為伺服器當機可以重開,網站掛了可以修復,但是資料錯誤或是遺失了會導致無法挽回的錯誤,以及可觀的財務損失,如何與資料庫溝通,做好備份,以及增進IO的效率是一個後端工程師非常重要的課題。
>
> 你需要先從資料庫語法開始學習,先選擇一個資料庫(可以是MariaDB或是MySQL),了解語法之後去了解如何確保交易的正確性,之後在你開始學習增進伺服器效能的時候,你會發現資料庫常常會是一個瓶頸,你就會開始思考如何增進資料庫的效率。
2. Cache
> 在學習資料庫好一段時間之後,你會發現你可能需要做一些Cache來增進效能,這時你可以開始研究Redis,思考哪些資料可以做暫存。
3. 架設與管理Server(監控)
> 你要知道怎麼把你寫好的專案架起來,畢竟會寫不會架實在是有點好笑對吧,要做到這件事你就必須對作業系統與網路有一定的了解了,所以前面的基礎知識是重要的。
>
> 你可能會需要想一套完善的流程來做每一次部署的更新,以及管理他的狀態,更進一步,你應該使用一些方式或是軟體來監控你的伺服器,或是搜集錯誤資料(你可以用Elastic全家餐)。
4. 測試
> 沒錯,就是測試,雖然我們有時候會有QA幫我們寫自動化及手動測試,但是一個後端工程師很多時候會需要做一些預先測試,不僅是為了解決沒有QA編制的問題,也是在確保你產出的成果是沒有問題的,最常見的有單元測試及壓力測試。
5. 加密
> 資料的安全性是一件重要的事,你要知道哪些資料可能需要加密(密碼,個資...),或是哪些情況你需要更安全的驗證方式(FIDO),在傳輸上是否也要進行加密(HTTPS, SSL),畢竟駭客的攻擊是源源不斷的對吧。
6. 其他我不熟的東西
> MessageQueue, 微服務,這些要自己查了。
### 進階通用知識
1. 容器化
> Docker是一個很好用的工具,語言,OS,Package,這些東西都有不同的版本,我們也會做越來越多的自動化設定,這些設定在每次的新人加入或是開發環境建立,轉移,都是一間可怕的事,更別說如何確保線上環境的正確以及一致性。
>
> 容器化的另一個好處是我們如果可以透過設定來描述一個環境的資訊,一鍵部署,接著我們就可以讓機器幫我們自動完成這件事,並且可以讓機器自動在需要的時候增減伺服器的執行個體數量(Kubernetes),建立叢集,用CP值最高的方式來達到我們需要的負載,避免工程師在睡覺的時候被大流量警告吵醒。
2. 雲服務
> 擁有一台實體的伺服器聽起來很酷,但是就跟買車一樣,如何維護這個伺服器是一件很惱人的事情。該買怎樣的機器,Intel還是AMD,網路要怎麼架,如果機房失火怎麼辦?停電怎麼辦?電費會不會很貴?這些事情都是需要煩惱的問題,這時你可以考慮使用雲服務!
>
> 雲服務有很多不同的種類:IaaS, PaaS, SaaS
> https://aws.amazon.com/tw/types-of-cloud-computing/
>
> 不同種類的服務也有很多不同的品牌及選擇:AWS, GCP, Firebase, Twilio...,你該怎麼開始嘗試雲服務呢?很簡單,你可以從硬體開始,先捨棄掉傳統的實體伺服器,試試看使用AWS(EC2), GCP(Compute Engine)來當作你的伺服器使用,接著把資料庫也從主機分離出來,託管到雲平台上,再來,思考看看你做的一些其他功能(即時通訊,串流,Log紀錄),有沒有現成可用的服務,用與不用的優缺點分別為何?
3. CI CD
> 工程師很喜歡讓機器來幫我們工作,看到一些複雜的事情都自動被完成真的很爽,你可以用CI CD來做程式的檢查,測試,部署,通知,有空去玩一玩,很好玩的
### 專案執行的其他技能
1. 專案管理(ClickUp, Jira, Trello)
> 專案管理是很重要的事情,或著不想要這麼專業,我們可以說是工作管理好了,當你在進行一個專案或是你在管理多個工作,事情一多就會搞亂你的頭腦,你會希望你專注在開發上而不是這些雜七雜八的事情,所以用工具來幫你管理是一件很重要的事情,學著使用這些工具,會大大增進你的工作效率。
2. Slack
> 不是很重要的東西,就是另一個Line,但是我喜歡用Slack來討論工作上的事情,因為Line很爛,而且Slack可以跟很多CI CD還有其他的平台做串接。
### 其他工程師該做的事
1. 做Side Project
> 好的工程師跟不好的工程師有什麼差異,我會說是持續學習的態度(個人見解,不要打人)。絕大多數的軟體工程師一個時間會專注於一個工作,比如說你的正職工作對吧,但是有些時候一個專案會持續很長時間,導致在專案的中後期可能會學習不到東西(我覺得這時你應該要警覺),或是你在工作之於,對於某一項技術有興趣,你就可以透過做 Side Project 的方式來提升自己的能力,或是單純做點有趣的事,有時候你會跟朋友一起合作,這可能也會進一步增加你的協作能力以及專案管理能力。
>
> 總結一下,做 Side Project 最大的好處就是可以跳脫既定的工作內容,嘗試接觸到一些完全不同的事物。
2. 參加Conference
> 每年都會有很多工程師的聚會,可能是以某個語言為主題,或是以某個群體為主題,挑你有興趣的去吧,在聚會上可以聽到很多別人的工作心得,很多新的想法,這是一個讓自己不會與世界脫軌的好東西。
>
> 你也可以邀請你的工程師朋友一起去,畢竟大家都坐在電腦前面太久了,有一個出去走走的理由也蠻不錯的。
## 以最快速轉職為目標的做法
1. 了解API與前後端溝通方式
2. 了解Git
3. 了解SSR與CSR
4. 了解Python語言,環境與Python Package
5. 學習Django (了解一個後端專案會有哪些東西,程式部分會分成哪些資料夾,分別是為了解決什麼問題)
6. 學習MySQL
7. 試著成功把Server架起來,然後可以從其他人的手機or電腦連進去
---
可以開始找工作了,下面的找時間快補起來
8. 用Linux做到第6點
9. 用GCP或AWS做到第6,7點
10. 寫些測試,做壓力測試
11. 學習使用Docker,用它來管理開發環境,接著用在正式環境(試著用K8s)
12. 工程師之路是沒有盡頭的,活到老學到老,繼續找東西充實自己吧。