1. 程式人生 > >記一次構建SaaS平臺專案失敗後的反思-技術VS產品哪個更重要-如何權衡-程式設計師職業生涯的自我批判與成長-業務型程式設計師的商業視角-多維度分析研發型企業管理之道

記一次構建SaaS平臺專案失敗後的反思-技術VS產品哪個更重要-如何權衡-程式設計師職業生涯的自我批判與成長-業務型程式設計師的商業視角-多維度分析研發型企業管理之道

記一次構建SaaS平臺專案失敗後的反思

前言: 筆者從2017年起開始著手將公司現有的軟體系統改造成多租戶模式,以降低整個系統的運營成本。但最後這個專案以失敗告終。今天,我將對這個SaaS專案是如何走向失敗,做一個分析和反思。

此前,我們花費了兩年的時間研發了一套教學系統,考慮到使用者的數量與營運成本,後期決定將這套單體的應用程式改造為基於SaaS架構的多租戶應用程式。經過短暫的需求分析後,便開始了重構工作。經過一年的艱苦奮鬥,SaaS化的產品不僅使用者不能接受,就連我們自己也無法成功運營。其功能的完成度差強人意,運營的成本也沒有比單體應用少,反而運營難度上升了。通過一段時間的整理與思考,總結了這一次SaaS化平臺失敗的原因。

一、不務實的需求

一個成功的SaaS產品,需要有足夠多的使用者需求樣本資料以及對這些樣本資料深入的挖掘、分析和抽象,以得到一份通用的,覆蓋率大的應用場景資料。只有如此,才能夠開發出一款具有普世價值的應用軟體,才能貼合SaaS使用者的實際需求。而在此次的SaaS化產品的過程中,我們犯了“閉門造車”的嚴重錯誤,導致這一錯誤產生的原因是我們拿到的原始需求不夠,僅僅憑藉一兩個客戶的需求資料,並以此為藍本展開系統的設計,實現了很多使用者根本不需要的功能,比如使用者只想要一個文件儲存的功能,我們實現了一個網盤的功能;又比如說我們沒有考慮到中學禁止學生使用手機,而我們的系統功能很多是基於移動端進行設計的,最後導致系統的功能和使用者的需求對不上號。當我們花了很長時間去實現一個自己認為很棒的功能時,客戶不認可這樣的設計給了我們狠狠的一劑耳光,痛並鬱悶著。

客戶需求資料過少,加之主觀上的臆想,導致了系統中充斥著大量華而不實的功能。表面上看,系統的各個功能都比較高大上,但就是這樣高大上的功能,卻和客戶的想法背道而馳。客戶的想法是最實際的,華麗的功能在一定程度上太過於注重“表演”,而無法真正幫助客戶解決實際的問題。

面對這樣一個問題,就需要在提出一個好的創意時,需要再三的與實際的需求做比對,只有創意與需求能夠契合在一起時,創意才能轉化為有效的功能,才能起到錦上添花的效果。而解決這一個問題,需要將如下的幾個工作落實到實處:

  • 1、獲取儘可能多的需求樣本資料
  • 2、對需求資料進行劃分、得出需求場景
  • 3、以場景建立使用者故事,梳理業務邏輯
  • 4、以業務邏輯為單元,評估系統規模,展開系統設計
  • 5、建立有效的溝通機制,及時將設計原型與使用者進行溝通,確定有效需求

下面,通過一張圖來說明如何排除不務實的系統需求:

記一次構建SaaS平臺專案失敗後的反思

 

說明:

在第一步中,我們需要收集不同使用者數量,不同知識結構、不同硬體環境以及不同資金支配能力的客戶需求,這樣才能從不同的維度去了解客戶的想法和業務痛點。如使用者量大的客戶,更則種系統的整體協能力,以及業務的流程的連貫性和時效性。而使用者量較小的客戶可能則重於系統的高效和便捷程度。對於可支配資金,直接影響著系統在設計時的佈局,如效能的分配和互動的體驗度,以及後期定製收費標準。

第二步、建立場景是為了把龐雜的需求進行切割,建立科學的需求分類,減輕需求分析的難度和時長。將雜亂的需求按照類別進行深入分析,挖掘客戶的業務痛點,為構建起使用者故事提供素材和依據。

