Câu chuyện này xảy ra hồi 2022. Tôi thề trên 3 cái repo production của tôi là thật. Ai không tin thì thôi. Nhưng mà thật 🙂
—
Hồi ấy tôi đang làm outsource cho một công ty Việt Nam, team 5 người, code PHP Laravel, cuộc sống bình yên như cái server không ai truy cập. Cho đến một ngày.
Sếp gọi tôi vào phòng. Mặt sếp nghiêm trọng kiểu mặt người vừa thấy bill AWS cuối tháng.
“Việt à, có một đối tác bên Mỹ muốn thuê mình xây hệ thống. Bên ấy khá lớn.”
“Dạ, bên nào anh?”
“Một công ty con của… Amazon.”
Tôi chớp mắt.
“Có phải Amazon bán sách không anh?”
“Amazon bán sách, bán cloud, bán cả giấc mơ của developer 🙂 Ừ, đúng Amazon đó.”
“…”
“Họ cần một bản System Design cho một microservice xử lý payment real-time, throughput 100k request/giây, đảm bảo exactly-once delivery, fault-tolerant, multi-region. Mày nhắm làm proposal được không?”
Tôi ngồi đó. 100k request/giây. Exactly-once delivery. Multi-region. Tôi — thằng viết `if-else` lồng 7 tầng, deploy bằng FileZilla, database duy nhất từng dùng là MySQL trên shared hosting 🙂
Nhưng cơ hội chỉ có một. Nếu Amazon duyệt proposal, công ty tôi lên đời. Tôi lên đời. Lương lên đời. LinkedIn bio từ “PHP Developer” thành “Solution Architect — Amazon Partner.” Cả dòng họ nở mặt nở mày.
“Dạ, được anh!”
“Tuần sau nộp nhé.”
“Dạ!”
🙂
—
Suốt tuần đó, tôi căng như cái terminal đang chạy `stress –cpu 8`. Đọc paper về distributed systems. Xem Martin Kleppmann trên YouTube. Mở “Designing Data-Intensive Applications” — cuốn sách dày 600 trang mà dân system design gọi là Kinh Thánh. Tôi đọc được 40 trang thì muốn khóc 🙂
Kafka, Zookeeper, Paxos, Raft, CRDT, event sourcing, saga pattern, two-phase commit — MỖI TỪ LÀ MỘT VŨ TRỤ mà tôi chưa từng đặt chân vào. Tôi — thằng deploy bằng FTP — đang cố viết proposal cho Amazon. Giống thằng bán phở đang cố viết thực đơn cho nhà hàng 3 sao Michelin 🙂
Thứ Sáu. Deadline thứ Hai. Proposal mới viết được 30%. Phần còn lại là mấy cái diagram vẽ bằng draw.io mà nhìn như bản đồ mê cung hơn là system architecture.
Tôi stress. Stress kiểu `OutOfMemoryError`. Não full. Không nạp thêm được nữa.
—
Tối thứ Sáu, thằng Phú — frontend dev cùng team, chuyên gia lướt manga trong giờ làm — thấy tôi ngồi gục trên bàn phím, mặt in hằn phím Enter.
“Ê, mày cần nghỉ ngơi. Đi giải trí đi.”
“Tao không có mood.”
“Tao biết chỗ. Karaoke. Trên Nguyễn Khang. Tao quen quản lý, phòng VIP, mát lắm.”
“Karaoke gì giờ này…”
“Karaoke… tay vịn 🙂”
Tôi nhìn Phú. Phú nhìn tôi. Cái nhìn đồng cảm giữa hai thằng dev mệt mỏi. Không cần nói thêm. Developer khi stress có 2 lựa chọn: Stack Overflow hoặc đi chỗ khác. Hôm nay Stack Overflow không cứu được tôi nữa 🙂
“Đi.”
—
Quán karaoke trên Nguyễn Khang. Tầng 3. Phòng VIP. Đèn mờ. Nhạc remix. Mùi nước hoa rẻ tiền trộn mùi điều hoà. Tiêu chuẩn ngành karaoke tay vịn 🙂
Phú gọi phục vụ. Order bia. Rồi quay sang tôi, nháy mắt:
“Để tao gọi cho mày một em thuộc dạng hồng bài của quán. Xinh nhất luôn.”
“Thôi, tao không có tâm trạng.”
“Kệ. Mày cần relax. Mày nhìn mặt mày kìa — mặt thằng vừa force push lên main rồi mới nhớ ra chưa test 🙂”
5 phút sau. Cửa phòng mở. Một cô bé bước vào.
Má phấn môi son. Váy ngắn. Tóc xoã ngang vai. Mùi nước hoa — lần này không rẻ tiền. Thơm. Kiểu thơm mà developer không biết gọi tên vì developer chỉ biết mùi cà phê và mùi bàn phím cơ 🙂
“Chào anh! Em tên Linh.”
“Ừ. Anh Việt.”
Linh ngồi cạnh. Rót bia cho tôi. Chuyên nghiệp. Nhưng mắt Linh — mắt không giống mắt người làm nghề này. Mắt sáng. Mắt kiểu — kiểu người quen đọc nhiều hơn quen cười.
Tôi tuy ham vui thật, nhưng là mẫu người của công việc. Khi công việc còn dang dở, não tôi không có RAM cho chuyện khác. Dù Linh xinh. Dù Linh ngồi cạnh. Dù Phú đang liếc sang với ánh mắt “mày ơi linh hoạt lên đi” 🙂
Tôi ngồi đó. Uống bia. Nhìn vào khoảng không. Trong đầu toàn Kafka, Zookeeper, exactly-once delivery.
Linh nhìn tôi. Nghiêng đầu.
“Anh sao vậy? Buồn gì mà mặt như bị reject PR?”
Tôi quay sang. Nhìn Linh. Chớp mắt.
“Em… em vừa nói gì?”
“Em nói mặt anh như bị reject PR. Pull request ấy. Sao, anh không biết PR à?”
“Không, anh biết PR. Anh chỉ… không nghĩ em biết PR.”
Linh cười. Nhẹ. Kiểu cười của người đã quen bị underestimate.
“Em biết chứ. Sao, anh kể đi. Công việc gì mà stress vậy?”
Chẳng hiểu ma xui quỷ khiến thế nào, tôi dốc hết nỗi lòng. Kể về Amazon. Về proposal. Về 100k request/giây. Về exactly-once delivery. Về cuốn “Designing Data-Intensive Applications” mà tôi đọc 40 trang muốn bỏ nghề.
Linh nghe. Im. Không ngắt lời. Thi thoảng gật đầu. Kiểu gật đầu kỹ thuật — không phải gật cho có.
Tôi kể xong. Thở dài.
“Đại khái vậy. Chắc em không hiểu mấy thuật ngữ đâu, kệ—”
“Anh dùng Kafka hay RabbitMQ cho message queue?”
“…”
“100k request/giây thì Kafka hợp hơn. Nhưng exactly-once delivery với Kafka khó. Anh cần idempotent producer, transactional consumer, rồi deduplication ở consumer side. RabbitMQ đơn giản hơn nhưng throughput không đủ. Anh có tính dùng Apache Pulsar không? Pulsar có native support cho exactly-once nè.”
Tôi TÒN MẮT.
“Em… em biết Pulsar?”
“Anh ơi, em từng là Senior Software Engineer ở Google. Team Google Cloud Pub/Sub. 3 năm.”
🙂🙂🙂
Tôi nhìn Linh. Linh nhìn tôi. Quán karaoke tay vịn. Đèn mờ. Nhạc remix đang phát bài gì đó của Sơn Tùng.
“Em… em nói thiệt?”
Linh lấy điện thoại. Mở LinkedIn. Cho tôi xem profile. Ảnh đại diện nghiêm túc. Google logo. “Senior Software Engineer — Google Cloud Platform, Mountain View, CA. 2018-2021.”
Bên dưới: education. FPT University — Computer Science. Rồi Stanford University — Master of Computer Science, specialization in Distributed Systems.
STANFORD 🙂
Tôi ngồi trong quán karaoke tay vịn trên Nguyễn Khang, đang nhìn LinkedIn profile của một cựu Senior Engineer Google, tốt nghiệp Stanford, chuyên ngành Distributed Systems — ĐÚNG CÁI THỨ TÔI ĐANG CẦN 🙂
“Anh… anh không hiểu. Em là engineer Google mà sao…”
Linh im 3 giây. Rồi kể.
—
Em vốn là sinh viên FPT. Nghèo. Nhà ở Hà Tĩnh. Bố làm nông. Mẹ bán rau. Nhưng em giỏi. Giỏi kiểu — kiểu top 1 khoá, nhận học bổng toàn phần Stanford. Bay sang Mỹ. 2 năm Master. Rồi vào Google. Mountain View. Lương 250k USD/năm. Gửi tiền về nuôi cả nhà.
3 năm ở Google. Cuộc sống ổn. Cho đến khi bố em bệnh. Ung thư gan giai đoạn 3. Chi phí điều trị: 800 triệu. Bảo hiểm Mỹ không cover bệnh viện Việt Nam. Em về nước. Nghỉ việc Google. Dùng hết tiền tiết kiệm cho bố chữa bệnh.
Bố em qua đời sau 6 tháng.
Tiền hết. Visa hết hạn. Google không giữ vị trí. Em quay lại Việt Nam. Apply remote job — nhưng 2021-2022 tech winter, FAANG layoff hàng loạt, remote position cho engineer ở Việt Nam gần như bằng không.
Mẹ em vẫn cần tiền. Em gái em đang học đại học. Và em — Senior Engineer Google, Stanford CS — đi làm tay vịn karaoke. Vì nó trả 15-20 triệu/tháng. Hơn lương fresher ở Việt Nam 🙂
Nghe em kể mà mắt tôi cay. Cay kiểu `console.error()` mà không biết fix ở đâu. Thương em quá. Nhưng tự biết mình — thằng dev lương 12 triệu — chẳng giúp gì được.
Linh lấy khăn giấy lau nước mắt cho tôi. Nhẹ nhàng. Tay mềm.
“Anh có say không đấy?”
“Anh ngàn chén không say.”
“Vậy nghe em nói nè.”
—
Thế rồi Linh bắt đầu thì thầm vào tai tôi.
Nhưng không phải thì thầm kiểu tay vịn 🙂 Linh thì thầm về SYSTEM DESIGN.
Linh nói về cách thiết kế payment service chịu tải 100k RPS. Về API Gateway pattern với rate limiting. Về cách dùng Kafka partition key theo transaction ID để đảm bảo ordering. Về idempotency key ở consumer side. Về saga pattern cho distributed transaction — thay vì two-phase commit vì 2PC không scale.
Linh nói về multi-region deployment. Về CockroachDB cho globally distributed SQL. Về cách dùng Raft consensus để đảm bảo consistency across region. Về circuit breaker pattern. Về bulkhead pattern. Về retry with exponential backoff.
Linh nói đến đâu, tôi sáng ra đến đấy. Mỗi câu Linh nói mở ra một cánh cửa. Và phía sau mỗi cánh cửa là kiến thức mà tôi đọc 600 trang sách không hiểu — Linh giải thích trong 5 phút.
“Em à, anh dốt tiếng Anh. Em nói nhiều thuật ngữ quá, sợ mai anh quên.”
“Nếu anh tin em, để em soạn proposal cho.”
TÔI MỪNG ĐẾN MỨC MUỐN HÉT. Nhưng đang ở karaoke tay vịn mà hét “EM SOẠN SYSTEM DESIGN CHO ANH ĐI” thì hơi kỳ 🙂
“Em soạn thật hả?”
“Thật. Em nhớ hết architecture của Google Cloud Pub/Sub. Cái proposal này với em chỉ mất 1 đêm. Anh gửi em requirement, em làm.”
Tôi chỉ nói chuyện với Linh hơn tiếng đồng hồ. Nhưng tôi KHẲNG ĐỊNH: Linh thuộc dạng siêu trí tuệ. Chẳng qua đời quá nghiệt ngã với em mà thôi.
Vừa lúc hết ca. Tôi và Linh trao đổi số điện thoại. Chia tay lưu luyến. Tối đó tôi về nhà, ngủ ngon lành. Giấc ngủ đầu tiên sau 1 tuần thức trắng đọc Martin Kleppmann.
—
Sáng dậy.
Theo thói quen tôi vớ điện thoại xem giờ.
Tìm mãi không thấy 🙂
Lục tung nhà. Không có. Kiểm tra balo — BALO CŨNG KHÔNG CÓ.
Tôi ngồi xuống. Tái mặt. Truy lại ký ức đêm qua: quán karaoke → ra cửa → lên Grab → về nhà → ngủ.
Balo. Tôi để balo ở quán. Trong balo có: điện thoại, ví, CCCD, và — CÁI LAPTOP 🙂
CÁI LAPTOP CÓ 3 CÁI REPO PRODUCTION ĐANG CHẠY 🙂
Tôi chạy xe máy lên Nguyễn Khang. 9h sáng Chủ Nhật. Vào quán.
“Em ơi, hôm qua anh để quên balo ở phòng VIP tầng 3.”
“Dạ, không có balo nào ở đây anh ơi.”
“Chắc không em?”
“Chắc ạ. Tụi em dọn phòng rồi, không có gì.”
MẢTAO 🙂
Mất balo. Mất điện thoại. Mất laptop. Mất CCCD. Mất luôn số điện thoại Linh — vì tôi lưu trong máy chứ không nhớ.
Hôm đó Chủ Nhật, không thể cắt sim mới. Tôi quay lại quán. Hỏi về Linh. “Em Linh, hôm qua, ca tối, phòng VIP.”
Thằng phục vụ nhìn tôi ngơ ngác.
“Linh nào anh?”
“Linh! Em cao khoảng 1m63, tóc xoã, mặt xinh, HỌC STANFORD, LÀM GOOGLE!”
“Anh ơi… tụi em không có ai tên Linh. Mà Stanford Google gì ở đây anh 🙂”
Tôi điên. Tôi book thêm phòng. Gọi tay vịn. Cả chục lượt em vào rồi ra. Không có Linh. Không ai biết Linh. Không ai nhớ Linh. Linh — Senior Engineer Google, Stanford CS, chuyên gia Distributed Systems — biến mất như một goroutine bị garbage collect 🙂
Thằng phục vụ mất kiên nhẫn. Dù tôi bo 5 lít bia. Cuối cùng nó trở mặt:
“Anh ơi, anh say quá rồi. Hôm qua anh vào đây, ngồi MỘT MÌNH, hát bài ‘Phía Sau Một Cô Gái’ 14 lần liên tục, rồi gục trên sofa. Không có em nào hết. TỤI EM KHÔNG DÁM VÀO VÌ ANH HÁT DỮ QUÁ 🙂”
“…”
“Balo anh thì… anh ôm balo ra cửa rồi lên Grab mà anh. Anh kiểm tra lại đi.”
Tôi về nhà. Kiểm tra. Balo ở dưới gầm giường. Laptop trong balo. Điện thoại trong túi áo khoác treo sau cửa.
TẤT CẢ Ở NHÀ TỪ ĐẦU 🙂
Tôi mở điện thoại. Tìm số Linh.
Không có số nào tên Linh. Không có cuộc gọi nào đêm qua ngoài cuộc gọi Grab.
Tôi mở laptop. Mở lịch sử browser. 2h sáng đêm qua: 47 tab đang mở — tất cả là Martin Kleppmann YouTube, Apache Kafka documentation, và một bài blog trên Medium có tiêu đề: “How Google Cloud Pub/Sub achieves exactly-once delivery” — tác giả: một Senior Engineer tên… Linh Nguyen 🙂
🙂🙂🙂
—
Tôi ngồi đó. Nhìn cái màn hình. 47 tab. Bài blog của Linh Nguyen.
Vậy là… Linh có thật. Nhưng không phải ở karaoke tay vịn. Linh ở trên Medium. Linh là tác giả bài blog mà tôi đọc lúc 2h sáng trong trạng thái nửa tỉnh nửa mê, say bia lẫn say thiếu ngủ, và não tôi — cái não đang chạy ở 100% CPU suốt 1 tuần — đã merge bài blog đó với giấc mơ thành một cô gái ngồi cạnh tôi ở karaoke tay vịn 🙂
Brain hallucinate. Giống ChatGPT. Tự tin. Chi tiết. Có dẫn chứng. MÀ SAI BÉT 🙂
—
Nhưng mà — và đây là phần hay — cái proposal?
Tôi mở lại 47 tab đó. Đọc lại bài blog của Linh Nguyen. Đọc kỹ. Đọc chậm. Lần này tỉnh.
Bài blog đó — 8.000 từ — trình bày CHÍNH XÁC cách thiết kế payment service chịu tải cao. Kafka. Idempotency. Saga pattern. Multi-region. Circuit breaker. Tất cả. Linh — Linh thật, Linh trên Medium — đã viết hết.
Tôi ngồi 2 ngày. Đọc. Hiểu. Viết lại bằng ngôn ngữ của mình. Vẽ diagram. Soạn proposal.
Thứ Hai. Nộp. Sếp đọc. Sếp gật.
Gửi Amazon. Amazon review. 1 tuần sau:
**DUYỆT** 🙂
—
Công ty tôi lên đời. LinkedIn bio từ “PHP Developer” thành “Solution Architect.” Lương tăng. Sếp thưởng. Thằng Phú hỏi:
“Ê, cuối cùng mày làm proposal bằng cách nào?”
“Nhờ một em tay vịn.”
“…Hả?”
“Thôi kệ. Mày không hiểu đâu 🙂”
—
6 tháng sau. Tôi tình cờ lướt LinkedIn. Thấy một bài post:
*”Linh Nguyen vừa nhận vị trí Staff Engineer tại Stripe, Singapore.”*
Ảnh đại diện: đúng người. Đúng mặt. Đúng đôi mắt sáng mà tôi “thấy” trong giấc mơ ở karaoke tay vịn — vì tôi đã xem ảnh avatar Medium của em lúc 2h sáng và não tôi lưu lại 🙂
Tôi bấm vào profile. Đọc bio:
*”Former Google Cloud Pub/Sub team. Stanford CS. Vietnamese. Building the future of global payments at Stripe.”*
Tôi nhìn cái profile đó. Rồi nhìn cái proposal trên bàn — proposal mà Amazon duyệt — proposal mà tôi viết dựa trên bài blog của Linh.
Tôi bấm nút “Connect.” Kèm message:
*”Hi Linh, em không biết anh, nhưng bài blog của em trên Medium đã cứu career anh. Cảm ơn em. — Một thằng dev Việt Nam từng đọc bài em lúc 2h sáng trong trạng thái không tỉnh táo.”*
3 ngày sau. Linh accept. Reply:
*”Haha, cảm ơn anh! Em viết bài đó lúc 3h sáng sau khi on-call xong. Vui vì nó giúp được ai đó 😊”*
Tôi nhìn tin nhắn. Cười. Rồi tự hỏi: nếu đêm đó tôi không say, không mở 47 tab lúc 2h sáng, không hallucinate ra Linh ở karaoke tay vịn — thì sao?
Thì chắc giờ tôi vẫn deploy bằng FileZilla 🙂
—
Giờ đây 2 năm đã trôi qua. Câu chuyện xưa đã thành quá khứ. Linh giờ là Staff Engineer Stripe ở Singapore, chắc lương mấy trăm nghìn đô. Tôi giờ là Solution Architect ở Việt Nam, lương đủ sống, đủ mua americano mỗi sáng.
Chỉ là mỗi khi deploy production lúc 2h sáng, trong lúc chờ CI/CD chạy, tôi lại mở Medium, tìm bài blog cũ của Linh Nguyen, đọc lại, như một thói quen trong vô thức.
Và thỉnh thoảng — rất thỉnh thoảng — khi thằng Phú rủ đi karaoke, tôi vẫn đi. Vẫn gọi tay vịn. Vẫn ngồi trong phòng VIP. Không phải vì tôi hy vọng gặp Linh. Mà vì — trong tất cả những nơi tôi từng học System Design, karaoke tay vịn Nguyễn Khang vẫn là nơi hiệu quả nhất 🙂
Kỷ niệm ngày xưa, mơ hồ như cái bug production lúc 3h sáng — thấy rồi mất, sửa rồi quên, nhưng cái impact thì ở lại mãi 🙂
💻🍺🎤
—