顯示廣告
隱藏 ✕
※ 本文為 layzer 轉寄自 ptt.cc 更新時間: 2019-06-06 14:07:21
看板 Soft_Job
作者 lovdkkkk (dk)
標題 Re: [請益] 後端工程師要如何更優秀
時間 Wed Jun  5 12:17:53 2019




大概提一些個人覺得有用的觀念, 可以做的方向以及建議順序

一些個人覺得蠻有用的觀念, 寫在前面
* 聚焦在目的, 而不是工具/方法/手段
  打個簡單的比方,
  做出好吃的料理是目的, 而用什麼器具、料理方法、調味方式是手段,
  具焦在用的器具或調味品或許能讓你找到最棒的鍋子 (?) 跟調味料之類的,
  但另一方面也可能讓你一旦沒有那特定的鍋子可用就成了料理白痴

  反之具焦在做出好吃的料理,
  思維上就會是 "有哪些工具/哪些材料的前提下, 如何能做出好吃的料理"
  也會促使你研究、實踐各種手段來試著達到該目的,
  並反思優/劣/利/弊/能如何再改善調整等, 多加上反思會更能進步

* 凡是都有代價
  有這個觀念, 你就不容易只是停留在 "用工具/方法/手段" 的階段,
  它會促使你學一樣新東西時,
  主動搜尋
    XXX advantages/disadvantages/drawbacks
    XXX vs OOO
    XXX OOO tips
    XXX best practice
  然後認真仔細地看上二三十篇文章, 去了解它的好與壞,
  這讓你在學東西的廣度與深度上能有很大的改善

  比如說 SRP 你可能就會找到這個
  https://sklivvz.com/posts/i-dont-love-the-single-responsibility-principle
I don't love the single responsibility principle
Personal site of Marco Cecconi ...

 
  然後就可以看一看, 想一想, 再吸收成自己的東西



然後是一些能精進的方向
* 讓程式易讀、易改、容易擴充、不容易改東壞西
  這部份就是你目前有在嚐試的 OOP/SOLID, 剛開始這就很夠了,
  前面有人推的 Clean Code 跟 Clean Architecture 也可以看看,
    ref: https://www.books.com.tw/products/0010579897
      https://www.books.com.tw/products/0010786994
  網路上還找得到有人對 Clean Code 做的重點整理
    ref: http://gitqwerty777.github.io/cleancode/
clean code(無瑕的程式碼)心得 | qwerty
僅節錄我認為有助益的。(書中有蠻多java的重構範例) ...

 

  其它像 KISS, Composition over inheritance,
  convention over configuration 也都是簡單又好用的一些原則
    ref: https://bit.ly/2WoLIPI ,
      https://tw.twincl.com/programming/*662v ,
      https://bit.ly/316hYFO

  另外可以學一下設計模試, 像 深入淺出-設計模式、
  重構--向範式前進 都是不錯的書,
    ref: https://www.books.com.tw/products/0010309237
      https://www.books.com.tw/products/0010399556

  不過要注意, 目的是 讓程式易讀、易改、容易擴充、不容易改東壞西,
  而 OOP/SOLID 其它原則和模式等則是 工具/方法/手段,
  要時時注意使用它們有沒有什麼代價, 是不是過了某個界線就會讓代價大於好處,
  以免為了貫徹手段而忘了目的

* 讓程式效能好,執行速度快、使用的資源少
  這部份說來很多很雜
  首先 OS 是要的, 不用全部很熟, 但最少有一些基本知識,
  例如速度是硬碟 < 記憶體, 記憶體不足會引發 Thrashing
  Process 吃的資源比 Thread 多,

  多 Thread 對 IO bound 比對 CPU bound 的問題有效果
  存取同一變數需要處理鎖定問題等

  然後資料結構跟演算法是必要的, 這部份雖然不用急著補, 但補越多效果就越好,
  最開始先知道 Array/List/Linked List/Queue/HashSet/HashMap 等的差異
  就會有不少的幫助, 推薦經典教科書 Introduction to Algorithms
  https://www.books.com.tw/products/F011708546

  其它比較雜、需要了解後端程式以外的部份
  像了解使用的語言/框架的資源耗用狀況,
  了解使用的伺服器對應不同的負載情形該如何設定,
  這在不同語言/伺服器會不同, 例如 nodejs/nginx 和 Java/JBoss 就差很大

  了解資料庫的運作也會有幫助,
  能協助你規劃哪些事情由程式處理, 哪些靠 SQL 解決,
  如何能盡量減少 lock 等等

  對前端的認識也會有幫助, 能協助你決定流程該如何切分,
  哪些事可以在使用者操作途中處理等等

  不過以上這些有點雜, 可以放比較後面

