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

Đêm đỏ

Đà Lạt lạnh theo kiểu không báo trước.

Ban ngày, nắng rơi trên mái tôn và những triền dốc làm người ta tưởng chỉ cần một cái áo sơ mi là đủ. Đến tối, hơi lạnh bò qua khe cửa khách sạn, chạm vào cổ tay Hoàng khi anh ngồi trước bàn gỗ nhỏ, khiến ly cà phê đen bên cạnh nguội nhanh hơn bình thường.

Ngoài cửa sổ, sương mù đè xuống con dốc phía trước khách sạn. Đèn đường vàng bị tán ra thành từng quầng mờ, xe máy chạy ngang chỉ còn tiếng máy thấp và vệt sáng đỏ kéo dài sau đuôi. Mùi gỗ ẩm trong phòng trộn với mùi khăn tắm mới giặt chưa khô hẳn. Máy sưởi treo tường kêu lạch cạch, chạy được vài phút lại tắt.

Trên màn hình laptop, slide thứ mười hai đang mở.

Tiêu đề: Khi founder không còn là cổ chai.

Hoàng nhìn dòng chữ ấy đã gần mười phút.

Bên dưới là ba gạch đầu dòng anh viết lúc chiều: trao quyền thật, quy trình có người chịu trách nhiệm, lòng tin được kiểm chứng bằng thời gian không can thiệp. Chữ nằm ngay ngắn trên nền trắng. Đẹp vừa đủ cho hội nghị. Không quá hào nhoáng. Không giống kiểu slide mấy năm trước anh từng làm, khi mọi thứ phải sắc như dao để thuyết phục nhà đầu tư tin vào một người trẻ có quá nhiều câu trả lời.

Anh sửa lại câu thứ ba.

Lòng tin được kiểm chứng bằng thời gian không can thiệp.

Anh xóa chữ “thời gian”, gõ “khoảng cách”, rồi xóa tiếp.

Không phải vì câu nào hay hơn. Vì câu nào cũng đụng vào phần đang nằm trong ngực anh từ lúc máy bay hạ cánh xuống Liên Khương.

Điện thoại đặt bên trái laptop rung một lần.

Hoàng không cầm lên ngay.

Anh đã tự đặt luật từ sáng: chỉ mở khi là tin nhắn từ group core, cuộc gọi trực tiếp, hoặc email có tag khẩn cấp. Những kênh còn lại bị tắt. Ba ngày không phải biến mất. Ba ngày chỉ là không để tiếng động nhỏ kéo tay mình về chỗ cũ.

Điện thoại rung lần nữa.

Màn hình sáng lên.

Tên Trâm hiện ở đầu thông báo.

Anh Hoàng, server NỢ SỔ báo lỗi đồng bộ nhẹ. Không nghiêm trọng nhưng anh Minh đang check.

Hoàng cầm điện thoại.

Dòng chữ ngắn, rất đúng giọng Trâm: báo đủ, không làm quá, không giấu. Anh nhìn chữ “nhẹ”, rồi nhìn chữ “Minh”. Ngón tay anh tự động mở khung chat.

Lỗi gì? Log ở module nào? Affected users bao nhiêu?

Ba câu hỏi nhảy lên trong đầu trước cả khi anh kịp đặt tên cho chúng.

Anh gõ được hai chữ: Lỗi gì

Dừng.

Con trỏ nhấp nháy sau chữ “gì”.

Trong phòng chỉ còn tiếng máy sưởi khởi động lại và tiếng nước nhỏ đâu đó ngoài hành lang. Hoàng nhìn câu đang gõ, thấy nó không sai về mặt công việc. Một CEO hỏi tình hình khi server lỗi là chuyện bình thường. Một founder từng viết code nền hỏi lỗi gì cũng bình thường. Nhưng với NỢ SỔ bây giờ, câu hỏi đó có thể là đầu một sợi dây khác.

Nếu Trâm trả lời, anh sẽ hỏi thêm.

Nếu anh hỏi thêm, Minh sẽ biết anh đang nhìn.

Nếu Minh biết anh đang nhìn, dù anh không ra lệnh, trọng lượng của anh vẫn rơi lên bàn kỹ thuật ở Tô Hiến Thành.

Hoàng xóa hai chữ.

