? ? ? ? 這應(yīng)該是這次項(xiàng)目的總后一篇總結(jié)文章了,Winner Club作為三月演武堂成立來(lái)完成的第一個(gè)商業(yè)項(xiàng)目,于7月28日正式交付,項(xiàng)目組人員也在當(dāng)晚進(jìn)行了總結(jié)。
? ? ? ? 下面是會(huì)議總結(jié)的要點(diǎn):
? ? ? ? 1. 學(xué)長(zhǎng)之后可能就不再參與代碼環(huán)節(jié)了。
? ? ? ? 確實(shí)這次學(xué)長(zhǎng)參與了項(xiàng)目很多重要代碼部分。比如小桑學(xué)長(zhǎng)主要負(fù)責(zé)后端環(huán)境的搭建和一些比較難的接口的開(kāi)發(fā)。騰飛學(xué)長(zhǎng)負(fù)責(zé)了一些關(guān)鍵組件的開(kāi)發(fā)。這幾天我從一些書(shū)中也了解到在客戶、項(xiàng)目負(fù)責(zé)人與程序員之間的分工,項(xiàng)目負(fù)責(zé)人正常來(lái)說(shuō)是不負(fù)責(zé)代碼的開(kāi)發(fā)的。不過(guò)有了第一次整體的流程和項(xiàng)目結(jié)構(gòu),我相信之后我們就可以步入正軌。
? ? ? ? 2. 時(shí)間評(píng)估
????????一開(kāi)始我與小桑學(xué)長(zhǎng)定的后端接口時(shí)間就是一個(gè)星期,大體的開(kāi)發(fā)速度基本上和我們規(guī)劃的一致,差不多用了6天就完成了第一版接口的開(kāi)發(fā),雖然部分接口不完美并存在一定的bug,但是沒(méi)有影響、耽誤前端的使用。但是前端方面確實(shí)時(shí)間評(píng)估上都有些失算,不過(guò)前端的難度也確實(shí)挺大的,因?yàn)榻缑嬉粩嗟男薷耐晟啤?/p>
? ? ? ? 但是時(shí)間上的評(píng)估還是要精算(花一定的時(shí)間去計(jì)劃、計(jì)算),否則一直延期是很不好的一件事。定的什么時(shí)間完成,就應(yīng)該在什么時(shí)間完成,為此我們還熬了一次夜。
? ? ? ? 3. 可交付的認(rèn)知程度? ? ? ??
????????我們以前做一個(gè)項(xiàng)目可能大多采用螺旋的開(kāi)發(fā)模式,盡量為客戶出第一版,項(xiàng)目整體的流程跑通,可以有部分不致命的bug,但是這次學(xué)長(zhǎng)對(duì)我們的要求是比較高的,特別是對(duì)于前端,可以說(shuō)是一直在改,一直在美化。可交付的狀態(tài)在我看來(lái)就是可以交付給甲方進(jìn)行商用了,正常情況下前后端已經(jīng)是不能再出現(xiàn)bug了。
????????所以要對(duì)自己的任務(wù)和整體的進(jìn)度情況有清晰的認(rèn)識(shí)。
? ? ? ? 4. 不要總看自己那一塊,多交流,看總體
? ? ? ? 由于后端在后期都只由我一個(gè)人進(jìn)行維護(hù)了,所以后端交流的部分比較少,主要是前期和學(xué)長(zhǎng)交流了一些參數(shù)格式和方法規(guī)范,后端的總體后期也是我一個(gè)人把控了。小程序界面是3個(gè)人開(kāi)發(fā),他們的交流是遠(yuǎn)多于我的,因?yàn)樗麄兊捻?yè)面相互影響,可能需要其他人所做的組件等等,所以要不斷交流,我能做的就是在空余時(shí)間多去關(guān)注他們的進(jìn)度,看能否幫上什么忙。
? ? ? ? 關(guān)于看總體,我覺(jué)得前端的各個(gè)人員的進(jìn)度要保證一致,不能太快也不能太慢,因?yàn)榇蠖囗?yè)面之間互相影響,所以前端一定要保證進(jìn)度的一致性,即看總體。
? ? ? ? 5. 需求文檔看仔細(xì)
? ? ? ? 這個(gè)問(wèn)題前端、后端都有,一開(kāi)始過(guò)文檔還是有些草率,部分情況沒(méi)有考慮清楚,就例如后端最嚴(yán)重的問(wèn)題就是文件存儲(chǔ)的設(shè)計(jì),一開(kāi)數(shù)據(jù)庫(kù)在這方面沒(méi)有設(shè)計(jì)好,導(dǎo)致后期影響了好多的表,而且目前更改過(guò)的還不好擴(kuò)展。前端的肯定也會(huì)有,但是更改起來(lái)相較于后端會(huì)輕松一些。
? ? ? ? 文檔如果沒(méi)有看仔細(xì),可能會(huì)多些一些冗余功能或者少寫(xiě)一些必要功能,這其實(shí)都是小事,要避免對(duì)其他模塊的影響,和方便后期的擴(kuò)展,反正看需求是十分重要的一個(gè)階段,這是毋庸置疑的。
? ? ? ? 6. 代碼質(zhì)量
? ? ? ? 可能這里又會(huì)牽扯到好多小細(xì)節(jié),例如規(guī)范、可擴(kuò)展性、可維護(hù)性、集成程度、耦合程度、設(shè)計(jì)模式等等。由于這是第一由兩個(gè)學(xué)長(zhǎng)帶著做,所以代碼質(zhì)量這一關(guān)還是拿捏的死死的。后端我是寫(xiě)第一個(gè)接口十分謹(jǐn)慎,寫(xiě)完之后讓學(xué)長(zhǎng)看規(guī)范邏輯等等,又改了好幾次后終于才算合格,之后的接口都要按著這個(gè)規(guī)范來(lái)。
? ? ? ? 前端就更可怕,學(xué)長(zhǎng)后期甚至把某一模塊的代碼全部重寫(xiě),就是因?yàn)橘|(zhì)量。前端還要將代碼組件化,意“即插即用”的設(shè)計(jì)思想。
? ? ? ? 總之功能不是實(shí)現(xiàn)了即可,要考慮諸多因素,這也就是為何技術(shù)越深反倒開(kāi)發(fā)某一模塊的速度相對(duì)較滿(不絕對(duì)),因?yàn)橐紤]的因素多。
? ? ? ? 7. 不斷評(píng)估自己? ? ? ??
? ? ? ? 在做項(xiàng)目的時(shí)候可以反映出來(lái)自己的真實(shí)水平,借此也可以看出自己的不足,協(xié)作開(kāi)發(fā)的時(shí)候也可以看出自己與他人的差距。那后端來(lái)說(shuō),搭建環(huán)境這塊我確實(shí)比較弱,我需要吸收這次學(xué)長(zhǎng)搭建的環(huán)境,相比學(xué)長(zhǎng)的學(xué)習(xí)能力,我也是自愧不如。
? ? ? ? 所以,在做項(xiàng)目的同時(shí),也要不斷評(píng)估自己,對(duì)比他人來(lái)找到不足。
? ? ? ? 8. 自己再封裝
? ? ? ? 別人寫(xiě)的好的組件當(dāng)然可以拿來(lái)用,自己也可以對(duì)其再封裝,我覺(jué)得這也是對(duì)應(yīng)著java的三大特性。當(dāng)然在我看來(lái)也不是集成度越高越好,能最優(yōu)化的方便自己和他人才是最好的封裝。
? ? ? ? 9. 可以將github上的開(kāi)源框架拉下來(lái),修改、提PR。
? ? ? ? 其實(shí)之前我還真的不知道可以這樣子做,知道這次項(xiàng)目學(xué)習(xí)了git flow流程之后才恍然大悟。學(xué)長(zhǎng)同時(shí)也說(shuō)如果自己代碼有合進(jìn)去,這對(duì)之后的面試是非常加分的,這不僅是對(duì)自己實(shí)力的認(rèn)可,也能反映出自己對(duì)代碼的理解與思考。
? ? ? ? 但是這一項(xiàng)對(duì)自身實(shí)力的要求還是非常的大的,所以還是要不斷提升自己才行。
? ? ? ? 10. 多看好的代碼
? ? ? ? 這一點(diǎn)很早之前學(xué)長(zhǎng)就教導(dǎo)我們要看好的代碼,但是我們可能最多只能看個(gè)規(guī)范,因?yàn)榇蠖鄶?shù)好的代碼以前根本看不懂其中的設(shè)計(jì)思想。目前我認(rèn)為我要做的就是先吸收兩個(gè)學(xué)長(zhǎng)在項(xiàng)目中所貢獻(xiàn)的代碼,先把自己的代碼質(zhì)量向兩個(gè)學(xué)長(zhǎng)靠近。
? ? ? ? 11. 前端的分工
? ? ? ? 這一塊雖然這次我沒(méi)有參與前端的開(kāi)發(fā),但是我也能感受到前端不好分工。這次我和小桑學(xué)長(zhǎng)在開(kāi)發(fā)后端的時(shí)候,幾乎在代碼上是0沖突,因?yàn)楹蠖嘶旧隙际敲嫦蚪涌陂_(kāi)發(fā),一個(gè)接口一個(gè)人,不同開(kāi)發(fā)人員之間不參與他人編寫(xiě)的接口,所以后端開(kāi)發(fā)相對(duì)獨(dú)立。
? ? ? ? 但是前端這一塊我感覺(jué)無(wú)論是按頁(yè)面分工還是按功能分工,都很有可能會(huì)造成兩個(gè)人、或多人參與一個(gè)頁(yè)面的制作,所以這次前端開(kāi)發(fā)造成的沖突就非常的多,一定程度上也影響了整體的進(jìn)度。
? ? ? ? 讓我們來(lái)分析一下造成的原因無(wú)外乎就是大量的代碼堆積到了一個(gè)頁(yè)面中。解決這種沖突的有效方法我認(rèn)為還是組件化開(kāi)發(fā),一個(gè)組件僅由一個(gè)人開(kāi)發(fā),頁(yè)面只是一個(gè)容器,去引用這些組件。
? ? ? ? 通俗的來(lái)說(shuō)就是,把一個(gè)頁(yè)面分成view合component,view就像一個(gè)無(wú)限長(zhǎng)的排插,component就是一個(gè)個(gè)的電器,他們就像是一個(gè)個(gè)的component連接/插到了view上一樣,view的代碼量很少,便于維護(hù),而component僅由一個(gè)人開(kāi)發(fā),避免了沖突。所以說(shuō)還是這種即插即用的思想,極大的降低了耦合,減少了沖突的出現(xiàn)。
? ? ? ? 有關(guān)前端的設(shè)計(jì)模式合代碼結(jié)構(gòu)還有待細(xì)細(xì)挖掘。
? ? ? ? 12. 遇到問(wèn)題的解決思路
? ? ? ? 我個(gè)人覺(jué)得我自己面臨問(wèn)題時(shí)解決流程還是比較清晰的,如果我自己的代碼出了bug,首先看控制臺(tái)輸出定位代碼,再思考邏輯。還沒(méi)有解決就開(kāi)始調(diào)試,一步步定位問(wèn)題。還不行就把錯(cuò)誤復(fù)制放到百度上查,如果最后還沒(méi)有解決就得問(wèn)其他人了。
? ? ? ? 學(xué)長(zhǎng)建議的解決思路和這個(gè)差不多,不過(guò)在百度上查之前應(yīng)該再加上兩個(gè)流程,一個(gè)是看官方文檔,看看是不是方法要求參數(shù)沒(méi)有看仔細(xì),哪里的調(diào)用邏輯或是配置有誤,如果還是沒(méi)有幫助再去所使用框架的社區(qū)或是對(duì)應(yīng)問(wèn)題的相關(guān)社區(qū)搜尋答案,最后再在百度上搜索(主要還是因?yàn)榘俣壬系拇鸢柑s,真正有效的并不多)。
? ? ? ? 13. 后端api要先開(kāi)發(fā)出來(lái)
? ? ? ? 這個(gè)又和我以前的認(rèn)知大相徑庭。學(xué)長(zhǎng)說(shuō)接口要一開(kāi)始和前端溝通好,例如商量要寫(xiě)什么接口,這些接口要有什么參數(shù),要先把接口定好,并讓前端review,之后可能就不會(huì)在接口上出現(xiàn)協(xié)商不一致的情況了。
? ? ? ? 而我現(xiàn)在開(kāi)發(fā)接口就是自己先寫(xiě),前端發(fā)現(xiàn)缺什么接口和說(shuō)參數(shù)我再補(bǔ)再改,現(xiàn)在看來(lái)確實(shí)很不規(guī)范。? ? ?
? ? ? ? 這也就是為什么造成項(xiàng)目delay的原因大多數(shù)情況下并不是因?yàn)閭€(gè)人自身的能力問(wèn)題,而是一開(kāi)始前后端協(xié)商不一致導(dǎo)致后期的大改。
? ? ? ? 14. 聯(lián)調(diào)
????????我認(rèn)為聯(lián)調(diào)不應(yīng)該集中到一個(gè)時(shí)間點(diǎn)整體聯(lián)調(diào),聯(lián)調(diào)應(yīng)該放在平時(shí),小規(guī)模的聯(lián)調(diào)可以在平時(shí)就發(fā)現(xiàn)彼此之間的問(wèn)題。如果所有模塊都堆在一起集中聯(lián)調(diào),有bug基本上是100%的,而且還有可能因?yàn)槟承┣爸胋ug導(dǎo)致某些隱藏的bug無(wú)法發(fā)現(xiàn),進(jìn)而導(dǎo)致下一次集體聯(lián)調(diào)又出現(xiàn)bug。
? ? ? ? 15.?卓越的工程師
? ? ? ? 一個(gè)卓越的工程師不僅是技能過(guò)硬,同時(shí)也要能夠把控總體。我認(rèn)為前端這次缺少的就是一個(gè)能夠把控整體的人,缺少一個(gè)可以做領(lǐng)頭羊的人。一個(gè)卓越的工程師在自己模塊開(kāi)發(fā)過(guò)程中,要不斷聯(lián)系項(xiàng)目組的其他成員,統(tǒng)計(jì)進(jìn)度、做總結(jié),及時(shí)發(fā)現(xiàn)問(wèn)題、更改計(jì)劃等等,簡(jiǎn)而言之就是開(kāi)發(fā)組的組長(zhǎng)。
? ? ? ? 16. 做一個(gè)靠譜的人
????????這也是學(xué)長(zhǎng)最后一直強(qiáng)調(diào)的事情——做一個(gè)靠譜的人。這可能要從多方面考慮,首先在項(xiàng)目進(jìn)度上不能掉鏈子,自己的模塊不能出問(wèn)題影響整體。其次自己要對(duì)自己的代碼負(fù)責(zé),就像上面說(shuō)的代碼質(zhì)量,不能做出結(jié)果就完事了,不僅自己要便于維護(hù),以后也要讓他人便于維護(hù)。如果自己的模塊真的出問(wèn)題了也要能快速反映想到問(wèn)題所在并及時(shí)解決,這一點(diǎn)前端后端都要具備。
? ? ? ? 最后,還是騰飛學(xué)長(zhǎng)的那句話:以目標(biāo)為導(dǎo)向,承諾即交付。
? ? ? ? 不是面向需求開(kāi)發(fā),而是面向需求變更開(kāi)發(fā)。(玉寶學(xué)長(zhǎng))