Dòng 247
Duy dọn bàn.
Không phải dọn kiểu quét sơ rồi bỏ, dọn thật. Nhặt ba lon mì Hảo Hảo rỗng xếp thành tháp ở góc bàn, bỏ vào bịch rác. Lau bàn bằng khăn ướt, khăn ướt duy nhất trong phòng, cái khăn mặt xanh nhạt mà má gửi lên từ hồi Duy mới thuê phòng, giờ bạc màu, sờn viền. Mặt bàn hiện ra: gỗ ép, vàng nhạt, có vết cà phê cũ khô thành vòng tròn nâu, có vết bút viết công thức gì đó từ hồi EduPath mà Duy không nhớ nữa.
Nhặt mấy cái ly nhựa cà phê sữa đá, nhặt nắp, nhặt ống hút. Bao nhiêu ly cà phê mua ở xe đầu hẻm, mỗi ly mười lăm ngàn, uống xong đặt bàn, uống xong đặt bàn, cho đến khi bàn toàn ly. Giờ nhặt hết. Bỏ bịch rác.
Đứng nhìn bàn. Sạch. Trống. Lần đầu tiên trong nhiều tháng, Duy thấy mặt bàn.
Mặt bàn. Gỗ ép. Vàng nhạt. Có vết cà phê. Có vết bút.
Hồi EduPath, bàn này đầy giấy ghi chú, đầy bản vẽ, đầy bản phác thảo in ra rồi gạch gạch xóa xóa. Hưng ngồi bên kia, vẽ logo lần thứ mười bảy, nói "lần này ngon rồi." Mình ngồi bên này, gõ hàm registerCourse(), nói "tuần sau ra bản thử."
Bàn lúc đó đầy. Giờ trống.
Duy quay sang cửa sổ. Rèm. Cái rèm vải xanh đậm Duy kéo kín từ sáu tháng trước, kéo kín vì nắng làm chói mắt, vì không muốn nhìn ra ngoài, vì bên ngoài là thế giới mà Duy không thuộc về nữa. Sáu tháng rèm kín.
Tay nắm rèm, kéo ra.
Nắng vào.
Duy nheo mắt. Nắng Sài Gòn buổi sáng, nắng vàng, ấm, xuyên qua khe cửa sổ, chiếu lên mặt bàn, chiếu lên sàn gạch, chiếu lên cái Trứng trên trần nhà. Vết ẩm hình bầu dục vẫn đó, cái Trứng, mối quan hệ ổn định nhất của Duy, vẫn nằm trên trần, vẫn vàng ố, vẫn không thay đổi.
Nắng. Lâu rồi không thấy.
Không phải lâu rồi không có nắng. Sài Gòn lúc nào chẳng nắng. Lâu rồi mình không mở rèm.
Bên ngoài cửa sổ: hẻm nhỏ Gò Vấp, mái tôn nhà đối diện, dây phơi đồ, áo thun, quần ngắn, cái áo bà ba ai đó, vài cái tã em bé. Tiếng trẻ con chơi ở dưới sân, tiếng xe máy, tiếng bà bán xôi rao "xôi xoài, xôi đậu xanh." Mùi xôi theo gió lọt qua cửa sổ, mùi nếp, mùi đậu, mùi lá chuối.
Duy hít thở. Thở bằng mũi. Mùi xôi.
Mùi xôi. Bao lâu rồi mình không ngửi gì ngoài mùi mì Hảo Hảo và mùi phòng kín?
Laptop nằm trên bàn. Laptop cũ, ASUS, mua hồi năm ba Bách Khoa, ba má góp tiền sinh nhật, mười bảy triệu, hồi đó đắt lắm. Bốn năm rồi. Vỏ nhôm xước, sticker "Hackathon 2022" ở góc trái, giải nhất toàn quốc, năm ba, đội ba người, thức ba đêm, giám khảo nói "đội này có tương lai". Bản lề hơi lỏng, mở ra thì màn hình rung nhẹ rồi đứng yên.
Duy mở laptop. Đèn nguồn xanh. Màn hình sáng. Màn hình khóa, hình nền: ảnh nhóm EduPath, ba đứa, Duy ở giữa, Hưng bên trái, Linh bên phải. Hưng cười, cái cười mà sau này Duy biết là cười của kẻ sắp cuỗm tiền bỏ chạy. Linh cũng cười, Linh giờ làm ở Google Singapore, đăng ảnh văn phòng đẹp, Duy unfollow từ tháng ba.
Gõ mật khẩu. Mật khẩu cũ: `EduPath2024!`, mật khẩu đặt từ hồi tin vào tương lai. Duy nghĩ đổi nhưng chưa bao giờ đổi. Vì đổi thì phải nghĩ mật khẩu mới, mà mật khẩu mới phải là gì? `ThatNghiep2025`? `ConCuaMa2025`?
Màn hình hiện ra. Lộn xộn. Biểu tượng rải khắp: VS Code, Chrome, Slack, mở ra sẽ thấy kênh EduPath đã chết, tin nhắn cuối cùng là Hưng gửi "sorry anh em" rồi mất tích, thư mục "EduPath" nằm giữa màn hình, to, đậm, như cái bia mộ.
Duy mở VS Code.
Lần này mày mở để làm gì? Lần trước mở rồi đóng. Lần trước nữa mở rồi gõ một ký tự rồi xóa. Lần trước nữa nữa mở rồi nhìn con trỏ nhấp nháy rồi đóng laptop đi nằm.
Lần này... mình không biết. Nhưng mở đã.
VS Code mở. Dự án cũ. Cây thư mục bên trái: `src/`, `components/`, `utils/`, `api/`. Cấu trúc quen, quen như nhà cũ, quen như hẻm cũ, quen như mọi thứ mình đã xây rồi bỏ.
Duy nhấp vào `src/courses/register.js`.
Dòng 247. Con trỏ nhấp nháy.
```javascript async function registerCourse(userId, courseId) { // TODO: validate enrollment limit ```
Dòng 247. Dòng mà Duy dừng lại mười tám tháng trước, dừng vào cái đêm Hưng gửi tin "sorry anh em", dừng vào cái sáng kiểm tra tài khoản công ty và thấy số dư bằng không, dừng vào cái trưa ngồi một mình trong quán cà phê nhìn điện thoại Hưng đã chặn.
Mười tám tháng. Dòng 247. Con trỏ nhấp nháy.
Mình viết cái này. Mình, không phải Hưng. Hưng lấy tiền. Hưng lừa. Hưng bỏ chạy. Nhưng mã này là của mình. Cấu trúc này mình thiết kế. Hàm này mình viết. Từng dòng, từng ký tự, từng dấu ngoặc.
Mã này sạch. Logic rõ. Biến đặt tên đúng. Hàm không quá dài. Comment đủ. Đây là mã của người biết code, không phải biết sơ sơ, mà biết thật. GPA 3.8. Giải nhất Hackathon. Backend thuần thục.
Hưng lấy tiền. Nhưng Hưng không lấy được cái này.
Duy đặt tay lên bàn phím. Ngón tay quen, quen vị trí, quen khoảng cách, quen cái cảm giác nhựa phím dưới đầu ngón. Ngón trỏ phải trên J, ngón trỏ trái trên F, ngón cái trên phím cách. Tư thế gõ. Tư thế cũ.
Gõ.
```javascript const course = await Course.findById(courseId); ```
Dòng 248.
```javascript if (!course) throw new Error('Course not found'); ```
Dòng 249.
```javascript if (course.enrolled >= course.limit) { ```
Dòng 250.
Duy gõ. Không biết đang code cho ai, EduPath chết rồi, không có khách hàng, không có người dùng, không có ai cần cái hàm này. Gõ vì tay nhớ. Gõ vì đầu nhớ. Gõ vì ngón tay chạy trên phím như chưa bao giờ dừng, mười tám tháng nghỉ mà cơ bắp ngón tay vẫn nhớ, vẫn biết phím nào ở đâu, vẫn gõ nhanh, vẫn chính xác.
Mười lăm phút. Ba mươi phút. Một tiếng.
Nắng dịch từ mặt bàn sang sàn nhà. Quạt trần quay, Duy bật quạt lúc nào không nhớ. Tiếng phím gõ đều, tiếng quen, tiếng mà Duy nghe mỗi ngày suốt hai năm đại học và một năm rưỡi startup, tiếng mà mười tám tháng nay không nghe. Tiếng gõ phím trong phòng trọ mười bốn mét vuông. Chỉ có tiếng đó, tiếng quạt trần, và tiếng con nít ngoài hẻm.
Hai tiếng. Ba tiếng.
Năm mươi dòng mã mới. Không hoàn chỉnh, thiếu phần kiểm tra lỗi, thiếu trường hợp biên, thiếu phần kết nối cơ sở dữ liệu thật, đang dùng giả lập. Nhưng năm mươi dòng. Năm mươi dòng mới sau mười tám tháng không gõ gì.
Duy dừng. Nhìn màn hình. Đọc lại mã, đọc từ dòng 247 đến dòng 297. Đọc chậm. Đọc từng dòng.
Được. Không tệ. Logic đúng. Biến rõ ràng. Cấu trúc ổn.
Mười tám tháng không gõ mà tay vẫn nhớ. Đầu vẫn nhớ. Mình vẫn nhớ.
Mở cửa sổ dòng lệnh. Đen, con trỏ trắng nhấp nháy. Gõ:
``` node src/courses/register.js ```
Lỗi. Đỏ. Dòng chữ đỏ hiện ra: `TypeError: Cannot read properties of undefined`.
Lỗi. Bình thường. Mã nào chạy lần đầu mà không lỗi. Sửa.
Duy đọc lỗi. Tìm dòng. Sửa, thiếu khai báo biến, quên gọi hàm khởi tạo. Sửa trong hai phút. Chạy lại.
Lỗi khác. Sửa. Chạy lại.
Lỗi nữa. Sửa. Chạy lại.
Chạy. Không lỗi. Dòng chữ xanh hiện ra trên cửa sổ dòng lệnh:
``` ✓ User registered successfully ✓ Course enrollment: 1/30 ```
Duy nhìn dòng chữ xanh. Nhìn lâu. Nhìn đến khi mắt hơi cay, không phải khóc, chỉ cay, vì nhìn màn hình lâu, vì ánh sáng xanh lá trên nền đen, vì mười tám tháng rồi mới thấy dòng chữ xanh "thành công" trên cửa sổ dòng lệnh.
Chạy. Nó chạy.
Mình viết. Mình sửa lỗi. Mình chạy. Nó chạy.
Không ai trả tiền cho cái này. Không ai cần cái này. EduPath chết rồi. Nhưng nó chạy. Mã mình viết, nó chạy.
Duy ngồi lại. Thở ra, thở dài, thở kiểu người vừa nín thở lâu mà không biết mình đang nín. Lưng tựa vào ghế nhựa. Ghế nhựa cũ, lưng cong, tay vịn sờn.
Nhìn xung quanh phòng. Phòng trọ mười bốn mét vuông. Vẫn bé. Vẫn tối ở góc, dù đã mở rèm, nắng chỉ vào được nửa phòng, nửa còn lại vẫn tối. Tường sơn trắng bạc. Sàn gạch lạnh. Giường đơn ga nhàu. Tủ quần áo nhựa xếp, ba ngăn, ngăn trên toàn áo thun, ngăn giữa quần, ngăn dưới đồ lặt vặt. Bảng trắng trên tường, xóa sạch từ lâu, chỉ còn vệt mờ, vết marker đỏ xanh hồi vẽ lộ trình EduPath, giờ loang thành ố vàng.
Vẫn bẩn. Vẫn bé. Vẫn tối.
Nhưng có gì đó khác.
Mình không viết mã để khởi nghiệp. Mình không viết mã để kiếm tiền. Mình không viết mã để chứng minh với ai.
Mình viết mã vì mình nhớ.
Nhớ cảm giác gõ phím rồi thấy thứ gì đó hiện ra trên màn hình. Nhớ cảm giác sửa lỗi, tìm dòng sai, sửa, chạy lại, thấy xanh. Nhớ cảm giác tạo ra thứ gì đó từ không.
Hưng lấy tiền. Startup sập. Mười tám tháng nằm phòng trọ. Mười tám tháng "sắp rồi má." Mười tám tháng nhìn trần nhà.
Nhưng mình vẫn nhớ.
Và nếu mình vẫn nhớ, nghĩa là mình chưa chết hẳn.
Duy đóng laptop. Nhẹ, đóng nhẹ, không đập, không quăng, không giận. Đóng kiểu sẽ mở lại. Đóng kiểu "mai gặp."
Đứng dậy. Đi ra cửa sổ. Nhìn ra hẻm, nắng chiều, mái tôn phản sáng, dây phơi đồ lắc nhẹ trong gió. Bà bán xôi đã đi, thay bằng xe nước mía ở góc hẻm, tiếng máy ép mía kêu rè rè. Mấy đứa con nít đá bóng bằng lon nước ngọt, lon Coca-Cola, bẹp, lăn trên đường, mấy đứa hét ầm ĩ.
Duy nhìn. Nhìn hẻm. Nhìn nắng. Nhìn mấy đứa con nít.
Rồi cười. Cười nhẹ. Cười không vì gì, cười vì nắng, vì mùi nước mía, vì tiếng con nít, vì năm mươi dòng mã mới, vì dòng chữ xanh "thành công" trên cửa sổ dòng lệnh.
Lần đầu tiên trong nhiều tháng, Duy cười mà không vì ai nhắn tin, không vì xem gì trên điện thoại, không vì gì cả. Chỉ cười.
Quay lại bàn. Mở điện thoại. Nhóm chat HỘI BẠN GÀ. Lướt, tin nhắn cuối là An gửi ảnh cà phê sáng nay, Quân thả tim. Duy nhấn tim.
Rồi gõ. Lần đầu tiên trong nhiều tuần, Duy gõ tin nhắn vào nhóm, không phải "Ờ", không phải "Bận. Lần sau", không phải đọc rồi bỏ qua.
"Thứ sáu này ai đi?"
Gửi.
Quân trả lời trong ba mươi giây: "Có tao."
An: "Có."
Vy gửi sticker giơ tay.
Long. Long seen. Không trả lời. Nhưng seen.
Nam. Không thấy.
Duy đặt điện thoại xuống. Nhìn laptop trên bàn. Laptop đóng, đèn nguồn xanh nhấp nháy chậm, chế độ ngủ, không phải tắt. Ngủ. Sẽ thức.
Mai mình sẽ mở lại. Sẽ gõ tiếp. Dòng 298. 299. 300. Gõ đến đâu thì đến.
Mình không biết sẽ đi đâu. Không biết có xin được việc không. Không biết tiền còn bao lâu, một triệu tám, má gửi ít hơn, bà ngoại bệnh. Không biết mình sẽ thành gì.
Nhưng hôm nay mình gõ năm mươi dòng. Và nó chạy.
Đủ rồi. Hôm nay thế đủ rồi.