Anh chỉ nhắn:

Đã thấy. Minh đang check thì theo quy trình của Minh. Có update thì gửi group.

Gửi xong, anh đặt điện thoại xuống, màn hình úp mặt vào bàn.

Anh quay lại slide.

Dòng tiêu đề vẫn ở đó.

Khi founder không còn là cổ chai.

Hoàng bật cười không thành tiếng. Anh kéo slide xuống phần ví dụ, nơi anh định kể chuyện Minh được trao quyền CTO. Một câu trong phần ghi chú diễn giả viết: Trao quyền không phải trao chức danh, mà là chịu được việc người khác quyết định khác mình trong lúc mình không đứng cạnh.

Anh đọc lại câu ấy.

Rồi đóng phần ghi chú.

Không viết thêm được.

Mười lăm phút sau, điện thoại rung liên tiếp.

Lần này không chỉ một cái.

Mặt gỗ dưới điện thoại rung lên, âm thanh nhỏ nhưng sắc trong căn phòng kín. Hoàng lật máy.

Group core “Bàn tròn” sáng đỏ ở góc ứng dụng.

Tin nhắn của Minh nằm trên cùng.

Migration production gặp lỗi nghiêm trọng. Dữ liệu đồng bộ bị corrupt cho 3.200 khách hàng Core. Đang triage. Đã khóa write với nhóm affected. Đạt và Bình đang chạy scope check. Trâm chuẩn bị thông báo CS tạm thời. Update 15 phút/lần.

Hoàng đọc hết một lần.

Không hiểu nhầm.

Anh đọc lại.

3.200.

Con số ấy đứng giữa màn hình như một vật nặng.

Chương trình máy sưởi tắt phụt. Căn phòng lạnh thêm ngay lập tức, hoặc cơ thể anh nhận lạnh trễ hơn. Hoàng đứng dậy khỏi ghế, nhưng không biết đứng để làm gì. Đầu gối va nhẹ vào cạnh bàn, ly cà phê sóng sánh, một giọt đen rơi xuống tờ giấy note khách sạn.

Anh đi hai bước tới cửa sổ.

Bên ngoài sương dày hơn. Con dốc biến mất sau lớp trắng đục, chỉ còn đèn hậu của một chiếc xe tải nhỏ leo dốc, đỏ lòe rồi tắt sau khúc cua.

3.200 khách hàng Core.

Không phải bốn mươi bảy khách hàng như đêm rollback năm nào. Không phải một incident nhỏ đủ để viết post-mortem rồi học. 3.200 nghĩa là hàng nghìn chủ tiệm mở app sáng mai có thể thấy số nợ sai, lịch sử bán hàng lệch, khách cãi nhau ngay tại quầy. 3.200 nghĩa là Trâm và đội CS sẽ ngồi trước điện thoại tới sáng. 3.200 nghĩa là báo cáo Board Q4 sẽ có một vết đỏ nếu xử lý chậm.

Hoàng mở group.

Tin nhắn tiếp theo của Phương Anh:

Đã thấy. Minh update impact và ETA theo format incident. Tôi giữ Board comms. Không phát thông báo ngoài khách affected cho tới khi có scope chắc.

Chị Linh:

Đang họp Melbourne, vẫn online nếu cần phần khách Cổng Việt. NỢ SỔ để Minh/Khoa/Trâm xử lý.

Khoa:

Tao đang ở Cần Thơ. Trâm, cần script khách thì gọi tao. Hoàng, mày đang Đà Lạt, đừng nhảy vào group kỹ thuật trừ khi Minh tag.

Hoàng nhìn dòng cuối.

Khoa viết rất nhanh, không vòng vo. Đúng kiểu người đã biết anh quá lâu nên không cần lịch sự ở chỗ dễ gãy.

Anh đặt ngón cái lên khung nhập.

Minh, rollback toàn bộ về snapshot trước migration đi. Đừng selective lúc này.

Câu này hình thành trong đầu rõ đến mức anh gần như nghe được giọng mình khi nói.

Rollback toàn bộ.

An toàn nhất. Dễ truyền thông nhất. Mất tiến độ migration, nhưng giảm rủi ro dữ liệu. Sáu năm trước, anh sẽ gửi ngay. Bốn năm trước, anh sẽ gọi điện và yêu cầu Minh giải thích vì sao không rollback. Hai năm trước, anh sẽ mở log, tự đọc, rồi gọi là “cùng xem” trong khi thực chất đã có kết luận.

