第一部分? 行業(yè)地圖
選擇:一線和次一線城市機(jī)會(huì)巨大
1.北京
2.上海煤蹭、深圳、杭州
3.成都取视、廣州硝皂、南京、廈門
4.福州作谭、蘇州
軟件工程師的四大臺(tái)階:
階段
能力
1
新手階段
執(zhí)行力
2
進(jìn)階階段
設(shè)計(jì)能力
3
高手階段
融會(huì)貫通的能力
4
行業(yè)大神階段
沉淀方法論和開創(chuàng)新領(lǐng)域的能力
35歲不是年齡的坎兒稽物,而是能力的坎兒。
持續(xù)學(xué)習(xí)是剛性要求折欠。
分類:交互(UI)贝或、系統(tǒng)(前后端)、算法怨酝、數(shù)據(jù)分析傀缩、測(cè)試、運(yùn)維
第二部分? 新手上路
1.入行前
正式入門語言:Java农猬;
操作系統(tǒng):Linux赡艰;
編程IDE:IntelliJ IDEA;
數(shù)據(jù)庫設(shè)計(jì)工具斤葱;
編程框架(Spring Framework)
離散數(shù)學(xué)中的數(shù)理邏輯和集合論 (數(shù)學(xué)建模慷垮、圖論揖闸、抽象代數(shù)、拓?fù)鋵W(xué)料身、運(yùn)籌學(xué)汤纸、博弈論(機(jī)器學(xué)習(xí)、AI的基礎(chǔ)))
選擇平臺(tái):去面向未來芹血、技術(shù)驅(qū)動(dòng)的公司
這家公司做的事情贮泞,要適應(yīng)未來的發(fā)展
技術(shù)驅(qū)動(dòng)、以技術(shù)文化為主導(dǎo)的公司
需求分析——>設(shè)計(jì)(技術(shù)調(diào)研幔烛、原型設(shè)計(jì)啃擦、架構(gòu)設(shè)計(jì)等)——>編碼——>測(cè)試
新人階段:1.養(yǎng)成良好的工作習(xí)慣 2.培養(yǎng)自己的執(zhí)行力
2.編碼
代碼規(guī)范、設(shè)計(jì)模式饿悬、架構(gòu)模型令蛉、運(yùn)維和開發(fā)的最佳實(shí)踐
(1)編碼規(guī)范?
行業(yè)規(guī)范:《代碼大全(第二版)》、《代碼整潔之道》狡恬、《重構(gòu):改善既有代碼的設(shè)計(jì)》珠叔、《程序員修煉之道:通向務(wù)實(shí)的最高境界》
(2)設(shè)計(jì)規(guī)范 (API接口規(guī)范、設(shè)計(jì)模式弟劲、架構(gòu)規(guī)范)
《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》祷安、《架構(gòu)整潔之道》、《微服務(wù)設(shè)計(jì)》函卒、《數(shù)據(jù)密集型應(yīng)用系統(tǒng)設(shè)計(jì)》辆憔、《Web API的設(shè)計(jì)與開發(fā)》
(3)生產(chǎn)規(guī)范(一套標(biāo)準(zhǔn)化的上線流程)
《人月神話》、《SRE:Google運(yùn)維解密》报嵌、《持續(xù)交付:發(fā)布可靠軟件的系統(tǒng)方法》
優(yōu)質(zhì)代碼:
(1)初級(jí):可讀
命名有意義虱咧;布局清晰;注釋明確……
(2)中級(jí):可擴(kuò)展
可維護(hù)(面向?qū)ο蠛秃瘮?shù)式的設(shè)計(jì)模式锚国,比如狀態(tài)機(jī)腕巡、聲明式編程、SOLID血筑、IoC/DIP)
(3)高級(jí):可重用
代碼可以用在很多場(chǎng)景(輪子可以用在馬車绘沉、汽車、飛機(jī)上)
DSL豺总、面向?qū)ο蟮脑O(shè)計(jì)模式车伞、Web Service、”Codeless”
復(fù)雜度一般由業(yè)務(wù)邏輯喻喳、控制邏輯和數(shù)據(jù)邏輯組成另玖,業(yè)務(wù)邏輯決定了復(fù)雜度的下限,控制邏輯決定了復(fù)雜度的上限。? 分開è 解耦
設(shè)計(jì)模式谦去、函數(shù)式編程慷丽、DSL、狀態(tài)機(jī)鳄哭、插件要糊、依賴倒置和反轉(zhuǎn)控制等
整潔代碼:不是寫出來的,而是讀出來的(方便他人閱讀)
代碼注釋:像說明書一樣清晰(函數(shù)的功能以及如何使用它妆丘,example)
編程原則:
(1)避免重復(fù)原則(DRY, Don’t Repeat Yourself)
抽象成數(shù)學(xué)模型锄俄,數(shù)學(xué)建模;用一種方式解決多種問題
(2)單一職責(zé)原則
一個(gè)類或者模塊應(yīng)該只有一個(gè)職責(zé)(各司其職)
簡(jiǎn)單化飘痛、模塊化珊膜、讓你的組件不斷復(fù)用
(3)高內(nèi)聚、低耦合原則
內(nèi)聚:一個(gè)模塊內(nèi)各個(gè)元素彼此結(jié)合的緊密程度
耦合:不同模塊之間的依賴程度
讓每一個(gè)模塊做到獨(dú)立宣脉,做到精益求精,同時(shí)把模塊間的耦合降到最低剔氏,不會(huì)因?yàn)閯?dòng)了一個(gè)模塊塑猖,而導(dǎo)致其他模塊出現(xiàn)問題。(沒有依賴就沒有傷害)
(4)開閉原則
對(duì)修改是關(guān)閉的谈跛,對(duì)擴(kuò)展是開放的羊苟。
3.測(cè)試
程序測(cè)試包括:?jiǎn)卧獪y(cè)試、功能測(cè)試感憾、集成測(cè)試蜡励、非功能測(cè)試、回歸測(cè)試等阻桅。
種類
目的
單元測(cè)試(白盒測(cè)試)
測(cè)各個(gè)模塊(零件)是否都能正常工作
功能測(cè)試(黑盒測(cè)試)
各個(gè)模塊合在一起能否正常運(yùn)轉(zhuǎn)
集成測(cè)試
模塊和模塊之間或者系統(tǒng)和系統(tǒng)之間的測(cè)試
非功能測(cè)試
檢查軟件應(yīng)用程序的非功能性方面(性能凉倚、可用性、可靠性等)
性能測(cè)試嫂沉、安全測(cè)試稽寒、穩(wěn)定性測(cè)試、健壯性測(cè)試趟章、破壞性測(cè)試杏糙、可用性測(cè)試、靈活性測(cè)試等
回歸測(cè)試
把以前做過的測(cè)試以及犯過的錯(cuò)誤再測(cè)一遍蚓土,確保代碼或配置的修改宏侍、需求的增加不會(huì)影響現(xiàn)有功能
做測(cè)試最好的方式不是用人工,而是寫代碼蜀漆。自動(dòng)化測(cè)試
想要做好測(cè)試谅河,先訓(xùn)練自己全面思考的能力。
4.成長論
1.拆分任務(wù):動(dòng)手工作前,先做任務(wù)分解
2.閱讀代碼:重要的不是寫代碼旧蛾,而是讀代碼
讀什么樣的代碼莽龟?(1)被反復(fù)使用的代碼(2)穿越時(shí)間的代碼(3)好調(diào)試的代碼
3.找到捷徑:通讀牛人代碼
4.追本溯源:多讀文檔,多讀書
第三部分 進(jìn)階通道
1.設(shè)計(jì)程序
原型設(shè)計(jì):面向用戶锨天,提前打個(gè)樣毯盈。
(1)先做最難的部分,既能提早發(fā)現(xiàn)問題病袄,又能節(jié)省開發(fā)時(shí)間搂赋。
(2)原型設(shè)計(jì)的關(guān)鍵是接口
架構(gòu)設(shè)計(jì):面向開發(fā)人員,一份詳細(xì)的施工藍(lán)圖益缠。
包括概要設(shè)計(jì)(high level desogn)和詳細(xì)設(shè)計(jì)(low level design)
《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》
(1)分而治之脑奠,理清思路。
(2)考慮系統(tǒng)的異常情況和極限情況幅慌。
技術(shù)調(diào)研
(1)調(diào)研做得好不好宋欺,和閱讀代碼的能力高度相關(guān)。
(2)分析優(yōu)缺點(diǎn)胰伍,結(jié)合場(chǎng)景才有效齿诞。
2.項(xiàng)目管理
開發(fā)模式
開發(fā)模式
特點(diǎn)
具體實(shí)現(xiàn)
瀑布式開發(fā)模式
傳統(tǒng),一層一層開發(fā)
缺點(diǎn):慢
先分析需求骂租,產(chǎn)生需求文檔祷杈;
再做概要設(shè)計(jì),技術(shù)選型等渗饮;
接著做詳細(xì)設(shè)計(jì)但汞,事無巨細(xì)地梳理流程和細(xì)節(jié);
最后編碼互站、測(cè)試私蕾、上線。
敏捷開發(fā)模式
做一點(diǎn)發(fā)一點(diǎn)云茸,小步快跑是目,快速迭代
本質(zhì):化繁為簡(jiǎn)
先把框架搭出來,把后續(xù)任務(wù)拆解成一個(gè)個(gè)小模塊标捺,讓每個(gè)團(tuán)隊(duì)負(fù)責(zé)其中一塊懊纳,大家根據(jù)協(xié)議并行開發(fā),最后拼在一起亡容。
班車模式
瀑布和敏捷的折衷
按一定節(jié)奏
我的發(fā)布每周一次嗤疯,趕得上就跟著一起發(fā),趕不上就等下一班闺兢。
分布式微服務(wù)開發(fā)模式
所有團(tuán)隊(duì)之間沒有工程上的依賴茂缚,大家耦合在一個(gè)標(biāo)準(zhǔn)的開發(fā)模式和框架上戏罢,能非常方便和高效地協(xié)作。(DevOps開發(fā)模式)
把代碼庫脚囊、數(shù)據(jù)庫全部分開龟糕,每個(gè)服務(wù)都由一個(gè)全功能的小團(tuán)隊(duì)來負(fù)責(zé)。
驗(yàn)證效果:做A/B test悔耘,用數(shù)據(jù)說話讲岁。
監(jiān)控打磨:上線前做好監(jiān)控與壓測(cè)(一般可上10倍的壓力)
3.學(xué)習(xí)進(jìn)階
打牢基礎(chǔ),以不變應(yīng)萬變
打牢自己的理論基礎(chǔ)衬以,比如編程的一些方式缓艳、修飾模式(添加新的行為的設(shè)計(jì)模式)、解耦看峻、提升代碼重用度等阶淘。
技術(shù)基礎(chǔ)
程序語言
語言的原理,類庫的實(shí)現(xiàn)互妓,編程技術(shù)(并發(fā)溪窒、異步等),編程范式车猬,設(shè)計(jì)模式……
系統(tǒng)原理
計(jì)算機(jī)系統(tǒng)霉猛,操作系統(tǒng),網(wǎng)絡(luò)協(xié)議珠闰,數(shù)據(jù)庫原理……
中間件
消息隊(duì)列,緩存系統(tǒng)瘫辩,網(wǎng)關(guān)代理伏嗜,調(diào)度系統(tǒng)……
理論知識(shí)
算法和數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫范式伐厌,網(wǎng)絡(luò)七層模型承绸,分布式系統(tǒng)……
搭建體系:用知識(shí)樹系統(tǒng)學(xué)習(xí)
主動(dòng)學(xué)習(xí):提高你的學(xué)習(xí)效率(討論,實(shí)踐挣轨,教授給他人(寫博客军熏、做分享))
第四部分 高手修養(yǎng)
預(yù)見未來:軟件工程師要有前瞻能力
權(quán)衡利弊:軟件工程師要有取舍能力
攻克難題:主動(dòng)尋找技術(shù)難題;嘗試不同解決方案
關(guān)鍵決策:技術(shù)選型的六大要素
看這項(xiàng)技術(shù)解決的是不是大問題卷扮。(主觀)
看這項(xiàng)技術(shù)解決問題的方式是否讓人有想象空間荡澎。(主觀)
看有沒有大公司撐腰(客觀)
看有沒有很好的技術(shù)社區(qū)(客觀)
看有沒有殺手級(jí)應(yīng)用(客觀)
看有沒有經(jīng)歷10年以上的時(shí)間(客觀)
代碼評(píng)審:不是“做出來”,而是“做漂亮”晤锹。
Google’s Code Review Guidelines
設(shè)計(jì):代碼是否經(jīng)過精心設(shè)計(jì)并適合系統(tǒng)摩幔?
代碼是否符合開發(fā)者意圖?代碼對(duì)用戶是否友好鞭铆?
復(fù)雜性:代碼是否可以更簡(jiǎn)潔或衡?未來其他開發(fā)人員接手時(shí),是否易于理解與易用?
測(cè)試:代碼是否經(jīng)過正確且設(shè)計(jì)良好的自動(dòng)化測(cè)試封断?
命名:開發(fā)人員是否為變量斯辰、類、方法等選擇了明確的名稱坡疼?
注釋:注釋是否清晰有效彬呻?
風(fēng)格:代碼是否遵循了谷歌的代碼風(fēng)格?
文檔:開發(fā)人員是否同步更新了相關(guān)文檔回梧?
含金量高的比賽:
GCJ(Google Code Jam)废岂、Facebook Hacker Cup、KDD Cup
第五部分 行業(yè)大神
丹尼斯.里奇(Dennis Ritchie)
C語言之父狱意,UNIX系統(tǒng)聯(lián)合發(fā)明人
保持簡(jiǎn)潔
林納斯.托瓦茲
Linux之父湖苞,開源運(yùn)動(dòng)的發(fā)起人,發(fā)明git版本控制器
只是為了好玩
吉多.范羅蘇姆(Guido van Rossum)
Python之父
允許不完美详囤、保持開放
瑪格麗特.漢密爾頓(Margaret Hamilton)
拯救人類登月計(jì)劃
制定規(guī)范财骨,嚴(yán)格測(cè)試
杰夫.迪恩
開創(chuàng)分布式系統(tǒng)
開創(chuàng)新領(lǐng)域
法布里斯.貝拉
QEMU、FFmpeg藏姐、TinyC隆箩、QuickJS
一個(gè)人就是一支隊(duì)伍