Mình không cố quá sức để đúng ngay từ lần đầu. Mình cố khá nhiều để việc mình sai trở nên rẻ và nhìn thấy được — đó là một khoản đầu tư khác, và theo mình là khoản tốt hơn.
Lý do nằm ở chỗ cái sai nào mới thật sự tốn. Một quyết định sai biết tự la lên — test đỏ, một cái 500, một bản deploy không chịu khởi động — được trả giá ngay trong ngày, và hoá đơn nhỏ vì chưa có gì được dựng lên trên nó. Loại đắt tiền là quyết định sai mà trông như đúng suốt nhiều tháng: nó được phụ thuộc vào, được trích lại, được lên kế hoạch dựa trên, và tới lúc có người phát hiện thì bản sửa phải gỡ ngược hết mọi thứ nằm phía dưới nó. Nên việc cần làm không phải là làm cho cái sai hiếm đi. Là làm cho nó phát hiện được và đảo ngược được.
Đây là bốn chỗ mà chuyện đó là một vật thể có thật chứ không phải một thái độ.
11.953 dòng, rollback từng dòng một
Dữ liệu danh tính khách sạn có một luật: một mapping chỉ được vào bảng khi bằng chứng cho nó là chính code của một supplier khác. Giống nhau về tên và toạ độ chỉ là một gợi ý — nó mở ra một cuộc điều tra, nó không kết thúc cuộc điều tra nào. Hai khách sạn trùng tên trên cùng một con phố là chuyện có thật, mà cùng một toà nhà được viết theo hai kiểu ở hai supplier cũng là chuyện có thật.
Trước khi cái luật đó được ghi ra, đã có một chiến dịch bắc cầu 11.953 dòng được đẩy vào chỉ dựa trên độ giống tên và toạ độ. Khi chính sách được chốt, chiến dịch đó không sống sót. Nó bị rollback từng dòng một.
Phần mình quan tâm không phải là sự kỷ luật khi revert; mà là việc revert có sẵn để làm. Chiến dịch được viết thành một tập thay đổi có định danh riêng cho từng dòng chứ không phải một cú ghi hàng loạt, nên câu "undo đúng những dòng này và không đụng gì khác" là thứ hệ thống diễn đạt được. Nếu nó là một câu UPDATE quét một phát, thì cùng quyết định đó vẫn đúng nhưng không trả nổi — và khi đó chuyện xảy ra là chính sách lặng lẽ được cấp một ngoại lệ cho phần dữ liệu đã nằm sẵn trong bảng. Chính khả năng đảo ngược mới cho phép cái luật áp được lên cả quá khứ chứ không chỉ tương lai. Luật đó vẫn giữ nguyên từ 2022.
Một file chi phí ghi rõ đo được hay ước lượng
Có một file ghi lại công việc về chi phí hạ tầng, và mỗi con số trong đó mang theo ba thứ: một nhãn nói nó là đo được hay ước lượng, một cái ngày, và một nguồn. Cái nhãn không phải trang trí. Một con số thiếu nhãn sẽ thoái hoá thành một sự thật — sáu tháng sau có người đọc nó trong một cuộc họp và trích lại với sự tự tin của một phép đo, vì chẳng có gì trên trang đó nói ngược lại.
Mục mình quý nhất là một lần tối ưu được ghi lại như một thất bại. Nó không hoàn vốn. Thay vì xoá đi — cái thường xảy ra với những việc không về đích — mục đó giữ nguyên phần tính toán cho thấy nó không hoàn vốn, để người sau nếu định làm đúng ý tưởng ấy thì gặp được lập luận thay vì phải tự khám phá lại. Một file chỉ chứa toàn thắng lợi thì không phải một bản ghi. Nó là một cuốn highlight, mà không ai lên kế hoạch được từ một cuốn highlight.
Cái đoạn bắt buộc phải viết sau cùng
Mọi output dạng audit mình làm ra đều kết thúc bằng một mục bắt buộc: những gì tôi không chắc. Site này đã có sẵn phần lập luận vì sao — một tài liệu mất lòng tin theo cả cụm, nên một đoạn không-chắc được dán nhãn rõ là khoản bảo hiểm rẻ. Cái mình muốn thêm ở đây là tác dụng cơ học của việc bị bắt phải viết nó ra.
Không thể điền mục đó một cách thành thật mà không liệt kê ra những thứ có thể chứng minh tài liệu này sai. Chính cái danh sách đó mới là phần có giá trị. Nó biến một cảm giác mơ hồ kiểu "mình chưa kiểm hết" thành những mục có tên — khẳng định này lấy từ đúng một nguồn log và mình chưa đối chiếu chéo, hành vi kia mình suy ra từ code chứ chưa từng nhìn nó chạy. Đủ nhiều lần, viết cái đoạn đó đẩy mình quay lại kiểm một trong những mục ấy, tức là cái mục đó làm xong việc của nó trước cả khi có ai kịp đọc.
Những agent có việc là cãi lại mình
Phiên bản mới nhất của chuyện này lại là thứ đổi thói quen của mình nhiều nhất. Khi một cuộc điều tra ra được một kết luận, bước tiếp theo hữu ích không phải là đi thêm một lượt tìm bằng chứng ủng hộ — mình sẽ tìm ra thôi; xác nhận thì dễ và gần như vô giá trị. Bước tiếp theo hữu ích là một agent có nhiệm vụ được ghi rõ là bác bỏ kết luận đó: đi tìm cách đọc chính đám bằng chứng ấy sao cho kết luận là sai.
Cách đặt vấn đề quan trọng hơn cái tool. "Kiểm lại giúp tôi" thì sinh ra sự đồng ý. "Tìm cho tôi trường hợp mà điều này sai" thì sinh ra một danh sách các điều kiện khiến mình sai, và mấy điều kiện đó dùng được ngay — hoặc mình loại trừ được chúng, hoặc mình vừa học ra kết luận của mình thật ra đang dựa vào cái gì. Dĩ nhiên pattern này cũ hơn cái tool nhiều; đó là việc một người review giỏi vẫn làm. Biến nó thành một bước riêng, có tên, nghĩa là nó vẫn xảy ra kể cả khi không ai còn thời gian để làm một người review giỏi.
Cái này tốn gì, và con số không có ở đây
Chẳng thứ nào trong số trên miễn phí. Viết một chiến dịch đảo ngược được thì tốn công hơn một cú update hàng loạt. Dán nhãn cho từng con số thì viết chậm hơn. Một lượt bác bỏ thì tốn đúng một lượt. Mình chưa đo cái nào trong số đó so với thứ nó trả lại, và mình sẽ không dựng ra một tỉ lệ để lập luận trông gọn hơn thực tế.
Mà đó cũng chính là kỷ luật site này đang chạy. Không có con số giờ tiết kiệm được ở bất kỳ đâu trên đây, không có phần trăm hiệu quả, không có bảng trước-và-sau. Không phải vì việc đã làm không có tác dụng, mà vì một con số ước lượng bị người đọc sau này tưởng là một phép đo là cách nhanh nhất để mất lòng tin vào cả một tài liệu — và khi chuyện đó xảy ra, những khẳng định đúng chìm theo cái con số bịa. Không đăng gì ở chỗ mình không đo gì thì không phải là khiêm tốn. Đó là đúng cái lập luận đảo-ngược-được, đem áp vào chuyện viết: một khẳng định mình chưa từng đưa ra là một khẳng định mình không bao giờ phải gỡ.