24 điểm bởi GN⁺ 2025-04-05 | 1 bình luận | Chia sẻ qua WhatsApp
  • Trong vài tháng gần đây, tác giả đã thử nghiệm sử dụng các công cụ lập trình dựa trên AI cả trong dự án cá nhân lẫn công việc
  • Kết quả rất tích cực, với cả rút ngắn thời gian phát triển lẫn cải thiện chất lượng đầu ra
  • Mặt khác, một số lập trình viên cũng chia sẻ phản hồi tiêu cực rằng các công cụ AI không hoạt động hiệu quả
  • Qua trải nghiệm này, tác giả tin rằng phát triển phần mềm với AI có tiềm năng tạo ra bước nhảy vọt tiếp theo về năng suất
  • Tuy nhiên, điều cần thiết không phải là chấp nhận một cách thiếu phản biện mà là góc nhìn đúng đắn và cách tiếp cận cân bằng
  • Thông qua bài viết này, tác giả chia sẻ các best practice rút ra từ trải nghiệm thực tế nhằm phần nào thúc đẩy việc đưa công cụ AI vào sử dụng một cách khôn ngoan trong cộng đồng phát triển rộng lớn hơn

Tình hình sử dụng hiện tại của các công cụ lập trình AI

  • Theo những gì quan sát được trên Twitter, các công cụ lập trình AI đang rất được ưa chuộng trong nhóm lập trình viên không chuyên
    • Họ dùng AI để thử sức với các dự án mới và học lập trình một cách hứng thú
  • Đây là một xu hướng tích cực, góp phần hạ thấp rào cản tiếp cận công nghệ cho nhóm người dùng mới
  • Tuy nhiên, đó chỉ là một khía cạnh cho thấy tiềm năng của công cụ AI
    • Trong những bối cảnh chuyên môn như với các lập trình viên kỳ cựu, AI cũng có thể mang lại giá trị rất lớn

Điểm mạnh của lập trình viên kỳ cựu

  • Dù vẫn đang ở giai đoạn phát triển ban đầu, kết luận cho đến lúc này là:
    • Lập trình viên kỳ cựu đang ở vị trí có thể tận dụng công cụ AI hiệu quả nhất
    • Không chỉ ở mức nhận hỗ trợ, mà còn có thể tối ưu hóa cách sử dụng
  • Cốt lõi nằm ở điều sau:

    Chính kinh nghiệm phát triển và know-how vận hành dự án, dù có vẻ hơi cũ kỹ trong thời đại AI, lại là nền tảng giúp khai thác những công cụ này tốt nhất

  • Nếu ví các agent lập trình dựa trên LLM,
    • thì chúng giống một lập trình viên kỳ cựu có kiến thức lập trình rất phong phú nhưng trong ngữ cảnh hiện tại lại là một junior thiếu hiểu biết về thiết kế
  • Vì vậy, để giao cho chúng công việc thực tế,
    • khâu chuẩn bị và hướng dẫn mang tính chiến lược là bắt buộc
    • Và người phù hợp nhất để đảm nhiệm vai trò này chính là lập trình viên kỳ cựu
  • Tóm lại, ngay cả công cụ AI tiên tiến nhất cũng được khai thác hiệu quả nhất khi dựa trên các thực hành phát triển truyền thống và kinh nghiệm tích lũy

Ba yếu tố cốt lõi cho một phiên lập trình AI thành công

  • Để hợp tác với AI và đạt kết quả tốt, ba yếu tố sau đây là rất quan trọng:
    • Tài liệu hóa yêu cầu chặt chẽ (Well-structured Requirements)
    • Guardrail chất lượng dựa trên công cụ (Tool-based Guard Rails)
    • Kỹ thuật keyframing dựa trên tệp (File-based Keyframing)
  • Trước khi đi vào giải thích chi tiết, tác giả giới thiệu các ví dụ dự án thực chiến có sử dụng AI
    • Dự án Green-field: dự án được xây mới hoàn toàn từ đầu
    • Dự án Brown-field: dự án bổ sung tính năng mới trên một codebase hiện có
  • Trong cả hai trường hợp, trọng tâm là những ví dụ mà AI đảm nhiệm gần như toàn bộ phần triển khai
    • Không chỉ là AI đóng vai trò hỗ trợ autocomplete hay trợ lý hội thoại, mà tập trung vào cách AI thực sự thực hiện công việc trong agent mode
  • Công cụ được sử dụng là Cursor,
    • dựa trên mô hình Claude Sonnet 3.7 của Anthropic
    • cung cấp khả năng trực tiếp chỉnh sửa toàn bộ tệp trong dự án và chạy cả các lệnh liên quan

