B端產(chǎn)品設計:從產(chǎn)品角度談“軟件模塊化設計”
軟件模塊化設計是軟件工程領域的概念。本文結(jié)合筆者 ToB 產(chǎn)品設計的經(jīng)驗,從產(chǎn)品經(jīng)理的角度談談什么是軟件模塊化設計,以及為何它被奉為產(chǎn)品設計的基本原則之一。
01 軟件模塊化設計,“偷懶”利器
為了提升寫作效率,幾乎任何一款編輯器都少不了“復制”“粘貼”這兩個功能,對于需要編輯冗長代碼的軟件開發(fā)人員更是如此。但程序猿們并不滿足于此,他們創(chuàng)建了一種開源社區(qū),從而可以“復制”其他人共享的代碼,他們把這種共享的理念叫做“不要重復造輪子”。
業(yè)務方頻繁改動需求令程序猿們很是頭疼,他們希望以最小的代碼改動來實現(xiàn)業(yè)務方相要的效果;同時,當業(yè)務方提出新需求時,盡量不去動已經(jīng)寫好的代碼……
基于以上實用性、高效率的工作需要,程序猿們創(chuàng)造一個“軟件模塊化設計”的概念:
把一個很大很復雜的系統(tǒng),按照功用性,劃分成若干個模塊,每個模塊完成一個確定的功能;然后在這些模塊之間建立相應的聯(lián)系(接口),通過模塊間的互相協(xié)作,最終實現(xiàn)業(yè)務方提出的需求。
舉個例子,對不懂技術(shù)的業(yè)務方來說,上傳文件和上傳圖片是兩個完全不同的動作,但對程序猿來說,這兩個動作其實可以抽象成一個行為(或功能)——“上傳”。這時,假如一個系統(tǒng)出現(xiàn)多處需要“上傳”功能的模塊,程序猿只需要把相應的代碼復制過去,根據(jù)業(yè)務方需要做簡單的修改即可,不必再重新編輯。
再比如一個商業(yè)分析模塊(BI),數(shù)據(jù)來源是財務系統(tǒng)和供應鏈系統(tǒng),那么開發(fā)人員在做BI模塊時,只需要了解需要輸入什么數(shù)據(jù)、輸出什么類型的圖表即可,完全不用考慮這些數(shù)據(jù)從哪來,有什么意義。
以上就是“軟件模塊化設計”在軟件開發(fā)領域最實用的兩個意義,除此之外,還具有使系統(tǒng)結(jié)構(gòu)清晰、代碼簡潔、良好擴展性、便于分離、適應業(yè)務變化等優(yōu)點。
產(chǎn)品經(jīng)理距離“軟件模塊化設計”最近的時候就是畫原型圖!比如Axure中的“母版”功能、“動態(tài)面板”、“框架”、頁面分級編組、圖層編組等等,我們可以仔細想想每次使用這些控件時,都是出于什么目的:
- 母版:一處改動,多處生效;
- 動態(tài)面板:封裝控件,便于拖動,交互效果互不干涉;
- 框架:對需要變動部分的內(nèi)容進行定向修改,不影響其他;
- 頁面分級編組:理清模塊、頁面間的層級關系;
- 圖層編組:封裝控件,便于編輯管理。
02 模塊化設計對產(chǎn)品經(jīng)理的幫助
產(chǎn)品經(jīng)理在互聯(lián)網(wǎng)時代以前,主要歸屬于市場營銷部,職能是快速響應市場需要,對產(chǎn)品盈虧負責;軟件類產(chǎn)品的設計工作直接由開發(fā)部門負責。
進入互聯(lián)網(wǎng)時代,尤其是移動互聯(lián)網(wǎng),產(chǎn)品版本迭代速度加快,開發(fā)部門越來越需要一個專門負責解讀用戶需求、研究用戶體驗,并將需求整理后傳遞給開發(fā)人員的職能角色。產(chǎn)品經(jīng)理自此才逐漸成為互聯(lián)網(wǎng)行業(yè)的一個重要角色。
產(chǎn)品經(jīng)理與程序猿之間的這些淵源,決定了產(chǎn)品經(jīng)理需要了解一些類似軟件架構(gòu)設計理念,或者是邏輯嚴謹?shù)乃伎挤绞?。一方面可以更友好、更準確地跟程序猿傳達設計要點;另一方面也能夠幫助自己處理“具象的、數(shù)量繁多的、無邏輯的、瑣碎的”用戶需求。
軟件模塊化設計有兩個很重要的步驟——歸類和抽象,完成了這兩步才能確定最終要做哪些模塊、哪些功能。
比如說,單選題、多選題、判斷題同屬于客觀題,這叫歸類;單選題是“擁有4個選項,答案唯一的題目”,多選題是“擁有4個選項,以“且”關系連接的多答案題目”,判斷題是“擁有2個固定選項,答案唯一的題目”,這叫抽象。
產(chǎn)品經(jīng)理在跟業(yè)務方溝通時,經(jīng)常會遇到各種各樣的專業(yè)名詞、行業(yè)限定下的特殊場景,這些名詞在業(yè)務場景中可能代表著不同的含義,但是在軟件開發(fā)中卻可以用固定的、已有的簡單名詞來表述。
對需求做歸類和抽象,不僅僅是為了跟程序猿溝通,更重要的是幫助產(chǎn)品經(jīng)理認識到需求的實質(zhì),也使自己的設計工作“不要重復造輪子”。
對需求完成歸類和抽象后,必然面對“如何聯(lián)系”這一問題——模塊之間有無前后置關系,數(shù)據(jù)流向是怎樣的?
比如說,經(jīng)過歸類抽象,我們決定開發(fā)“題庫管理”“試卷管理”“教學管理”三個產(chǎn)品模塊;這時就需要思考這三個模塊之間的關系:
- 沒有“題庫”,“試卷”不成立,但“教學”成立,所以“試卷”依賴“題庫”;
- 沒有“試卷”,“題庫”“教學”均成立,所以“題庫”“教學”獨立;
- 沒有“教學”,“題庫”“試卷”均成立……
經(jīng)過逐級演化,最終我們可以得出這三個模塊之間的關系圖譜。
經(jīng)過一系列歸類、抽象和關系確定,我們可以得到一張UML用例圖、一張活動圖,甚至狀態(tài)圖、時序圖和數(shù)據(jù)庫設計;這些流程圖相當于一張標注過路線的產(chǎn)品地圖,有了路線圖就可以直接進入產(chǎn)品設計階段了(UML圖可以使程序猿直接進入開發(fā)階段,不一定非得等到原型圖出來)。
當業(yè)務方提出需求變更時,我們可以對照這些圖例:哪些需求是原有需求的變種,哪些需求是真正的新增,這些需求是否在預期的開發(fā)路線上,是否能夠在系統(tǒng)中實現(xiàn),對系統(tǒng)的影響有多大……
總之,當產(chǎn)品經(jīng)理對產(chǎn)品有了模塊化的概念化,會很輕松地應對來自客戶的需求新增和變動。
- 在軟件工程領域,模塊化設計的初衷是:使軟件不至于隨著逐漸變大而變得不可控,最終要達到可控、可維護、可擴展的目的。
- 產(chǎn)品經(jīng)理學習模塊化設計的目的也是如此——使獲取到的需求可控、可維護、可擴展,至少可以幫助我們快速評估出新需求在產(chǎn)品中所在的位置。
03 模塊化設計的5個顯著特征
前文通俗地還原了軟件模塊化設計的原貌,最后總結(jié)一下軟件模塊化設計的5個顯著特征:
1. 層次分明
可以簡單理解為設計一個結(jié)構(gòu)合理的樹狀菜單。
2. 抽象與細分
抽象:只考慮要解決的問題(用戶需求),不考慮實現(xiàn)方法;
細分:強調(diào)對需求的逐步分解,分解時僅較上一部分增加少量的細節(jié)。
例:
用戶想要實現(xiàn)在線報銷的功能,那我們就給他做一個“報銷軟件”,這個“報銷軟件”就是抽象出來的實體;
接下來要對“報銷軟件”進行第一次分解:報銷信息填寫、發(fā)票識別與驗真、審批;
第二次分解“發(fā)票識別與驗真”:發(fā)票信息錄入、發(fā)票真?zhèn)涡则炞C、發(fā)票是否已用驗證;
第三次分解“發(fā)票是否已用驗證”:歷史已用發(fā)票查詢、歷史已用發(fā)票編號對比……
3. 組成獨立
在軟件工程領域也被成為“信息隱蔽”,意思是在設計和確定模塊時,使一個模塊內(nèi)包含信息(流程或數(shù)據(jù)),對于不需要這些信息的其他模塊來說是不能訪問的。
也就是說,除了必要的接口,盡量減少模塊間、分系統(tǒng)、子系統(tǒng)間的邏輯依賴,這樣在后期維護升級時,就可以避免干涉其他不相關的部分。
例:
“報銷單”包含單據(jù)編號、單據(jù)類型、單據(jù)金額、提交人、提交日期等信息,但“財務分析”模塊只需要用到單據(jù)金額、提交日期兩項數(shù)據(jù),那么就只允許“財務分析”模塊通過接口調(diào)用的方式訪問這兩項數(shù)據(jù),其他數(shù)據(jù)一概不能訪問。
4. 面向數(shù)據(jù)結(jié)構(gòu)(面向接口)
軟件系統(tǒng)一般由邏輯(算法)和信息兩部分構(gòu)成,信息又分為內(nèi)容和數(shù)據(jù);邏輯是構(gòu)建軟件功能的骨架,內(nèi)容和數(shù)據(jù)是血肉,其中以數(shù)據(jù)尤為重要。
假如要實現(xiàn)軟件模塊化且模塊之間相互獨立,必須要先拋棄邏輯(實現(xiàn)方法),因為有邏輯就代表這兩個模塊誰也離不開誰,就不能稱之為獨立。
如果這兩個模塊必須要關聯(lián)在一起,但又不允許它們在邏輯上互相干涉,那么最好的辦法就是為它們內(nèi)部包含的數(shù)據(jù)進行抽象化,形成標準化接口,以數(shù)據(jù)調(diào)用的形式實現(xiàn)兩個模塊間的互相協(xié)作。
5. 高內(nèi)聚,低耦合
這里要解釋一下,其實“高內(nèi)聚,低耦合”才是軟件開發(fā)的內(nèi)在要求,“模塊化設計”只是實現(xiàn)“高內(nèi)聚,低耦合”的其中一種方法。
- “高內(nèi)聚”最精準的體現(xiàn)是“面向?qū)ο箝_發(fā)”,它的意思是從功能角度來衡量模塊間的聯(lián)系,也就是說一個好的內(nèi)聚模塊應當只做一件事;
- “低耦合”的精準體現(xiàn)是“面向接口開發(fā)”,意思是從軟件結(jié)構(gòu)角度衡量各個模塊之間的聯(lián)系,耦合強弱取決于模塊間接口的復雜程度、進入或訪問一個模塊需要調(diào)用的接口數(shù)量和次數(shù);極端的低耦合是不需要任何接口,但一般很少見。
“高內(nèi)聚,低耦合”是判斷軟件設計好壞很重要的一個標準,關于如何達到這一要求,本文不作重點介紹,大家可以自己查查資料簡單了解一下。
04 兼顧考慮用戶體驗和市場需求
模塊化設計并不只是為了提高軟件開發(fā)效率、適應快速變化,它在一定程度上也代表了最優(yōu)的用戶體驗和市場需要。下面舉幾個例子:
- UE設計中有一個“就近原則”,就是對相關控件進行直觀分組,創(chuàng)建一個更少混亂、更有組織的布局,使用戶在一個區(qū)域只進行一類操作。
- 頁面設計中的樹狀菜單和“面包屑”元素,代表著分層分級;
- 每個頁面只進行固定的、少量的幾個相關性較強的功能操作,比每個頁面進行很多個操作學習成本更低,更容易上手使用;
- B端客戶的定制化需要相對比較高,而ToB產(chǎn)品往往都做得又大又全,有的客戶可能僅僅只需要部分功能模塊,這時就需要為拆分后的功能模塊進行單獨定價,最終報價按照客戶選用的模塊進行匯總。
- 采用模塊化設計的軟件產(chǎn)品,可以結(jié)合客戶行業(yè)特點或公司產(chǎn)品規(guī)劃,針對性地對某個模塊進行優(yōu)化升級,使之單獨成為一款產(chǎn)品參與市場競爭,并且不會對原系統(tǒng)造成影響。
作者:產(chǎn)品路漫漫;微信公眾號:產(chǎn)品路漫漫
本文由 @產(chǎn)品路漫漫 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自Unsplash,基于CC0協(xié)議
非常好