第三步中,分析的視角將從區域性變為全域性,通過第二步得到資料,建立起使用者故事,以分析各需求之間的聯絡和各自的主線。

第四部是對需求進行統籌規劃,將需求變成可用的業務邏輯,並對此業務邏輯進行技術可行性和風險評估,最後將此評估結果與客戶需求進行比對和調整,確定最終的有效需求。

二、技術債務過大

任何應用程式的開發,都需要考慮技術債務問題,即木桶定理。從專案開始提案開始,就犯了技術冒進的錯誤。選擇了技術一系列比較新的技術框架和設計思想,如前後端分離設計,微服務化和容器化等較新的技術棧,以及專案開始實施前沒有做好相關技術的培訓工作,導致專案組成員的技術能力良莠不齊,專案推進緩慢,接連踩坑,很多關鍵技術沒有吃透,很多技術問題沒有解決,導致應用系統性能脆弱,部署週期長,運維難度大,直至後面專案擱淺。

出現這樣巨大的技術債務,是過於盲目的跟隨市場技術浪潮,沒有對自身團隊技術能力做一個有效的評估所造成的。新技術固然有它超越現有技術的威力所在,但弊病也不少。首先是學習成本,需要花費大量的時間對整個團隊進行培訓,而培訓並不是所有的人都能一個水平,從這開始,木桶的短板就開始產生了。由於技術掌握不牢固,開發工程中踩坑是避免不了的,這就導致專案進度急劇拉長,技術債務開始累積,最後的結果就是,產品千瘡百孔,無法使用。

由於花費的巨大的時間去解決技術問題,從而忽略了一開始的運維問題(更多的是無暇顧及,先把產品搞出來再說)。很多時候,在開發除錯階段應用程式沒有出現問題,一旦放到生產環境就開始問題百出。這是因為我們想當然的認為,新技術已經把所有的問題都解決了,抱著一種僥倖的心理,在匆忙之間將專案上線,從而忽視那些極為致命的問題,線上安全問題、效能問題、網路問題、環境問題、終端適配問題等等。

這些問題歸集到一起,主要問題出在架構師身上,導致可以終結出這種架構師的幾點特質:

  • 1、出方案靠拍腦袋,一錘子買賣。一拍腦袋,就這麼定了,根本沒有考慮後續的問題
  • 2、實現過程排胸脯,保證沒有問題。過於自信,導致太過自負。對於架構師而言,沒有問題就是最大的問題
  • 3、出問題排大腿,這麼回這樣。等到問題出現了,才恍然大悟,當初為什麼沒有想到會這樣
  • 4、程式崩潰排桌子,坑爹的框架。沒有認真的選擇合適的技術棧來完成專案,從一開始的設計從確定了系統的先天性頑疾,並不是框架本身的錯。

那麼,該如何避免技術債務過大的問題能?我的建議是杜絕設計上的冒進,不是新技術就一定好。可以採取小步快走,縮小升級範圍,先將非核心功能進行改造,實現系統平滑過渡到新的技術框架,也讓團隊的成員有一個適應期,避免一次性集中踩雷的風險。與此同時,還需注意另外一個問題,系統重構不等於推翻重來。很多人會覺得推翻重來一定會比之前的設計好,在一定程度上可以將之前系統暴露的問題進行規避,但新的設計又會帶來新的,更多的問題。所以,在進行升級過渡到SaaS產品時,一定要學會利用以後的成熟技術,減少升級的難度和成本,快速多批次的進行升級,這樣,即便出現問題,也可以將問題控制在一個可以接受的範圍,不至於蔓延至整個系統,甚至造成應用程式的不可用。

最後就是關於運維的問題,在設計一套系統架構時,一定要提前預估它的運維工作量,如果解決系統的“後顧之憂”,運維所帶來的技術債務不比開發過程的少,以這次專案為例,應用程式按照業務分成了若干個服務,每個服務對應著10到20個不等的執行例項,由於專案組無法拿出有效的容器化方案,以及部署環境不支援Docker容器技術,也沒有持續釋出應用例項的環境,最後只能人工手動維護200多個JAR包的執行例項,當出現應用程式不可用,或者宕機問題時,需要人工重啟對應的應用程式,這是一個糟糕的設計,或者說是失敗的設計,對於運維來說,這是一場災難。由於先天性的不足,加速了產品走向奔潰的邊緣。

