多人協(xié)作在線文檔的概念,最早由Google Docs帶入中國(guó)。但實(shí)際上,在日常工作中,與團(tuán)隊(duì)的其他人進(jìn)行協(xié)作是一種在常見(jiàn)不過(guò)的工作方式。
由于工作分工、工作進(jìn)展的不同,團(tuán)隊(duì)內(nèi)部的信息往往需要及時(shí)同步,然而伴隨著團(tuán)隊(duì)經(jīng)營(yíng)規(guī)模的不斷擴(kuò)大,在線協(xié)同、多人協(xié)作,以及軟件項(xiàng)目管理等問(wèn)題將會(huì)接踵而至,成為制約企業(yè)高效發(fā)展的瓶頸。
這些問(wèn)題,通常表現(xiàn)為:
1. 跨部門、地區(qū)協(xié)作不便
2. 過(guò)度依賴文件夾共享的形式,不能確保文檔的安全性
3. 沒(méi)法紀(jì)錄和體現(xiàn)職工對(duì)文本文檔的意見(jiàn)和評(píng)價(jià)
4. 文檔記錄發(fā)生變更時(shí),無(wú)法及時(shí)通知到相關(guān)部門和員工
5. 文檔無(wú)法在線協(xié)同編輯,缺失必要的流程管控
6. 多人共同編輯一個(gè)文檔,無(wú)法留存修改記錄和歷史版本
針對(duì)上述問(wèn)題,目前最佳的解決方案是:使用一款可多人在線協(xié)同辦公的軟件或工具。市面上,這類軟件有很多,比如國(guó)外的Google Docs、Office365,以及國(guó)內(nèi)的騰訊文檔、石墨文檔、有道云協(xié)作等。
本文將不再過(guò)多贅述這類成品軟件,而是深入?yún)f(xié)同辦公系統(tǒng)的實(shí)現(xiàn)原理,從企業(yè)IT管理者的角度出發(fā),深入研究多人協(xié)作的形式、基礎(chǔ)和難點(diǎn),分析一款開(kāi)發(fā)工具應(yīng)具備怎樣的特點(diǎn),才是實(shí)現(xiàn)多人協(xié)作“在線excel”系統(tǒng)的關(guān)鍵。
以下內(nèi)容,節(jié)選自葡萄城公開(kāi)課《如何實(shí)現(xiàn)可多人協(xié)作的“在線excel”系統(tǒng)?》,歡迎大家提前預(yù)約,屆時(shí)觀看:https://live.vhall.com/483759540
多人協(xié)作的形式:歷史與發(fā)展
多人協(xié)作的歷史十分悠久,起源于靜態(tài)的多人協(xié)作模式,即每個(gè)人先完成自己的工作,然后再進(jìn)行匯總。
靜態(tài)的多人協(xié)作模式
• 遞增式協(xié)作
• 郵件:你來(lái)我往
• 論壇:跟帖回復(fù)
• 獨(dú)占式協(xié)作
• 文檔傳遞
• 微軟VSS
• 合并式協(xié)作
• SVN
• Git
• diff,patch,merge指令
常見(jiàn)的靜態(tài)多人協(xié)作方式
從靜態(tài)到動(dòng)態(tài)
• 靜態(tài)協(xié)作的比喻
• 拼接畫
• 積木
• 靜態(tài)協(xié)作的特點(diǎn)
• 多版本
• 塊操作
• 有協(xié)作動(dòng)作
• 靜態(tài)協(xié)作的缺點(diǎn)
• 版本碎片化
• 缺乏時(shí)效性
• 協(xié)作動(dòng)作成本高
靜態(tài)多人協(xié)作的成本,會(huì)隨著加入人數(shù)和項(xiàng)目的復(fù)雜度呈幾何級(jí)數(shù)的增長(zhǎng)。因此,對(duì)于企業(yè)來(lái)說(shuō),急需一種無(wú)協(xié)作動(dòng)作、唯一版本、版本可控的無(wú)協(xié)作成本模式,即動(dòng)態(tài)多人協(xié)作模式。
動(dòng)態(tài)的多人協(xié)作
• 動(dòng)態(tài)協(xié)作的比喻
• 一起畫黑板
• 動(dòng)態(tài)協(xié)作的特點(diǎn)
• 唯一版本
• 原子操作
• 無(wú)協(xié)作動(dòng)作
• 動(dòng)態(tài)協(xié)作的優(yōu)點(diǎn)
• 版本可控
• 實(shí)時(shí)
• 無(wú)協(xié)作成本
• 典型產(chǎn)品
• Office Online
• 石墨
• OnlyOffice
多人協(xié)作的基礎(chǔ):原理與架構(gòu)
任何信息,無(wú)論其是什么展現(xiàn)形式,如果要做到多人實(shí)時(shí)編輯與展現(xiàn),只需要實(shí)現(xiàn)以下三步而已:
1. 操作化
2. 可傳輸
3. 可還原
舉例說(shuō)明多人協(xié)作的實(shí)現(xiàn)方式
操作化
操作化,指任何信息都可以轉(zhuǎn)換為一組操作的集合。很容易理解,但它仍有不少值得思考的點(diǎn):
1. 分割與組合
· 如何保證:信息的所有變化都可以分解為操作的集合?反之,操作如何覆蓋出信息的所有變化?
· 分割的顆粒度如何決定?
• 粗一點(diǎn)?
• 細(xì)一點(diǎn)?
• 如何兼顧解釋性與擴(kuò)展性?
2. 絕對(duì)操作與相對(duì)操作
· 絕對(duì)操作
• 針孔打印機(jī)的完美世界
• 打印機(jī)時(shí)代的編輯噩夢(mèng)
· 相對(duì)操作
• 4K電視不是夢(mèng)
• 為什么數(shù)字電視穩(wěn)定性不如模擬電視
· 絕對(duì)操作與相對(duì)操作比喻:時(shí)間與空間的互換
3. 使用一款開(kāi)發(fā)工具:SpreadJS,實(shí)現(xiàn)操作化的優(yōu)勢(shì):
· 好用的指令集,保證覆蓋信息的全部變化與操作的集合
· 經(jīng)過(guò)實(shí)踐驗(yàn)證的顆粒度,完美兼顧解釋性與擴(kuò)展性平衡
可傳輸
可傳輸,就是指操作有辦法通過(guò)網(wǎng)絡(luò)傳輸給其他終端。實(shí)現(xiàn)動(dòng)態(tài)多人協(xié)作,需要考慮以下幾點(diǎn):
1. 傳輸內(nèi)容
· 原始文本
• 清晰
• 冗余
· 壓縮技術(shù)
• 邏輯壓縮
• 協(xié)議壓縮
• 手動(dòng)壓縮
2. 網(wǎng)絡(luò)協(xié)議
· Socket
• TCP
• UDP
· HTTP
· WebSocket
3. QoS(Quality of Service,服務(wù)質(zhì)量)
· 快速失敗
· 自動(dòng)回滾
· 自動(dòng)重連
· 自動(dòng)恢復(fù)
可還原
可還原,就是指接收到來(lái)自網(wǎng)絡(luò)的操作消息后,可以在本地完全一致地再次執(zhí)行該操作。可還原包括了:
1. 絕對(duì)操作的還原
· 控制體積
· 合理的提示
2. 相對(duì)操作的還原
· 嚴(yán)格的順序性
· 從源頭保障順序性
· 順序性的補(bǔ)救
3. 本地操作的還原
· 過(guò)濾收到的操作集合
· 從源頭細(xì)化操作顆粒
· 本地保存本地執(zhí)行
4. 無(wú)入侵的還原
· 定義入侵
· 排除入侵
· 千人千面
多人協(xié)作的難點(diǎn):亂序與沖突
亂序
亂序的表現(xiàn)形式如下圖,小明在客戶端執(zhí)行了一系列操作,傳遞到服務(wù)器時(shí)發(fā)生亂序,導(dǎo)致小花看到了截然不同的信息:
為了解決亂序問(wèn)題,可以嘗試以下方法:
1. 用性能換取順序正確——基于協(xié)議
2. 用性能換取順序正確——基于回執(zhí)
兩種方法的優(yōu)缺點(diǎn)
1. 基于協(xié)議
• 優(yōu)點(diǎn)
· 可靠,歷經(jīng)考驗(yàn)
· 簡(jiǎn)單,無(wú)需開(kāi)發(fā)
• 缺點(diǎn)
· 資源開(kāi)銷高
· 必須整套使用
2. 基于回執(zhí)
• 優(yōu)點(diǎn)
· 自主可控,按需開(kāi)發(fā)
· 資源開(kāi)銷可控
• 缺點(diǎn)
· 需要自己投入開(kāi)發(fā)
· 應(yīng)用層邏輯控制使得網(wǎng)絡(luò)復(fù)雜度向外蔓延
· 復(fù)雜度帶來(lái)維護(hù)成本
基于亂序處理方法的總結(jié)
網(wǎng)絡(luò)不是絕對(duì)可靠的,為了實(shí)現(xiàn)相對(duì)可靠,需要付出一定的代價(jià),企業(yè)需要考慮的是:如何衡量所付出的代價(jià)與產(chǎn)出成正比。
沖突
比亂序更高級(jí)的一種表現(xiàn)形式,存在多向、多維度等問(wèn)題。
如何避免錯(cuò)誤的蔓延?
原則:任何一次不一致,都會(huì)導(dǎo)致后續(xù)的操作基于錯(cuò)誤的信息進(jìn)行,從而不斷擴(kuò)大錯(cuò)誤,造成無(wú)法收拾的結(jié)果。因此,不一致是不能被容忍的。
解決辦法:
1. 嚴(yán)格一致性:獨(dú)占
2. 最終一致性:檢查與修復(fù)
3. 非技術(shù)手段:設(shè)計(jì)與提示
嚴(yán)格的一致性
獨(dú)占就是同一時(shí)間同一范圍只能由一人操作。
1. 范圍(以SpreadJS為例)
1. 整個(gè)表格,類似VSS
2. 工作表
3. 單元格范圍
2. 排他性
1. 獨(dú)占沖突時(shí),必有一方被彈開(kāi)
2. 直到占有者解開(kāi),不然無(wú)法占用
3. 占用前無(wú)法操作
4. 原理和鎖基本一致
3. 優(yōu)點(diǎn)
1. 可以確保嚴(yán)格一致性,不會(huì)產(chǎn)生多版本的錯(cuò)誤累積
2. 比起修復(fù)恢復(fù)這類彌補(bǔ)手段,一開(kāi)始就不出錯(cuò)的成本最低
3. 邏輯清楚簡(jiǎn)單,開(kāi)發(fā)維護(hù)成本低
4. 缺點(diǎn)
1. 靜態(tài)協(xié)作的味道
2. 獨(dú)占動(dòng)作嚴(yán)重影響體驗(yàn)
3. 大幅降低協(xié)作效率
5. SpreadJS提供的支持
1. 鎖定工作表
2. 鎖定單元格
最終一致性
基于唯一正確順序,察覺(jué)客戶端的錯(cuò)誤,撤銷錯(cuò)誤操作后重新執(zhí)行正確的操作。
1. 唯一正確
1. 服務(wù)器到達(dá)順序
2. 協(xié)作邊界分流
3. P2P+選舉算法
2. 察覺(jué)錯(cuò)誤
1. 服務(wù)器回執(zhí)id
2. 服務(wù)器回執(zhí)操作,MS
3. 撤銷錯(cuò)誤
1. 撤銷到錯(cuò)誤發(fā)生前的一步操作的結(jié)果
2. 利用SpreadJS的撤銷功能
3. 利用操作版本快照
4. 重新執(zhí)行
1. 操作隊(duì)列需保存
2. 區(qū)分好無(wú)感知執(zhí)行與顯式執(zhí)行
非技術(shù)手段
技術(shù)手段追求錯(cuò)誤0發(fā)生,而非技術(shù)手段則可以降低錯(cuò)誤發(fā)生的可能性。
1. 選中框
1. 非常重要但不顯眼
2. 人性化的獨(dú)占
3. 操作的預(yù)期
4. 協(xié)作感
5. SpreadJS提供高度可自定義的邊框
2. 協(xié)作設(shè)計(jì)
1. 設(shè)計(jì)協(xié)作區(qū)域與合并手段
2. 設(shè)置權(quán)限
3. SpreadJS提供幾乎Excel的所有公式
4. SpreadJS提供了工作表和單元格鎖定功能
3. 單向協(xié)作
1. 區(qū)分單向與雙向協(xié)作的場(chǎng)景
2. 對(duì)單向協(xié)作盡量放開(kāi)
3. 對(duì)雙向協(xié)作嚴(yán)謹(jǐn)設(shè)計(jì)
針對(duì)多人協(xié)作難點(diǎn)的總結(jié)
首先,可以明確一點(diǎn):SpreadJS完全可以用作多人協(xié)作系統(tǒng)開(kāi)發(fā)的組件。原因在于:
• SpreadJS的產(chǎn)品質(zhì)量是毋庸置疑的
• SpreadJS在設(shè)計(jì)之初,便考慮到了多人協(xié)作的可能,而除此之外,絕大多數(shù)的前端產(chǎn)品都不是為了多人協(xié)作而設(shè)計(jì)的
• 多人協(xié)作需要中心系統(tǒng)的支持,SpreadJS基于純前端的體系架構(gòu)可以很容易的嵌入系統(tǒng)開(kāi)發(fā),而無(wú)需過(guò)多考慮與原生系統(tǒng)的兼容性,這是常規(guī)組件是無(wú)法做到的
• 要實(shí)現(xiàn)多人協(xié)作,需要投入一定的開(kāi)發(fā)成本,SpreadJS作為一款開(kāi)發(fā)工具,可以有效幫助開(kāi)發(fā)人員減輕代碼量
多人協(xié)作表格的本質(zhì):
• Server – Clients 中心系統(tǒng),類似數(shù)值敏感的小型網(wǎng)游
• 任何這類系統(tǒng)都是在體驗(yàn)和正確性中尋求平衡
多人協(xié)作表格的特點(diǎn):
• 表格的數(shù)值敏感性高于網(wǎng)游,數(shù)據(jù)操作和存儲(chǔ)的挑戰(zhàn)更大
• 表格的計(jì)算復(fù)雜度更高,尤其涉及復(fù)雜公式嵌套與全量統(tǒng)計(jì)篩選
• Web存在天花板,所以復(fù)雜的頁(yè)游并不多見(jiàn),端游較多
對(duì)SpreadJS這類開(kāi)發(fā)工具/組件的展望與期待
1. SpreadJS 已經(jīng)可以很好地支持多人協(xié)作的最終一致性。如果能支持多人多撤銷隊(duì)列,或者撤銷重做自定義,那么就可以給用戶提供更加易用且多樣化的體驗(yàn)效果,從此絲般順滑不是夢(mèng)。
2. SpreadJS的絕大部分功能是支持命令的,這使得操作化變得更簡(jiǎn)單。如果SpreadJS能開(kāi)放命令自定義,便可以讓自主控制顆粒度成為可能,用戶可以針對(duì)具體的業(yè)務(wù)邏輯做出更加精細(xì)化的操作轉(zhuǎn)換,大幅提高協(xié)作效率。
3. SpreadJS不僅在數(shù)據(jù)錄入、數(shù)據(jù)填報(bào)等方面表現(xiàn)出強(qiáng)大的功能,其各類統(tǒng)計(jì)分析與圖形化手段也是一個(gè)不少,一旦明年的透視表功能上線,使用SpreadJS開(kāi)發(fā)在線協(xié)同系統(tǒng)的數(shù)據(jù)商業(yè)價(jià)值將更易體現(xiàn),用戶將體驗(yàn)到“表格”無(wú)限的魅力與威力。
4. 表格在多人協(xié)作中的數(shù)據(jù)量增長(zhǎng)速度比單人使用時(shí)快得多,希望SpreadJS可以支持更大的數(shù)據(jù)量,尤其是在大數(shù)據(jù)量情況下仍舊保持操作的性能與體驗(yàn)。
以上就是本期公開(kāi)課《如何實(shí)現(xiàn)可多人協(xié)作的“在線excel”系統(tǒng)?》的部分摘要,如果您對(duì)在線協(xié)作系統(tǒng)的開(kāi)發(fā)感興趣,歡迎點(diǎn)擊預(yù)約,屆時(shí)收看:https://live.vhall.com/483759540