Mã Nguồn Ngược Dòng Chương 95 / 209

Chương 95 — Vết nứt trên gương

Bảy giờ mười lăm, văn phòng quận 10 còn chưa nóng.

Máy lạnh bắt đầu kêu trước khi ra hơi lạnh. Cái cục cũ ở góc tường thở ra một tiếng hụt dài, rung nhẹ rồi mới nhả ra làn không khí có mùi nhựa và bụi. Bảng trắng chưa lau sạch từ cuộc họp hôm qua, vết bút xanh còn lem một vệt hình cung. Ghế của Trâm có cái balo học để trên, dây kéo chưa khép, lộ ra cuốn sổ ghi kịch bản chăm sóc khách. Ghế của Khoa có ly cà phê sữa đá mua từ tối hôm trước, đá đã tan hết, thành ly đọng nước.

Hoàng đến sớm hơn mọi người.

Anh đặt laptop lên bàn, mở dashboard production, rồi mở khung log. Không có incident. Không có queue kẹt. Ticket khuya cuối cùng của Trâm đã đóng từ 21:18. Giá mà mọi buổi sáng đều mở ra bằng màu xanh.

Nhưng mắt anh không dừng ở đó.

Góc nhìn của anh, lớp giao diện bạc trong suốt vẫn nằm sẵn.

[CHỈ SỐ TIN CẬY NỘI BỘ: 71%]

Dòng chữ nhỏ, hơi nghiêng, phản chiếu mờ ánh đèn trần. Chỉ một đêm, con số giảm một điểm so với thời điểm Hệ thống mở lại. Không có fanfare, không có cảnh báo đỏ. Chỉ có một mũi tên nhỏ màu vàng quay xuống, rồi một ghi chú mở ra khi anh nhìn lâu hơn.

[XU HƯỚNG 7 NGÀY: GIẢM DỊU]

[ĐIỂM CHẠM CHÍNH: MINH — CẢM NHẬN MINH BẠCH VỀ QUYỀN QUYẾT ĐỊNH KỸ THUẬT / KÊNH NGOÀI TỔ CHỨC]

[PHẢN HỒI GẦN NHẤT: LOG DEPLOYMENT DÀI, NHƯNG THIẾU LÝ DO KIẾN TRÚC ĐẰNG SAU]

Hoàng đọc lần hai, rồi tắt khung Hệ thống trong đầu.

Chỉ số không phải ông thầy. Nó là tờ hóa đơn in bằng mực nhạt.

Anh mở bảng theo dõi ticket. Đọc phần ghi chú của Trâm. Cô Thanh Thuỷ hỏi in báo cáo theo tuần. Anh mở thêm sync log. 132 job, failed 0. Rồi anh kéo đến một nhánh log kỹ thuật hơn: change history hai mươi bốn giờ. Phía dưới entry mới nhất, ai đó đã thêm một comment dài. Tên hiển thị: M. Nguyen.

“Module thanh toán đang gánh path thanh toán offline rồi online theo kiểu two-state mơ hồ. Nếu chỉ sửa UI báo cáo doanh thu, khách bớt phàn nàn, nhưng đường đi dữ liệu vẫn đâm ngang qua queue không có contract rõ. Khách ít lỗi hơn không có nghĩa hệ thống sạch hơn.”

Hoàng nhìn dòng chữ.

Đúng.

Đó là câu đúng kiểu Minh.

Không sai, không tàn nhẫn quá, nhưng đủ để một người viết đoạn code đầu tiên của sản phẩm này cảm thấy người khác vừa lật mặt trái chiếc áo anh tự cắt.

Anh ngẩng lên khi nghe tiếng khoá xoay ngoài cửa.

Minh bước vào với laptop dưới nách và cuộn giấy A3 gấp đôi kẹp bên hông. Tóc anh còn ướt, mùi dầu gội bạc hà bay ra theo chuyển động nhanh. Anh chào ngắn: “Anh Hoàng.” Giọng bình thường, nhưng lưng thẳng hơn mọi lần. Không có cà phê mang theo. Không hỏi ai đã đến chưa.

“Em mang diagram module thanh toán,” Minh nói, giơ cuộn giấy. “Em muốn dán lại trước khi sửa queue.”

Hoàng gật. “Để lên bảng.”

