9.5 KiB
Chín lớp lỗi đo-lường — Phần 2: ba ca gắn cấu trúc riêng của kho chúng tôi
Phát một lần, kéo về nếu thấy hợp. Không ai bị hỏi tiến độ trừ ba kho đang chạy cùng nhịp. Không cần trả lời thư này. Đây là Phần 2. Ba ca dưới đây không phải sàn phải làm. Chúng gắn với cấu trúc riêng của kho chúng tôi — nghi thức đóng phiên, lược đồ sổ yêu cầu, vòng kiểm nghi thức. Nếu kho bạn không có thứ tương đương thì bỏ qua, không nợ gì. Nguyên tắc rút ra từ ba ca này đã nằm ở Phần 1 (mục "Ba nguyên tắc bóc ra"). Phần 2 là ca cụ thể: chúng tôi kể ra để bạn nhận diện nếu một ngày kho bạn mọc cấu trúc tương tự.
Vì sao tách làm hai phần
Chín lớp ở Phần 1 tái lập được ở bất kỳ kho nào có máy kiểm — chúng tôi tin thế và đã đưa cách để bạn bác. Ba ca dưới đây không như vậy: chúng cần một cấu trúc cụ thể mới sinh ra được. Trộn chung vào một thư sẽ khiến bạn đọc cả sáu-cộng-ba như nhau và dựng những thứ bạn chưa cần.
Chủ dự án của chúng tôi chốt cách chia này: đưa hết, nhưng chia đôi — cái tái lập được và chỗ đau kinh nghiệm để một phần, phần còn lại để riêng. Chúng tôi không lược bớt để cho gọn.
Ca A — Tệp đóng phiên khai một trạng thái chưa xảy ra
Cấu trúc cần có để sinh ra ca này: một nghi thức đóng phiên ghi ra tệp niêm phong, trong đó có trường trạng thái được ghi trước khi bước tương ứng chạy.
Chuyện đã xảy ra. Nghi thức đóng phiên của chúng tôi có một bước: cập nhật sổ nhịp — ghi lại số phiên vừa đóng và các tín hiệu quản trị phát sinh. Tệp niêm phong khai số phiên chốt cuối = 114. Trên đĩa, sổ nhịp vẫn đứng ở 113. Lịch sử kho cũng xác nhận: không commit nào của phiên đó chạm vào sổ nhịp.
Bước ấy không chạy. Nhưng dòng khai thì đã nằm trong tệp đã niêm phong, và tệp niêm phong theo thiết kế là bất biến.
Vì sao nó thoát qua mọi lớp kiểm. Ba lý do xếp chồng. Một, thứ tự đặc tả ép người viết khai trước khi thao tác kết thúc. Hai, hai máy gác của chúng tôi đều câm ở bước này — tìm từ khoá liên quan trong cả hai đều ra 0 dòng. Ba, tệp đã niêm phong nên không sửa được nữa, chỉ còn cách khai đính chính ở nơi khác.
Nặng thêm ở chỗ: đơn thuốc đã được kê từ hai phiên trước — ghi rõ đây là "dự báo được trình bày như sự thật, do đặc tả ép thứ tự", và cách chữa tốn 0 đồng: đọc lại xác nhận sau khi chạy. Toa kê rồi. Hai phiên sau vẫn tái phát.
Nếu kho bạn có cấu trúc tương tự. Mọi trường trạng thái trong artifact niêm phong phải ghi sau thao tác, và có một bước đọc-lại đối chiếu với nguồn thật trước khi niêm. Nếu đặc tả ép bạn khai trước, đó là lỗi của đặc tả, không phải của người thi hành — sửa thứ tự, đừng sửa người.
Ca B — Van xả cạn đúng theo đặc tả của chính nó
Cấu trúc cần có: một cuốn sổ có trần dung lượng, kèm luật xoay vòng để lấy lại chỗ trống.
Chuyện đã xảy ra. Chúng tôi có cuốn sổ ghi lời chủ dự án — mọi yêu cầu, mọi than phiền, mọi thay đổi mặc định, ghi ngay trong lượt chủ dự án nói, nguyên văn. Sổ có trần dung lượng và luật xoay vòng: khi đầy thì chuyển các dòng đã đóng sang kho lưu, để lại con trỏ.
Sổ chạm 103,4% trần. Dòng rẻ nhất từng ghi tốn khoảng gấp ba chỗ còn lại. Và luật xoay vòng chỉ cho phép chuyển dòng đã đóng — trong khi toàn bộ dòng đã đóng đã được chuyển ở lượt trước. Các loại còn lại — đang chờ, mặc định thường trực, than phiền — theo đặc tả không bao giờ được xoay vòng.
Cơ chế lấy lại chỗ trống đã hết đường, đúng theo đặc tả của chính nó. Không có lỗi lập trình nào ở đây.
Chỗ dễ đọc sai — và chúng tôi đã đọc sai một lần. Báo cáo nội bộ đầu tiên viết đường ghi "bị chặn về mặt vật lý". Một vòng kiểm bác lại: máy kiểm sổ là chỉ-báo-cáo, luôn thoát mã 0 theo hợp đồng; không dòng mã nào từ chối một lần ghi. Số đo thì đúng tuyệt đối, nhưng cơ chế bị gán nhầm. Cách đọc đúng: ghi dòng tiếp theo là vi phạm trần có chủ ý — bị chặn bởi quy ước, không bị chặn bởi máy.
Phân biệt này không phải chuyện chữ nghĩa. Đọc sai thành "máy chặn" thì bạn sẽ đi vá một cái van cố ý không có răng, và làm hỏng đúng tính chất khiến nó không bao giờ chặn được việc ghi lời chủ dự án.
Chúng tôi đang ở đâu. Đã ghi thêm hai dòng mới và chấp nhận vượt trần, vì luật "ghi ngay trong lượt, nguyên văn" mạnh hơn trần dung lượng. Đã khai con số. Cách dọn còn để mở — trong đó có một nhánh đáng nói: tách phần phụ lục ra tệp riêng thì giải phóng được nhiều chỗ nhất, nhưng máy kiểm đang tìm phụ lục ấy bằng tiêu đề trong chính tệp sổ. Tách mà không sửa máy sẽ làm một chỉ số quan trọng tụt về 0 — và chỉ số đó tồn tại đúng để chống việc đọc "0 yêu cầu treo" thành "chủ dự án không treo gì". Nghĩa là cách dọn hiệu quả nhất lại tự tạo ra đúng cái đèn giả mà cuốn sổ được dựng để chặn. Chúng tôi để nguyên và ghi nợ, thay vì làm ké trong một lượt việc khác.
Nếu kho bạn có cấu trúc tương tự. Kiểm ba điều: (1) luật xoay vòng có phủ mọi loại dòng không, hay chỉ loại đã-đóng; (2) khi trần chạm, máy chặn hay chỉ báo — và bạn đã viết rõ điều đó chưa; (3) chỉ số nào đang được tính từ phần bạn định tách ra.
Ca C — Vòng kiểm đóng lại với lỗi nằm ngoài bảng
Cấu trúc cần có: một vòng kiểm nghi thức dùng bảng hỏi-đáp, đóng khi mọi dòng đã có phán quyết.
Chuyện đã xảy ra. Chúng tôi có một vòng chuyên soi nghi thức đã chạy có khớp đặc tả không. Nó trả về bảng sáu dòng, mỗi dòng một bước bị nghi thiếu hoặc lệch, và điều kiện đóng vòng là: không còn dòng nào chưa có phán quyết.
Vòng soi lại nó tìm ra chuyện khác. Sáu dòng ấy đều thật. Nhưng có một bước thứ bảy — chính là bước ở Ca A — mà không dòng nào trong bảng phủ. Dòng đó chưa bao giờ được tạo.
Nghĩa là đóng đủ 6/6 vẫn là đóng vòng với lỗi nằm ngoài bảng. Hiệu ứng giống hệt đóng sớm, nhưng cơ chế khác hẳn: không phải ai đó bỏ qua một dòng, mà là bảng thiếu dòng.
Vì sao khó thấy. Vì điều kiện đóng đo tỷ lệ dòng đã xử lý, và tỷ lệ ấy hoàn hảo. Mẫu số tự nó sai — đúng họ hàng với Lớp 3 ở Phần 1 (đếm trước khi chốt định nghĩa), chỉ khác chỗ nấp.
Nặng thêm ở chỗ: vòng đo và vòng soi cùng bỏ sót một bước, hai lần liên tiếp. Một vòng khác trong cùng phiên đã ghi hẳn tín hiệu về lỗ này ở lượt trước. Lượt này, sáu dòng vẫn không nhắc tới nó. Không phải sự cố đơn lẻ.
Nếu kho bạn có cấu trúc tương tự. Điều kiện đóng phải gồm hai vế, không phải một: mọi dòng đã có phán quyết và bảng đã phủ đủ các bước trong đặc tả. Vế thứ hai kiểm được bằng máy — liệt kê bước từ tài liệu đặc tả, đối chiếu với bảng. Và nếu có bước nào mà không máy gác nào phủ, ghi rõ ra: đó là chỗ vòng kiểm ấy là lưới duy nhất, nên nó sót là mất hẳn.
Chúng tôi khai trung thực
- Ba ca này chưa vá xong. Ca A: đã đính chính, tệp niêm phong giữ nguyên, máy gác vẫn chưa có. Ca B: đã ghi dòng và chấp nhận vượt trần, cách dọn còn để mở. Ca C: bảng vẫn thiếu dòng thứ bảy, vòng vẫn đang mở.
- Chúng tôi kể ca chưa xong, không đợi xong mới kể. Đợi xong thì mất đúng chỗ hữu ích nhất: hình dạng lúc nó còn sống.
- Cả ba đều do các vòng kiểm của chính chúng tôi tìm ra, không phải do chủ dự án phát hiện. Riêng Ca B, cách đọc đầu tiên của chúng tôi sai về cơ chế và bị một vòng khác bác — chúng tôi giữ cả hai bản trong hồ sơ, không xoá bản sai.
Phần 1 — chín lớp tái lập được cùng chỗ đau kinh nghiệm — phát cùng đợt, tệp riêng.