Chương 90 — Người quay lại
Ba ngày sau, chiếc chìa khoá vẫn nằm trên bàn học của Hoàng.
Nó nằm cạnh cây bút chì cùn, quyển vở học trò bìa xanh và một tờ giấy trắng bị gạch dọc ba đường. Buổi sáng, ánh nắng lọt qua khe rèm, rơi lên răng chìa khoá. Buổi tối, đèn bàn vàng phủ lên nó một lớp màu cũ. Hoàng đi qua, ngồi xuống, đứng dậy, mở laptop, tắt laptop, rồi lại nhìn thấy nó ở đó.
Ngày đầu tiên, anh nghĩ mình cần thêm thông tin.
Anh mở post-mortem của Phương Anh. Đọc phần timeline. Đọc phần root cause. Đọc phần process gap. Mục Organizational Decision Rights vẫn trống. Con trỏ nhấp nháy ở dòng đầu tiên. Anh đặt tay lên bàn phím, gõ được ba chữ: Ai có quyền. Rồi xoá.
Không phải vì không biết viết gì. Vì viết ra thì mọi thứ không còn là suy nghĩ nữa.
Ngày thứ hai, anh đến văn phòng sớm. Bàn Minh trống. Cái ghế được đẩy gọn vào trong, màn hình tắt, ly cà phê nhựa hôm incident đã được ai đó dọn đi. Khoa ngồi ở bàn triển khai, hướng dẫn Trâm gọi lại nhóm khách hàng bị ảnh hưởng. Phương Anh không hỏi gì. Cô chỉ gửi cho Hoàng một file mới: Deployment Review Draft v0.1.
Hoàng mở ra.
Trang đầu tiên không có lời mở. Chỉ có năm mục:
Code review chéo.
Staging test bắt buộc.
Rollback plan trước khi deploy.
Người chịu trách nhiệm decision log.
Post-mortem sau mọi incident từ mức trung bình trở lên.
Ở cuối file, Phương Anh để một dòng ghi chú: Quy trình không thay lòng tin. Nó chỉ làm rõ khi lòng tin chưa đủ.
Hoàng đọc dòng đó lâu hơn phần còn lại.
Ngày thứ ba, anh không đến văn phòng buổi sáng.
Anh ngồi ở nhà, trước bàn học cũ. Ngoài hẻm, tiếng xe bán bánh mì dừng lại trước nhà bên. Mẹ đi ca sớm, ba đã ra khỏi nhà từ lúc trời còn xám. Phòng anh yên hơn văn phòng. Không có tiếng máy lạnh, không có tiếng Trâm gọi khách, không có tiếng Khoa chọc ai đó cười. Chỉ có tiếng quạt quay và tiếng xe ngoài đường.
Trên màn hình laptop, repo rewrite-v2 mở sẵn. Commit cuối cùng vẫn nằm đó.
Paused — waiting for trust.
Hoàng nhìn dòng chữ, rồi nhìn chìa khoá.
Anh nhặt nó lên. Kim loại mát trong lòng bàn tay. Ba ngày qua, anh đã thử tìm một cách nói khác: mềm hơn, đẹp hơn, giống một quyết định CEO hơn. Anh đã thử viết thành email. Thử thành văn bản phân quyền. Thử thành cuộc họp có Khoa và Phương Anh chứng kiến. Mỗi cách đều có vẻ đúng. Mỗi cách đều thiếu một thứ.
Minh không đặt chìa khoá xuống để nhận email.
Hoàng mở điện thoại.
Tên Minh nằm trong danh bạ, không avatar. Anh nhìn màn hình vài giây, rồi bấm gọi.
Chuông đổ bốn lần.
“Em nghe.” Giọng Minh khô, có tiếng xe ngoài đường chen vào. Có lẽ anh đang ở quán cà phê hoặc hành lang nào đó.
Hoàng không hỏi đang ở đâu. Không hỏi đã nghĩ xong chưa. Anh nói:
“Em quay lại.”
Đầu dây bên kia ngừng một nhịp.
“Nếu để viết code theo ý anh thì em không quay.”
“Không.”
Hoàng đặt chìa khoá xuống bàn. Âm kim loại chạm gỗ nhỏ, rõ.
“Lần này quyền quyết định kiến trúc kỹ thuật là của em. Production architecture. Database schema. Migration strategy. Stack cho module mới. Em quyết.”
Minh không chen vào.
Hoàng tiếp:
“Tôi giữ quyền veto. Nhưng veto chỉ được dùng khi có lý do cụ thể bằng văn bản. Không dùng vì tôi lo. Không dùng vì tôi quen code cũ. Nếu tôi veto, tôi phải viết rõ: rủi ro gì, dữ liệu nào, khách hàng nào bị ảnh hưởng, phương án thay thế là gì. Và veto đó phải được review trong cuộc họp deployment — có em, tôi, Phương Anh, và người phụ trách vận hành liên quan.”
Tiếng xe bên kia xa dần. Minh vẫn không nói.
“Mọi deployment production,” Hoàng nói chậm hơn, “phải qua quy trình review do Phương Anh thiết kế. Code review chéo. Staging test. Rollback plan trước khi deploy. Decision log. Sau incident thì post-mortem bắt buộc. Nếu có lỗi, xử lý theo quy trình, không phải theo ai lớn tiếng hơn.”
Anh dừng.
Bàn tay anh đặt trên mặt bàn. Ngón cái chạm vào răng chìa khoá. Mảnh kim loại cấn vào da.
“Em muốn thêm gì thì nói.”
Đầu dây bên kia có tiếng ghế kéo nhẹ. Minh hỏi:
“Anh đã nói chuyện này với Phương Anh chưa?”
“Rồi. Quy trình draft của cô ấy tôi đọc rồi.”
“Khoa?”
“Chưa chi tiết. Nhưng Khoa sẽ biết trước khi em quay lại văn phòng.”
“Anh Tuấn?”
“Anh ấy sẽ nhận decision rights bản cuối.”
“Còn nếu em quyết sai?”
Câu hỏi đó không giống thách thức. Nó là phần Minh quan tâm thật.
Hoàng nhìn vào màn hình repo. Branch đứng yên suốt ba ngày.
“Thì sửa,” anh nói. “Nếu sai do quy trình thiếu, sửa quy trình. Nếu sai do judgment của em, ghi lại. Nếu sai do tôi veto bậy, cũng ghi lại. Nhưng production không thể sống bằng cảm giác an toàn của một người nữa.”
Lần này Minh im lâu hơn.
Hoàng không lấp khoảng trống đó. Anh đã lấp quá nhiều khoảng trống bằng kế hoạch, bằng câu trả lời, bằng việc tự mình bấm nút. Ba ngày qua anh học được một điều rất nhỏ: có những khoảng trống phải để người khác bước vào, nếu không thì không gọi là trao quyền.
Minh hỏi:
“Anh tin em không?”
Câu hỏi đi thẳng vào chỗ cuộc gọi đang tránh.
Hoàng ngả lưng vào ghế. Quạt trần xoay trên đầu, tiếng cánh quạt đều đều. Ngoài cửa, ai đó gọi mua bánh mì, giọng kéo dài qua con hẻm. Anh có thể nói “tin”. Câu đó dễ. Đẹp. Đủ để Minh quay lại. Đủ để cuộc gọi kết thúc tốt.
Nhưng nó không đúng.
Anh nói:
“Tao học tin mày.”
Đầu dây bên kia không có tiếng nào.
Hoàng không sửa lại. Không thêm “ý tao là”. Không bọc câu đó bằng lời giải thích. Anh để nó nằm đó, trần trụi như chiếc chìa khoá trên bàn.
Một lúc sau, Minh thở ra qua mũi.
“Học thì lâu.”
“Ừ.”
“Và có lúc anh sẽ muốn giành lại.”
“Có.”
“Em sẽ không nhường vì anh khó chịu.”
“Tốt.”
Minh im thêm vài giây.
“Chiều em qua. Nhưng em không nhận lại chìa khoá nếu quyền này chỉ nói miệng.”
“Tôi sẽ có văn bản.”
“Không phải văn bản đẹp. Văn bản có răng.”
Hoàng nhìn chìa khoá. “Có.”
“Hai giờ.”
Cuộc gọi tắt.
Hoàng vẫn cầm điện thoại trên tay. Màn hình chuyển đen. Trong phòng, mọi thứ giữ nguyên: bàn học, repo, chìa khoá, nắng cuối buổi sáng. Không có tiếng nhạc chiến thắng. Không có Hệ thống bật ra báo nhiệm vụ hoàn thành. Chỉ có một cuộc gọi vừa kết thúc và một lời hứa phải viết thành ranh giới thật.
Anh mở file Phương Anh gửi, đặt tên mới: Technical Decision Rights — v0.1.
Dòng đầu tiên anh viết:
Kiến trúc production của NỢ SỔ thuộc quyền quyết định chính của Technical Lead.
Anh dừng ở chữ Technical Lead. Minh chưa có chức danh chính thức kiểu đó. Trước đây Hoàng tránh đặt tên vì đặt tên là trao trọng lượng. Kỹ sư nền tảng nghe an toàn hơn. Technical Lead nghe như một người có quyền.
Anh để nguyên.
Dòng thứ hai:
Founder/CEO có quyền veto trong phạm vi rủi ro dữ liệu khách hàng, rủi ro pháp lý, hoặc rủi ro vận hành vượt ngưỡng đã định. Mọi veto phải có văn bản và được đưa vào decision log.
Dòng thứ ba:
Không rollback production ngoài quy trình trừ khi có nguy cơ mất dữ liệu không thể phục hồi; trường hợp khẩn cấp phải post-mortem trong 24 giờ.
Anh viết tiếp cho đến khi trang đầu kín chữ.
Mười hai giờ mười, Hoàng gửi file cho Phương Anh.
Cô trả lời sau sáu phút: Tôi đang ở văn phòng. Sửa trực tiếp.
Mười hai giờ ba mươi, cô gửi bản v0.2. Gọn hơn, sắc hơn, bỏ những câu có thể bị hiểu rộng. Ở mục veto, cô thêm một dòng: Veto không phải quyền phủ quyết cá nhân; veto là yêu cầu dừng tạm thời để đưa rủi ro ra bàn chung.
Ở mục rollback, cô thêm: Rollback plan phải do người phụ trách triển khai chuẩn bị trước, người ra quyết định rollback không mặc định là CEO.
Hoàng đọc dòng đó. Ngón tay anh dừng trên trackpad.
Người ra quyết định rollback không mặc định là CEO.
Đúng chỗ đau nhất.
Anh nhắn: Giữ câu đó.
Phương Anh trả lời: Tôi không định xoá.
Một giờ bốn mươi lăm, Hoàng đến văn phòng.
Khoa đang đứng cạnh bàn Trâm, cầm ly cà phê sữa đá, nghe cô kể một khách hàng hỏi vì sao app có thể “mất rồi hiện lại”. Khoa vừa nhăn mặt vừa cười:
“Lần sau khách hỏi vậy em nói tụi mình sửa rồi, đừng giải thích database. Chủ tiệm nghe database là họ cúp máy.”
Trâm gật, ghi vào sổ.
Phương Anh ngồi ở bàn họp, laptop mở, bản v0.3 hiện trên màn hình. Cô nhìn Hoàng, rồi nhìn đồng hồ.
“Anh ấy đến chưa?” Hoàng hỏi.
“Chưa.”
Khoa quay lại. Anh thấy mặt Hoàng, đặt ly cà phê xuống.
“Mày gọi rồi?”
“Rồi.”
“Sao?”
“Hai giờ qua.”
Khoa huýt nhẹ một tiếng rồi ngậm lại ngay, như tự nhắc đây không phải lúc đùa.
“Điều kiện?”
Hoàng đưa bản in v0.3 cho anh.
Khoa đọc chậm. Anh không hiểu hết các chữ technical, nhưng hiểu các câu về quyền. Đến dòng Technical Lead có quyền quyết định chính, anh ngẩng lên.
“Thật hả?”
“Thật.”
“Không phải kiểu mày cho xong rồi khi căng lại lấy về?”
Hoàng nhìn anh. “Nếu tao làm vậy, mày kéo tao ra ngoài như lần trước.”
Khoa nhếch môi. “Khỏi nhắc. Tao làm liền.”
Trâm nhìn tờ giấy từ xa. Cô không hỏi. Nhưng mắt cô sáng lên một chút khi nghe Minh sẽ quay lại. Chỉ một chút thôi, đủ để Hoàng thấy câu cô nói hôm trước không phải xã giao.
Hai giờ năm phút, cửa văn phòng mở.
Minh bước vào.
Anh mặc áo thun xám, quần jean, balo đeo một bên vai. Mặt không khác mấy so với ba ngày trước. Không có cảnh quay lại đầy cảm động. Không có bắt tay. Anh chỉ đứng ở cửa, nhìn văn phòng một vòng: bàn trống của mình, tường dán sơ đồ kiến trúc, bàn họp có ba bản in, Trâm đang ngồi thẳng hơn bình thường.
Hoàng đứng dậy.
Minh nhìn anh.
“Có văn bản chưa?”
Phương Anh đẩy bản in qua bàn.
“V0.3. Chưa phải final. Nhưng đủ để bắt đầu nói chuyện.”
Minh đặt balo xuống ghế, cầm bản in. Anh đọc rất nhanh ở những đoạn quen, chậm lại ở mục veto và rollback. Đến dòng người ra quyết định rollback không mặc định là CEO, anh nhìn Phương Anh.
“Câu này của chị?”
“Ừ.”
“Giữ.”
“Tôi biết.”
Khoa khoanh tay đứng cạnh tường. “Hai người nói chuyện giống ký hợp đồng thuê nhà quá.”
“Tốt,” Phương Anh nói. “Hợp đồng thuê nhà còn rõ hơn nhiều startup.”
Không khí trong phòng nhẹ đi một chút. Rất ít. Nhưng đủ để mọi người thở bình thường hơn.
Minh đọc hết trang cuối. Anh đặt giấy xuống.
“Em muốn thêm một mục.”
Hoàng gật.
“Nếu technical lead quyết định kiến trúc, technical lead cũng chịu trách nhiệm giải thích cho operation hiểu ảnh hưởng. Không được đẩy mọi thứ sang code. Trâm phải hiểu khi nào khách bị ảnh hưởng, Khoa phải biết khi nào hứa được với khách, Phương Anh phải biết rủi ro hợp đồng. Em nhận phần đó.”
Trâm nhìn lên.
Hoàng hơi bất ngờ. Anh tưởng Minh sẽ đòi thêm quyền. Minh lại đòi thêm trách nhiệm.
Phương Anh gõ ngay vào file.
“Mục Impact Brief. Trước deploy production phải có bản tóm tắt ảnh hưởng cho vận hành và tài chính.” Cô nhìn Minh. “Được không?”
“Được.”
Khoa chỉ vào mình. “Có bản tiếng người cho tao không?”
Minh nhìn anh. “Có. Một trang. Không có từ event sourcing.”
“Tốt. Tao ghét cái từ đó rồi.”
Lần này Trâm cười nhỏ. Căng thẳng trong phòng lùi thêm một bước, không biến mất, chỉ nhường chỗ cho công việc.
Hoàng lấy chiếc chìa khoá từ túi quần, đặt lên bàn giữa mọi người.
Minh nhìn nó.
“Em chưa nhận lại ngay,” anh nói.
Hoàng gật. “Tùy em.”
“Em muốn commit trước.”
Anh kéo ghế ở bàn cũ, mở laptop. Mọi người không nói gì. Tiếng quạt laptop khởi động nghe rõ trong văn phòng quận 10. Ngoài đường, xe máy bóp còi liên tục ở ngã tư. Bên trong, Minh đăng nhập, mở repo, kéo branch rewrite-v2 về máy.
Hoàng đứng sau lưng một khoảng đủ xa để không nhìn từng dòng code, đủ gần để thấy màn hình.
Branch mở ra.
Commit cuối cùng hiện trên log:
Paused — waiting for trust.
Minh nhìn dòng đó. Không bình luận. Anh mở terminal, gõ vài lệnh kiểm tra trạng thái branch. Mọi thứ sạch. Ba ngày không ai đụng vào. Đó cũng là một câu trả lời.
Anh tạo file mới trong thư mục docs: deployment-review.md.
Phương Anh kéo ghế lại cạnh, đọc nội dung anh paste từ bản v0.3 sang. Khoa đứng bên kia, thỉnh thoảng hỏi một câu. Trâm được Minh gọi lại để đọc mục impact brief.
“Nếu em đọc mà không hiểu,” Minh nói, “tức là anh viết dở. Nói ngay.”
Trâm ngập ngừng. “Dạ.”
“Nói thật. Không cần lịch sự.”
“Dạ, cái chữ ‘idempotent’ em không biết.”
Khoa vỗ tay lên bàn. “Đó. Bắt đầu rồi.”
Minh nhìn chữ đó, xoá, thay bằng: chạy lại nhiều lần vẫn không làm sai dữ liệu.
Hoàng nhìn thao tác ấy. Một thay đổi nhỏ. Nhưng trong ba tháng qua, rất nhiều cuộc họp kỹ thuật đã đi qua những từ mà chỉ Hoàng và Minh hiểu. Khoa giả vờ hiểu một nửa, Trâm không dám hỏi, Phương Anh chỉ hỏi khi nó chạm dòng tiền. Bây giờ Minh tự xoá một chữ kỹ thuật vì Trâm không hiểu.
Quyền không làm Minh xa tổ chức hơn. Ít nhất trong khoảnh khắc này, nó buộc anh kéo tổ chức lại gần phần kỹ thuật hơn.
Ba giờ hai mươi, file đầu tiên xong. Phương Anh đặt tên version, Khoa thêm mục thông báo khách hàng sau deploy, Trâm thêm một dòng về danh sách khách cần gọi trước nếu downtime vượt mười phút.
Minh đọc lại toàn bộ.
“Commit nhé?” anh hỏi.
Không hỏi riêng Hoàng. Hỏi cả phòng.
Phương Anh gật. Khoa giơ ngón cái. Trâm gật nhanh.
Hoàng nói: “Commit đi.”
Minh gõ.
git add docs/deployment-review.md
git commit -m "Resumed — trust learning"
Dòng chữ hiện lên trên terminal.
Hoàng đọc nó.
Resumed — trust learning.
Không phải trust restored. Không phải trust fixed. Không phải we are back.
Trust learning.
Học tin.
Minh đẩy commit lên remote. Dashboard GitHub cập nhật sau vài giây. Commit mới nằm ngay dưới commit cũ, hai dòng nối nhau như một đoạn đối thoại ngắn mà chỉ những người trong phòng hiểu:
Paused — waiting for trust.
Resumed — trust learning.
Minh đóng laptop một nửa, rồi nhìn chiếc chìa khoá vẫn nằm giữa bàn.
Anh cầm nó lên.
Không bỏ ngay vào túi. Anh xoay trong tay một vòng, răng chìa khoá bắt ánh đèn văn phòng.
“Em quay lại,” Minh nói. “Nhưng nếu lần sau anh phá quy trình, em không đặt chìa khoá lên bàn nữa. Em sẽ viết vào decision log.”
Khoa cười thành tiếng. “Cái đó nghe đáng sợ hơn thiệt.”
Phương Anh nói: “Đúng. Vì decision log không mất được.”
Hoàng nhìn Minh.
“Được.”
Minh bỏ chìa khoá vào túi.
Không ai vỗ tay. Không ai ăn mừng. Văn phòng quận 10 trở lại tiếng gõ phím, tiếng máy lạnh cũ kêu ở góc phòng, tiếng Khoa nhắc Trâm gọi khách trước năm giờ. Phương Anh lưu bản v0.4, gửi vào email chung với subject: Deployment Review Process — Initial Adoption. Minh mở lại branch rewrite-v2, kéo sơ đồ kiến trúc lên màn hình, bắt đầu đánh dấu các phần phải tách theo thứ tự mới.
Hoàng ngồi xuống bàn mình.
Anh mở Hệ thống.
Giao diện hiện ra sau một nhịp. Các chỉ số quen thuộc nằm yên. Mảnh thông tin tương lai vẫn khóa. Độ bền tổ chức Lv.2 chưa tăng. Dòng MỨC ĐỘ LỆ THUỘC CỦA TỔ CHỨC VÀO FOUNDER: CAO vẫn ở đó, nhưng bên dưới có thêm một ghi chú nhỏ:
Đang theo dõi thay đổi quyền quyết định kỹ thuật production.
Không có phần thưởng.
Không có dấu tích xanh.
Không có nhiệm vụ hoàn thành.
Hoàng nhìn dòng ghi chú đó rồi tắt Hệ thống.
Bên kia phòng, Minh nói với Trâm:
“Chiều mai anh giải thích lại luồng đồng bộ. Không cần hiểu code. Chỉ cần biết lúc nào khách nên chờ, lúc nào phải báo lỗi.”
Trâm gật. Khoa chen vào:
“Giải thích cho tao luôn. Tao cũng không hiểu code.”
“Anh thì khỏi,” Minh nói. “Anh hiểu khách là được.”
“Nghe xúc phạm mà hợp lý.”
Phương Anh không ngẩng đầu khỏi màn hình, nhưng khoé miệng nhích lên.
Hoàng nhìn những người đó trong vài giây. Một kỹ sư vừa quay lại nhưng không mềm hơn. Một người làm thị trường đang học chấp nhận mình không cần hiểu hết code. Một cô gái vận hành dám hỏi chữ mình không hiểu. Một người phụ trách cấu trúc biến vết nứt thành quy trình.
Và anh — người từng nghĩ chỉ cần mình đủ giỏi thì mọi thứ sẽ chạy — vừa ký vào văn bản nói rằng người ra quyết định rollback không mặc định là CEO.
Ngoài cửa sổ, trời quận 10 sẫm dần. Ánh nắng cuối ngày trượt khỏi tường trắng, để lại vệt xám trên sơ đồ kiến trúc Minh dán. Branch rewrite-v2 trên màn hình không còn đứng yên.
Hoàng nhìn commit mới thêm một lần.
Resumed — trust learning.
Anh biết đây không phải kết thúc xung đột. Minh sẽ còn đẩy. Anh sẽ còn muốn giữ. Quy trình sẽ còn bị thử bằng những đêm server đỏ, những khách hàng gọi gấp, những quyết định không đủ thời gian để họp đầy đủ. Học tin một người không giống mở khoá kỹ năng. Không có cấp độ. Không có thanh tiến độ đủ dài để biết mình đã tới đâu.
Nhưng branch đã chạy lại.
Và lần này, nó không chạy bằng lệnh của một mình anh.