Minh không hỏi “anh có muốn xem trước không”. Anh trải giấy ra, lấy hai miếng dán từ ngăn kéo, dán lên bức tường bên trái bảng trắng. Sơ đồ vẽ tay, nét bút đen, mũi tên rõ ràng. Có mấy chỗ gạch chân bằng bút đỏ. Một ô ghi “current contract” bị khoanh tròn, rồi một đường đâm sang ô ghi “implicit fallback” — chính xác chỗ anh đã viết từ thời đầu, khi một mình vừa code vừa chạy vừa vá.

Hoàng thấy ngực mình hơi nặng.

“Em muốn review mở,” Minh nói, quay lại. “Không phải một mình hai người. Cả Khoa và Trâm.”

“Tao cũng định vậy.”

Minh nhìn anh một giây, rồi gật.

Không khí giữa hai người không giống trận chiến. Nó giống hai người đàn ông đang đứng hai bên một cái mương hẹp. Nước chưa dâng, nhưng ai cũng biết mương ở đó.


Trâm đến sau mười phút.

Cô đặt balo xuống ghế, lấy sổ ra, rồi nhìn sơ đồ trên tường. “Em không rành kỹ thuật,” cô nói, giọng thẳng. “Nhưng nếu anh muốn em nghe để em biết nói gì với khách khi họ hỏi, thì em nghe.”

“Vậy được rồi,” Hoàng nói.

Trâm gật, kéo ghế lại gần.

Khoa đến khi ly cà phê trên bàn đã ấm lại.

“Trời,” anh nói, nhìn sơ đồ. “Mấy cái này cho tao hiểu thì chỉ cần nói cho tao biết khách bị gì khi nó sai.”

“Đó,” Trâm nói. “Em cũng muốn nghe đoạn đó.”

Minh mở laptop, cắm USB, rồi chiếu slide lên tường bằng chiếc máy chiếu rẻ mua lại từ thời còn ở phòng mượn. Hình hơi mờ, chữ hơi rung. Nhưng sơ đồ rõ: dòng tiền vào NỢ SỔ chia làm hai nhánh chính, nhánh thanh toán trực tuyến và nhánh thanh toán ghi nợ rồi đối soát sau.

“Đây là chỗ đang chạy,” Minh nói. “Và đây là chỗ em muốn đổi.”

Hoàng khoanh tay, đứng cạnh bảng trắng.

“Mọi người không cần hiểu từng dòng code,” anh nói. “Chỉ cần hiểu nó ảnh hưởng gì khi khách hàng không nhận được tiền, không in được báo cáo, hoặc nợ hiển thị sai.”

“Vậy bắt đầu từ lần incident,” Khoa nói, kéo ghế ngồi xuống. “Lần rollback đó. Nếu module thanh toán có contract rõ từ đầu, anh có cần lùi hết không?”

Câu hỏi ném thẳng vào ngực Hoàng.

“Có thể không,” anh trả lời. “Vì khi đó mình sẽ biết điểm nào được phép fail, điểm nào không.”

Trâm ghi nhanh vào sổ, rồi ngẩng lên. “Vậy em có thể hiểu là từ giờ nếu khách hỏi ‘app bị gì’, em sẽ biết nói ‘phần này đang được cô lập’ thay vì ‘hệ thống đang lỗi’?”

“Nếu mọi người làm đúng,” Minh nói. “Phần frontend có thể xin lỗi, nhưng backend phải nói được câu: phần này lỗi, phần kia chưa.”

Khoa gật. “Vậy được. Tao nghe.”

Hoàng nhìn họ.

Một người bán hàng, một người chăm sóc khách, một kỹ sư, một CEO.

Cả bốn ngồi trước một sơ đồ, và lần đầu buổi review kiến trúc không phải cuộc tra vấn giữa hai người đã va nhau.

Anh mở slide tiếp theo.

“Đây là lý do tao muốn nói chuyện,” Hoàng nói. “Không phải chỉ vì một module.”

Anh dừng nửa nhịp.

“Vì nếu đường đi không rõ, khi sửa người ta sẽ sửa theo cảm giác. Có khi đúng, có khi sai. Và người đầu tiên nhận hậu quả là Trâm.”

Trâm nhìn lên.

“Thứ hai là Khoa.”

Khoa cười nhẹ. “Nghe như tao sắp lãnh đạn.”

“Thứ ba mới là tụi kỹ thuật,” Hoàng nói. “Và tụi kỹ thuật chỉ lãnh đạn sau nếu khách vẫn còn giận.”

“Đó,” Khoa nói. “Đó là câu đúng.”

Minh gật, mắt nhìn slide hơn nhìn Hoàng. “Anh Hoàng, em muốn nói thẳng một chỗ.”

“Nói.”

