Tôi không còn viết code nữa

Có một điều khá thú vị xảy ra với cách tôi làm phần mềm trong vài năm trở lại đây. Tôi vẫn dành phần lớn thời gian làm việc với code, database, server, Git, deployment, debugging và đủ thứ vấn đề mà một developer vẫn phải xử lý mỗi ngày. Nhưng nếu nhìn kỹ vào quá trình làm việc hiện tại, tôi nhận ra rằng mình không còn tự viết phần lớn code nữa.

Điều này khá lạ đối với tôi, bởi vì tôi đã lập trình trong một thời gian dài. Khi mới bắt đầu, nếu muốn một thứ gì đó hoạt động thì gần như không có cách nào khác ngoài việc tự tìm hiểu rồi tự viết. Tôi đọc documentation, tìm kiếm trên Google, xem code của người khác, thử nghiệm, sửa lỗi và đôi khi mất cả buổi chỉ để tìm ra một lỗi mà cuối cùng hóa ra lại nằm ở một dòng code rất đơn giản.

AI không làm thay đổi tất cả những điều đó chỉ sau một đêm. Nó thay đổi dần dần, qua từng công cụ và từng giai đoạn.

Từ autocomplete đến một người cùng làm việc

Tôi bắt đầu thử GitHub Copilot từ khoảng năm 2022, khi nó vẫn còn ở giai đoạn beta khá sớm. Thời điểm đó, Copilot chủ yếu giống như một autocomplete rất thông minh. Tôi bắt đầu viết một function, nó đoán phần còn lại. Có lúc nó đoán đúng đến mức gần như không cần sửa, có lúc tôi chỉ lấy một phần, và cũng có lúc nó viết ra thứ hoàn toàn không đúng.

Nhưng về cơ bản, tôi vẫn là người viết code.

Copilot chỉ giúp tôi viết nhanh hơn.

Điều đó khác khá nhiều so với những coding agent mà chúng ta có ngày nay. Với autocomplete, tôi vẫn phải biết mình đang muốn làm gì, phải biết code nằm ở đâu, phải hiểu architecture của project và phải tự quyết định implementation. AI chỉ giúp giảm bớt phần công việc mang tính cơ học.

Sau đó các model bắt đầu làm được nhiều hơn.

Thay vì hỏi AI viết một function, tôi có thể đưa cho nó một repository và yêu cầu nó tìm hiểu một vấn đề. Nó có thể tìm kiếm các file liên quan, đi theo một flow qua nhiều function, kiểm tra configuration, tìm những chỗ khác đang sử dụng cùng một function rồi giải thích lại cho tôi.

Lúc đó, cảm giác không còn giống autocomplete nữa.

Nó bắt đầu giống như đang làm việc với một developer khác.

Và đây cũng là lúc vai trò của tôi bắt đầu thay đổi.

Tôi bắt đầu trở thành người chia việc

Khi các coding agent đủ tốt để xử lý những task thực tế, tôi bắt đầu giao cho chúng những phần việc lớn hơn. Thay vì tự mình đi qua từng file và viết từng function, tôi có thể mô tả vấn đề, để AI điều tra trước, sau đó xem kết quả và quyết định có nên triển khai theo hướng đó hay không.

Dần dần tôi cũng bắt đầu chia một task lớn thành nhiều task nhỏ hơn.

Một session có thể được dùng để investigate một bug. Một session khác tìm hiểu một phần khác của hệ thống. Một session khác có thể kiểm tra performance hoặc review một thay đổi đã được thực hiện.

Tôi không ngồi xuống và quyết định rằng từ nay mình sẽ trở thành một “AI orchestrator”. Nó đơn giản là cách làm việc tự nhiên xuất hiện khi những công cụ này đủ khả năng để thực hiện những phần việc thực tế.

Điều quan trọng là AI không nhất thiết phải hiểu toàn bộ công việc tôi đang làm. Nó chỉ cần hiểu đủ context cho task hiện tại. Tôi mới là người phải giữ bức tranh lớn trong đầu, biết task nào liên quan đến task nào, biết nên chia công việc như thế nào và cuối cùng phải kiểm tra xem tất cả những thay đổi đó có thực sự hợp lý hay không.

