Câu chuyện tiếp theo của phần 1 - Kể về quãng thời gian tại công ty hiện tại - phần 1
Sau đợt gap time tôi đã kể ở phần 1, sếp chuyển tôi sang một dự án dùng công nghệ khác hẳn .NET (thứ tôi theo đuổi bấy lâu nay). Nhưng cũng chính ở đây, tôi mới nhận ra một điều, đó là trong software luôn có một lớp kiến thức nền tảng, và 99% ngôn ngữ hay công nghệ đều được xây lên từ đó. Khi đã nghĩ được vậy, tôi thấy thoải mái hẳn, không còn tự trói mình vào mỗi .NET nữa. Ngày trước ở công ty cũ, chuyện mình làm .NET mà bị cho đi làm Java từng khiến tôi bức bối và khó chịu lắm.
Ở dự án mới, tôi làm việc với NestJS (framework backend chạy trên NodeJS).
Giới thiệu sơ về NestJS một chút. Người ta có câu “Nam có Nam hiệp Triển Chiêu, Bắc có Bắc hiệp Âu Dương Xuân”, thì giới lập trình cũng có câu y vậy, đó là “Nam .NET có ASP.NET Core, Bắc NodeJS có NestJS” :v.
NestJS lấy cảm hứng kiến trúc từ Angular, nhưng với dân .NET như tôi thì nó giống ASP.NET Core đến lạ, cụ thể là cũng có DI container, module, lifecycle, routing, middleware, rồi guard, interceptor, exception filter na ná filter bên ASP.NET Core. Thế mạnh của nó là hướng tới enterprise, và nhờ module cùng DI nên áp dụng Clean Architecture khá thuận tay. Rồi khi dive deep vào dự án, tôi mới ngộ ra một điều. Á à, lâu nay cái mình theo đuổi ở C# phần nhiều chỉ là đồ chơi công nghệ mà thôi, bỏ mấy thứ đó đi thì mình còn lại gì nhỉ? Nói ra ri chắc mất mặt lắm. Nhưng khi AI bùng nổ cực mạnh thì chuyện mất mặt không còn là chính nữa, thứ khiến tôi lo là hướng đi của mình trong tương lai. Với sự trợ giúp của AI, tôi thấy nhiều anh em dev bắt nhịp với một ngôn ngữ mới nhanh hơn hẳn trước đây. Nhiều khi việc của dev chúng tôi chỉ còn là copy spec, copy mô tả hoặc gửi link task, connect MCP cho AI, thế là xong.
Chính điều đó ít nhiều đã tác động sâu sắc đến sự chấp niệm bấy lâu của tôi vào một ngôn ngữ, và lung lay luôn cả cách tôi tiếp cận vấn đề. Lung lay cách tiếp cận vấn đề là sao nhỉ? Trước đây tôi có viết bài X-Dev: Ngày cũ của tương lai, ít nhiều trả lời được câu hỏi này, và một bài có liên quan chút xíu là Khi cha đẻ Claude Code không còn tự gõ dòng code nào. Sự thay đổi này cũng trùng với định hướng của công ty, và tôi thấy có vẻ bến đỗ này vẫn hợp với mình. Ở đây, dev không còn là một thợ code nữa, mà là người tư duy theo hướng product first, solution first. Thứ cần nghĩ là thiết kế như thế nào, solution ra sao, trade-off thế nào, có giải được bài toán của khách hàng với chi phí và thời gian khiến họ hài lòng không, chứ không còn chăm chăm vào việc code nữa.
Cũng trong khoảng thời gian đấy, công ty nói về AI khá nhiều, đi kèm là tổ chức một cuộc thi hackathon ứng dụng AI để làm tool nội bộ. Đây là cuộc thi quy mô toàn công ty. Thật may tôi là một trong các thí sinh, và may mắn hơn nữa là team tôi nhận được giải nhất cùng giải ứng dụng AI hiệu quả nhất. Nói sơ về cuộc thi thì các đội dùng AI để xây dựng một tool nội bộ, với end user là Ban Giám Đốc và bộ phận Business Development (tôi chỉ có thể nói tới đây thôi). Có checklist tiêu chí chấm, có danh sách các tính năng core cần đáp ứng. Cơ cấu giải gồm giải nhất, nhì, ba và một giải dành cho đội ứng dụng AI hiệu quả nhất. Để truyền đạt đề bài, công ty tổ chức hẳn 2 - 3 buổi, kết hợp gặp các đội mỗi tuần một lần để nắm rõ hơn yêu cầu. Chúng tôi có 1 tháng để triển khai thành sản phẩm hoàn chỉnh.
Khoảng 1 tuần sau kickoff, khi đã nắm được đề bài và toàn bộ context, tôi mang những gì đã note được đi validate với AI. Phải nói AI phát huy sức mạnh ở khâu này. Từ một danh sách tính năng, tôi nhờ nó gom lại thành các module, và nó gom rất chuyên nghiệp thành 3 module ứng với 3 giai đoạn chính. Bên cạnh đó, nó còn giải thích thêm thuật ngữ, validate ý tưởng của tôi và chỉ ra những điểm mù mà tôi chưa nhận ra. Phải công nhận là nó ngon, bảo sao người ta chẳng lo AI đá dev ra chuồng gà =))).
Validate xong, tôi đưa thêm cho nó những gì tôi biết về cách triển khai một hệ thống RAG, như dùng database gì, ngôn ngữ gì, model nào để embedding, chunking ra sao, semantic search thế nào, và nếu làm theo team thì dùng thêm công cụ, phần mềm gì. Từ một mớ hỗn độn không đầu không đuôi, nó giúp tôi phân mục, sắp xếp thứ tự để tôi nhẹ nhàng copy vào file rồi gửi mọi người trong team cùng đọc.
Lý thuyết là vậy, nhưng tới khi triển khai thực tế thì tôi thấy một số công nghệ tôi đề xuất mang hơi hướng phải làm thủ công khá nhiều. Ví dụ tôi chọn pgvector, một extension của PostgreSQL cho phép lưu và tìm kiếm vector để làm semantic search. Nhưng trong một cuộc thi hackathon mà ôm làm thủ công phần này thì khá là khoai =))). Trước đó tôi từng ứng dụng thành công semantic search vào một browser extension, nhưng đó là side project, và tôi đã tốn kha khá thời gian chỉ để tinh chỉnh chunking sao cho kết quả tìm kiếm ổn (cân bằng giữa tìm theo ngữ nghĩa và theo từ khoá). Hackathon thì khác, nó cần tốc độ. Vì thế sau khi cả team cùng tìm hiểu, chúng tôi chốt dùng RAGFlow. Đúng như tên gọi, nó lo tất tần tật phần RAG, chúng tôi chỉ việc đưa input vào, lấy output ra và ứng dụng thôi. Thế là pgvector ra rìa (môi trường đã setup sẵn rồi nên cứ để yên đấy, nhưng không xài). Có điều bà RAGFlow này cũng không phải không có nhược điểm. Chạy bằng docker compose là bả kéo theo cả một mớ dependencies như Elasticsearch và vài thứ linh tinh khác. Nhưng ưu tiên là ra được MVP, nên đành thế thôi =))).
Về cách làm việc, công ty không bắt buộc các đội dùng công nghệ hay tool nào, tất cả chỉ là gợi ý. Trước khi hackathon diễn ra, công ty đã xây dựng sẵn một bộ khung làm việc chung (tôi chỉ có thể nói đến thế) để dev dùng. Khi đưa vào thực tế, bộ khung chưa thật sự khớp với cách làm của team tôi, nên sau khi báo mọi người trong team, tôi tinh chỉnh thêm cho vừa. Cũng nhờ đợt đó mà tôi biết bản thân hợp với cách làm AI development nào, rồi từ đó tự làm một bộ khung riêng cho mình.
Nhưng trong suốt một tháng đó, thứ khiến tôi nhớ mãi, lấn át luôn những chuyện khác, lại là lúc validate tới phần giải thưởng. Bạn biết AI nói gì với tôi không? Đại ý là với cơ cấu giải như thế này, team bạn đi thi không phải để có giải, mà “Mục tiêu của team bạn phải là giải nhất.” Kể từ đó, mỗi lần nhóm họp (nhóm tự set lịch họp riêng vào cuối tuần, thỉnh thoảng thêm buổi giữa tuần), tôi đều mang câu đó ra nói =))). Điều làm tôi khá bất ngờ là mọi người lên tinh thần khiếp, đến nỗi giai đoạn gần demo ai cũng máu chiến, hiếu thắng hơn bao giờ hết. Câu đó thành kim chỉ nam bí mật của team cho đến lúc tàn cuộc, và có thể sau này tôi sẽ còn dùng lại nếu có cơ hội.
Hô hào thì là giải nhất, nhưng thật lòng thứ tôi thấy hay ho nhất lại là giải “đội ứng dụng AI hiệu quả nhất”. Tuy mức thưởng của giải này chỉ bằng giải ba, nhưng nó mới là cốt lõi của cuộc thi, cốt lõi của việc chúng tôi đã phối hợp với nhau như thế nào. Nhìn lại, tôi rút ra được bốn điều.
- Document là bộ nhớ chung của team. Mỗi người làm việc với một phiên AI riêng, mà AI của người này không hề biết AI của người kia vừa quyết định gì. Vì vậy chúng tôi làm theo hướng document first. Thiết kế và các quyết định phải được chốt vào document trước, rồi mới để AI code. Document là source of truth duy nhất.
- Thống nhất cách làm với nhau bằng harness. Chúng tôi dùng harness engineering, hiểu nôm na là bộ quy ước, công cụ và khung làm việc bao quanh AI, để AI của mọi người làm theo cùng một cách, thay vì mỗi người một kiểu prompt, mỗi AI một kiểu code. Đi kèm là một quy trình chung mà cả team thống nhất từ đầu, cụ thể là viết document trước, giao cho AI làm, rồi review.
- Chia module phải rõ ranh giới hơn bao giờ hết. AI sửa code rất nhanh và sửa nhiều chỗ cùng lúc, nên chỉ cần hai người cùng đụng vào một vùng code là conflict nổ liên tục. Chúng tôi phân rã module, chia task sao cho mọi người pick mà không giẫm lên nhau.
- Khơi dậy tinh thần của team. Tinh thần chiến đấu cộng thêm AI, tôi tin là chẳng đối thủ nào cản nổi =)))). Chung quy lại, AI giúp từng người làm nhanh hơn, nhưng để cả team cùng nhanh thì vẫn phải nhờ con người thống nhất với nhau. Mà khi đã có tinh thần chiến đấu chung, mọi người chốt giải pháp với nhau nhanh gọn lẹ hơn hẳn.
Nhìn chung, sau cuộc thi này, tôi nghĩ điều công ty coi trọng là các team rút ra được cách làm việc như thế nào, để sau này áp dụng quy trình làm việc với AI cho cả công ty.
Ảnh lấy từ fanpage công ty nè.
Cũng như sau chuyện văn nghệ ở phần 1, sau cuộc thi tôi quay lại với công việc thường nhật, cuộc sống vẫn trôi êm ả. Nhưng kể từ đó, trong đầu tôi vẫn luôn ghim một câu hỏi. Trong thời đại mà ai cũng có AI trên tay, làm sao để một dev giữ được cá tính và sự khác biệt của bản thân so với phần còn lại? Tôi chưa biết trả lời câu hỏi đó như nào, nên tạm dùng nó như một lời nhắc để mỗi ngày vẫn tỉnh táo trước thời cuộc hiện tại.
Sau đó, công ty có chuyến trip thứ hai (kể từ lúc tôi vào làm). Lần này không còn văn nghệ gì nữa. Nhưng chữ “nhưng” này tôi thật sự rất muốn kể, vì đó là một kỷ niệm, một lần đầu tiên mà tôi rất cảm ơn mọi người đã tin tưởng giao cho. Tôi được nhờ làm trưởng đoàn xe (TĐX).
Tôi vốn không phải người hoạt ngôn gì đâu. Khi được nhờ, tôi cũng nói vậy, nhưng được động viên rằng vai trò này easy game lắm, chỉ cần điểm danh, mang đồ y tế cho mọi người thôi à. Và đúng thế thật. Với tâm thế dù sao mình cũng chưa từng làm, thì thử một lần xem sao.
Chuyến đi diễn ra khá suôn sẻ, chỉ là cá nhân tôi vẫn còn ngợp và rụt rè, chưa dám cầm mic điểm danh mọi người mà cầm giấy đi check từ trên xuống. Tính ra tôi có sẵn bộ câu hỏi tự vấn bản thân luôn á, cái bộ câu hỏi từng giúp tôi chiến khô máu với “văn nghệ” (đã kể ở phần 1), vậy mà tới tình huống này nó lặn đâu mất. Chắc giống Hulk trong Marvel, bình thường máu chiến lắm, gặp Thanos cái là sủi mất =)))). Nói vậy chứ tôi nghĩ chuyện này cũng như văn ôn võ luyện. Tuy đã có skill trị mấy tình huống như vậy, nhưng cả năm trời không có dịp mài giũa thì con người cũng thụt lùi chăng? Ngoài điểm này ra, những việc chung như thông báo trong group, chuyển tiếp đồ y tế thì tôi làm được cả. Mà nghĩ kỹ thì việc của TĐX cũng có chi khó đâu. Như cách dev hay làm, dùng lối nghĩ sequential thinking thì việc gì cũng mổ xẻ ra được từng bước rồi làm. Cái khó chưa bao giờ là biết làm hay không, mà là có dám làm hay không =))). Yeah, tự thấy mình còn yếu chỗ này.
Nói tới đây tôi chợt nhận ra, những gì mình làm, mình trải nghiệm có vẻ mới dừng ở bước nạp dữ liệu và thực hành, còn thiếu bước review lại. Hi vọng bài viết này chính là bước đó, để sau ni khi nhớ công ty, tôi có chỗ ôn lại một thời trải nghiệm của mình.
Sau khoảng thời gian này, tôi còn thêm vài kỷ niệm nữa ở nơi đây, nhưng chủ yếu ít liên quan đến các hoạt động chung của công ty, nên tôi nghĩ sẽ bổ sung vào một ngày không xa.
Và như người thuỷ thủ neo thuyền nơi eo cảng, thuỷ thủ lên bờ ngắm nhìn thành phố xinh đẹp, ghé một quán ăn mới lạ, gọi một tô mì Quảng thập cẩm full topping. Tô mì đậm vị, đậm chất văn hoá, thành phố thì yên bình, thành phố của sự an cư. Đôi lúc thành phố có mưa, nhưng hầu hết là nắng, và thuỷ thủ có cơ hội thấy những chiếc cầu vồng nhiều sắc hơn mọi nơi từng ghé qua. Thuỷ thủ dần nảy sinh tình cảm với nơi đây. Nếu một ngày phải lên thuyền rời eo cảng ấy, thuỷ thủ cũng sẽ chẳng bao giờ quên. Nơi đã thay đổi thuỷ thủ ít nhiều.
Chấm bút…