Ví dụ 1: Platform Problem Monitoring (dự án Green-field)

  • Tác giả đã dùng Cursor và Claude để triển khai một ứng dụng mớiPlatform Problem Monitoring
  • Ứng dụng này kết nối đến máy chủ Elasticsearch của ELK mỗi giờ để thu thập thông báo lỗi, rồi gửi email report có cấu trúc tóm tắt tình trạng sự cố hiện tại của nền tảng web
  • Toàn bộ phần triển khai do AI thực hiện, không có dòng mã nào được tác giả tự viết
  • Tác giả không quen thuộc với ngôn ngữ Python,
    • nhưng nhờ hiểu biết rộng về kiến trúc, vận hành và best practice nên vẫn có thể triển khai thuận lợi
    • Đây là cơ hội để thử nghiệm AI có thể hỗ trợ đến mức nào trên một stack công nghệ không quen thuộc

Lưu ý: vấn đề chất lượng mã

Trong phần thảo luận trên HackerNews, đã có ý kiến chỉ ra các vấn đề về chất lượng mã như cấu hình logging, parsing cấu hình tùy chỉnh, race condition, v.v. Dự án này đặt mục tiêu tạo prototype nhanh hơn là viết mã production, và tập trung vào triển khai chức năng hơn là khả năng bảo trì dài hạn hay quy ước ngôn ngữ

Ví dụ 2: Process Management UI Integration (dự án Brown-field)

  • Đây là trường hợp tích hợp UI cho một chức năng backend legacy hiện có dựa trên PHP/Symfony
  • Backend được vận hành bằng các lệnh CLI dựa trên cron và không có UI
  • Tác giả muốn tích hợp chức năng này vào một ứng dụng Symfony hiện đại
    • tận dụng cấu trúc thân thiện với UI với codebase hiện đại, hệ thống test và style guide sẵn có
  • Nội dung công việc chính:
    • Giao tiếp với hệ thống legacy qua HTTP API
    • Triển khai truyền dữ liệu giữa các hệ thống
    • Xây dựng giao diện phù hợp với design system của UI
    • Triển khai API client trong Symfony bundle dùng chung
  • Ngoại trừ các tệp keyframe, toàn bộ phần triển khai đều được AI tự động thực hiện

Những insight cốt lõi rút ra từ hai dự án

  1. Dự án Green-field: Ngay cả với stack công nghệ không quen thuộc, vẫn có thể xây dựng một ứng dụng hoạt động được nhờ sự hỗ trợ của AI
  2. Dự án Brown-field: Dù việc triển khai UI không phải sở trường, nhờ AI mà vẫn có thể hoàn thiện tính năng rất nhanh
  • Qua hai ví dụ này, tác giả cảm nhận rõ rằng công cụ AI có thể tạo ra thay đổi thực chất cho năng suất cá nhân và workflow của cả đội ngũ
  • Tuy nhiên, để AI thực sự giúp tiết kiệm nhiều thời gian, cần có đầu tư thiết lập ban đầu và cách tiếp cận mang tính chiến lược
    • Cần vận hành theo cách tương tự như khi dẫn dắt một junior giỏi để đạt được kết quả tốt nhất