Có những lúc tôi mở nhiều session cùng lúc và cảm giác khá giống việc quản lý một nhóm developer rất kỳ lạ. Mỗi session có một nhiệm vụ riêng, nhưng người duy nhất biết toàn bộ bức tranh vẫn là tôi.

Tôi không muốn AI tự làm mọi thứ

Một điều tôi nhận ra sau khi sử dụng nhiều coding agent là tôi không nhất thiết muốn chúng càng tự động càng tốt.

Tôi từng sử dụng Claude Code và khá ấn tượng với khả năng của nó. Nó có thể tự khám phá repository, tìm hiểu một vấn đề và thực hiện khá nhiều thay đổi mà không cần tôi hướng dẫn từng bước. Nhưng đôi khi nó cũng suy nghĩ quá nhiều hoặc đi quá xa so với thứ tôi thực sự muốn làm. Có những trường hợp nó tiếp tục thực hiện thay đổi hoặc commit khi tôi vẫn muốn xem xét cách tiếp cận trước.

Có thể đây đơn giản là vấn đề về workflow của tôi.

Tôi thích kiểm soát quá trình hơn.

Tôi thường muốn AI điều tra trước, giải thích cho tôi nó tìm thấy gì và đề xuất hướng xử lý. Sau đó tôi xem xét. Nếu hướng đó đúng, tôi mới yêu cầu nó implementation.

Cách này có thêm một bước, nhưng tôi cảm thấy thoải mái hơn rất nhiều.

Tôi không muốn giao cho agent một câu kiểu “fix this problem” rồi quay lại sau mười phút và phát hiện nó đã thay đổi một đống thứ trong repository.

AI càng có khả năng tự làm nhiều việc thì việc đặt ra giới hạn cho nó càng quan trọng.

Với tôi, AI tốt nhất không phải là AI thay thế hoàn toàn developer. Nó giống một developer rất nhanh, nhưng vẫn cần một người đứng phía trên hiểu mục tiêu, đưa context và kiểm tra kết quả.

Tôi viết ít code hơn nhưng lại review nhiều code hơn

Đây có lẽ là thay đổi lớn nhất.

Trước đây, nếu một developer khác gửi cho tôi một pull request, tôi sẽ đọc diff và xem những thay đổi đó có đúng không. Bây giờ tôi làm điều tương tự với code do AI viết.

Có một điểm khác là code được tạo ra nhanh hơn rất nhiều.

AI có thể viết vài trăm dòng code trong thời gian mà trước đây tôi mới chỉ bắt đầu xây dựng structure của feature. Nhưng tốc độ tạo code không đồng nghĩa với tốc độ tạo ra phần mềm đúng.

Tôi vẫn phải đọc diff.

Tôi vẫn phải chạy test.

Tôi vẫn phải kiểm tra những edge case.

Và quan trọng nhất, tôi vẫn phải hiểu code đó đang làm gì.

Một đoạn code nhìn rất đẹp vẫn có thể giải quyết sai vấn đề. Một query có thể chạy đúng trong trường hợp bình thường nhưng trở nên cực kỳ chậm khi không tìm thấy dữ liệu. Một workaround nhìn có vẻ thừa có thể tồn tại vì một customer nào đó đang phụ thuộc vào nó.

AI có thể viết code rất nhanh.

Nhưng nó không tự động hiểu được lịch sử của một hệ thống.

Legacy code làm mọi chuyện thú vị hơn

Điều này đặc biệt rõ khi tôi làm việc với những hệ thống cũ.

Không phải project nào tôi gặp cũng là một ứng dụng hiện đại sử dụng framework mới nhất, package manager mới nhất và architecture được thiết kế từ đầu. Có những hệ thống chứa PHP rất cũ, database structure đã tồn tại nhiều năm, cron jobs, shell scripts, những đoạn code viết từ rất lâu và cả những behavior riêng cho từng customer.

Trong một hệ thống như vậy, AI rất hữu ích.

Tôi có thể yêu cầu nó tìm xem một function được gọi ở đâu, một request đi qua những file nào, một query được tạo ở đâu hoặc tại sao một phần của hệ thống lại hoạt động theo cách hiện tại.