* 讓程式容易佈署、設定
  例如用設定檔或 DB 開設定的 table 而不要程式寫死,
  讀檔時設法使用通用的方式等,
  例如 JAVA 包成 jar, 包成 war 跟跑在 IDE 能用的資源讀取方式會有差異
  這部份留意一下你的程式會更容易應用在多種情境,
  而不會換個 package 形式就各種跳 error
  這也是不急, 有空再了解就好

* 讓程式容易驗證、除錯
  這有幾個部份,
  適當的 Exception handle 方式, 不要隨便自己 catch 掉,
  並設法讓 error log 有足夠的資訊且容易查閱,
  自動測試則能讓你經常測, 早期發現問題較容易修,
  對容器、CI/CD、shell/batch script 的熟悉
  則能讓你容易佈署整個測試環境做整合測試
  初期先以 log 及 unit test 為主就很夠能改進很多了,
  有空再往下摸

* 能更好的和不同職能的人溝通
  這部份就只能靠多了解其它部份的相關知識,
  多了解領域知識, 就能更好的和 SA/SD 溝通,

  更了解前端或機器/系統, 就能更好的和前端工程師或維運人員溝通,

  也對開發及查問題有幫助,
  比方前後端怎麼分工, 哪些前端處理哪些後端做, 沒反應是不是前端就沒送,
  連不到請維運開一下防火牆,
  一直掛是不是清硬碟的排程沒有跑或實體機器資源不夠等等


建議順序

大至上就是 前置少, 影響大的優先, 前置多, 影響較小的放後面,
但也不必一個學完才學另一個, 可以併行,
看個人取捨

OOP/SOLID 及各種其它原則等
  前置: 使用的語言的基礎
  影響層面: 大, 影響到日常開發、效能調整、測試除錯等各個層面
  需要時間: 極長, 基本上等同於你的開發生涯,
    會不斷在不同情境下有不同的想法, 持續修正
unit test

  前置: 使用的語言的基礎, unit test 工具
  影響層面: 大, 做各種修改時可以更放心大膽的改,
    改完後幾秒內知道有哪裡壞掉
  需要時間: 短, 基本上有固定套路
設計模試
  前置: 使用的語言的基礎, 及一些較進階的語法
  影響層面: 大, 影響到日常開發、效能調整、測試除錯等各個層面,
  需要時間: 極長, 基本上等同於你的開發生涯,
    會不斷在不同情境下有不同的想法, 持續修正
OS

  前置: 無
  影響層面: 中, 主要是對效能調整及除錯有幫助
  需要時間: 長, 很多東西一下子可能不太能理解,

    建議記錄下來後先略過, 時不時再回頭重看及查資料

    不必非要搞清楚後才繼續, 快速增加能吸收的東西比較重要

資料結構跟演算法
  前置: 基本邏輯, 一些些基本數學
  影響層面: 大, 除了效能, 也影響架構程式及整體系統的能力
  需要時間: 極長, 基本上等同於你的開發生涯,
    會不斷在不同情境下有不同的想法, 持續修正

容器、CI/CD、shell/batch script

  前置: 一些些基本命令列指令, 基本 OS 操作
  影響層面: 中, 主要是佈署與測試的部份,
  需要時間: 中, 基本操作可以很快上手, 建議可以先挑一組工具學會使用,
    之後再慢慢補上其它相關知識