Bây giờ anh đứng trong phòng khách sạn Đà Lạt, cách Tô Hiến Thành hàng trăm cây số, tay cầm điện thoại và tim đập mạnh hơn cả lúc đứng trước Tan ở Singapore.

Không có Hệ thống.

Không có chỉ số rủi ro.

Không có thanh cảnh báo màu đỏ.

Chỉ có một group chat và quyền lực chưa gửi đi.

Hoàng không gõ câu rollback.

Anh bấm vào tên Minh, định gọi.

Màn hình hiện biểu tượng video call.

Anh dừng lại.

Nếu gọi audio, Minh có thể phải rời khỏi log. Nếu gọi video, cả phòng kỹ thuật sẽ biết CEO đang nhìn. Nhưng nếu không gọi, anh sẽ ngồi ở đây nhìn chữ “corrupt” trong group và tưởng tượng ra mọi cách nó lan rộng.

Điện thoại rung thêm.

Minh update:

Scope check initial: corrupt ở sync_state và receivable_cache, chưa thấy mất transaction log gốc. Suspect timezone normalization trong legacy PHP rows trước 2016. Đang confirm. Không rollback toàn bộ ngay vì 147k khách còn lại đang ổn. Đề xuất selective lock + restore affected cache sau khi verify transaction log.

Hoàng hít vào.

Đề xuất selective lock + restore.

Đúng kiểu Minh. Khó hơn rollback toàn bộ. Ít phá hơn nếu làm đúng. Nguy hiểm hơn nếu scope check sai.

Anh nhìn dòng “legacy PHP rows trước 2016”.

Dữ liệu cũ do anh viết.

Những dòng code đầu tiên trong phòng nhỏ hẻm Bình Thạnh, khi anh vừa làm học sinh vừa làm founder, khi mọi thứ còn là PHP monolith vá nhanh để kịp có khách. Những quyết định “tạm được” năm đó bây giờ quay lại dưới dạng 3.200 khách hàng bị khóa write trong một đêm Đà Lạt.

Cổ họng anh khô đi.

Anh mở laptop, định vào VPN.

Con trỏ di chuyển tới biểu tượng terminal trên dock.

Đúng lúc đó, wifi khách sạn mất.

Biểu tượng mạng chuyển sang dấu chấm than.

Hoàng nhìn nó, mất một giây mới tin rằng đây không phải trò đùa của đời sống.

Anh bật hotspot điện thoại. Sóng 4G trong phòng chỉ còn hai vạch. Laptop kết nối chậm, vòng tròn quay trên màn hình. Terminal mở lên, nhưng VPN không vào được. Anh đổi sang email, rồi Slack web. Trang trắng hiện chữ “Loading…” như một lời chế nhạo rất bình tĩnh.

Điện thoại lại rung.

Phương Anh:

Hoàng, nếu anh đang định vào VPN thì đừng. Minh không tag anh. Để cậu ấy chạy incident.

Hoàng đứng trước bàn, tay đặt trên laptop.

Anh nhìn tin nhắn ấy rất lâu.

Cô không ở đây. Cô không thấy màn hình anh. Nhưng cô biết.

Hoàng đóng laptop lại.

Không mạnh. Chỉ gập xuống cho tới khi nắp chạm đáy, tiếng “cạch” nhỏ lọt vào không khí lạnh.

Anh bấm gọi video vào group core.

Lần này anh làm trước khi kịp nghĩ thêm. Màn hình hiện “Đang kết nối…” rồi hình Phương Anh xuất hiện vỡ thành từng mảng vuông. Sau lưng cô là phòng họp Tô Hiến Thành, đèn trắng, bảng ABF còn mở. Giọng cô đến muộn nửa nhịp.

“Hoàng?”

“Anh chỉ cần nghe tình hình.”

Hình chuyển qua Minh. Mặt Minh xanh vì ánh màn hình, tóc rối, áo hoodie kéo khóa lệch. Phía sau là Đạt cúi xuống một laptop khác, Bình đứng cạnh bảng trắng, Trâm ngồi ở bàn CS với tai nghe.

