Bỏ qua để đến nội dung

Vì sao nền tảng kỹ thuật phần mềm vẫn không thể thiếu với người làm AI

The AI Engineering Skills Map In Detail — Software Engineering Fundamentals: Why Software Fundamentals Remain Essential for AI Developers

Chào các bạn,

Các nguyên tắc nền tảng của kỹ thuật phần mềm đã thay đổi thế nào khi agentic coding ra đời? Ngay cả khi bạn dùng một coding agent để viết toàn bộ code, việc hiểu các nguyên tắc nền tảng của phần mềm vẫn quan trọng để định hướng agent cân nhắc các giải pháp (cần đánh đổi gì cho mỗi giải pháp) theo ý muốn của bạn - hoặc kiến thức nền tảng giúp bạn biết được những sự đánh đổi nào cần được cân nhắc khi chọn lựa các giải pháp. Hơn nữa, khi bạn xây dựng một ứng dụng AI, phần lõi AI thường được thể hiện thông qua một ứng dụng phần mềm rộng hơn, và chính một kỹ sư giỏi mới là người định hình được ứng dụng đó.

Một người mới bắt đầu “vibe code” (lập trình bằng cách mô tả ý tưởng cho AI mà không thực sự hiểu code) mà không nắm được các nguyên tắc nền tảng của phần mềm vẫn có thể tạo ra những ứng dụng đơn giản, nhưng cách làm này thường khiến coding agent đưa ra những đánh đổi tệ về độ trễ (latency), khả năng sẵn sàng (availability), tính nhất quán (consistency), độ tin cậy (reliability), khả năng bảo trì (maintainability), sự đơn giản, và/hoặc chi phí. Trong đa số trường hợp, người phát triển thậm chí không biết những đánh đổi đó tồn tại, nên không thể định hướng agent đưa ra quyết định đúng đắn cho bối cảnh ứng dụng của mình.

Bức thư này mô tả những gì mà nghiên cứu về kỹ năng AI Engineering của DeepLearning.AI cho thấy là những điều quan trọng nhất cần biết về kỹ thuật phần mềm. Nó đòi hỏi bạn phải giỏi ở năm mảng:

  • Xây dựng ứng dụng full-stack
  • Quản lý dữ liệu
  • Thiết kế kiến trúc hệ thống
  • Làm cho hệ thống an toàn và đáng tin cậy
  • Vận hành và mở rộng quy mô (scale) trong môi trường production

Lập trình agentic cho phép nhiều nhà phát triển vốn trước đây chỉ đảm nhận những vai trò chuyên biệt hơn (như front-end developer hay mobile developer) giờ đây đảm nhận một vai trò rộng hơn, mang tính full-stack. Một coding agent có thể hỗ trợ những phần trong quy trình phát triển mà bạn có thể chưa quen thuộc. Tuy nhiên, hiểu cách toàn bộ stack thực sự vận hành vẫn rất quan trọng. Những nhà phát triển giỏi hiểu rõ các thành phần và khái niệm cốt lõi của hệ thống front-end lẫn back-end, bao gồm UI component, caching, cách trang được render, cách lựa chọn và thiết kế API, xác thực (authentication), quản lý trạng thái (state) và phiên làm việc (session), xử lý bất đồng bộ (asynchronous processing), lưu trữ dữ liệu bền vững (data persistence), kiểm thử, bảo mật, và khả năng truy cập (accessibility).

Dữ liệu xứng đáng được chú ý đặc biệt vì nó là nền móng mà phần mềm được xây dựng lên trên, và tương đối khó thay đổi (ngay cả khi agent có thể hỗ trợ việc migrate dữ liệu). Khi biết cách quản lý dữ liệu, bạn có thể suy nghĩ thấu đáo về các kiểu truy cập dữ liệu (access pattern) và dùng chúng để quyết định nên lưu gì và lưu trong bao lâu. Bạn có thể xác định đúng mô hình dữ liệu (data model) và chọn đúng loại lưu trữ phù hợp (như bảng quan hệ, document, key-value, hay graph) cùng hạ tầng tương ứng, những lựa chọn này ảnh hưởng trực tiếp đến tốc độ, khả năng mở rộng, khả năng sẵn sàng, độ tin cậy, và chi phí. Bạn hiểu về transaction, concurrency, và cách đảm bảo dữ liệu luôn sạch, nhất quán, và cập nhật. Khi cần, bạn biết cách đảm bảo quyền riêng tư (privacy), quản trị dữ liệu (governance), và tuân thủ quy định (compliance). Bạn biết cách quản lý toàn bộ vòng đời dữ liệu.

Khi một ứng dụng phát triển theo thời gian, bạn cũng cần biết cách phát triển kiến trúc dữ liệu song song với nó. Việc quyết định cách quản lý dữ liệu đòi hỏi rất nhiều bối cảnh do chính con người cung cấp. Hệ thống AI của bạn sẽ nhận context đầu vào từ nguồn dữ liệu của bạn, nên nếu kiến trúc dữ liệu được chọn kém, AI sẽ không biết những gì nó không biết. Đây là lý do vì sao cần có sự can thiệp có chủ đích từ một người vừa nắm bối cảnh liên quan vừa giỏi về AI engineering - chính là bạn! - để thiết lập mọi thứ cho đúng. Cách xây dựng hạ tầng dữ liệu phục vụ cho agent - chứ không chỉ cho phần mềm truyền thống hay con người - cũng là một lĩnh vực đang thay đổi rất nhanh, và bạn nên liên tục điều chỉnh các thực hành tốt nhất của mình khi lĩnh vực này tiến hóa.