Thay vì tự mình search hàng chục file, tôi có thể để AI làm phần công việc đó rồi kiểm tra lại kết quả.

Nhưng tôi cũng phải rất cẩn thận.

AI nhìn thấy code, nhưng nó không nhất thiết biết tại sao code lại được viết như vậy.

Một đoạn if trông rất kỳ quặc có thể đang xử lý một customer đặc biệt. Một đoạn code bị duplicate có thể là kết quả của một yêu cầu từ nhiều năm trước. Một workaround tưởng như có thể xóa đi có thể đang bảo vệ một workflow production nào đó.

Vì vậy, với legacy code, tôi càng ít tin vào việc “clean up everything”.

Có những lúc code xấu nhưng an toàn vẫn tốt hơn code đẹp nhưng chưa biết sẽ phá cái gì.

Tôi đã thử khá nhiều công cụ

Trong quá trình này tôi đã thử khá nhiều công cụ khác nhau.

Sau Copilot, tôi thử Claude Code, rồi Codex, Cursor, Antigravity và OpenCode. Tôi cũng từng sử dụng Gemini nhưng ngay từ đầu nó không thực sự phù hợp với workflow của tôi. Ngoài ra tôi cũng thử DeepSeek, các model miễn phí thông qua OpenRouter và một số model local với Ollama.

Tôi không nghĩ những trải nghiệm đó dẫn đến một kết luận đơn giản kiểu “tool này tốt hơn tool kia”. Mỗi công cụ có cách hoạt động khác nhau và quan trọng hơn là mỗi người có một workflow khác nhau.

Tôi từng dùng Codex trong hơn ba tháng và khá thích nó, nhưng vì tôi code khá nhiều nên việc thường xuyên gặp giới hạn sử dụng bắt đầu trở thành vấn đề. Sau đó tôi chuyển sang OpenCode và sử dụng model thông qua API.

Tôi thích cách này hơn.

Tôi biết rằng API cũng tốn tiền và dùng nhiều thì sẽ tốn nhiều. Nhưng ít nhất chi phí gắn trực tiếp với mức sử dụng, thay vì workflow của tôi bị phụ thuộc quá nhiều vào một giới hạn reset nào đó.

Tôi cũng nhận ra rằng mình thích CLI hơn các giao diện đồ họa dành riêng cho AI coding.

Có lẽ vì tôi đã quen với terminal

Tôi đã làm việc với Linux, SSH, Git, shell script, PHP, MySQL và server trong rất nhiều năm. Terminal vốn đã là một phần rất tự nhiên trong công việc của tôi.

Vì vậy khi một AI coding agent chạy ngay trong terminal, tôi không cảm thấy đó là một môi trường hoàn toàn mới.

Repository đã ở đó. Git đã ở đó. Log đã ở đó. Test đã ở đó. Database tools, shell commands và những thứ tôi cần để kiểm tra hệ thống cũng đã ở đó.

Tôi có thể yêu cầu AI điều tra một vấn đề, đọc kết quả, tự mình chạy một command để kiểm tra, yêu cầu nó sửa code, sau đó xem Git diff.

Quy trình đó khá tự nhiên với tôi.

Có thể một developer khác sẽ thích Cursor hoặc một IDE có giao diện tích hợp AI hoàn chỉnh hơn. Tôi không nghĩ có một cách duy nhất để làm việc với AI. Với tôi, CLI đơn giản là nơi phù hợp nhất với cách tôi đã làm việc trong nhiều năm.

Điều khiến tôi hơi lo là đôi khi tôi cảm thấy mình bị “rusty”

Có một mặt khác của việc sử dụng AI mà tôi không muốn bỏ qua.

Đôi khi tôi cảm thấy mình bị rusty.

Có những thứ trước đây tôi có thể viết ngay mà bây giờ phải search hoặc hỏi AI. Có những syntax PHP tôi từng nhớ rất rõ nhưng nếu lâu không dùng thì phải kiểm tra lại. Một shell command đơn giản mà trước đây tôi có thể tự viết cũng có lúc tôi để AI viết cho nhanh.

Sau nhiều năm lập trình, cảm giác đó đôi khi khá khó chịu.