※ 引述《csjs87 (思念的季節)》之銘言:
: 各位年薪三百萬的大神們好,小弟不才又上來請益了。一年前為了選擇資策會的課程在版上發了問,有幸獲得許多人的回覆。
: 從資策會畢業、順利找到工作也一陣子了,現在月薪37k,主要是協助開發後端。但我碰到一些對於自己不足的地方,想再次請教各位。
: 一、
: 因為公司沒有一套完整的教育訓練或是架構的教學,所以即使我有嘗試在我負責做的小工具、api中盡量使用"我認為的oop觀念"、"solid的開發原則"。但還是不曉得是否正確,同事們大多也都很資淺,加上沒有太多時間幫我看(專案忙)。我要怎麼檢視自己的code是良好、容易維護的呢?
: 二、
: 偶爾會看版上或是104徵才需要什麼樣的能力,為將來不管跳槽或是談薪水更有籌碼。我印象中常看到的有雲端架設相關(aws、azure)、程式設計上(單元測試、graph api)、其他(CI/CD、Docker容器、TDD)。雖然都有查過也大致知道是什麼,但也僅此而已,更不曉得知識還很淺薄的我有沒有誤會什麼。
: 三、
: 最後是一些比較底層的資料結構、計算機概論這類都幾乎是0知識。雖然計概有自己看台大開放課程的計算機概論,是多少有學到一些,但又好像不是我現在急迫必要的知識。聽說資工有本聖經恐龍本,看過目錄發現,很多都是我常常看到的陌生詞彙。I/O、thread、Process等等,我覺得好像不看懂這些我就很難更精進。
: 其實我本身不是“非常”熱愛寫程式的人,我會在寫code的時候為解出bug感到開心,也會邊騎車邊想程式的事,看到好像很神奇的新技術新聞也會很興奮,也想做side project,想使用新知識。但到了休假日,也很少真的著手進行。
: 總之我現在稍微有點迷惘,對於程式這條路我覺得我才剛起步,也不想離開。但學海無涯,光上面就太多東西要學。
: 根據我自己的感覺,只知道自己暫時還不太想鑽研前端。而對於我上面提到的各種知識,能怎麼安排、規劃比較好?謝謝大家。
: -----
: Sent from JPTT on my Sony G8142.

--
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.154.169 (臺灣)
※ 文章代碼(AID): #1Szq9umH (Soft_Job)
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1559708280.A.C11.html
NAVYmaker: 感謝大大1F 06/05 12:24
MOONY135: 最近是怎樣 U值文大噴發2F 06/05 12:41

大概大家看到想精進的人都很興奮 XD

devilkool: 感謝分享3F 06/05 12:42
oceanblue21: 推 講的很詳細!!4F 06/05 12:52
b81314: 這篇讚5F 06/05 13:33
expup: 大推 你人真的非常好6F 06/05 14:22

看情況, 只能說人都有不只一種面貌 @@

v9290026: 推推7F 06/05 14:36
jeremy616: 好文推8F 06/05 16:56
cz75: 謝謝大大,提供好的文讓軟工版起飛QQ9F 06/05 19:45
lwtech: 不要再躲了,快去自首,你就是兇手。10F 06/05 22:27

對不起我承認桌上的銅鑼燒是我吃晫的 QQ

genius945: 推   幫找個錯字  exception 那邊應該 cache  => catch11F 06/05 22:41

已改 0rz

※ 編輯: lovdkkkk (36.231.217.216 臺灣), 06/05/2019 23:18:58
genie920: 推推,真的謝謝你的分享!12F 06/06 00:13
umum29: 推13F 06/06 00:36
frankshih: 近期真的U值文連發,給推14F 06/06 07:10
molopo: 好文15F 06/06 07:55
showken: 好文 謝謝分享16F 06/06 09:42
IamTD: 讚17F 06/06 09:52
qwe85158: 推18F 06/06 10:38
aliasber66: 好文推推19F 06/06 11:50
LinNine: 推! 謝謝你的分享20F 06/06 12:41

--
※ 看板: layzer 文章推薦值: 0 目前人氣: 0 累積人氣: 424 
※ 文章分類: 程式設計
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