Tầm quan trọng của việc viết yêu cầu một cách chặt chẽ

  • Trọng tâm của một phiên lập trình AI thành công là tài liệu yêu cầu có cấu trúc và bao quát
  • Trong dự án thực tế Platform Problem Monitoring, trước khi bắt đầu phiên làm việc, tác giả đã viết tài liệu REQUIREMENTS.md
  • Tài liệu này gồm tổng cộng 371 dòng và tuân theo cấu trúc phân cấp như sau
    • Mức cao nhất: tóm tắt yêu cầu cốt lõi trong một dòng
    • Mức cao: use case và động cơ phát triển
    • Mức trung: quy trình và cách vận hành
    • Mức trung: kiến trúc, stack công nghệ và các ràng buộc
    • Mức thấp: mô tả chi tiết từng bước công việc theo đầu vào/đầu ra/tác dụng phụ
  • Một tài liệu được cấu trúc như vậy cũng cung cấp cho AI một framework rõ ràng để dẫn đến kết quả chính xác hơn
  • Việc viết tài liệu tốn thời gian và công sức, nhưng là khoản đầu tư thiết yếu để triển khai thành công
  • Có một câu châm ngôn trong phát triển phần mềm:

    “6 tuần triển khai giúp tiết kiệm 2 giờ lập kế hoạch”

    • Đây là cách nói châm biếm, nhưng hàm chứa sự thật rằng những kém hiệu quả ở giai đoạn triển khai thường bắt nguồn từ việc lập kế hoạch thiếu đầy đủ
  • Vì thế, dự án luôn phải bắt đầu từ bảng trắng chứ không phải bàn phím, và nguyên tắc này cũng áp dụng y hệt khi cộng tác với AI
  • Trong thực tế, tác giả bắt đầu một phiên Cursor theo các bước sau:
    1. Yêu cầu AI tự tóm tắt lại yêu cầu
    2. Yêu cầu tạo kế hoạch thực hiện
    3. Khuyến khích AI đặt câu hỏi về những phần chưa rõ
  • Chỉ sau giai đoạn xác minh này, AI mới được chuyển sang chế độ “Agent” để bắt đầu triển khai

Thiết lập guardrail chất lượng dựa trên công cụ

  • Nếu tài liệu yêu cầu định nghĩa đích đến, thì guardrail chất lượng sẽ giúp giữ lộ trình ngắn nhất tới đích đó
  • Cũng giống như tầm quan trọng của hệ thống phản hồi thời gian thực trong quá trình phát triển, các công cụ phân tích tĩnh cũng rất hữu ích với AI
  • Ví dụ, phát hiện thiếu kiểm tra null ngay trong giai đoạn phát triển sẽ hiệu quả hơn nhiều so với việc chỉ nhận ra sau khi ra mắt thông qua câu hỏi từ khách hàng
  • Vì vậy, trước khi bắt đầu một phiên lập trình AI, tác giả luôn thiết lập sẵn các công cụ đảm bảo chất lượng như sau
    • Dựa trên ví dụ Makefile:
      • black, isort: format mã
      • ruff: lint
      • mypy: kiểm tra kiểu
      • bandit: phân tích bảo mật
      • Toàn bộ test suite
  • Các AI agent dựa trên Claude có thể nhận diện và sử dụng các công cụ này
    • Ví dụ: nếu kiểm tra kiểu thất bại, AI sẽ tự sửa mã để vượt qua
  • Để xác minh chức năng, tác giả cũng cung cấp các lệnh curl để gửi request test API
    • Việc AI tự gọi endpoint, kiểm tra response và cải thiện mã là điều rất ấn tượng
  • Những guardrail dựa trên công cụ như vậy là thành phần thiết yếu giúp AI tạo ra kết quả đáng tin cậy

Kỹ thuật keyframing dựa trên tệp

  • AI mạnh ở khâu triển khai sáng tạo, nhưng có thể thiếu định hướng về cấu trúc mã hay cách tổ chức tệp
    • Để bù đắp điều này, tác giả dùng chiến lược file-based keyframing
  • Kỹ thuật này lấy cảm hứng từ phương pháp keyframe trong sản xuất hoạt hình:
    • Một animator giàu kinh nghiệm sẽ tạo ra các cảnh quan trọng (keyframe) trước, còn phần còn lại sẽ do nhân lực hỗ trợ điền vào
    • Nhờ đó có thể nâng cao hiệu quả làm việc mà vẫn giữ được chất lượng
  • Trong các dự án lập trình AI thực tế, trước khi triển khai, tác giả tạo sẵn các tệp khung rỗng (stub files)
    • Ví dụ: API endpoint, API client, lớp controller, template Twig, v.v.
  • Những tệp keyframe này cung cấp cho AI thông tin ngữ cảnh quan trọng như:
    • Cách tổ chức tệp của dự án
    • Cấu trúc namespace
    • Quy ước đặt tên
    • Mẫu mã nhất quán
  • Thay vì giải thích toàn bộ cấu trúc trong prompt, việc đưa gợi ý trực tiếp vào codebase giúp tăng độ chính xác trong suy luận của AI
  • Cách tiếp cận này cũng nhấn mạnh nguyên tắc “đặt tên” vẫn rất quan trọng ngay cả trong thời đại AI
    • Vì AI hoạt động dựa trên ngôn ngữ, văn bản chứa đựng ý định và ý nghĩa sẽ dẫn tới kết quả tốt hơn

