如何才能做好一個軟件系統(tǒng)?
前言
? ? ?在2014年左右,當時我們創(chuàng)業(yè)成立了一家軟件公司,主要服務于中小客戶,幫助客戶實現(xiàn)業(yè)務的互聯(lián)網(wǎng)化,我作為公司的技術負責人,一直負責公司里的技術管理+技術框架,我們主要做的產(chǎn)品形態(tài)以手機APP為主,在2016年年初的時候,我們團隊已經(jīng)有30多人,主要都是些軟件工程師。然后好景不長在2016年底公司因為項目交付出了問題,導致資金鏈斷裂致使公司倒閉了。如何才能做好項目交付?就成了我一個非常想搞清楚的問題。? ??
? ? ?后來,我們創(chuàng)業(yè)團隊解散后,就各自在不同的賽道上繼續(xù)創(chuàng)業(yè)了,當時我們團隊在做汽配商場的產(chǎn)品軟件,我們迭代產(chǎn)品搞了將近一年的時間,從18年10月份搞到19年底,我們技術上采用了前沿的技術,管理上也采用了敏捷項目管理模式,但最終的產(chǎn)品表現(xiàn)也很一般,拋開需求變更這些干擾只是從項目技術上來說,我也感覺沒有那么讓人滿意,當時非常的迷茫,都不清楚該超什么地方努力才能做好項目??
? ? ? 在2020年,疫情開始以后徹底打亂了我們的市場規(guī)劃,當時汽配行業(yè)受疫情影響非常嚴重,我們堅持到五一然后也就放棄了。同年在10月份,我加入了一家新三板上市公司,擔任技術負責人。公司主要服務于政府/事業(yè)單位的客戶,公司的人員規(guī)模與體量都要大很多。公司也始終與其他的兄弟公司保持交流,也借鑒很多大型企業(yè)的管理理念與方式,而且在2022年公司還獲得了CMMI5認證,但是公司的項目交付上卻也非常吃力,到底如何才能做好一個軟件系統(tǒng)呢??
實踐
? ? ?上面說道的三段不同的經(jīng)歷過程中,我都在思考這個問題,也為此做了不同的實踐嘗試: 1. 通過企業(yè)考核制度確保質量?
2. 通過采用前沿的項目管理方式?
3. 利用領域驅動設計+單元測試確保質量?
三種實踐的結果 ??
實踐一 ??
? ? ?由于當時我們沒有完備的軟件流程,且流程與流程之間的責任很多地方存在盲區(qū),盡管我們設置了一套考核管理體系,但是由于大家對制度上不認同,反而讓很多人產(chǎn)生了敵對心里,最終的結果是:考核失敗、公司倒閉而結束。?
實踐二 ??
? ? 我們把敏捷項目管理方式納入到了項目管理過程中,同時也采用了騰訊的TAPD管理平臺作為管理工具,嚴格的執(zhí)行敏捷模式,每1~2周進行一次版本迭代,采用springcloud技術開發(fā),通過CI/CD實現(xiàn)自動化編譯與部署,上線前也都做功能測試,但是最終我們的產(chǎn)品質量也就剛剛60分及格。? ?主要的有如下幾個問題:
? ? ? ?1、經(jīng)常事與愿違 ??
? ? ? ? 在緊急上線的時候,無法完全走完預定流程。經(jīng)常在上線的時候保持高度緊張,經(jīng)常熬夜上線,但是百密一疏終有一漏,可能第二天一早就被客戶的電話給叫醒。 ? ?
? ? ? ?2、測試覆蓋不全面 ??
? ? ? ?測試盡管也有測試用例,但測試的方式主要主要是靠人,由于測試的精力有限,再加上通常半夜上線,導致測試往往每次部署后,主要關注本次部署的功能,而開發(fā)過程中經(jīng)常出現(xiàn)把當前問題解決了,卻引發(fā)了新的問題的時候。我們當時也期望引進單元測試實現(xiàn)對代碼質量的監(jiān)控,但是由于當時采用的是面向數(shù)據(jù)驅動的方式開發(fā),單元測試落地成本極高,所以也是嘗試了一段時間就放棄了。 ??
? ? ?? 3、陷入bug的死循環(huán) ? ?
? ? ? ? 由于沒有良好的檢測機制,無法做不到對功能的全面覆蓋,不可避免的會導致系統(tǒng)上線后產(chǎn)生bug,而由于是在運行中的系統(tǒng),帶著bug上線致使團隊不僅要面對新需求以及修復缺陷,還要投入很大經(jīng)歷在做數(shù)據(jù)恢復與數(shù)據(jù)的處理中。然而bug反反復復,然后就天天的寫bug改bug了。?
實踐三 ??
? ? ? 2019年,在我看了一篇名為《復雜業(yè)務代碼要怎么寫》的文章后,被領域驅動設計所深深的吸引了,然后就一頭扎進了領域驅動設計的學習中了,我最開始對這個技術感興趣,就是感覺能夠用它來解決軟件開發(fā)的質量問題,在2020年我?guī)缀醢盐?0%的興趣都投身了領域驅動設計,然后在我在加入這家公司時,我也基本掌握了領域驅動設計的思想了,也就頗不期待的將這套思想模式引入了公司的當前研發(fā)體系。我當時經(jīng)常激情澎湃的給大家做分享講解,每次大家也都聽的熱火朝天,但是結果卻是道理都非常認同,狀態(tài)非常nice,就是不清楚該怎么做。我為了落地這套理念,也投入到一線帶隊參與項目的開發(fā),但由于我在公司里其他的事情比較多就在一個月后脫離出來了,結果這個項目最終的結果卻是“四不像”,最終也以理念落地失敗而告終,后由被強行改回了數(shù)據(jù)驅動開發(fā)的三層架構。 ? 分析主要的原因如下: ??
? ? ?1. 企業(yè)過度重視交付,不夠重視軟件本身 ? ?
? ? ? ? 公司研發(fā)團隊,一直都忙于項目交付,盡管很多個人對這套體系非常認同,但是迫于項目進度的壓力,且自己短時間內也不知從何下手,就導致沒法推動落地了。所以我一直認為,這次失敗與公司層面不足夠重視,沒有投入太大精力去嘗試有關。?
? ? ?2. 大家過分的追求技術,不重視設計與思想 ? ?
? ? ? ?從事技術的人做的時間久了,無論是個人,還是客戶,都比較喜歡追求技術,喜歡研究學習更前沿的技術,例如:人工智能、區(qū)塊鏈、云原生等等。而相比領域驅動設計,就顯得有些冷門,即便學會了也不能讓你瞬間可以上天入地。再加上追隨的人越多互聯(lián)網(wǎng)上的資源也越多,反之亦然,領域驅動設計在互聯(lián)網(wǎng)上的資料就非常的有限,而且還存在很多誤導。當大家習慣了沉浸在當前熟悉的領域中以后,就更加難以脫離,而且對其模式都比較的排斥,,再加上領域驅動設計是一種編程思想,不是技術框架,所以更在難短時間內掌握。 ??
? ? 3. 缺乏系統(tǒng)的學習體系,缺乏對軟件的敬畏 ??
? ? ? ?目前我了解到,還沒有哪家學?;蛘吲嘤枡C構會教大家該如何做好軟件工程,領域驅動設計更也不在教學范圍之內。唯一與領域驅動設計有關系的也就是面向對象了,領域驅動設計思想底層是就是面向對象,而很多人都認為面向對象只是面試時需要掌握的知識,基本是過了面試以后就都還給了老師。市場上缺乏對設計模式與思想的追捧,市場上更多的是對技術本身的追捧。?
總結
? ? ?如何才能做好一個軟件系統(tǒng)?開始我是被動面對這個問題的,在此之前我從沒有思考過這個問題,當時感覺自己的技術還不錯,還擁有開源項目,也做過那么多的項目,處理過各種技術問題,總覺得做好項目,有我這個技術大佬在就沒有問題。 ??
? ? ?后來我希望依靠管理的提升來解決這個問題,學習了《敏捷項目管理》、《OKR》、《一分鐘經(jīng)理人》,才有先進的技術與自動化的策略,但是最終卻僅僅是及格的成績。? ? ? ?
? ? ?在學習完領域驅動設計,我明白了什么是面向對象開發(fā),也懂得如何將業(yè)務轉變成領域對象,而且可以非常容易的對對象做全方面的單元測試,以保證軟件業(yè)務的質量。同時也學會了如何通過領域對象來應對需求的變化,面對需求變化的時候,做到游刃有余。? ? ??
? ? ?我在公司里以EPG組長角色參與了CMMI5的認證,整個過程中我也都是帶著問題去學習的,整個過程我的收獲也頗多,不僅學會了如何通過數(shù)據(jù)量化分析的方式來支撐流程上的改動,也學會了如何通過數(shù)據(jù)分析發(fā)現(xiàn)出流程背后的問題,完成認證以后我在公司里也做了一個自我分享,整理了30多頁對CMMI5的理解。整個CMMI5過程盡管是對軟件管理能力成熟度做的評價,但是其本身并不局限在技術上,也不局限在某一個流程上,它是一套可以收斂的制度體系,只要按照其理念方式去不斷的優(yōu)化,最終就可以得到自己滿意的模型。 ??
? ? ? 我從12年工作到現(xiàn)在為止10年的時間里我曾經(jīng)學習過非常多的技術,學過深度學習、區(qū)塊鏈、大數(shù)據(jù),也學過分布式、容器化、云原生等各種前沿的技術,但是最讓我感覺的收獲最大的還是DDD和面向對象。軟件可也分兩個維度,一個是術,就是各種技術體系,一個是道,就是設計思想、設計模式、面向對象等。道雖然難以理解,卻不怎么變化,術雖然非常亮眼,卻不斷變化。?
情懷
? ? ? 在18/19年,我當時在做分布式事務框架的時候,那時候很多出版社聯(lián)系我,希望我可以出一本分布式事務的書。我沒有去做,因為我感覺分布式事務就是一個技術框架,再就是不知道能給讀者留給什么東西,我不希望為了出書而出書。 ??
? ? ? ?而在今年我想好了寫的內容的時候,卻已經(jīng)找不到合適的出版社了,因為我想寫分享面向對象開發(fā)和領域驅動設計的相關內容,而這類的書卻因為比較冷門不被追捧,不好賣,所以出版社不太同意合作。?
? ? ? ?科學重于方法,不在于技術。個人感覺真正實現(xiàn)國產(chǎn)化軟件崛起,要學習更先進的軟件工程管理經(jīng)驗,要學習更先進的設計思想,而非技術本身。 ?
? ? ? ?我希望可以靠自己的這份微薄之力,能夠讓更多的人了解真正的軟件工程,我目前也通過B站、GitHub同時開源分享了關于領域驅動設計相關的知識技術,也希望大家多多關注,因為只有更多的關注才能讓更多的人有機會關注到。?
GitHub:https://github.com/codingapi/springboot-framework
B站:?https://space.bilibili.com/386239614?spm_id_from=333.1007.0.0?
推薦
[如何做好一個后端項目](https://github.com/1991wangliang/springboot-ddd-demo) ?
[復雜業(yè)務代碼要怎么寫](https://blog.csdn.net/significantfrank/article/details/98087611)?
[領域模型、貧血模型、充血模型概念總結](https://www.cnblogs.com/duanxz/p/9922170.html)? ?
[分離業(yè)務邏輯和技術細節(jié)](https://blog.csdn.net/significantfrank/article/details/94593620)
[設計模式](https://www.runoob.com/design-pattern/design-pattern-intro.html)