看板 Soft_Job 關於我們 聯絡資訊
※ 引述《jojoboy0115 (jojo)》之銘言: : 前情提要 : 開始上班到現在已經兩個月了, : 想請教各位先進,當你們還是新人時 : 是怎麼樣了解程式的架構呢? : 花了多久才成為公司的即戰力? : 先謝謝各位了 : ----- : Sent from JPTT on my Foxconn International Holdings Limited A6S. 每個人都有這段從新手到熟手過程,如果你遇到挫折,也不必灰心,因為這是每 個人都需要經過的必經之路。 根據您的描述,你在這試用期所做的工作主要是更改已完成或運行中系統的小功 能,這樣的功能很容易完成,很快就能看到成果,所以也很容易有成就感,但往 往新手會因為這樣的成就感而在這的階段被卡住,而無法往上一層樓,做更長更 複雜的工作。 此外,您也提到程式的測試,根據你的描述我可以大膽猜測,您不是使用單元測 試框架來做程式的測試,而是使用手動測試吧? 另外,有些人不如離職,我想這一點也太過誇張了,大多數的公司,都不會從頭 到尾手把手教你整個程式架構,這很花時間,效果也不佳,主要的工作,還是得 要靠你自己來。 我想貴公司應該是想要交給比較大的開發工作,而不是只是修改小function之類 的吧?而你因為無法快速了解程式架構,所以感到挫折。 我分享一下我做程式架構分析的幾個原則,提供給您參考。 一、不要一開始就投入code trace 也許有些人會建議你直接用debug mode trace code,我認為這是很後面才會做 的事,因為你無法確認你投入的那段程式碼是否關鍵段落。 二、好好閱讀你手上的使用者文件 使用者文件是給客戶看的,不是給開發者看的,你的公司應該有提供給你,如果 沒有,就去問你的前輩吧,看看你的系統提供你的客戶多少功能,試著把這些功 能整理成功能架構圖,先別管程式是怎麼寫的,第一件事情:你要先搞懂你的產 品,以使用者的角度。 三、做一份整個架構的程式清單 如果你們公司能提供你的話很好,即使有,你也不用太高興,因為與實際內容不符 在業界是屢見不鮮的事情,不管有沒有,你都要自己整理與對過一次,每一個頁面 ,每一個類別在程式中的作用,你不需要細看程式碼的function,也不需要知道裡 面的流程跟互動關係。 如果你參與的系統有適當的架構,分層負責元件,以及正確的開發style,你應該在 分析這份程式清單的過程中發現這個系統與其他外部服務(如果有的話,例如用了那 些資料庫,使用了哪些其他服務)的關係,還有之前的開發者在開發過程中的思維, 你應該可以歸類出哪些是frontend的程式碼,那些是business logic,那些是DAO。 當然,在過程中你勢必也能看出來每個namespace的用途以及哲學,等到你真的把清單 做出來或一一對過,你對整個系統的架構已經有一定的瞭解了。 四、試著畫出程式之間的依賴關係 你可以從任何一個程式開始,以你熟悉的方式,不用管什麼UML或是什麼規範,用你 自己懂的方式,就算是簡單的方塊圖加上箭頭也好,把程式或namespace之間的圖 畫出來,你可以用手繪或是用powerpoint等任何工具,只要你方便快速就好,因為這 不是正式的文件,只是便於你了解整個系統架構。 記住,你是用圖像表示程式或模組之間的關係,不需要細究裡面的文字,你可以從 using,程式碼或是visual studio的工具找到這些關係,但我不是很建議透過工具, 用你自己的眼睛對過一次才會有記憶,程式的架構是你必須記憶起來的東西。 五、追蹤程式碼 到了這個階段,追蹤程式碼才有意義,因為你會知道哪些程式碼是值得追蹤的, 當你收到一個需求,你才需要去追蹤程式碼,沒頭沒腦的隨便找一個地方開始追蹤 ,是事倍功半的。 追蹤程式碼的過程很容易忘記,但是整體架構卻不容易忘記,因為你是用圖像記憶 方式把東西記下來,而不是記憶文字。所以直接追蹤程式碼,對於系統架構了解我 覺得作用不大,除非你的目標是理解演算法。 六、學會單元測試 單元測試分為兩個部分:單元測試框架與mocking framework,感覺你們公司應該 沒有在做單元測試,不過沒有關係,他們沒做你可以自己做,透過單元測試跟mocking framework做白箱測試,可以徹底了解一個元件自己是如何運作的,為了要讓一個測試 能夠成功通過,你就會在過程中對於程式的運作邏輯更為了解,最重要的,他可以讓 你知道如何「打斷」邏輯,縮減你需要了解的程度。 七、運用靜態掃描工具協助你了解程式碼 舉例來說,Sonarqube,這安裝上十分簡單而且也不用費用,他可以掃描C#程式碼並 發覺其技術債務,複雜度等等的資訊,這可以讓你很快了解到整個程式的核心在哪裡 ,通常最複雜越高,問題最多的程式就是這個系統的核心程式,你可以從核心程式開 始找出他與其他程式之間的關係。 此外,用 doxygen + graphviz可以快速產生系統架構與說明文件,不過因為產生得 太快了,所以還是自己手動去畫比較有記憶。 八、不要害怕開口 不要害怕開口去問前輩,主管或是同仁,程式是問出來的,大家都當過程式員,你要 一個程式員兼顧元件說明與架構,大家都會有所疏忽,因為schedule跟cost,不要害 怕問蠢問題,只要你經過前面一二三四五六七,你的問題勢必會直指核心,就算是問 蠢問題也沒關係,積極度要表現出來,人都好為人師,多少快慢,對方都會回答你的 。 以上八點,是過去我接各類系統時的分析方式,我的電腦裡面,位置的牆上永遠掛著 我一開始分析的系統架構圖,當我遇到一個問題的時候,我會從頭開始看他對系統各 部分的影響,即使我很久沒有碰過某個系統,只要看到圖我就能回想起來,希望以上 的幾點能夠對你有幫助。 等到您能快速接手別人的程式架構,未來您要自己做程式架構設計,也是水到渠成的 事情。 -- https://www.facebook.com/derekhsu.sports 德瑞克徐的少年籃球夢粉絲團 http://www.sportsv.net/authors/derekhsu 運動視界作者網頁 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.217.130.251 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1475060406.A.1ED.html ※ 編輯: derekhsu (49.217.130.251), 09/28/2016 19:01:47
kniver999: 推 很實用的建議 09/28 19:03
※ 編輯: derekhsu (49.217.130.251), 09/28/2016 19:05:31
dali17dali17: 實用推 09/28 19:05
sojoasd: 對原po來說最後一點一定要做到,一方面也可以讓主管或資 09/28 19:21
sojoasd: 深人員知道你目前狀況 09/28 19:21
art1: 真是好文章 09/28 19:54
pttworld: 二的部分有些公司做法是開始不給,上手才給。 09/28 20:21
CiC: 推 09/28 20:44
kinanson: 真的 09/28 20:49
NB574: 推推! 不管新手老手都非常實用的文章! 09/28 20:49
※ 編輯: derekhsu (49.217.130.251), 09/28/2016 21:01:57
ripple0129: 根據clean coder,新人不是應該要先學會說不嗎 09/28 21:18
kougousei: 好文推 09/28 21:20
tyc5116: 推 09/28 21:20
A4P8T6X9: 推 09/28 21:21
phire: 推 09/28 21:24
sing10407: 推,但我覺得要先trace某支程式,再來了解整個架構會 09/28 21:28
sing10407: 比較有感覺,上手比較快;反之則有些耗時 09/28 21:29
minesos520: push 09/28 21:35
ATPS4869: 推,感謝分享! 09/28 21:36
windlll: 其實第8點最重要,敢開口問真的解決很多問題 09/28 21:36
sing10407: 不過問問題也要很有技巧,太常問前輩會不爽 09/28 21:37
yotsuba1022: Good 09/28 21:47
zebraseven: 非常精闢 !!! 09/28 22:13
jay12324: 推 09/28 22:25
jojoboy0115: 非常感謝您這近兩千字的回文,在下覺得受益良多,就 09/28 22:30
jojoboy0115: 算最後的結果不盡理想,在這過程中必定是有所收穫。 09/28 22:30
sean0430: 非常實用推! 09/28 22:38
vi000246: 推 09/28 22:58
bbccnn: 我的前輩不教 要我自己找答案 後來還離職了 09/28 23:21
bbccnn: 我花了一年才自認為可獨立作業(FAE兼RD) 09/28 23:22
pig0038: 感謝分享 09/28 23:33
codehard: 推 09/28 23:48
asd2260123: 感謝 09/29 00:06
femlro: 謝謝您貢獻一篇好文章 09/29 00:11
tomroy: 熱心推 09/29 00:24
cphe: 推 09/29 00:28
hungys: 推 09/29 00:36
beryah: 推 好文章!! 09/29 00:40
BearWu: 推,好文!! 09/29 00:55
vn509942: 感謝分享 09/29 01:00
CuteAmi: D大乃強者我朋友:p 09/29 01:13
et055011: 推!謝謝分享 09/29 01:17
tim92087p: 經驗分享收益良多 09/29 01:29
molopo: 真的好文 09/29 01:30
p0x0q: 推 09/29 02:22
sorryla: 這篇好 09/29 02:23
FK56: 優文 09/29 03:16
jason82714: 推 09/29 03:36
sky40280: 推 09/29 06:34
bean0917: 實用推 09/29 08:06
shiauji: 感謝分享! 09/29 08:08
Arser: 原來德瑞克徐也是程式員! 09/29 08:19
sppqre: nice 09/29 08:36
strlen: 腿 09/29 09:11
chadcoco1222: 推 09/29 09:19
yesyesyesyes: 推 09/29 11:24
magus: 推,我當新人時有用2,3,4,5,8 09/29 11:26
oscarchichun: 推 09/29 12:42
sonicnaru: 跪惹 感謝分享 09/29 13:35
andreli: 推德瑞克徐 (雖然他很大隻推不動) 09/29 13:51
mike01019: 推 09/29 16:55
AnswerD: 推 09/29 18:38
s860134: 比對自己經驗,本文很有參考價值 09/29 20:56
landlord: 這真的用心 貼心+專業! 09/29 21:59
tt75321: 推!!!謝謝分享 09/29 22:53
ntddt: 推好文~ 09/29 22:58
MagicTouch: ~好文推 09/29 23:26
E33258: 實用推!! 09/30 21:08
daniel54088: 好文必推 10/01 13:44
Mtcat: 10/01 19:04
kobeflower: 推 10/01 19:56
kanepor: 推 10/01 20:07
PasserDin: 我以為我到NBA版了 10/02 14:00
simpleplanya: 推! 10/02 19:35
LordSo: 有學到東西給推 10/03 01:44
serval623: 推推 感恩 非常實用 10/03 10:28
chia3120: 朝聖 10/04 08:32
wxywxywxy: 推 10/04 20:02
elvispoetic: 收穫很多,把架構圖像化跟主動提問是新人期的重點 10/18 16:36
roger00: 獲益匪淺! 10/21 19:33