經(jīng)歷了將近一年的時(shí)間,我終于階段性地完成了從iOS開(kāi)發(fā)到后端開(kāi)發(fā)的角色轉(zhuǎn)變。
現(xiàn)在我可以自豪地說(shuō),我已經(jīng)接近一名全棧工程師了,已經(jīng)熟悉了后端開(kāi)發(fā)的各種工具、環(huán)境和一些后端工作的方式。
接下來(lái),我將繼續(xù)熟悉框架、工具、語(yǔ)言,并繼續(xù)深入研究后端的一些技術(shù)方案和實(shí)現(xiàn)策略。
通用軟件開(kāi)發(fā)流程
在這將近一年當(dāng)中,經(jīng)歷過(guò)太多的坑了。
幸運(yùn)的是,我們作為一名通用軟件的工程師,這個(gè)行業(yè)發(fā)展了這么多年,其工作流程已經(jīng)趨于穩(wěn)定。
所以,在我個(gè)人看來(lái),無(wú)論是什么樣的開(kāi)發(fā)角色,對(duì)于開(kāi)發(fā)這個(gè)崗位來(lái)說(shuō),我們大致可以將知識(shí)結(jié)構(gòu)分為以下幾個(gè)方面:
- 語(yǔ)言
- 框架
- IDE
- 依賴(lài)管理
- 測(cè)試框架
- 編譯運(yùn)行環(huán)境
- 運(yùn)行平臺(tái)
- 打包工具
- 部署方式
- CI/CD配置
- 性能指標(biāo)
如下圖所示,例如:
做iOS開(kāi)發(fā)的語(yǔ)言就是OC或者swift,我們學(xué)習(xí)語(yǔ)言特性之后,需要學(xué)習(xí)如何使用對(duì)應(yīng)的框架進(jìn)行開(kāi)發(fā),開(kāi)發(fā)過(guò)程中,我們用Cocoapods做依賴(lài)管理,使用XCTest寫(xiě)測(cè)試代碼,最后經(jīng)過(guò)LLVM和Mach-O的編譯打包后生成了IPA包,我們將IPA通過(guò)Xcode發(fā)布到AppStore中,然后用戶(hù)可以下載并運(yùn)行在相應(yīng)的AppleOS(iOS/iPadOS/MacOS/WatchOS…)中,并且上線(xiàn)后我們需要重點(diǎn)關(guān)注的指標(biāo)是崩潰率和卡頓率。
那么我們也可以將這些模塊映射到后端的學(xué)習(xí)中去。
后端開(kāi)發(fā)也會(huì)大致遵循這個(gè)結(jié)構(gòu),就像流水線(xiàn)上的各個(gè)工位一樣,每一步都是需要做的,只是使用的工具和方式不同罷了。
接下來(lái),比如,我們選擇JS語(yǔ)言進(jìn)行后端開(kāi)發(fā),那么我們一定也會(huì)選擇一個(gè)框架(如果不是從底層開(kāi)始寫(xiě)的話(huà)),假如我們選擇了NestJS框架,那我們肯定也會(huì)問(wèn),管理依賴(lài)用什么做呢?測(cè)試用什么框架寫(xiě)呢?哪個(gè)IDE好用呢?我要如何將它進(jìn)行打包發(fā)布呢?上線(xiàn)之后我們用什么指標(biāo)作為衡量其好壞的標(biāo)準(zhǔn)呢?
一旦我們擁有了針對(duì)整個(gè)流水線(xiàn)或者工作流程的認(rèn)知,我們接下來(lái)要做的,只是在尋找有什么工具能夠?qū)崿F(xiàn)這一步驟而已,如此,對(duì)于快速學(xué)習(xí)上手很有幫助。
這里,有一個(gè)網(wǎng)站,或許能有所助益,https://roadmap.sh
借助這個(gè)網(wǎng)站,我們可以清晰地規(guī)劃自己的學(xué)習(xí)路徑。
開(kāi)發(fā)過(guò)程側(cè)重點(diǎn)的轉(zhuǎn)變
正所謂屁股決定腦袋,作為一名前端或者iOS開(kāi)發(fā),在開(kāi)發(fā)過(guò)程中的側(cè)重點(diǎn)一般在以下幾個(gè)方面(按照我腦袋中的順序排列)
-
UI/UX的實(shí)現(xiàn)
-
怎樣的數(shù)據(jù)結(jié)構(gòu)可以更好地驅(qū)動(dòng)UI
-
如何和后端交互
-
各個(gè)模塊之間如何更好地調(diào)用
-
如何更好地持久化數(shù)據(jù)
-
如何更好地使用線(xiàn)程,協(xié)調(diào)UI渲染時(shí)的主線(xiàn)程和其他線(xiàn)程
-
如何讓CI/CD更有效率
-
降低崩潰率/卡頓率
而在后端開(kāi)發(fā)過(guò)程中,我的側(cè)重點(diǎn)變成以下幾個(gè)方面了:
-
數(shù)據(jù)如何更好的存儲(chǔ),注重表結(jié)構(gòu)的設(shè)計(jì)
-
如何和前端更好地交互
-
contract怎么設(shè)計(jì)
-
怎么更好的兼容多平臺(tái),例如,Auth怎么做,BFF怎么做,數(shù)據(jù)結(jié)構(gòu)怎么設(shè)計(jì)
-
怎么更好地做API的版本管理
-
-
各個(gè)模塊或者服務(wù)之間如何更好地協(xié)作,如何更好地設(shè)計(jì)事件
-
CI/CD怎么更有效率,不同環(huán)境的部署怎么做能更好地做E2E測(cè)試
-
降低接口響應(yīng)時(shí)間/HTTP錯(cuò)誤率
當(dāng)然,側(cè)重點(diǎn)的轉(zhuǎn)變主要還是因?yàn)榍岸撕秃蠖说姆?wù)對(duì)象不同。
前端應(yīng)用更多的是服務(wù)用戶(hù),所以如何將頁(yè)面做的更好是首要,然后再向后思考如何更好地為頁(yè)面汲取數(shù)據(jù)。
而后端更多的是服務(wù)前端,或者其他后端服務(wù),重點(diǎn)在于數(shù)據(jù)處理和API設(shè)計(jì),所以數(shù)據(jù)是首要,如何存儲(chǔ)數(shù)據(jù),如何傳輸數(shù)據(jù),是重中之重。
開(kāi)發(fā)者思維角度的轉(zhuǎn)變
由于工作的側(cè)重點(diǎn)變了,所以思考的方式也會(huì)隨之改變。
作為一名iOS開(kāi)發(fā),在日常生活中,我會(huì)習(xí)慣性地對(duì)一個(gè)正在使用的APP思考,這個(gè)特效是如何實(shí)現(xiàn)的,這個(gè)APP的頁(yè)面是如何組織起來(lái)的,或者這么多頁(yè)面同時(shí)存在切換,它是如何進(jìn)行內(nèi)存管理的?
而作為一名后端開(kāi)發(fā),我開(kāi)始思考的是,微博的互粉功能在數(shù)據(jù)結(jié)構(gòu)上是怎么保證高效率查找的?微信消息是怎么做到丟失率這么低的?
更加明顯的是,在進(jìn)行需求分析的時(shí)候,之前習(xí)慣性的將頁(yè)面作為錨點(diǎn),比如討論業(yè)務(wù)需求首先確定這個(gè)頁(yè)面交互如何實(shí)現(xiàn),然后確定什么數(shù)據(jù)更好的驅(qū)動(dòng)頁(yè)面,然后再定API。
而對(duì)于后端,更多考慮的是背后的數(shù)據(jù)表字段怎么定義,表關(guān)系如何管理。
但是,可喜的是,由于現(xiàn)在同時(shí)具備這些經(jīng)驗(yàn)了,所以又可以提起那個(gè)老生常談的策略:分層,或者分而治之。
所以,在進(jìn)行需求分析的時(shí)候,更多的關(guān)注點(diǎn),或者切入點(diǎn)就是BFF和contract怎么定義,用AOP的方式管理團(tuán)隊(duì)的關(guān)注重點(diǎn),大家討論的時(shí)候只關(guān)注交互的地方,以及可能變化的地方,剩下的工作都在各自的領(lǐng)域中進(jìn)行,互不影響。
這種方式同樣適用iOS開(kāi)發(fā)內(nèi)部或者后端開(kāi)發(fā)內(nèi)部,比如我們同時(shí)完成一個(gè)大的功能,我負(fù)責(zé)A,你負(fù)責(zé)B,于是我們先定義好A和B的交互部分,將interface先實(shí)現(xiàn),然后各自回到自己的領(lǐng)域做事,最后面向interface接洽就好。
如何更好地理解業(yè)務(wù)
隨之而來(lái)的,我可以理解頁(yè)面,知道如何做UI/UX會(huì)更好地服務(wù)客戶(hù),現(xiàn)在也可以理解數(shù)據(jù),知道如何更好地讓數(shù)據(jù)流轉(zhuǎn)和存儲(chǔ),所以針對(duì)業(yè)務(wù),站在技術(shù)人員的角度,我們可以提供更多的建議,以及指導(dǎo)如何更好地拆解和實(shí)現(xiàn)業(yè)務(wù)。
比如,使用BFF來(lái)隔斷前端所需的數(shù)據(jù)結(jié)構(gòu)和內(nèi)部數(shù)據(jù)結(jié)構(gòu),用來(lái)避免業(yè)務(wù)變化對(duì)底層實(shí)現(xiàn)的影響,并且可以兼容各個(gè)平臺(tái),給不同的平臺(tái)分發(fā)不同的數(shù)據(jù)結(jié)構(gòu)。
業(yè)務(wù)的變化可以被隔離在domain中,前端對(duì)于domain的體現(xiàn)是不同的module,后端可以是module也可以是微服務(wù),然后我們討論時(shí)重點(diǎn)關(guān)注的是他們中間如何交互,而不是很多的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)
再比如,現(xiàn)在需要實(shí)現(xiàn)一個(gè)登錄功能:
-
作為前端,我只在乎如何畫(huà)出登錄頁(yè)面,調(diào)用登錄接口,持久化session然后進(jìn)入主頁(yè)面。
-
作為后端,我只在乎如何進(jìn)行Auth的實(shí)現(xiàn),然后存儲(chǔ)生成的 session并記錄日志。
可以從流程中看出來(lái),初始數(shù)據(jù)是前端提供的賬號(hào)密碼,從前端流向后端,而后端生成session,然后從后端流向前端,我們第一步需要做的就是確定數(shù)據(jù)怎么流,剩下的就是各自領(lǐng)域的事情,后端去研究數(shù)據(jù)怎么存,前端去研究頁(yè)面怎么畫(huà),僅此而已。
在此基礎(chǔ)之上,我們就可以把握整體,進(jìn)行更好地架構(gòu)設(shè)計(jì)和分層設(shè)計(jì)了。
并且無(wú)論是前后端之間,還是前端和后端各自?xún)?nèi)部的工作。
如何開(kāi)始
前面說(shuō)了一大堆,都是成為全棧之后的好處和所得。
那么,如果你也有這個(gè)計(jì)劃,你應(yīng)該如何尋找一個(gè)機(jī)會(huì),或者創(chuàng)造一個(gè)機(jī)會(huì)開(kāi)始呢?
從一個(gè)純粹的前端轉(zhuǎn)到后端,并不僅僅是技術(shù)棧的遷移,還包括思維視角的轉(zhuǎn)變。
首先,我們得確立轉(zhuǎn)職的原因:
-
主觀上
-
興趣學(xué)習(xí)
-
成為一名全棧開(kāi)發(fā)
-
成為一名TL
-
-
客觀上
-
項(xiàng)目需要
-
市場(chǎng)需要
-
如果僅僅是項(xiàng)目需要,那機(jī)會(huì)已經(jīng)送到眼前,相信一般情況下,項(xiàng)目上會(huì)給你時(shí)間和精力專(zhuān)門(mén)從事學(xué)習(xí),并且還有很多機(jī)會(huì)直接進(jìn)行開(kāi)發(fā),剩下的只是效率問(wèn)題。
但如果沒(méi)有客觀的條件支持,那么我的處理方式是,找一個(gè)你感興趣的APP,去思考它是如何實(shí)現(xiàn)這些功能的,然后嘗試著自己去實(shí)現(xiàn),例如小紅書(shū),微信等等。
用一個(gè)項(xiàng)目和實(shí)踐來(lái)承載你的學(xué)習(xí),這樣子,就不僅僅只是看看文檔,并且練手的時(shí)候順便分析學(xué)習(xí)了一個(gè)成熟產(chǎn)品,也不用耗神在創(chuàng)造技術(shù)的應(yīng)用場(chǎng)景上。
再接下來(lái),確定你要點(diǎn)哪些技能點(diǎn)。
從興趣,市場(chǎng)需求,各個(gè)方面,確定語(yǔ)言,確定框架,然后最好跟著官方文檔進(jìn)行學(xué)習(xí)吧。
上面分享的模塊化知識(shí)和roadmap網(wǎng)站在這里就非常有用。
或者跟著某個(gè)學(xué)習(xí)視頻來(lái)進(jìn)行學(xué)習(xí)和練手,但是會(huì)有幾個(gè)問(wèn)題:
-
講解的技術(shù)點(diǎn)不一定是官方最新建議的
-
一般這種視頻進(jìn)行的練手項(xiàng)目都很簡(jiǎn)單,不能完全應(yīng)對(duì)真實(shí)的使用場(chǎng)景
學(xué)習(xí)方式
學(xué)習(xí)需要區(qū)分了解和使用
在這里,我將知識(shí)點(diǎn)分為三類(lèi):
- 知識(shí)類(lèi):這種類(lèi)別的知識(shí)我們需要的是記住,例如我們看到狗就知道他是狗,例如我們知道我們需要用NodeJS去運(yùn)行我們的應(yīng)用。
這類(lèi)的知識(shí)主要在于主動(dòng)獲取并記住理解它。
- 技能類(lèi):這種類(lèi)別的知識(shí),就是唯手熟爾,例如我們需要熟練地使用JS中各種語(yǔ)法特性,我們知道拆分?jǐn)?shù)據(jù)需要用哪個(gè)函數(shù)。
有一些知識(shí)起初是知識(shí)類(lèi)類(lèi)的,當(dāng)我們知道了解后,但是一旦你運(yùn)用到實(shí)踐當(dāng)中,并且越來(lái)越熟練,就證明你徹底掌握了這項(xiàng)技能。
- 索引類(lèi):這種類(lèi)別的知識(shí),是技能類(lèi)退而求其次的產(chǎn)品,有些技能或者方式我們并不需要掌握的如此熟練,但是,我們是知道有這種方法存在的,在需要精確的書(shū)寫(xiě)實(shí)踐它的時(shí)候,再去查閱就行了。例如π的前30位數(shù)字,例如八皇后的算法。
而針對(duì)不同類(lèi)別的知識(shí),我們采取不同的學(xué)習(xí)方法。
語(yǔ)言
針對(duì)語(yǔ)言的學(xué)習(xí),重點(diǎn)在于練習(xí),是我們需要不斷使用和磨練的技能:
-
數(shù)據(jù)類(lèi)型
-
數(shù)據(jù)結(jié)構(gòu)
-
函數(shù)的定義和使用
-
線(xiàn)程
對(duì)于我而言,學(xué)習(xí)JS的時(shí)候,對(duì)應(yīng)著OC,或者Swift的一些語(yǔ)法結(jié)構(gòu),會(huì)學(xué)習(xí)的很快。
在這里其實(shí)也可以進(jìn)行各種模塊化,例如數(shù)據(jù)結(jié)構(gòu)其實(shí)已經(jīng)比較恒定,在不同的語(yǔ)言中,字符串、HashMap、數(shù)組、Decimal都有各自的處理方式方法,只是名稱(chēng)不同而已,實(shí)現(xiàn)的功能是一樣的。
再比如,無(wú)論是什么語(yǔ)言,都需要進(jìn)行函數(shù)調(diào)用棧的管理,只是實(shí)現(xiàn)方式不同罷了。
而一些特殊的地方,例如JS中的類(lèi)型解構(gòu),也可以找到對(duì)應(yīng)的概念去理解,例如Swift中的元組。
框架
針對(duì)框架,重點(diǎn)在于對(duì)控件的使用和對(duì)其文件組織方式的了解。
我們根據(jù)需求和興趣選擇某一個(gè)框架后,在這個(gè)框架中,構(gòu)建運(yùn)行應(yīng)用,使用其提供的工具進(jìn)行需求的實(shí)現(xiàn),例如在NestJS中使用TypeORM或者接入Kafka非常方便,它使用module-controller-service的方式來(lái)組織文件。
練習(xí)
在上面的陳述中,我提到可以選擇一個(gè)成熟的APP進(jìn)行仿作練習(xí),在這個(gè)過(guò)程中,使用TDD,并且使用ChatGPT來(lái)進(jìn)行結(jié)對(duì)編程簡(jiǎn)直是絕佳的選擇。
TDD可以幫助我們快速了解框架,語(yǔ)法和API的使用,而結(jié)對(duì)編程能夠幫助我們更好地了解它為什么這么寫(xiě),為什么能夠適用這個(gè)場(chǎng)景以及獲取一些經(jīng)驗(yàn),尤其在有了chatGPT之后,就算沒(méi)有一個(gè)大佬或者共同學(xué)習(xí)的小伙伴跟你結(jié)對(duì)編程,但是我們依然可以假裝在結(jié)對(duì)編程。
寫(xiě)在最后
在這快一年的時(shí)間里,我接觸了PHP,Typescript,React,React-Native,最近開(kāi)始研究研究ES的標(biāo)準(zhǔn),從一名iOS純開(kāi)發(fā)慢慢轉(zhuǎn)型到后端甚至全棧,在這個(gè)過(guò)程中不僅僅是提升了自己的技術(shù)能力。
更多的是了解了不同崗位之間思考的差異,能夠更好的作為T(mén)L拆分需求,跟各個(gè)崗位的同學(xué)們進(jìn)行溝通。
并且,經(jīng)過(guò)發(fā)現(xiàn)總結(jié)后,又提升了一點(diǎn)點(diǎn)自己快速學(xué)習(xí)的能力。
現(xiàn)在只是想寫(xiě)出來(lái),和大家共勉,其中當(dāng)然有很多不那么恰當(dāng)甚至錯(cuò)誤的理解,也希望能夠得到大家的指正。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-686336.html
文/Thoughtworks 宋奕興
原文鏈接:如何成為全棧開(kāi)發(fā)工程師-Thoughtworks洞見(jiàn)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-686336.html
到了這里,關(guān)于我是如何成為一名全棧工程師的?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!