[{"data":1,"prerenderedAt":386},["ShallowReactive",2],{"insight-\u002Finsights\u002Ften-steps-into-three":3,"insight-related-\u002Finsights\u002Ften-steps-into-three":122},{"id":4,"title":5,"body":6,"category":110,"date":111,"description":112,"draft":113,"extension":114,"meta":115,"navigation":116,"path":117,"readingTime":118,"seo":119,"stem":120,"__hash__":121},"insights\u002Finsights\u002Ften-steps-into-three.md","把十個步驟變成三個",{"type":7,"value":8,"toc":100},"minimark",[9,13,16,20,23,36,39,42,49,52,58,64,70,73,76,79,82,85,88,91,94,97],[10,11,12],"p",{},"改善一個流程的時候，直覺的做法是讓每個步驟變快：這個表單少填兩欄、那個畫面少點兩下。",[10,14,15],{},"但通常效果最好的做法不是加速，而是刪除。",[17,18,19],"h2",{"id":19},"先把步驟列出來",[10,21,22],{},"不用工具，先用一張紙把目前的步驟一項一項寫下來。寫的時候有幾個規則：",[24,25,26,30,33],"ul",{},[27,28,29],"li",{},"用動詞開頭，例如「打開 Excel」「複製昨天的表格」",[27,31,32],{},"包含等待，例如「等主管回覆」",[27,34,35],{},"包含切換，例如「從 LINE 複製到系統」",[10,37,38],{},"寫完之後常常會發現步驟比想像中多。原本以為是三步的事情，攤開來有十一步，其中六步是在不同工具之間搬資料。",[17,40,41],{"id":41},"然後對每一步問一個問題",[10,43,44,45],{},"對每個步驟問：",[46,47,48],"strong",{},"如果這一步直接不做，會發生什麼事？",[10,50,51],{},"答案通常會落在三類：",[10,53,54,57],{},[46,55,56],{},"第一類：會出事。"," 這是真正的步驟，留著。",[10,59,60,63],{},[46,61,62],{},"第二類：不會出事，但沒人敢刪。"," 這通常是某次出過錯之後加上去的檢查，而那個錯的原因可能早就不存在了。這一類值得認真討論。",[10,65,66,69],{},[46,67,68],{},"第三類：只是因為工具不支援。"," 「先匯出成 CSV 再匯入另一個系統」這種步驟不是流程的一部分，它是工具的限制。這一類是軟體最容易處理掉的。",[17,71,72],{"id":72},"搬資料的步驟優先處理",[10,74,75],{},"在多數企業流程裡，最花時間的往往不是判斷，而是搬運：把資料從 A 系統複製到 B 系統，把照片從手機傳到電腦再上傳。",[10,77,78],{},"這些步驟不需要人的判斷力，卻佔掉大量時間，而且是出錯機率最高的地方，因為它很無聊。",[10,80,81],{},"處理掉這一類，通常就能把十步變成五步。",[17,83,84],{"id":84},"剩下的步驟才考慮自動化",[10,86,87],{},"把不必要的步驟刪掉之後，剩下的才值得問要不要自動化。",[10,89,90],{},"順序很重要。如果先自動化再簡化，最後常常會做出一個「自動執行不必要步驟」的系統，而且因為它跑得很順，反而更沒有人會去質疑那些步驟。",[17,92,93],{"id":93},"一個提醒",[10,95,96],{},"流程簡化最大的阻力不是技術，是「我們一直都是這樣做的」。",[10,98,99],{},"比較有效的方式不是說服，而是先讓某一個人用新做法跑一次，讓他自己說快很多。這比任何簡報都有用。",{"title":101,"searchDepth":102,"depth":102,"links":103},"",3,[104,106,107,108,109],{"id":19,"depth":105,"text":19},2,{"id":41,"depth":105,"text":41},{"id":72,"depth":105,"text":72},{"id":84,"depth":105,"text":84},{"id":93,"depth":105,"text":93},"產品思考","2026-07-08","流程簡化最有效的方式不是把每個步驟做得更快，而是判斷哪些步驟其實可以直接不存在。",false,"md",{},true,"\u002Finsights\u002Ften-steps-into-three",6,{"title":5,"description":112},"insights\u002Ften-steps-into-three","7uINQhqG9a4VowoN9X8CHS6It_HGQRJAvMQqEQ02clE",[123,235],{"id":124,"title":125,"body":126,"category":227,"date":228,"description":229,"draft":113,"extension":114,"meta":230,"navigation":116,"path":231,"readingTime":118,"seo":232,"stem":233,"__hash__":234},"insights\u002Finsights\u002Fprocess-before-features.md","先問流程，再問功能",{"type":7,"value":127,"toc":221},[128,131,134,137,142,145,150,153,158,161,164,167,178,181,184,187,190,193,196,199,203,206,215,218],[10,129,130],{},"第一次和企業聊系統的時候，最常拿到的是一份功能清單。上面寫著「要有登入」「要有報表」「要有通知」。清單本身沒有問題，問題是它通常是從別人的系統抄來的，而不是從自己的流程長出來的。",[10,132,133],{},"所以我們現在習慣先把功能清單放在旁邊，改問另一組問題。",[17,135,136],{"id":136},"先問的三件事",[10,138,139],{},[46,140,141],{},"這件事現在是誰在做？",[10,143,144],{},"不是「哪個部門」，是哪一個人。找到那個人，通常也就找到了所有的例外狀況。",[10,146,147],{},[46,148,149],{},"他現在用什麼做？",[10,151,152],{},"答案很常是 Excel、LINE、紙本，或是三個一起。這不是落後，而是資訊。它代表現有工具至少在某個地方是好用的，不然不會活這麼久。",[10,154,155],{},[46,156,157],{},"做錯的時候會怎樣？",[10,159,160],{},"有些環節做錯只是重做一次，有些做錯會直接影響出貨或收錢。這個問題的答案，會決定哪裡需要防呆、哪裡可以放寬。",[17,162,163],{"id":163},"功能清單的問題",[10,165,166],{},"功能清單描述的是系統，流程描述的是人。兩者之間往往差了一段沒有人記錄下來的東西：",[24,168,169,172,175],{},[27,170,171],{},"那個「先傳照片到群組給主管看一下」的步驟",[27,173,174],{},"那個「星期五下午單子會特別多」的節奏",[27,176,177],{},"那個「新人前兩週都會做錯同一件事」的現象",[10,179,180],{},"這些東西不會出現在需求文件裡，但它們決定了系統上線之後會不會被繞過。",[17,182,183],{"id":183},"一個實際的例子",[10,185,186],{},"有一種很常見的需求是「我要一個報表系統」。",[10,188,189],{},"如果直接照做，結果通常是一個有很多圖表的頁面，然後三個月後沒有人打開。",[10,191,192],{},"但如果先問「你做這份報表是為了回答什麼問題」，答案可能是「我只是想知道這週有沒有哪一天特別忙」。",[10,194,195],{},"那麼需要的可能不是報表系統，而是一個每週寄一次、只有五行字的信。",[10,197,198],{},"這兩件事的開發成本差了不只十倍，而後者比較有機會真的被看。",[17,200,202],{"id":201},"流程問清楚之後功能反而好決定","流程問清楚之後，功能反而好決定",[10,204,205],{},"把流程攤開之後，功能清單通常會發生兩件事：",[207,208,209,212],"ol",{},[27,210,211],{},"有一半的功能會被刪掉，因為它們解決的是不存在的問題。",[27,213,214],{},"會冒出兩三個原本沒寫的功能，而且它們才是真正的重點。",[10,216,217],{},"這個過程不需要很久。多數情況下，把一天的實際工作走過一次，大概兩個小時就夠了。",[10,219,220],{},"比起花兩個月做一個沒人用的系統，這兩個小時很便宜。",{"title":101,"searchDepth":102,"depth":102,"links":222},[223,224,225,226],{"id":136,"depth":105,"text":136},{"id":163,"depth":105,"text":163},{"id":183,"depth":105,"text":183},{"id":201,"depth":105,"text":202},"企業數位化","2026-08-12","很多系統做完之後沒人用，不是因為功能不夠，而是因為它從一開始就照著功能清單設計，而不是照著人實際的工作方式設計。",{},"\u002Finsights\u002Fprocess-before-features",{"title":125,"description":229},"insights\u002Fprocess-before-features","7-zsY3oWaYKvoW50feBNsUNNqp91NdKpd-dtowIB1rU",{"id":236,"title":237,"body":238,"category":377,"date":378,"description":379,"draft":113,"extension":114,"meta":380,"navigation":116,"path":381,"readingTime":382,"seo":383,"stem":384,"__hash__":385},"insights\u002Finsights\u002Fpermissions-are-not-a-final-step.md","權限不是上線前才補的東西",{"type":7,"value":239,"toc":370},[240,243,246,249,252,258,264,270,273,276,279,282,336,339,345,348,351,354,357,360,363,366],[10,241,242],{},"在系統開發裡，權限常常被排在很後面。先把畫面做出來、先讓流程跑得動，權限「之後再加」。",[10,244,245],{},"聽起來很合理，但實際上這個順序有一個問題：權限不是一層可以外掛的東西，它會決定資料怎麼查、怎麼存、怎麼分頁。等到功能都做完才回頭處理，通常會發現要改的不是幾行判斷，而是整個資料存取的寫法。",[17,247,248],{"id":248},"三個不同層次的權限",[10,250,251],{},"把權限分開來想，會比較容易決定每一層要做什麼。",[10,253,254,257],{},[46,255,256],{},"介面層","：這個按鈕要不要顯示。這是最表面的一層，也是唯一一層可以被使用者繞過的。",[10,259,260,263],{},[46,261,262],{},"應用層","：這個請求可不可以執行。伺服器收到請求時要自己判斷，不能相信前端已經檢查過。",[10,265,266,269],{},[46,267,268],{},"資料層","：這筆資料可不可以被讀到。資料庫本身也應該有規則，這樣即使應用層有漏洞，也不會直接把整張表倒出去。",[10,271,272],{},"只做第一層，等於沒有做。三層都做，才有辦法在某一層出錯的時候還有東西擋著。",[17,274,275],{"id":275},"從最小權限開始",[10,277,278],{},"比較安全的預設是：一開始什麼都不給，再依角色一項一項加回來。",[10,280,281],{},"反過來做（先全部開放，再逐一關掉）幾乎一定會漏掉東西，而且漏掉的地方通常不會有人回報，因為使用者不會抱怨「我看到了不該看的資料」。",[283,284,288],"pre",{"className":285,"code":286,"language":287,"meta":101,"style":101},"language-sql shiki shiki-themes github-light github-light","-- 不是「這個角色不能看什麼」，\n-- 而是「這個角色只能看什麼」\nselect * from orders\nwhere store_id = current_store_id();\n","sql",[289,290,291,300,305,321],"code",{"__ignoreMap":101},[292,293,296],"span",{"class":294,"line":295},"line",1,[292,297,299],{"class":298},"sJ8bj","-- 不是「這個角色不能看什麼」，\n",[292,301,302],{"class":294,"line":105},[292,303,304],{"class":298},"-- 而是「這個角色只能看什麼」\n",[292,306,307,311,314,317],{"class":294,"line":102},[292,308,310],{"class":309},"sCydW","select",[292,312,313],{"class":309}," *",[292,315,316],{"class":309}," from",[292,318,320],{"class":319},"sKWpL"," orders\n",[292,322,324,327,330,333],{"class":294,"line":323},4,[292,325,326],{"class":309},"where",[292,328,329],{"class":319}," store_id ",[292,331,332],{"class":309},"=",[292,334,335],{"class":319}," current_store_id();\n",[17,337,338],{"id":338},"前端隱藏不是安全機制",[10,340,341,344],{},[289,342,343],{},"v-if=\"isAdmin\""," 只是讓畫面乾淨，不是保護。任何人打開開發者工具都可以看到前端拿到了哪些資料。",[10,346,347],{},"判斷方式很簡單：如果把這個請求直接用 curl 打一次，會發生什麼事？如果答案是「會拿到資料」，那這個地方就沒有真的被保護。",[17,349,350],{"id":350},"環境也是權限的一部分",[10,352,353],{},"正式環境的金鑰不應該出現在開發環境，開發用的測試帳號也不應該出現在正式資料庫。這兩件事聽起來很基本，但在時間趕的時候特別容易被跳過。",[10,355,356],{},"比較實際的做法是一開始就把環境變數分好，讓「拿錯金鑰」這件事在流程上就做不到，而不是靠記得。",[17,358,359],{"id":359},"什麼時候處理",[10,361,362],{},"我們的習慣是在畫資料表的時候就一起決定：這張表有哪些角色會碰到、各自能做什麼。",[10,364,365],{},"這個階段做這件事幾乎不花時間，因為還沒有任何程式碼需要改。等到上線前一週才想，成本就完全不一樣了。",[367,368,369],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sCydW, html code.shiki .sCydW{--shiki-default:#D73A49;--shiki-dark:#D73A49}html pre.shiki code .sKWpL, html code.shiki .sKWpL{--shiki-default:#24292E;--shiki-dark:#24292E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":101,"searchDepth":102,"depth":102,"links":371},[372,373,374,375,376],{"id":248,"depth":105,"text":248},{"id":275,"depth":105,"text":275},{"id":338,"depth":105,"text":338},{"id":350,"depth":105,"text":350},{"id":359,"depth":105,"text":359},"資安","2026-08-05","「先把功能做出來，權限之後再說」是很常見的順序，但它幾乎一定會讓你在最後一週重寫一次資料存取邏輯。",{},"\u002Finsights\u002Fpermissions-are-not-a-final-step",7,{"title":237,"description":379},"insights\u002Fpermissions-are-not-a-final-step","zWtmc13aqFoDwMCfylZRS7XYckT8GRrG34i03fYoBkQ",1787663694598]