Nhưng càng sử dụng AI, tôi càng nghĩ rằng việc nhớ chính xác syntax không phải là phần quan trọng nhất của programming.

Nếu tôi hiểu hệ thống, hiểu data flow, hiểu constraint và hiểu tại sao một phần code cần tồn tại, tôi vẫn có thể đọc implementation do AI tạo ra và nhận ra nó có hợp lý hay không.

Điều đáng lo hơn không phải là việc tôi không nhớ một syntax.

Điều đáng lo là nếu tôi không hiểu code nhưng vẫn chấp nhận nó.

Nếu AI viết code và tôi không thể giải thích code đó đang làm gì, tại sao nó lại làm như vậy và chuyện gì có thể xảy ra nếu nó sai, thì có lẽ tôi đã giao quá nhiều quyền cho AI.

Còn nếu tôi hiểu vấn đề và hiểu kết quả, việc để AI làm phần typing không còn khiến tôi quá bận tâm.

Công việc của developer đang dịch chuyển lên một tầng khác

Sau vài năm sử dụng những công cụ này, tôi không nghĩ câu hỏi thú vị nhất là liệu AI có thay thế developer hay không.

Ít nhất trong công việc của tôi, điều tôi thấy rõ hơn là công việc của developer đang thay đổi.

Khi việc viết code trở nên rẻ và nhanh hơn, những phần khác của quá trình phát triển phần mềm trở nên quan trọng hơn. Hiểu requirement, chia nhỏ vấn đề, cung cấp context, lựa chọn architecture, kiểm tra implementation và xác nhận kết quả vẫn cần rất nhiều suy nghĩ.

Thậm chí một số việc còn trở nên quan trọng hơn trước.

Nếu AI có thể viết một function trong vài giây thì việc tôi có thể mô tả chính xác function đó cần làm gì trở nên quan trọng. Nếu AI có thể đọc hàng trăm file nhanh hơn tôi thì tôi cần biết mình đang tìm kiếm điều gì và làm sao để kiểm tra kết quả của nó.

Tôi không còn cần phải tự mình làm tất cả mọi thứ.

Nhưng tôi vẫn phải biết mình đang làm gì.

Tôi không ngừng làm programmer

Nhìn lại từ Copilot năm 2022 đến những coding agent tôi đang sử dụng hiện nay, sự thay đổi thực sự lớn hơn tôi tưởng.

Ngày trước, tôi viết code và AI thỉnh thoảng giúp tôi hoàn thành một đoạn code.

Bây giờ tôi có thể chia một vấn đề thành nhiều phần, giao những phần đó cho nhiều AI session, sử dụng những model khác nhau tùy công việc, rồi dành phần lớn thời gian để review và kết nối các kết quả lại với nhau.

Tôi viết ít code bằng tay hơn rất nhiều.

Nhưng tôi không nghĩ mình đang làm ít engineering hơn.

Thứ thay đổi chủ yếu là vị trí của tôi trong quá trình đó.

Tôi dành nhiều thời gian hơn để hiểu vấn đề trước khi bắt đầu. Tôi chia task nhỏ hơn. Tôi quản lý context. Tôi xem xét output. Tôi kiểm tra diff. Tôi chạy test. Tôi quyết định phần nào nên giữ, phần nào cần sửa và phần nào không nên thay đổi.

Có lẽ đây mới là điều thú vị nhất của AI coding đối với tôi.

Nó không lấy programming ra khỏi công việc của tôi.

Nó chỉ thay đổi phần nào của programming mà tôi trực tiếp làm bằng tay.

Tôi vẫn là người chịu trách nhiệm khi code chạy trên production. Vẫn là tôi phải giải thích tại sao hệ thống hoạt động như vậy. Và nếu một thay đổi làm hỏng một thứ gì đó, việc AI đã viết đoạn code đó không làm trách nhiệm biến mất.

AI có thể viết phần lớn code.

Nhưng cuối cùng vẫn cần một người hiểu nó.

Và ít nhất với tôi, người đó vẫn là programmer.

Tôi chỉ không còn là người duy nhất phải gõ code nữa.

Để lại bình luận đầu tiên

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Danh mục