Chương 83 — Sơ đồ treo tường
Trịnh Nguyễn Minh mang một cuộn giấy lớn đến văn phòng vào sáng thứ Ba.
Đó là loại giấy vẽ kỹ thuật khổ A0, giấy hơi vàng, rìa giấy bị cắt lệch một đường do người cắt vội. Minh không nói gì khi bước qua bậc cửa gỗ xám của tầng ba. Anh đặt balo xuống chân bàn veneer, tháo hai sợi thun buộc đầu cuộn giấy, rồi dùng băng keo giấy dán bốn góc bản vẽ lên bức tường trắng đối diện lối vào.
Bức tường trắng vốn trống trơn từ hôm dọn văn phòng, giờ bị chiếm trọn bởi một sơ đồ hình cây phức tạp.
Khoa đang ngậm nửa cái bánh mì thịt ở cửa, dừng lại nhìn.
“Cái gì đây Minh?” Khoa hỏi, tiếng hỏi hơi đục vì còn vướng miếng vỏ bánh giòn. “Bản đồ phân lô hả?”
“Kiến trúc mới,” Minh nói, ngón tay anh miết chặt miếng băng keo giấy ở góc dưới bên trái để nó không bị quạt trần thổi bong ra. “Microservices. Tôi tách phần ghi nợ, phần đối soát kho, và phần thông báo ra ba cụm dịch vụ chạy độc lập. Nó không còn nằm chung một cục PHP như cũ nữa.”
Hoàng đứng dậy khỏi bàn làm việc phía cửa sổ. Anh đi qua, dừng lại cách bức tường khoảng hai bước chân.
Bản vẽ được Minh kẻ bằng bút kim đen, nét mảnh nhưng thẳng tắp. Những ô chữ nhật ghi Debit Service, Inventory Service, Notification Engine được bao quanh bởi các đường mũi tên chỉ hướng đi của dữ liệu. Ở trung tâm, nơi đáng lẽ là cơ sở dữ liệu MySQL cũ của Hoàng, Minh vẽ một vòng tròn lớn bằng bút mực đỏ, bên trong ghi: Event Bus / Message Queue.
Nét mực đỏ nổi bật trên nền giấy vàng nhạt, trông như một vết thương hở trên bức tường vừa sơn.
“Tách ra thế này thì hạ tầng chịu sao nổi?” Hoàng hỏi, mắt anh quét qua các điểm nối của các mũi tên. “Mình đang chạy VPS ba mươi đô một tháng của nhà đầu tư cũ chưa dọn đi. Muốn chạy Message Queue ổn định thì memory tối thiểu phải tăng gấp ba.”
Minh không quay lại. Anh điều chỉnh hướng thổi của cái máy lạnh Toshiba cũ — cái nắp cánh quạt gãy một góc vẫn đang kêu rè rè mỗi khi đảo hướng.
“Phương Anh đã duyệt ngân sách hạ tầng mới trong file Excel hôm qua,” Minh nói, giọng đều đều. “Ba nghìn đô ban đầu đủ mua ba server ảo có RAM tối ưu trên DigitalOcean. Tôi đã setup xong môi trường staging tối qua. Chạy thử thấy throughput tăng gấp năm lần khi có tải giả lập.”
Khoa nuốt trôi miếng bánh mì, gật gù nhìn sơ đồ dù Hoàng biết thằng bạn không hiểu một chữ nào về throughput hay staging. Khoa chỉ nhìn thấy sự dịch chuyển.
“Nhìn hoành tráng đó,” Khoa nói, vỗ vỗ vai Minh. “Ít nhất tường đỡ trắng. Bữa giờ khách ở Gò Vấp cứ than bấm lưu nợ mà vòng xoay nó quay hoài. Tách ra vầy là bấm cái ăn liền đúng không?”
“Đúng,” Minh đáp ngắn gọn. Anh mở khóa kéo balo, lấy ra chiếc laptop ThinkPad cũ, đặt lên mặt bàn veneer đã hơi cong. “Nhưng để làm được cái này, cơ sở dữ liệu cũ phải đập đi xây lại.”
Hoàng nhíu mày. “Đập thế nào?”
“Đổi schema,” Minh vừa gõ lệnh mở terminal vừa nói. “Cột transaction_date trong bảng nợ của anh đang lưu dạng string định dạng tự do do người dùng gõ. Tôi phải chuẩn hóa nó về DateTime ở mức database. Ngoài ra, bảng khách hàng cần tách riêng thông tin cá nhân và lịch sử trả nợ để tránh việc mỗi lần truy vấn nợ phải quét qua toàn bộ text mô tả.”
“Lượng dữ liệu cũ của khách hàng thì sao?” Hoàng bước thêm một bước, vai anh gần như chạm vào rìa cuộn giấy A0. “Hơn tám trăm tiệm đang có giao dịch mỗi ngày. Có người nợ gối đầu từ năm ngoái. Chỉ cần lệch một giờ múi múi giờ khi migrate, số tổng cuối ngày của họ sẽ lệch.”
“Tôi viết script migration tự động rồi. Chạy trên staging mất bốn mươi giây cho toàn bộ dữ liệu hiện tại.” Minh xoay màn hình laptop về phía Hoàng. Trên đó là một đoạn log terminal màu xanh lá cây chạy dài, kết thúc bằng dòng chữ: Migration completed: 842 records updated. 0 errors.
“Migration tự động chỉ chạy tốt khi dữ liệu sạch,” Hoàng nói, giọng anh chùng xuống nhưng rõ ràng từng chữ. “Dữ liệu thực tế từ thị trường không sạch như staging đâu Minh. Có những tiệm ghi nợ bằng ký tự lạ, có tiệm để trống trường ngày tháng rồi Khoa tự vá thủ công trên database bằng tay. Nếu chạy migration tự động mà không có cơ chế backwards compatibility thủ công, database sẽ tự động drop những dòng lỗi. Lúc đó khách hàng mất dữ liệu, ai đền?”
Minh dừng ngón tay trên bàn phím. Anh ngước lên nhìn Hoàng. Đôi mắt Minh sau cặp kính cận không có sự né tránh, chỉ có sự lạnh lùng của một người tin vào logic toán học hơn là những biến số con người.
“Nếu cứ giữ backwards compatibility thủ công, chúng ta sẽ không bao giờ migrate xong,” Minh nói. “Codebase sẽ chứa đầy các câu lệnh if-else chỉ để xử lý những ca lỗi từ một năm trước. Đến khi hệ thống có mười nghìn người dùng, đống if-else đó sẽ kéo sập server.”
“Nhưng hiện tại chúng ta chỉ có tám trăm người dùng,” Hoàng phản pháo. “Và tám trăm người này là những người trả một trăm năm mươi nghìn một tháng để chúng ta có tiền ngồi ở đây. Họ không quan tâm codebase sạch hay bẩn. Họ chỉ quan tâm tối nay khi đóng cửa tiệm, con số nợ của khách không bị mất.”
Không khí trong phòng bốn mươi mét vuông đột ngột loãng đi.
Tiếng máy lạnh Toshiba rè rè bỗng nghe lớn hơn bình thường. Khoa nhìn Hoàng, rồi nhìn Minh, tay anh vẫn cầm nửa cái bánh mì dở nhưng không ăn tiếp. Phía góc phòng, Trâm đang gõ danh sách khách hàng mới vào file Excel cũng dừng tay, mắt nhìn chằm chằm vào màn hình máy tính của mình như thể đang bận rộn lắm, nhưng tai cô hướng về phía hai người đàn ông.
Phương Anh bước vào phòng đúng lúc đó.
Cô mang theo một xấp tài liệu in sẵn, đặt lên bàn kính. Cô nhìn cuộn giấy A0 trên tường, nhìn vòng tròn đỏ chói ở giữa, rồi nhìn vẻ mặt của Hoàng và Minh. Cô không hỏi chuyện gì đang xảy ra. Cô kéo chiếc ghế xoay nỉ xám ngồi xuống, mở nắp bút bi.
“Mọi người đang tranh luận về deploy bản mới?” Phương Anh hỏi.
“Bản rewrite,” Hoàng nói. “Minh muốn deploy migration tự động cho database vào cuối tuần này. Tôi yêu cầu giữ compatibility thủ công và rollback plan chi tiết.”
Minh xoay ghế hẳn về phía Hoàng.
“Tôi đã test ba lần trên staging. Lỗi phát sinh dưới hai phần trăm, và những ca lỗi đó đều có thể sửa bằng tay sau khi deploy. Mất khoảng hai tiếng.”
“Hai tiếng đó là hai tiếng khách hàng không vào được app,” Hoàng nói. “Giờ cao điểm của tiệm tạp hóa là từ năm giờ chiều đến tám giờ tối. Họ chốt sổ lúc đó. Em chọn deploy vào lúc đó à?”
“Tôi sẽ deploy lúc ba giờ sáng,” Minh đáp, giọng anh vẫn đều, không có dấu hiệu tăng tông. “Nhưng tôi cần đảm bảo không có ai can thiệp vào database trong lúc migration đang chạy. Tôi cần approval để lock database production tạm thời.”
Hoàng đứng im. Anh nhìn sơ đồ trên tường, nhìn vòng tròn đỏ ghi Message Queue. Trong đầu anh, những dòng code PHP cũ anh viết từ con hẻm Bình Thạnh hiện lên. Chúng bẩn, chúng lộn xộn, nhưng chúng đã chạy suốt mười tám tháng qua mà không làm mất một đồng nào của chị Bảy tạp hóa hay cô chủ quán mì Quảng ở Đà Nẵng.
“Tôi chưa duyệt bản deploy này,” Hoàng nói. “Cần staging test kỹ hơn với dữ liệu thực tế copy từ production về, không dùng dữ liệu giả lập.”
Minh nhìn Hoàng. Lần này, anh không đưa ra lập luận kỹ thuật nào nữa. Anh tựa lưng vào ghế xoay, hai tay đan vào nhau đặt trước bụng.
“Ai approve?” Minh hỏi.
Hoàng khựng lại. “Tôi là CEO.”
“Anh là CEO trên giấy tờ pháp lý để làm việc với quỹ,” Minh nói, giọng nhỏ nhưng lực gõ của từng từ rất nặng. “Nhưng về mặt kỹ thuật, ai là người quyết định cuối cùng? Anh một người, hay chúng ta có quy trình?”
Câu hỏi treo lơ lửng giữa phòng.
Khoa dịch chuyển người, tiếng ghế xoay rít lên một tiếng nhỏ trên sàn gạch hoa. Khoa nhìn Phương Anh, nhưng Phương Anh chỉ cúi xuống nhìn tập tài liệu của mình, ngón tay cô nhẹ nhàng xoay xoay cây bút bi. Cô không hiểu sâu về database schema hay migration, nhưng cô hiểu rất rõ câu hỏi của Minh.
Đó không phải là câu hỏi về code. Đó là câu hỏi về quyền kiểm soát.
Cho đến trước khi Series A đóng, NỢ SỔ vận hành theo cơ chế một người: Hoàng quyết định, mọi người theo. Hoàng bảo Khoa đi Bình Dương, Khoa đi. Hoàng bảo Minh viết cái gì, Minh viết cái đó. Nhưng bây giờ, tiền đã về tài khoản. Văn phòng đã có địa chỉ cụ thể. Minh đã là kỹ sư nền tảng chính thức, chịu trách nhiệm về scalability của hệ thống trước Raj và ban cố vấn của quỹ.
Hệ thống cũ không thể sống tiếp bằng cách cũ.
“Chúng ta chưa xây quy trình ra quyết định kỹ thuật,” Phương Anh nói, cô ngước lên nhìn cả hai. Giọng cô kéo không khí loãng ra một chút. “Hiện tại, trong board structure mình chỉ mới thống nhất về quyền veto của CEO đối với các nhân sự chủ chốt. Còn các quyết định vận hành hàng ngày như deploy hay architecture, chúng ta chưa có văn bản.”
“Vậy thì phải làm rõ,” Minh nói. Anh nhìn Hoàng. “Nếu mọi deploy đều phải đợi anh approve dựa trên cảm giác lo lắng của anh, tôi không thể bảo đảm tiến độ rewrite. Tôi cần ranh giới rõ ràng giữa những gì tôi được tự quyết và những gì cần review.”
Hoàng nhìn xuống bàn tay mình. Bàn tay mười tám tuổi, da ngăm nhẹ. Anh nhớ lại những ngày ngồi trong phòng tối ở hẻm Bình Thạnh, Hệ thống Kiến Quốc hiển thị những chỉ số trực quan, rõ ràng, cho anh biết chính xác bước tiếp theo phải làm gì để đạt năm trăm người dùng. Khi đó, anh chỉ có một mình.
Giờ anh có năm người. Và Hệ thống đang khóa tạm mảnh tương lai.
“Tôi sẽ viết rollback plan cho đợt migration này,” Minh phá vỡ sự im lặng, anh xoay ghế lại phía màn hình ThinkPad. “Nhưng tôi muốn tuần sau chúng ta phải ngồi lại để chốt quy trình review. Tôi không muốn mỗi lần deploy lại phải giải thích tại sao tôi chọn Node.js thay vì PHP.”
Minh gõ một dòng lệnh. Tiếng phím gõ giòn, dứt khoát.
“Tôi tạo branch mới,” Minh nói, không quay đầu lại. “Tên là rewrite-v2. Tôi commit phần setup core framework lên trước.”
Hoàng quay về bàn làm việc của mình.
Màn hình laptop của anh đang mở trang quản trị Git của công ty. Anh nhấn refresh. Một dòng thông báo mới hiện lên trên feed:
trinhnguyenminh created branch rewrite-v2
trinhnguyenminh committed: Setup core project setup. Start from scratch.
Start from scratch. Bắt đầu từ đầu.
Hoàng nhìn dòng chữ đó. “Từ đầu” nghĩa là những gì anh đã tự tay gõ trong suốt mười tám tháng qua — những đêm thức trắng dưới ánh đèn bàn vàng ở hẻm Bình Thạnh, tiếng ba ho khan bên kia vách tường thạch cao mỏng — không còn là nền tảng nữa. Chúng sắp sửa bị thay thế bởi những nét vẽ kim đen mảnh dẻ và những vòng tròn đỏ trên tờ giấy A0 treo trên tường.
Hoàng về nhà lúc tám giờ tối.
Hẻm Bình Thạnh ẩm ướt sau một cơn mưa giông ngắn lúc chiều. Nước đọng thành những vũng nhỏ trên mặt đường nhựa bong tróc, phản chiếu ánh đèn neon từ các tiệm tạp hóa. Mùi cá kho tương từ nhà ai đó bay ra, lẫn với mùi khói xe máy.
Ba anh đang ngồi trước hiên, chiếc Wave cũ dựng bên cạnh, chân chống gạt xuống để lại một vệt xước nhỏ trên nền xi măng. Ba đang dùng một miếng giẻ lau dầu xích xe.
“Về rồi hả con?” Ba ngước lên, trán nhăn lại dưới ánh đèn đường.
“Dạ ba.”
“Ăn cơm đi, má mày để trong lồng bàn đó. Nay má làm ca chiều về trễ.”
“Ba ăn chưa?”
“Tao ăn rồi. Cuốc xe chiều chạy hơi xa, ăn dọc đường luôn.”
Hoàng đi vào nhà. Gian bếp nhỏ quen thuộc, nền gạch men xanh nhạt đã mòn màu ở những chỗ hay đi lại. Anh mở lồng bàn: một đĩa trứng chiên hành, một bát canh rau má thịt bằm đã nguội. Anh không hâm lại canh, cứ thế xới chén cơm nguội rồi ăn.
Tiếng ba dắt xe máy vào nhà vang lên cạch cạch ở phòng khách. Rồi tiếng nước máy chảy ở bồn rửa tay. ba bước vào bếp, ngồi xuống chiếc ghế nhựa đối diện Hoàng.
“Mệt không con?”
“Dạ hơi mệt ba.”
Ba Hoàng nhìn chén cơm của con, rồi nhìn khuôn mặt gầy đi chút ít của anh sau chuyến đi Singapore.
“Làm người lớn là vậy đó,” ba nói, giọng ông trầm và phẳng như mặt nước giếng. “Hồi trước tao chạy xe ôm truyền thống, ngày nào cũng chỉ lo có khách hay không. Giờ chạy app, tụi nó báo cuốc liên tục, tiền về tài khoản mỗi tuần. Có tiền hơn thiệt, nhưng tối về cái lưng nó đau không cúi nổi.”
Ba dừng lại, lấy cái ly thủy tinh rót đầy nước lọc từ bình sứ, đẩy sang phía Hoàng.
“Có tiền vô thì chuyện nó cũng nhiều lên. Mày lo liệu mà giữ sức.”
“Con biết rồi ba.”
Hoàng cầm ly nước uống một ngụm lớn. Nước mát, hơi ngọt vị bình lọc cũ.
Ăn cơm xong, anh dọn dẹp bát đĩa rồi vào phòng mình. Căn phòng nhỏ bốn mét vuông, cái giường đơn chiếm gần hết diện tích. Anh nằm xuống, không bật đèn, chỉ để ánh sáng vàng từ ngõ hắt qua ô cửa sổ nhỏ chiếu lên trần nhà.
Hoàng nhắm mắt lại, gọi Hệ thống trong đầu.
Giao diện hiển thị mờ ảo trong bóng tối:
┌─────────────────────────────────────────┐
│ HỆ THỐNG KIẾN QUỐC │
│ NGUYỄN MINH HOÀNG │
│ │
│ CẤP ĐỘ: Founder Lv.3 │
│ ĐIỂM KIẾN QUỐC: [████████░░] 8,167 │
├─────────────────────────────────────────┤
│ NGUỒN LỰC ████████████ 300 │
│ ĐỘ BỀN TỔ CHỨC Lv.2 │
│ SỨC LAN TOẢ VĂN HOÁ 1 │
│ DI SẢN 1 │
│ │
│ VAI TRÒ: CEO — PUBLIC ROLE │
│ MẢNH THÔNG TIN TƯƠNG LAI: ĐÃ KHÓA │
│ THỜI GIAN KHÓA CÒN LẠI: 164 NGÀY │
├─────────────────────────────────────────┤
│ ⚠ TỐC ĐỘ PHÁT TRIỂN VƯỢT KHẢ NĂNG │
│ SỐNG CÒN CỦA TỔ CHỨC HIỆN TẠI │
└─────────────────────────────────────────┘
Độ bền tổ chức vẫn ở mức Cấp độ 2.
Con số không nhúc nhích dù hôm qua họ đã dọn vào văn phòng mới đường Tô Hiến Thành, dù tiền Series A đã nằm an toàn trong tài khoản ngân hàng của pháp nhân mới.
Hệ thống như đang nhắc nhở anh một sự thật lạnh lùng: cơ sở vật chất và tiền bạc không thay đổi bản chất của một tổ chức. Những bức tường sơn mới, cái máy lạnh Toshiba, hay thậm chí cả cuộn giấy vẽ kỹ thuật khổ A0 dán trên tường kia cũng chỉ là lớp vỏ ngoài.
Bên trong lớp vỏ đó, vết nứt đầu tiên về quyền lực kỹ thuật đã xuất hiện.
Hoàng đưa tay lên trán.
Mảnh thông tin tương lai: Đã khóa.
Thời gian khóa còn lại: 164 ngày.
Không có câu trả lời nào từ tương lai giúp anh giải bài toán này. Trí nhớ của kỹ sư hai mươi bảy tuổi từ năm 2026 cũng không giúp được gì, bởi vì ở cuộc đời trước, anh chưa từng phải điều hành ai. Anh chỉ nhận task, gõ code, rồi giao đúng hạn. Anh chưa từng phải ngồi trước một kỹ sư giỏi hơn mình và trả lời câu hỏi: Ai approve?
Anh tắt giao diện Hệ thống.
Bên ngoài cửa sổ, tiếng còi xe máy xa dần. Cơn mưa giông lúc chiều đã qua hẳn, để lại không khí ẩm ướt và mát mẻ đặc trưng của đêm Sài Gòn.
Hoàng nhắm mắt lại, trong đầu vẫn là hình ảnh sơ đồ vẽ bằng bút kim đen của Minh trên tường văn phòng, và dòng commit đầu tiên trên branch mới:
Start from scratch.
Bắt đầu từ đầu.
Nhưng lần này, anh không còn đi một mình nữa. Đêm tối tĩnh lặng, và Hoàng biết, chặng đường tiếp theo sẽ không có ngọn đèn nào dẫn lối ngoài những quyết định mà anh buộc phải tự mình đưa ra.