Khi bạn đã hiểu các thành phần chính của toàn bộ stack phần mềm và dữ liệu, bạn sẽ ở vị trí tốt hơn để quyết định cách ghép các mảnh ghép đó lại với nhau. Thiết kế hệ thống tốt đòi hỏi hiểu được phần mềm đó nhắm tới mục đích gì (bao nhiêu người dùng? độ trễ quan trọng đến mức nào? chi phí quan trọng đến mức nào? v.v.) để bạn có thể đưa ra lựa chọn về nền tảng ứng dụng, ranh giới giữa frontend và backend, cách phân rã hệ thống (system decomposition), nơi đặt trạng thái ứng dụng (application state), và mức độ chi tiết kiến trúc (monolith so với microservices). Bạn cũng sẽ chọn stack công nghệ (ngôn ngữ lập trình, runtime, framework cho từng thành phần/frontend/backend, công nghệ dữ liệu) - đôi khi bằng cách chạy thử nghiệm để đánh giá các lựa chọn trước khi chốt một phương án.

Hơn nữa, kiến trúc đúng đắn là một mục tiêu luôn di chuyển, tùy thuộc vào giai đoạn của dự án. Kiến trúc đơn giản bạn chọn để xây một bản prototype nhanh có thể không phải là kiến trúc phù hợp để xây hệ thống production đầu tiên, và điều đó cũng có thể thay đổi khi ứng dụng mở rộng quy mô. Đưa ra những quyết định này đòi hỏi kiến thức kỹ thuật sâu về cả các thành phần phần mềm lẫn bối cảnh ứng dụng, để bạn có thể thiết kế - và phát triển - kiến trúc nhằm đưa ra những đánh đổi tốt hơn.

Làm cho hệ thống an toàn và đáng tin cậy

Phần tiêu đề “Làm cho hệ thống an toàn và đáng tin cậy”

Để xây dựng hệ thống đáng tin cậy, bạn cần biết cách phát triển chiến lược kiểm thử để xác minh tính đúng đắn của hệ thống: nên kết hợp bao nhiêu unit test và integration test, dùng framework nào, và mức độ bao phủ (coverage) ra sao. Bạn cũng cần biết cách thiết kế để đối phó với các khả năng thất bại - cách xử lý lỗi (như một API bị giới hạn tốc độ - rate limit), xây dựng cơ chế suy giảm nhẹ nhàng (graceful degradation), và giảm thiểu phạm vi ảnh hưởng (blast radius) khi có sự cố. Ngoài ra, thay vì viết phần mềm trước rồi mới tìm cách bảo mật nó sau, phong trào “shift left” đang đẩy công việc bảo mật lên sớm hơn trong vòng đời phát triển (dịch sang bên trái trên một timeline dự án truyền thống). Cũng giống như mọi nhà phát triển đang dần trở thành full-stack developer, nhiều nhà phát triển hiện nay cũng đang một phần đóng vai trò security engineer. Bạn giờ có thể dùng công cụ AI để quét lỗ hổng trong code, kiểm tra dependency xem có bị chèn mã độc theo chuỗi cung ứng (supply chain injection) hay không, và rà soát cấu hình cloud để tìm bề mặt tấn công (attack surface). Nhưng để làm tốt việc này vẫn đòi hỏi một số kiến thức về bảo mật.

Vận hành và mở rộng quy mô trong production

Phần tiêu đề “Vận hành và mở rộng quy mô trong production”

Để phục vụ người dùng thật, bạn sẽ phải biết cách triển khai phần mềm lên production. Bạn sẽ được hưởng lợi từ việc biết cách thực hiện vòng đời phát triển phần mềm (software development lifecycle - SDLC), bao gồm không chỉ xây dựng và kiểm thử mà còn cấu hình môi trường triển khai, quyết định chiến lược phát hành, áp dụng tự động hóa triển khai (CI/CD), và hiểu về hạ tầng dưới dạng dịch vụ (infrastructure as a service - IaaS).

Vận hành trong production đòi hỏi thiết lập công cụ quan sát (observability), đặt cảnh báo (alert), và quản lý sự cố (incident). Cuối cùng, để mở rộng quy mô ứng dụng, bạn cần hiểu tải thực tế (real load) và biết cách scale server, cân bằng tải (load-balance), và điều chỉnh hạ tầng dữ liệu (thông qua sharding, indexing, replication) hoặc thay đổi kiến trúc để hệ thống thích ứng với quy mô lớn hơn. Cuối cùng, hiểu các thực hành tốt nhất trong lập trình như quản lý phiên bản (version control), review code, bảo trì dependency, và cách quản lý nợ kỹ thuật (technical debt) giúp bạn tiếp tục phát triển hệ thống theo thời gian.

Coding agent đã thay đổi cách chúng ta xây dựng phần mềm, kể cả những phần mềm không hề chứa thành phần AI nào. Một số phần của kiến thức lập trình - như việc ghi nhớ cú pháp code - đang trở nên lỗi thời. Nhưng những nhà phát triển thực sự hiểu sâu cách phần mềm vận hành vẫn vượt trội hơn hẳn những người chỉ “vibe code” mà không hiểu gì.

Hiểu các nguyên tắc nền tảng của phần mềm (bên cạnh AI) còn giúp bạn nhận ra phần mềm có thể và không thể làm được gì. Đây chính là bối cảnh quan trọng để bạn biết cách dùng coding agent và định hình quá trình xây dựng. Tôi sẽ bàn tiếp về những điều này trong hai bức thư tới.

Tiếp tục xây dựng nhé!

Andrew