20% Thời Gian Của Tôi
Người ta thường nói Google có một chính sách đặc biệt gọi là “20% thời gian” - mỗi nhân viên có thể dành 20% giờ làm việc để theo đuổi những dự án cá nhân sáng tạo bên ngoài nhiệm vụ chính. Tôi đã từng tranh luận với vài người bạn về ý nghĩa thực tiễn của mô hình này. Theo tôi nghĩ, đây là chiêu trò “gây nghiện” dành cho dân lập trình, đặc biệt là những người khó chiều. Khi họ không còn bị thúc đẩy bởi lợi ích vật chất, thì việc tạo ra những điều thú vị mới chính là động lực thực sự. Việc học hỏi và khám phá những kiến thức mới mẻ không chỉ làm công việc chính trở nên hấp dẫn hơn, mà còn khiến 80% thời gian còn lại hiệu quả hơn nhiều. Chưa kể hiệu suất của lập trình viên có thể chênh lệch “trên trời dưới đất” (ngay cả cùng một người ở các trạng thái khác nhau), nên đây thực chất là một khoản đầu tư khôn ngoan.
Dù bản thân không thừa nhận, nhưng khách quan mà nói, nửa năm nay áp lực công việc khá nặng nề. Rõ rệt nhất là tôi đã từ bỏ thói quen tập thể dục kiên trì nhiều năm, không còn đam mê leo tường trong nhà, leo núi ngoài trời càng không cần phải nói; đã lâu không đạp xe vi vu, không chơi cờ vây, không đánh bài ma, thậm chí cả trò chơi “Giết người” cũng mất hứng. Dạo trước thử chơi “OUAT” (bạn nào chưa biết thì tự Google nhé), nhưng sau đó thấy phí thời gian nên bỏ luôn.
Mẹ tôi vừa gửi thư tay (dán tem 2 xu) nhắc nhở đủ điều về sức khỏe, vậy mà tuần trước tôi vẫn “thức trắng hai đêm” như thường lệ. Thôi thì đợi dự án xong sẽ điều chỉnh lại lịch sinh hoạt, lấy lại mục tiêu tập thể dục 5 tiếng mỗi tuần. Có lẽ còn phải tính đến chuyện tìm một nửa kia, cùng nắm tay nhau đi đến cuối cuộc đời.
Dù vậy, đó cũng là chuyện sau dự án, phải không? Tuổi trẻ mà, cố thêm một hai năm nữa cũng không sao. Cha tôi hồi ngoài 40 tuổi còn chuyển cả giường xuống văn phòng, cả tuần không về nhà để viết code, chắc là gen di truyền :D Huống hồ tôi còn có một nhóm anh em đồng hành.
Xin lỗi, lạc đề một chút. Thực ra tôi muốn nói rằng dù đang làm việc 7 ngày/tuần, cuối tuần tôi vẫn dành thời gian cho những dự án nhỏ thú vị. 2/7 ngày thực ra đã hơn 20%, chỉ là mượn cớ “20% thời gian” của Google để biện minh thôi. Dưới đây là vài chia sẻ về những thứ tôi thử nghiệm vào cuối tuần.
Hôm thứ Sáu, một người bạn cũ gọi điện bàn về một số vấn đề kỹ thuật. Dự án của anh ấy (một phần mềm nhắn tin đã có hàng tỷ người dùng) đang chuẩn bị phiên bản 2, muốn tham khảo ý kiến tôi. Tôi gợi ý sử dụng Lua để nhúng, cũng như áp dụng một số kiến trúc đa nền tảng. Dù chỉ là thảo luận thoáng qua, nhưng tôi vốn hiểu biết nông cạn về mảng nhắn tin tức thời, nên không dám nói nhiều. Tuy nhiên cuộc trò chuyện này khiến tôi bỗng dưng quan tâm trở lại lĩnh vực này.
Cuối tuần chủ yếu nghiên cứu XMPP, phần vì tôi là fan cứng của Google (Google Talk dùng giao thức này), phần vì đây là điểm khởi đầu lý tưởng. Nhân tiện, phiên bản mới của Popo cũng đã hỗ trợ XMPP một phần, ít nhất là có thể liên kết với Google Talk và thêm bạn bè qua lại. Không biết có phải do tôi “rỉ tai” suốt mấy năm trời không :)
Ban đầu tôi tìm hiểu dự án Tessa - một client Jabber viết bằng C++ và Lua. Mục tiêu dự án khá phù hợp với kỳ vọng của tôi, đặc biệt là việc dùng Lua để kết nối các module. Tuy nhiên sau khi xem xét mã nguồn, tôi không thực sự hài lòng. Có lẽ vì dạo này tôi ít quan tâm đến C++. Điểm thú vị là phần binding Lua cho thư viện gloox khá độc đáo. Tôi định tận dụng binding này để thử nghiệm vài ý tưởng nhỏ, nhưng vì thiếu tài liệu nên tiến triển chậm. Phải công nhận Tessa có vài điểm sáng tạo trong cách xử lý tin nhắn, dù việc truyền dữ liệu còn nhiều hạn chế (cứ mỗi lần lại tạo một std::map mới).
Sau đó tôi trực tiếp nghiên cứu gloox. Tiếc là dù cố gắng nhiều ngày vẫn không đăng nhập được vào Google Talk. Qua quá trình này, tôi khám phá ra vài thiết kế tinh tế trong gloox. Dù là thư viện C++, nhưng được xây dựng khá công phu. Tôi ghi chú lại những điểm hay, dù bản thân vẫn thích phong cách KISS hơn.
Cuối cùng tôi chọn libjingle của Google để tạo các dự án nhỏ. Việc biên dịch trên Windows khá phức tạp (trên Unix thì dễ hơn nhiều). Nhưng khi đã hiểu rõ thiết kế, chỉ cần vài chục dòng code là có thể tạo một con bot chat đơn giản. Thư viện này còn có ví dụ về chat thoại và truyền file đều hoạt động ổn định.
Libjingle sử dụng mô hình đa luồng dựa trên hàng đợi tin nhắn để giao tiếp giữa các thread. Nhìn chung mã nguồn khá tốt, dù phong cách lập trình không hợp gu tôi lắm.
Tôi làm những điều này chủ yếu để thực hiện hai dự án nhỏ:
Thứ nhất là hệ thống cảnh báo lỗi máy chủ. Khi hệ thống gặp sự cố, một con bot sẽ tự động gửi thông báo qua IM và đính kèm file liên quan. Dù với người quen dùng email thì tính năng này không cần thiết, nhưng với tôi đây là một thử nghiệm thú vị.
Thứ hai là thay thế widget Google Talk Chatback trên blog. Công cụ hiện tại khá bất tiện - mỗi khi có khách nhắn, tôi phải mở phiên bản Flash của GTalk để kích hoạt. Tôi muốn tạo một con bot đóng vai trò trung gian giữa web và desktop GTalk của tôi. Khi đó mọi tin nhắn từ khách sẽ hiển thị qua bot, và tôi có thể trả lời trực tiếp bằng lệnh /1 /2 /3… để chuyển đổi cuộc trò