Ứng dụng tích hợp qua ví dụ thực tế: triển khai UI dashboard hợp đồng thuê bao

  • Tác giả giới thiệu một ví dụ thực chiến áp dụng tích hợp ba nguyên tắc cốt lõi đã nêu ở trên trong cùng một dự án:
    • Tài liệu hóa yêu cầu chặt chẽ
    • Guardrail chất lượng dựa trên công cụ
    • Kỹ thuật keyframing dựa trên tệp
  • Tổng quan dự án

    • Mục tiêu: triển khai dashboard web UI chỉ đọc để trực quan hóa thông tin hợp đồng thuê bao dưới dạng bảng trong nền tảng
    • Đối tượng: môi trường đa codebase (monorepo)
      • backend-app: ứng dụng Symfony 5, lưu trữ dữ liệu
      • janus-christophorus: ứng dụng Symfony 7, cung cấp UI
      • janus-shared-bundle: bao gồm triển khai API client
      • janus-webui-bundle: bao gồm style guide, cấu hình Tailwind và template Twig
  • Cấu trúc yêu cầu

    • Đọc dữ liệu backend qua API và hiển thị trên UI frontend
    • Hỗ trợ demo mode ngoài endpoint API thực tế (cung cấp dữ liệu giả để test)
    • UI được triển khai nhất quán với style guide
    • Mỗi tầng được triển khai bằng các thành phần sau:
      • API endpoint
      • API client
      • Lớp service ở tầng presentation
      • Controller và template Twig
  • Chuẩn bị trước cho phiên AI

    • Tạo sẵn các tệp rỗng trong mọi codebase theo cách file-based keyframing
    • Cung cấp style guide hiện có, navigation service và các tính năng tương tự làm tài liệu tham chiếu cho AI
    • Có thể chạy các công cụ chất lượng (như PHPStan) trong từng codebase
      • Ví dụ: dùng script .dxcli/dxcli.sh quality
  • Cách sử dụng kết hợp các nguyên tắc

    • Sắp xếp yêu cầu: mô tả chi tiết yêu cầu và cấu trúc hệ thống trong prompt
    • Cung cấp guardrail: kèm hướng dẫn sử dụng các công cụ kiểm tra mã
    • Cung cấp keyframe: tạo sẵn các tệp cần triển khai để AI có thể viết mã đúng vị trí và đúng ngữ cảnh
  • Mục tiêu chính

    • Nhanh chóng cung cấp UI giúp nắm bắt tổng thể thông tin hợp đồng
    • Cung cấp cấu trúc và gợi ý rõ ràng để AI có thể đặt câu hỏi và lập kế hoạch trong quá trình triển khai thực tế
  • Ví dụ này cho thấy rất rõ mức độ cộng hưởng mạnh mẽ có thể đạt được khi công cụ AI và kinh nghiệm con người cùng hợp tác

Kết luận: Công cụ AI + kinh nghiệm con người = tổ hợp tốt nhất

  • Bằng cách cung cấp yêu cầu chặt chẽ, guardrail dựa trên công cụkeyframe dựa trên tệp, có thể tận dụng sức mạnh của AI mà vẫn duy trì được chất lượng mã và tính nhất quán kiến trúc
  • Những thực hành phát triển truyền thống này vẫn còn nguyên giá trị trong thời đại AI, và thậm chí còn phát huy hiệu quả lớn hơn thông qua kinh nghiệm và insight của lập trình viên kỳ cựu
  • Cuối cùng, AI chỉ là công cụ, và đây là thời đại mà kinh nghiệm và kỹ năng của con người biết cách sử dụng công cụ đó đúng đắn trở nên quan trọng hơn bao giờ hết

