如何把 CSV 視覺化成一條工作流程
工作流程就是裡面有返工的流程。如何在一個 CSV 檔裡寫一個往回的「連線至」引用、為重試封頂令修訂不會無限繞圈,以及怎樣分辨一條真迴路與一個打錯了的列號。
當一個「連線至」儲存格放著一個比它自己那一列還小的列號,這個 CSV 檔就由一份清單變成一條工作流程——那個往回的引用,正是每一條審批流程都有、而幾乎每一份匯出檔都漏掉的返工迴路。
簡而言之
- 一個比自己那一列還小的「連線至」數字就是一條回頭迴路。沒有別的東西標示它。
- 會形成迴路的列都是多目的地列,所以它們的儲存格含有逗號,在 CSV 裡必須用引號包起。
- 為重試封頂:一個數算次數的判斷,才是令一條迴路不會永遠繞下去的東西。
- 那些返工列可以坐在檔案的任何位置——迴路是那條邊,不是那個位置。
- 一個往回指、而目標列不會重做任何工作的引用,是打錯了,不是一條迴路。
迴路在一份匯出檔裡藏在哪裡
一條流程的 CSV 匯出檔,來自那些記錄發生了甚麼的系統:一份審批日誌、一份工單匯出、一個工作流程引擎背後的稽核表。它們是扁平的,一個事件一列,通常按時間戳記排序,對過去交代得完整,對形狀卻一言不發。把其中一份讀成一條工作流程,意味著要回答一條這個檔案並不包含的問題——當這一步被退回時,工作退回到哪裡去?
在 QueryChart 裡,那個答案是一個數字。「連線至」欄放著這一列所連往那幾列以 1 起計的列號,而沒有任何東西要求那個數字大過它自己所在的那一列。第 16 列指向第 3 列就是一條迴路:工作回到第 3 列,然後再往前走一次。整套機制就是這樣。沒有迴路形狀、沒有重複標記、也沒有一個獨立的返回欄——一條工作流程與一條直線流程的分別,就在於一個數字比預期細。
有一個這個格式特有的原因,令 CSV 比試算表更難把那一個數字寫對。會形成迴路的列,正是那些有多過一個目的地的列,所以它們的「連線至」儲存格讀作 3,17,而「連線文字」儲存格讀作 第一次修訂,第二次修訂。兩者都含有逗號,而一個逗號在一個逗號分隔的檔案裡必須用引號包起,否則那一列會悄悄多出幾個欄,並與標題失去對齊。/yue/guides/在csv裡定義連接 交代了配對規則;這一頁講的是那些儲存格解析出來之後代表甚麼。
下面的示例是一條折扣審批工作流程,就是 /yue/templates/csv審批流程 那張圖。它在二十四列裡有三個往回的引用:一次回到毛利率計算的修訂、一次回到總監摘要的呈交,以及一次回到修訂的客戶還價。打開試算表面板,對著列號讀「連線至」欄。
二十四列裡的三個往回引用
一條折扣審批工作流程的四個完成度階段。畫布下面的試算表面板顯示填好了哪些欄——在「連線至」裡留意那些比自己那一列還小的數字。
有形狀,未有連接
第 1 至 6 列只填好了「形狀」欄,其他甚麼都沒有:「收到客戶提出的折扣要求」的一個 Start、三個 Process 列、判斷「毛利率是否達到 40% 或以上?」,以及銷售代表那一級的批准。還沒有任何東西指向任何地方。一份原始匯出檔給你的大致就是這樣——一份加上了一個類型欄的清單,那是一張表,不是一條工作流程。
向前的路徑
「連線至」填好,審批階梯就現形:第 5 列分岔去 6 或 7,第 7 列去 8 或 10,第 10 列去 11 或 13,每一級把那個毛利率分段交給一位更高的審批人。這一段裡每一個數字都大過放著它那一列,所以所有箭嘴都往前走,而這個檔案仍然可以由上而下當一份清單來讀。
那個往回指的數字
第 15 至 17 列補上返工那一段,而第 16 列正是這個檔案不再是一份清單的地方。「是否同一位審批人第二次退回?」的「連線至」是 3,17,「連線文字」是 第一次修訂,第二次修訂:那個 3 細過 16,所以第一次修訂回到「計算折扣後的毛利率」——價格改了毛利率就改了,可能落在另一個分段。第二次修訂改為去第 17 列,那就是封頂。
連泳道在內的整條工作流程
全部二十四列,頂上是報價、毛利檢查、審批、修訂與發出,側邊是銷售代表、銷售經理、財務與商務總監。修訂那一欄現在明顯地收攏了第 15 至 17 列,這正是為甚麼那條迴路在畫布上讀得到、在匯出檔裡卻隱形。最後一個往回引用坐在第 20 列,那裡「要求更大折扣」把客戶的還價送回第 15 列,而不是送去一張新報價。
運作方式
把匯出檔重排成流程次序
系統匯出檔出來時是按時間戳記或者工單次序排的,那是事情發生的次序,不是流程運行的次序。在寫下任何一個「連線至」值之前,先把那些列排成一宗個案所走的次序,因為那些值是列的位置,而事後把檔案重新排序會令它們每一個失效。
檢查標題列有沒有在匯出中活下來
欄是按標題名稱比對的,所以標題列是這個檔案裡唯一必須完全正確的部分。確認它寫著「形狀」、「方框文字」、「連線至」、「連線文字」。一個由 UTF-8 匯出帶來的位元組順序標記會附在第一個標題名稱上,而一份來自歐洲系統的分號分隔匯出檔會把整行放進一個儲存格——兩種情況下那個欄都不獲認得,並作為一個沒有用到的多餘欄被帶過,而不是大聲失敗。
先寫向前的路徑
只為直通的情況填「連線至」,那裡每一個數字都大過放著它那一列。先令這條工作流程由頭到尾完全沒有返工地跑通。加在一條你尚未驗證過的路徑上的迴路幾乎讀不回來,因為當兩者都指向一列你不肯定的列時,你分不出哪個是返回邊、哪個是錯的號碼。
加一列返工,並把返回邊指向它
給那次修訂一列自己的——「修訂折扣、價格或條款」——並把每一個退回的判斷都送去那一列,而不是在每一位審批人下面各自複製一個返工步驟。然後寫出離開返工那一段的返回邊,指向那個會重新評估已改動輸入的列。在示例裡那是第 3 列,即毛利率計算,不是第 1 列。
為重試封頂
一條沒有封頂的迴路是一條可以永遠跑下去的工作流程,而在真實流程裡它不會。在返工列之後加一個判斷,問這件事回來過幾多次——第 16 列「是否同一位審批人第二次退回?」——「連線至」寫 3,17:繞一次,第二趟就往上呈交。把那個儲存格用引號包起,令那個逗號留在裡面。
把檔案拖進去,再讀那些往回的箭嘴
把 .csv 拖到一張新圖表的試算表區域,或者直接把文字貼進去,圖就會渲染出來。然後把每一條往回走的箭嘴讀一次。每一條都應該是一個你叫得出名的情況——一次修訂、一次呈交、一次還價。一條你叫不出名的箭嘴是一個調轉了的列號,而這是唯一一個令它明顯可見的視圖。
應避免的錯誤
「連線至」儲存格裡的那個逗號
一列有兩個目的地時放的是 3,17,有三個時放的是 19,15,22。在一個逗號分隔的檔案裡不加引號,它們就變成三個與四個欄,之後每一個欄往左移,而錯位落在的正正是那些承載迴路的列。試算表匯出時預設會為這種儲存格加引號;人手寫成與腳本產生的檔案往往不會。
編好號之後才把檔案排序
「連線至」值是列的位置而不是識別碼,所以把這張表排序一次,就會令每一列重新編號,而每一個引用都指向現在佔著那個位置的東西。圖照樣渲染,而且徹底錯了。先把次序定下來——見 /yue/guides/流程圖csv檔案結構——然後才編號。
一條回得太早的迴路
把返回邊指向第 1 列等於重新開始接收,那是在宣稱客戶提交了第二次要求。請把它送去第一個結果會因為這次返工而真正改變的列。在示例裡,那次修訂回到毛利率計算,因為價格改了,而毛利率由價格得出。
迴路沒有出口
一條旁邊沒有計數的回頭邊,會造出一條永不終止的工作流程,並藏起人人最怕的那種情況:一單生意繞了三圈,最後還是死了。那個封頂就是一個有第二條分支出去的判斷——第 16 列去第 17 列,而第 17 列要麼呈交總監,要麼結束在「因毛利理由放棄這單生意」。
打開這個審批工作流程示例
把示例作為你自己的圖表打開,然後把那些列換成你自己檔案的內容,並檢查每一個往回的數字都落在工作真正被重做的地方。
相關指南
常見問題
一個「連線至」值可以指向較前的一列嗎?
可以,而返工的整套機制就是這樣。「連線至」取的是目標列以 1 起計的位置,而沒有任何東西限制它必須大過放著它那一列,所以第 16 列的儲存格裡一個 3,就會由 16 往上畫一條箭嘴到 3。渲染器會把它繞開那些方框選路,不用你擺。因為沒有一個獨立的迴路標記,所以在一個 CSV 裡讀出迴路,就是掃描那些比自己那一列還小的數字——那是這個檔案裡唯一的訊號。
怎樣防止一條返工迴路永遠繞下去?
在返回路徑上放一個數算次數的判斷。示例裡,第 16 列問「是否同一位審批人第二次退回?」,並帶著「連線至」3,17 與「連線文字」第一次修訂,第二次修訂,所以第一趟繞回去,第二趟離開這條迴路去第 17 列「堅持這個折扣還是放棄這單生意?」。那個計數沒有儲存在任何地方——圖記錄的是那條規則,而規則才是人會遵守的東西。要緊的是這條迴路在圖上有一條加了標籤的出路,而不是留在某個人腦裡的一條默契。
在別人的檔案裡,怎樣分辨一條真迴路與一個錯的列號?
三個檢驗。目標列會不會重做那次返工實際改動過的工作?一條回到某個輸出這次不可能不同的步驟的迴路,是一個錯誤。那條回頭邊是不是離開一個判斷?一個「連線至」只往回指、而沒有向前出口的 Process 列,會令檔案其餘部分無法到達,幾乎一定是調轉了數字。還有那條分支有沒有標籤?真迴路帶著一個為那種情況命名的「連線文字」;打錯的從來沒有,因為沒有人會為一條自己並不打算畫的邊加標籤。
我的匯出檔是一次審批事件一列,不是一個步驟一列。該怎麼辦?
把它收攏。一張稽核表會把同一個步驟每發生一次就重複一次,所以一單被修訂了兩次的生意會出現兩列「退回申請人」,而直接匯入它得到的是一宗個案的圖,不是這條流程的定義。把不重複的步驟抽出來,每個保留一列,讓那個往回的引用去承載重複——那次替換正是這條迴路的用意所在。
當那些迴路跨越泳道時,圖還讀得到嗎?
路徑是計算出來的而不是畫出來的,所以一條由修訂那一欄回到報價那一欄的返回邊,會自行繞開那些方框選路,你甚麼都不用移動。令一條有迴路的工作流程讀不到的不是那些箭嘴,而是列的次序:把返工那幾列放在一起,像示例裡的第 15 至 17 列那樣,不要在每一位審批人下面散落一個修訂步驟。三位審批人各配一列返工,會產生三條其實是同一條的迴路。