“Em không phủ nhận anh viết được nền tốt,” Minh nói. “Nhưng nền đó được viết khi một người ôm toàn bộ logic. Bây giờ người đó không ôm nữa, mà contract cũ vẫn còn. Khách không thấy. Trâm chỉ thấy kết quả. Khoa thấy giận dữ. Em thấy món nợ.”

Hoàng nhìn vào sơ đồ.

“Tao thấy,” anh nói.

Giọng anh bình tĩnh hơn người.

Nhưng trong đầu, Hệ thống không cần mở ra. Anh vẫn thấy dòng chữ mảnh: MINH — CẢM NHẬN MINH BẠCH VỀ QUYỀN QUYẾT ĐỊNH KỸ THUẬT.

Anh không nên lấy chỉ số đó ra nói. Không nên dùng một con số trong đầu mình để biện minh cho người thật đang ngồi trước mặt. Câu “tao thấy” kia phải là kết quả của việc nhìn sơ đồ, nhìn khách, nhìn incident, nhìn lại mười tám tháng code một mình.

“Tao không phản đối sửa,” Hoàng nói. “Nhưng sửa phải theo nguyên tắc.”

“Nguyên tắc nào?” Minh hỏi.

“Nguyên tắc số một: khách hàng không được phép mất dữ liệu đang hoạt động.”

“Đương nhiên.”

“Nguyên tắc số hai: phần mới được phép chạy song song phần cũ, nhưng contract phải ghi rõ phần nào chịu trách nhiệm phần nào.”

Minh gật chậm.

“Nguyên tắc số ba: tao giữ quyền veto. Nhưng nếu tao veto, tao phải ghi lý do, và cả team được đọc.”

“Vậy thì khác,” Minh nói.

“Khác gì?”

“Trước đây anh veto bằng trực giác.”

Câu đó treo trong không khí.

Khoa liếc sang. Trâm ngưng viết.

Hoàng nhìn vào slide. Phía dưới sơ đồ module thanh toán, anh đã chuẩn bị một trang riêng: ghi lại toàn bộ các lần Hoàng can thiệp vào kiến trúc trong mười hai tháng qua. Không phải vì tự kiểm điểm. Vì nếu anh yêu cầu người khác minh bạch, anh không thể đứng ngoài.

“Tao biết,” anh nói. “Nên hôm nay tao chuẩn bị phần này.”

Anh chuyển slide.

Trên màn hiện ra danh sách.

“Tháng 8: tao đổi khoá đồng bộ để chạy offline nhanh hơn,” Hoàng nói. “Lý do khi đó là khách ở chợ mất sóng vẫn ghi nợ được. Không ghi ADR.”

Khoa gật, như thể anh cũng nhớ lần một chị bán vải gọi điện nói “em ơi app nó không lưu”.

“Tháng 11: tao thêm queue retry,” Hoàng tiếp. “Lý do là lần đó mạng Viettel lag, nhiều đơn bị treo. Tao ghi commit, nhưng không ghi document.”

Minh nhìn danh sách, tay khoanh trước ngực.

“Tháng 3: tao đổi cách tính báo cáo doanh thu cho hợp phân khúc chủ tiệm,” Hoàng nói. “Lý do thật là Khoa nói chủ tiệm không hiểu từ ‘revenue’. Tao đổi tên, đổi luôn cách đếm.”

Khoa cười. “Ờ, tao nhớ.”

“Không ghi lý do kia,” Hoàng nói. “Tức là người đọc code chỉ thấy hàm đổi, không thấy câu chuyện.”

Trâm giơ tay như học sinh. “Em hỏi được không?”

“Được.”

“Nếu mấy cái đó được ghi lại từ đầu thì em có hiểu không?”

“Em không cần hiểu code,” Hoàng nói. “Nhưng em cần biết khi nào khách bị ảnh hưởng. Nếu có ADR rõ ràng, em có thể nhìn impact note và nói: phần này đang sửa để bớt lỗi khi mạng yếu, chị thông cảm.”

Trâm gật. “Vậy thì em cần.”

Hoàng nhìn sang Minh. “Nên nếu em muốn sửa module thanh toán, tao đồng ý sửa. Nhưng từ giờ mọi thay đổi lớn phải có ADR. Không phải vì tao không tin em. Vì tao không muốn lặp lại cách làm cũ.”

“Anh từng lặp,” Minh nói. “Em cũng từng lặp.”

“Ừ.”

“Vậy thì được,” Minh nói. “Em cần thấy hợp đồng mới. Không phải hợp đồng giấy. Hợp đồng về ai được phép quyết gì.”