1 bình luận

 
GN⁺ 2025-04-05
Ý kiến trên Hacker News
  • Một lập trình viên Python giàu kinh nghiệm sau khi xem xét một tệp cụ thể đã chỉ ra rằng nó đầy những lỗi điển hình của kỹ sư phần mềm mới vào nghề

    • Bắt đầu từ việc cấu hình root logger ở cấp độ module, rồi đến chuyện tự viết trình phân tích tệp cấu hình thay vì dùng parser cấu hình có sẵn trong thư viện chuẩn
    • Chỉ ra vấn đề của load_json: kiểm tra xem tệp có tồn tại hay không rồi sau đó lại tiếp tục như thể tệp chắc chắn tồn tại
    • Nhận xét rằng nhìn chung chất lượng mã khá thấp
  • Một coder nghiệp dư có 25 năm kinh nghiệm cảm thấy LLM và vibecoding đang làm giảm tính sáng tạo

    • Thích học và sử dụng công cụ mới, đồng thời muốn tạo ra các giải pháp có thể thương mại hóa
    • Dùng LLM thì có thể nhanh chóng hiện thực hóa điều mình hình dung, nhưng cảm giác thỏa mãn khi tự tay làm ra lại giảm đi
    • Than rằng trong 1 năm qua mình không tạo được dự án lớn nào nên niềm vui cũng ít đi
  • Một lập trình viên chưa đến 40 tuổi cảm thấy AI hữu ích như một công cụ giúp giảm bớt gánh nặng công việc

    • Đang bị viêm gân nặng và đã thấy tình trạng cải thiện sau khi dùng tính năng tự động hoàn thành mã
    • Lo rằng "vibe coding" có thể trở thành xu hướng chủ đạo, và e ngại rằng chỉ những lập trình viên nhiều kinh nghiệm mới có thể hiểu được toàn cảnh
  • Một người dùng cảm thấy việc tạo mã bằng AI là không hiệu quả

    • Tốn rất nhiều thời gian để viết prompt và lần theo lỗi trong mã
    • Nói rằng tự viết mã mang lại sự bình yên trong đầu óc
  • Có ý kiến cho rằng AI hữu ích với dự án mới (greenfield) nhưng kém hiệu quả với dự án hiện có (brownfield)

    • Chỉ ra rằng AI gặp khó khăn trong việc tích hợp với codebase sẵn có
  • Một lập trình viên lập kế hoạch bằng tệp Markdown khi bắt đầu dự án

    • Dùng Rust để cố gắng bảo đảm tính chính xác của mã thông qua kiểm tra ở thời điểm biên dịch
    • Hài lòng vì có thể phát hiện nhiều lỗi hơn trong mã Rust do AI tạo ra
  • Một người dùng cho rằng kinh nghiệm kỹ nghệ phần mềm rất quan trọng trong thời đại AI

    • Lo rằng nếu phụ thuộc vào LLM thì kinh nghiệm bản thân có thể bị mai một
  • Một người dùng muốn áp dụng khái niệm "bất ngờ" trong lý thuyết thông tin vào LLM

    • Nếu mã do LLM tạo ra đi chệch khỏi dự đoán, có thể sẽ khó xác định lỗi
    • Muốn tái định hình điều đó thành "khám phá" để biến nó thành cơ hội học chủ đề mới
  • Một người dùng muốn dùng phát triển hướng kiểm thử (TDD) để dẫn dắt mã do AI tạo ra

    • TDD hoạt động như một bản hợp đồng, cho phép chọn giữa AI hoặc viết tay khi lập trình
  • Một người dùng lo rằng hình thái hiện tại của AI không phù hợp với hướng đi tương lai của phần mềm

    • Nói rằng thành công của Java có được là nhờ mã nguồn được cung cấp cùng JDK
    • Chỉ ra rằng AI không cải thiện được tính rõ ràng và khả năng khám phá của mã
  • Một người dùng cảm thấy AI đang phát triển quá nhanh nên có thể gây choáng ngợp

    • Lập trình viên giàu kinh nghiệm có thể tận dụng AI để lên kế hoạch cho các ứng dụng mới
    • Cho rằng việc xây dựng thương hiệu cá nhân là quan trọng, và cần tạo ra ứng dụng của riêng mình