夜班步驟
這是什麼
多數程序由已經熟悉工作的人撰寫。在辦公桌前閱讀沒問題;但在凌晨三點、嘈雜的房間、手機上、以第二語言閱讀、或害怕弄壞東西時,它們就失效了。這些失效是可預測的:一個步驟中隱藏了兩個動作、警告放在其所保護的步驟之後、條件句出現在句子末尾、被動句隱藏了必須行動的人、以及像「適當」這類讓讀者猜測的詞語。
這個技能將這類文字轉化為人能逐字遵循的步驟。它借鑒了航空與工業維護中使用的受控語言紀律(短句、每句一個動作、主動語態、一詞一義)、設備標籤上使用的安全訊息順序(信號詞、危害、後果、避免方法),以及在每個風險步驟後寫上預期結果的習慣,讓讀者知道何時應停止。
這不是「讓它聽起來像人話」的修飾。目標是無法被誤讀的程序,即使聽起來稍微平淡。
何時使用
- Runbook、事件劇本、值班檢查清單、部署與回滾步驟。
- 硬體、家用設備、實驗室設備或辦公室 IT 的設定或維修指南。
- 標準操作程序(SOP)和交接記錄,供他人或下一班使用。
- 將要進行機器翻譯或由非母語人士閱讀的指示。
- 任何一個誤讀步驟可能導致資料遺失、金錢損失或人身傷害的文字。
不要用於論文、行銷文案或概念解釋。那些需要不同的語調。
規則(預設層級)
| # | 規則 | 限制或測試 |
|---|---|---|
| R1 | 每步一個動作 | 無「,然後」、「然後」、分號或同一句中用「和」連接兩個動詞 |
| R2 | 指令句簡短 | 英文 20 字,中文約 35 字元 |
| R3 | 描述句簡短 | 英文 25 字,中文約 45 字元 |
| R4 | 祈使句、主動語態 | 以動詞開頭。若非讀者本人,則指明執行者 |
| R5 | 條件在前 | 「如果燈是紅色的,停車。」而非「停車,如果燈是紅色的。」 |
| R6 | 一詞一義 | 將詞彙鎖定在詞彙表中。切勿為了變化而互換同義詞 |
| R7 | 精確數值 | 帶單位的數字,標籤與螢幕或裝置上顯示的完全一致 |
| R8 | 安全訊息在步驟之前 | 信號詞、危害、後果、該做什麼 |
| R9 | 風險步驟後的預期結果 | 「結果:...」以及結果不同時該做什麼 |
| R10 | 無猜測詞語 | 移除「適當」、「按需」、「確保」、「應該」、「剛好」 |
嚴格層級(用於安全關鍵或規範性文字):應用所有規則,無例外,不允許任何迴避詞語,並在每個步驟後加上結果行。 輕量層級(用於已經不錯的內部備註):僅應用 R1、R5、R8 和 R9。
信號詞
使用仍然正確的最低層級詞語。不要誇大。
- DANGER:若忽略將導致死亡或重傷。
- WARNING:可能導致死亡、重傷、或重要資料或金錢損失。
- CAUTION:可能導致可修復的輕微傷害或損壞。
- NOTICE:無受傷風險;僅有財產、資料或時間風險。
每條安全訊息包含三部分:危害是什麼、讀者忽略時會發生什麼、以及該做什麼。「小心」不是安全訊息。
如何操作
- 填寫程序卡。 在編輯之前,寫下:目標狀態(「Disk 2 重建中」)、誰將遵循(角色、語言、條件如手套、噪音、手機螢幕、夜間)、他們擁有的東西(權限、工具、時間)、危險以及停止條件。對於無法推斷的任何事項,請詢問使用者。缺少停止條件是最常見的缺口。
- 列出必須保留的事實。 每個數字、單位、標籤、指令、順序限制、警告和條件。改寫必須包含所有這些內容且不新增任何內容。如果你認為某個值有誤,請標記它;不要默默修正。
- 拆分為動作。 讀者執行的一個動詞 = 一個步驟。導航也算(「前往 Storage」和「選擇 Disk 2」是兩個步驟)。將背景資訊移至簡短的「開始之前」段落。
- 改寫每個步驟。 動詞在前、條件在前、精確標籤以粗體或
程式碼顯示、單位始終存在。替換所有隱藏執行者的被動語態:「金鑰被產生」變成「工具產生金鑰」,或者更好的是,讀者為產生金鑰所採取的步驟。 - 放置安全訊息。 對於每個涉及刪除、覆寫、關機、重啟、斷線、加熱、切割或加壓的步驟,將訊息直接放在該步驟上方。從上述階梯中選取信號詞。
- 添加結果和退出條件。 在每個風險或狀態改變的步驟之後,寫下讀者看到的情況,表示操作成功。如果結果可能不同,給出一行:「如果你看到 X,停止並前往恢復 A。」撰寫恢復部分。
- 鎖定詞彙表。 每樣東西挑選一個術語(例如「托盤」,而非「抽取盒」或「滑槽」)。如果程序將被維護,將其儲存為
glossary.json。 - Lint。 執行
python scripts/stepcheck.py lint procedure.md --glossary glossary.json。修復每個 UNSAFE 和 REWORK 的發現,或解釋為何某個是偽陽性。 - 進行字面走查。 僅閱讀編號步驟,假裝是完全按照每句話所述操作、不做更多事情的人。他們會在哪裡停下、猜測、或做出有害的事?修正那些地方。
- 返回 改寫後的程序,接著是簡短的變更清單(規則編號)、無法驗證的事實清單以及未解決的問題。
輔助腳本
scripts/stepcheck.py 是一個基於標準庫的 Markdown 程序 Python linter,支援英文或中文。
| 代碼 | 嚴重程度 | 意義 |
|---|---|---|
| HAZARD-NO-WARNING | 硬性 | 風險步驟上方無安全訊息 |
| LATE-WARNING | 硬性 | 安全訊息在所保護的步驟之後 |
| WEAK-WARNING | 修復 | 訊息未說明後果 |
| LONG | 修復 | 指令句超過限制 |
| STACKED | 修復 | 一個步驟中有超過一個動作 |
| HIDDEN-ACTOR | 修復 | 被動語態或「被」隱藏了執行者 |
| HEDGE / VAGUE | 修復 | 猜測詞語 |
| CONDITION-LAST | 修復 | 條件在動作之後 |
| DRIFT | 修復 | 使用了詞彙表中禁止的同義詞 |
| NO-RESULT, LONG-DESC | 備註 | 僅為建議 |
結局:READY(exit 0)、REWORK(exit 1)、UNSAFE(exit 2)。腳本使用詞彙清單和模式,因此有時會遺漏某些事項,有時也會標記出正確的句子。它從不取代步驟 9。
範例
改寫前:
- 如果 NAS 仍在運作,請將其關機。
- 拉出 Disk 2 的托盤,並將新磁碟放入。 CAUTION:舊磁碟可能很燙。
改寫後:
WARNING:在移除磁碟之前,請先將 NAS 關機。在運行中移除的磁碟可能會損壞第二個磁碟。 5. 按住電源按鈕 2 秒,將 NAS 關機。 結果:約 1 分鐘後,前方所有指示燈熄滅。 CAUTION:使用後的舊磁碟可能很燙。請握持托盤,否則可能燙傷手指。 6. 拉出 Disk 2 的托盤。 7. 將新磁碟放入托盤。
變更:R1(拆分步驟 4)、R5(透過將關機設為獨立步驟移除條件)、R8(警告上移並附加後果)、R9(添加結果)。完整檔案位於 examples/。
提示
- 如果來源文字有誤,最清晰的改寫仍然有誤。在變更清單中標記可疑的值。
- 保持指令、路徑和螢幕上的標籤逐字不變。圍繞著打錯的指令的清晰散文比原始文字更糟。
- 需要長解釋的步驟通常是一個步驟加上一個前置的備註。
- 連續編號步驟。不要在同一個程序中重新開始編號;使用不同的章節來處理恢復。
- 當同時產出中文和英文版本時,將它們並排閱讀:每個步驟應一對一對應。
- 切勿宣稱輸出符合任何官方受控語言標準。改說「以受控風格撰寫」。