“Phương Anh đang viết,” Hoàng nói. “Nhưng hôm nay chưa phải lúc đọc văn bản. Hôm nay là để nhìn lại.”

“Vậy nhìn đi,” Khoa nói, cười. “Tao thì nhìn chán rồi. Chỉ cần nói cho tao biết cái này khi nào sửa xong.”

“Không nhanh,” Minh nói. “Nếu đúng.”

“Khách không đợi đúng,” Khoa nói. “Khách đợi không lỗi.”

Hai câu đó đập vào nhau giữa bàn.

Hoàng không chọn bên.

“Cả hai,” anh nói. “Mình phải gánh cả hai.”

Anh lật sang slide cuối cùng.

Không phải slide kiến trúc. Slide này chỉ có một danh sách ngắn.

“Đây là phản hồi thật trong ba mươi ngày,” Hoàng nói.

Anh đọc.

“Cô Thanh Thuỷ: in báo cáo theo tuần.” Trâm gật.

“Anh Hải: nợ hiển thị lệch khi khách trả một phần.” Khoa chép miệng.

“Chị Bảy: app chậm vào tối thứ Bảy.” Trâm cười nhẹ. “Chị Bảy giận lắm.”

“Anh Long ở Bình Dương: thanh toán Momo không trả kết quả rõ.” Minh nhìn Hoàng. “Phần đó module thanh toán.”

“Đó,” Hoàng nói. “Tao không muốn sửa kiến trúc vì diagram xấu. Tao muốn sửa vì khách đang đụng.”

Minh gật, lần này chậm hơn.

“Em hiểu.”

“Vậy thì mình có cùng lý do,” Hoàng nói. “Không phải ai thắng ai.”

Buổi review kéo dài thêm bốn mươi phút.

Minh đi qua từng ô trong diagram. Anh hỏi về schema mới, nhưng lần này câu hỏi không giống tra vấn. Nó giống người kỹ sư đang kiểm tra xem nền móng có thể đục ở đâu mà nhà chưa sập. Khoa hỏi câu nghe thô mà đúng: “Nếu đổi, khách có phải cài lại app không?” Trâm hỏi: “Nếu đổi, em cần nói với khách là đang bảo trì bao lâu?” Hoàng trả lời bằng ranh giới thật: staging trước, migration có rollback, không deploy vào ngày cao điểm, không động vào phần đang tranh chấp khi chưa có ADR.

“Vậy ai approve?” Khoa hỏi.

“Minh propose,” Hoàng nói. “Tao review. Phương Anh kiểm tra impact. Em và Trâm kiểm tra khách.”

“Nghe nhiêu khê,” Khoa nói.

“Vì từ giờ không phải một người vừa chạy vừa vá nữa,” Hoàng nói.

Minh nhìn anh.

“Anh nói câu đó,” Minh nói, “nhưng em cần biết anh có chịu được khi người khác vá khác anh không.”

“Tao chưa biết,” Hoàng nói. “Nhưng tao sẽ học.”

“Học,” Minh nhắc lại. “Không phải tin.”

“Ừ,” Hoàng nói. “Học.”

Khoa cười. “Trời, hai người nói chuyện nghe như giảng đường.”

“Thì đó,” Trâm nói, ghi nhanh. “Em cũng đang học.”

Buổi họp tan khi máy lạnh bắt đầu rỉ nước xuống sàn.

Khoa lấy giẻ lau, Trâm bỏ sổ vào balo, Minh gập laptop rồi đứng dậy. Hoàng tắt máy chiếu, cuộn dây điện lại. Mùi nhựa nóng và bụi bảng trắng trộn vào nhau. Bức tường còn sót lại vết bút xanh hôm trước.

“Anh Hoàng,” Minh nói.

Hoàng quay lại.

Minh chỉ vào slide cuối cùng, vẫn còn treo trên tường dưới dạng ảnh mờ.

“Anh chuẩn bị phần này,” Minh nói. “Phản hồi khách, lần can thiệp cũ, lý do kỹ thuật.”

“Ừ.”

“Anh tự làm?”

Hoàng nhìn anh.

“Ừ.”

“Tất cả?”

“Tất cả.”

Minh nhìn slide lâu hơn bình thường. Anh khoanh tay, nghiêng đầu, rồi hỏi câu mà Hoàng biết sẽ đến, nhưng vẫn khiến cổ họng anh khô lại.

“Anh tự viết cái này hay có ai tư vấn?”