Âm thanh giật mạnh.

“…đang theo quy…”

Mất tiếng.

Hoàng đưa điện thoại gần cửa sổ.

“Minh, anh nghe không rõ.”

Hình Minh đứng yên, miệng mở mà không có âm thanh. Rồi âm thanh dồn lại thành một đoạn đứt quãng:

“…root cause chưa confirm… transaction log còn… không mất dữ liệu gốc… post-mortem mở rồi…”

Màn hình đen.

Cuộc gọi rớt.

Hoàng đứng cạnh cửa sổ, điện thoại trong tay, hơi lạnh từ kính truyền vào khớp ngón. Anh nhìn màn hình báo reconnect rồi thất bại.

Tin nhắn riêng của Minh đến sau đó mười giây.

Wifi bên anh yếu. Anh đừng lo. Em đang theo quy trình post-mortem. Nếu cần CEO quyết định, em sẽ tag thẳng. Hiện tại đây là quyết định CTO.

Hoàng đọc câu cuối.

Hiện tại đây là quyết định CTO.

Không phải Minh hỗn. Không phải Minh đẩy anh ra. Đó chính là cấu trúc mà Hoàng đã ký. Chính anh đặt tờ giấy lên bàn, viết tên Trịnh Nguyễn Minh — CTO. Chính anh nói quyết định kiến trúc production thuộc về CTO. Chính anh giữ veto chỉ khi có lý do bằng văn bản.

Bây giờ lý do duy nhất của anh là sợ.

Sợ 3.200 khách hàng mất dữ liệu.

Sợ báo chí ngửi thấy mùi incident.

Sợ Board hỏi vì sao founder ở Đà Lạt nói chuyện bền vững trong khi server đỏ.

Và sâu hơn những thứ đó, sợ cảm giác điện thoại trong tay không biến anh thành người cần thiết.

Hoàng ngồi xuống giường.

Nệm khách sạn mềm quá mức, lún dưới người anh. Trên bàn, slide vẫn sáng, dòng “founder không còn là cổ chai” nhìn qua khoảng cách vài mét trông như một câu được ai khác viết cho anh đọc.

Anh đặt điện thoại úp xuống chăn.

Nó rung ngay lập tức.

Anh không lật lên.

Rung thêm lần nữa.

Không lật.

Anh nhìn hai bàn tay mình đặt trên đầu gối. Những ngón tay hơi run vì lạnh hoặc vì adrenaline. Anh nhớ cảm giác đêm đầu tiên Hệ thống tắt: chiếc điện thoại tối trong tay, căn phòng trọ quận 10, sự trống rỗng mở ra sau sáu năm luôn có một lớp giao diện phản chiếu bên trong mắt. Khi đó, anh tưởng mình đã gặp đáy của cảm giác một mình.

Nhưng đêm nay khác.

Hồi đó chỉ có anh và khoảng trống.

Đêm nay, khoảng trống có tiếng server đỏ, tên khách hàng, log lỗi, tin nhắn của Trâm, update của Minh, giọng Phương Anh bị méo vì wifi, và một tổ chức đang chạy mà anh không cầm tay lái.

Điện thoại ngừng rung.

Hoàng lật lên.

Tin nhắn mới trong group:

Minh:

Update 00:17 — confirmed transaction log gốc an toàn. Corrupt ở cache layer sau migration. Affected users locked. Đang chạy restore script trên sample 50 users. ETA next update 15 phút.

Trâm:

CS tạm thời đã sẵn sàng. Chưa gửi cho khách, chờ Minh confirm scope. Khoa đang review câu chữ.

Khoa:

Script khách affected: không đổ lỗi kỹ thuật dài. Nói dữ liệu ghi nợ có thể hiển thị sai trong vài giờ, dữ liệu gốc còn, team đang khôi phục. Ai gọi thì nhận trách nhiệm, không nói ‘hệ thống lỗi chung chung’.

Phương Anh:

Board comms draft xong. Chưa gửi. Chờ 01:00 nếu incident chưa ổn định.

Mỗi người một dòng.

Không ai hỏi anh.

Không ai chờ anh.

Không ai bỏ phần của mình.

Hoàng kéo xuống cuối group. Khung nhập trống.

Anh gõ:

Rollback đi.

Hai chữ hiện ra quá nhanh.

Anh nhìn chúng.

Câu này ngắn hơn mọi lý lẽ. Gọn, mạnh, đúng giọng người từng cứu hệ thống bằng quyền lực cuối cùng. Nếu gửi, mọi thứ sẽ thay đổi. Minh sẽ phải trả lời, dù đang chạy restore script. Phương Anh sẽ nhìn sang. Khoa sẽ chửi hoặc không chửi, nhưng luồng incident sẽ có thêm một trọng lượng lớn đè lên.

Hoàng đặt ngón tay lên nút gửi.

Không bấm.

Anh nhìn hai chữ đến khi chúng không còn là giải pháp kỹ thuật nữa. Chúng là một yêu cầu: hãy để tôi lại là người quyết định. Hãy để tôi có vai trò. Hãy để nỗi sợ của tôi được gọi bằng tên “an toàn”.

Anh xóa từng chữ.

Khung nhập trống lại.

Anh gõ câu khác.

Đã thấy update. Không cần trả lời tin này. Theo quy trình của Minh.

Anh đọc lại.

Rồi cũng xóa.

Tin nhắn ấy nghe ngoan, nhưng vẫn là một lá cờ cắm xuống group: CEO đang chứng kiến và ban phép. Không cần thiết.

Hoàng tắt màn hình.

Đặt điện thoại úp xuống, lần này trên mặt bàn thay vì trên chăn.

Anh đứng dậy, đi vào phòng tắm, mở vòi nước lạnh rửa mặt. Nước Đà Lạt buốt, chạm da làm anh tỉnh hơn. Trong gương, mặt anh nhợt dưới bóng đèn vàng, tóc hơi rối, mắt có quầng vì tối qua ngủ ít. Không có giao diện nào hiện trên tròng mắt. Không có dòng chữ bạc an ủi rằng anh đang làm đúng.

Anh chống hai tay lên lavabo.

“Không phải quyết định của mày,” anh nói thành tiếng rất nhỏ.

Tiếng nước chảy át gần hết câu đó.

Anh tắt vòi.

Phòng trở lại yên tĩnh.

Khi ra ngoài, điện thoại vẫn nằm úp trên bàn. Laptop vẫn đóng. Slide trên màn hình phụ đã tự tắt vì hết thời gian chờ, căn phòng chỉ còn ánh đèn đầu giường và quầng sáng mờ từ cửa sổ. Sương mù ngoài kia dày tới mức không còn thấy con dốc, chỉ còn vài đốm đỏ lơ lửng của xe máy ở xa.

Hoàng ngồi xuống mép giường.

Anh không mở điện thoại.

Trong túi áo khoác treo trên ghế có cuốn sổ tay. Anh lấy ra, mở trang trống. Bút bi lạnh trong tay.

Anh viết:

00:29, Đà Lạt. Migration incident. 3.200 khách hàng affected. Minh đang xử lý.

Dừng.

Anh viết tiếp:

Tao muốn rollback. Tao muốn gọi. Tao muốn về Sài Gòn.

Mực hằn xuống giấy mạnh hơn thường lệ.

Dòng kế tiếp mất lâu hơn.

Tao không biết mình sợ server sập hay sợ mình không được quyền cứu nó.

Hoàng nhìn câu đó.

Không sửa.

Điện thoại rung một lần trên bàn.

Rồi một lần nữa.

Anh vẫn nhìn trang giấy.

Ngoài cửa sổ, sương mù nuốt hết đèn đường. Đà Lạt lạnh hơn, phòng khách sạn nhỏ hơn, và khoảng cách tới Sài Gòn dài hơn mọi con số trên bản đồ.

Hoàng đặt bút xuống.

Điện thoại tiếp tục rung, mỗi lần cách nhau vài giây, những update từ team đang kéo qua mạng yếu như đi qua bùn.

Anh ngồi trên mép giường, hai tay đặt lên trang sổ mở, để mặc màn hình úp mặt xuống bàn.

Lần đầu kể từ khi Hệ thống tắt, cái khoảng trống trong người anh không còn yên. Nó đỏ, nóng, đầy tiếng chuông báo lỗi.

Và anh phải ngồi cạnh nó mà không đưa tay dập.