三、一口吃成大胖子

導致專案最終走向失敗還有另外一個重要的原因,一口吃太多,嚼不爛。在確定需求的過程中,對於每一個租戶提出的需求,我們採取了儘可能滿足的方法,導致整個系統過於臃腫,雜亂,就好比一個萬花筒。

按照這樣一種方式,平臺需要具備多端接入的能力,如PC、平板、智慧手機等,以滿足不同租戶的要求,但最終我們連PC端都沒有實現好。好高騖遠,往往就是走向失敗的開始;量體裁衣,才是做系統設計的硬道理。體系太過於龐大,團隊的技術能力無法覆蓋一下子覆蓋到這麼大的面,而且核心的功能還未接受市場的檢驗,就同時要滿足適配多端的能力,這無疑是在開玩笑,最終將會得到一個爛尾工程。即便專案完成,充其量也就是一個軟體中的“玩具”。

因此,在軟體開發之初,切忌好大喜功,一下子將全部的功能都納入到實現的範圍,需要識別出哪些是必須功能,哪些是核心功能,哪些是擴充套件功能。需要分清楚產品的願景與產品實現的本質區別。願景是對產品生態鏈的展望,而技術實現需要實事求是,根據現有的技術水平和使用者需求,做出一個折中的方案,任何設計都有妥協,沒有一步到位的軟體產品,也沒有最好的軟體產品,只有通過一步步的優化設計,一步步的升級技術,才能做出更好的軟體產品。這一點在研發SaaS平臺時尤為重要,你不可能同時滿足多個租戶的需求,你需要甄別出最具代表性和最有價值的那一部分租戶,你的研發方向也需要向這一部分租戶靠攏,下面通過一張圖來說明構建一個SaaS平臺時,需求佔比應該如何分配:

記一次構建SaaS平臺專案失敗後的反思

 

為什麼會有這樣的一個配比?首先,能夠創造價值的租戶,是能夠向你進行付費使用軟體的租戶,對於這一部分租戶提出的需求,你可以以定製軟體的態度去對待,對於他們提出的要求,你需要想辦法去實現。而具有發展潛力的租戶,是那些有可能成為你付費使用者的群體,你需要研究產品的核心功能是什麼?,以及什麼樣的核心功能才能打動他們。而具有代表性的租戶是指那些能夠提出比較創新的,具有一市場價值的需求的群體,他們是產品發展的創新所在,可以考慮為這一部分群體單獨擴展出他們想要的功能,以觀察市場的對平臺的反應。最後是基礎租戶,他們的需求都具有普世性,需要考慮一定量的通用功能為其服務。

四、業務於產品先行

最後,談談技術之外的一些看法。大部分的團隊都會犯這樣一個錯誤:當產品開發完成之後,再去尋找市場。我們在這個專案中,也犯了同樣的錯誤。可以思考這樣一個問題,使用者的需求隨著時間的推移在發生改變,如果你不緊跟市場的動向,及時調整自己的產品功能,而是拿到一份需求後就開始閉門造車,當你的產品開發完時,就已經被淘汰了。為了避免產品沒有市場,業務就必須限於產品動起來。通過不斷的獲取使用者的需求,提取有價值的需求資料,及時調整產品的方向,才能縮短產品功能與使用者需求之間的差距。業務先行,在間接的幫助平臺設計者完善和充實現有的功能,及時的發現平臺隱藏的問題,並對此做出調整,在交付產品前儘可能的規避可能出現的故障,提高平臺的服務能力。

總結

對於今天的軟體設計者來說,讓軟體使用者來適應你所設計的產品的時代已經不復存在。你需要主動的調整自己,從內到外多角度的看待問題,才能幫助你出色的完成軟體的設計。在技術上,需要沉著冷靜,實事求是的分析所面對的問題,需要懂得如何把控技術風險;科學有序的開展軟體設計工作,斷不可不顧現實情況,盲目跟風,技術冒進以及唯技術論的路子對待軟體設計。在業務上,需要實時跟進需求的變化,具備敏銳的眼光去發現使用者的痛點和難點,能夠快速的對使用者需求的變更做出合理