Review từng dòng code AI là một sai lầm

Philipp Lackner kể cách team anh bỏ review từng dòng code AI: dồn sức vào verification, chỉ đọc kỹ phần chạm tới tiền, dữ liệu người dùng, bảo mật.

Đã duyệt độc lập · cập nhật 27/10/2026 · 10 min

1. Ai cũng đã phát ngán với việc review code AI

Philipp Lackner mở đầu: theo anh (video đăng ngày 14/10/2026), ai cũng đã phát ngán với việc phải review quá nhiều code do AI viết. Chắc bạn cũng biết kiểu pull request (PR) mà vừa mở ra là biết ngay: "ok, lại thêm một PR do AI sinh ra". Lý do là giờ ai cũng code theo cách đó, và theo anh chuyện này cũng sẽ không thay đổi nữa. Nhưng nó mệt kinh khủng.

Philipp Lackner mở một pull request trên GitHub, bên trái là cây file gồm code Kotlin, test và các file spec
Ví dụ Philipp mở ra ngay đầu video đăng ngày 14/10/2026: một PR tên "fix(auth): stop showing the Settings CTA before the notification prompt was ever shown", cây file bên trái gồm code Kotlin, file test và cả các file spec như auth-presentation.md, research.md, spec.md, tasks.md.

Anh kể cụ thể cái mệt đó gồm những gì: phải đọc qua hàng loạt doc comment dài dằng dặc, rồi những thay đổi trong chính các doc comment ấy, phải đọc từng implementation cụ thể của các test case, rồi lại thêm doc comment, đủ thứ khác nữa. Có quá nhiều thứ phải review. Và theo anh (video đăng ngày 14/10/2026), kể cả khi đó là code do người viết, thì chỉ riêng khối lượng code mới mà bạn phải review ngày nay cũng đã khiến toàn bộ công việc này kém thú vị đi rất nhiều.

Diff của file test NotificationPermissionRootTest.kt và file NotificationPermissionAction.kt với một doc comment mới
Trong PR mẫu (video đăng ngày 14/10/2026): phần trên là thay đổi ở file test NotificationPermissionRootTest.kt, phần dưới là file NotificationPermissionAction.kt với một doc comment mới nhiều dòng. Thanh trên cùng ghi "0 / 11 viewed".

Ít nhất là với anh (theo video đăng ngày 14/10/2026), việc phải review quá nhiều code là thứ chính lấy đi niềm vui trong công việc. Anh nói cũng có một phần là vì giờ mình tự suy nghĩ ít hơn một chút, không còn phải tự nghĩ ra nhiều lời giải nữa. Nhưng phần chính vẫn là tất cả những gì thuộc về việc review lại những thứ AI đã làm.

Philipp Lackner nói trước camera trong phòng làm việc
Philipp Lackner nói trước camera khi kể rằng anh và team đã thay đổi hoàn toàn cách review nội bộ (video đăng ngày 14/10/2026).

Ít nhất là anh và team của anh đã thay đổi hoàn toàn hướng đi trong cách xử lý review nội bộ (theo video đăng ngày 14/10/2026). Trước khi vào điều anh thật sự muốn nói trong video, anh đưa ra một lưu ý và disclaimer rất quan trọng.

2. Lưu ý trước: chuyện này dành cho phần mềm bình thường

Những gì anh nói tiếp theo áp dụng cho phần mềm trung bình, cho một app trung bình. Theo Philipp (video đăng ngày 14/10/2026), chắc chắn có những ngành và những phần mềm, như trong hàng không vũ trụ (aerospace) hay ngân hàng (banking), nơi việc review thủ công từng dòng vẫn là không thể tránh, và vẫn nên làm.

Lý do anh đưa ra (video đăng ngày 14/10/2026): trong một số ngành, quản trị rủi ro (risk management) được ưu tiên cao hơn nhiều so với chỉ riêng lượng code làm ra, cao hơn tiến độ. Còn điều anh nói ở đây thật sự chỉ dành cho phần mềm trung bình điển hình, nơi một con bug không quyết định chuyện hàng nghìn người dùng mất tiền hay đại loại thế.

Phần mềm, app trung bình Aerospace, banking... một bug không khiến hàng nghìn người dùng mất tiền phạm vi của video risk management ưu tiên hơn lượng code và tiến độ review từng dòng vẫn nên làm
Hình 2.1Phạm vi Philipp tự vạch ra trong video đăng ngày 14/10/2026: lời khuyên của anh dành cho phần mềm trung bình; ở các ngành như aerospace hay banking, review thủ công từng dòng vẫn nên làm.

3. Review từng dòng không scale được

Rốt cuộc, anh và team đi tới kết luận rằng review từng dòng (line-by-line review) không scale được (theo video đăng ngày 14/10/2026). Review, chẳng hạn, 5.000 dòng code mỗi ngày, vì lượng output bây giờ quá nhiều, thì quá mệt. Và theo anh, khi một việc gì đó làm bạn mệt, khi bạn đã phát ngán với nó, thì bạn cũng sẽ không làm nó tốt được. Anh khá chắc là bạn hiểu cảm giác này nếu bạn đang review những PR kiểu như thế.

Diff của file spec auth-presentation.md với nhiều dòng comment được thay và một đoạn mô tả dài
Philipp cuộn qua file spec specs/002-splash-onboarding-auth/contracts/auth-presentation.md trong PR mẫu (video đăng ngày 14/10/2026): file này đổi +12 −5, gồm cả một khối comment được viết lại và một đoạn mô tả dài về NotificationPermissionViewModel.

Nhân tiện, anh nói PR đang mở trên màn hình vẫn còn là một PR khá modular: theo lời anh (video đăng ngày 14/10/2026), nó có khoảng 112 dòng thay đổi, tức dòng thêm vào. Nhưng ngày nay, những PR 300, 400 dòng lại có cảm giác là ngắn.

Trước thời AI, theo anh, mức đó về cơ bản là giới hạn của một PR còn chấp nhận được. Giờ thì mức chuẩn đó đã thay đổi. Nên rất có thể bạn cũng đang review những PR 1.000 dòng. Và theo Philipp (video đăng ngày 14/10/2026), ngày nay không thể nào review những PR như vậy cho tốt được.

4. AI fatigue: mệt thì review không kỹ

Lý do, theo Philipp (video đăng ngày 14/10/2026), là AI fatigue có thật. Nó thật sự rất mệt. Và khi một việc làm bạn mệt, bạn sẽ không làm nó tốt được. Anh bảo người xem hãy thật lòng: nhiều khả năng bạn sẽ không review một PR chi tiết như bạn từng làm ngày trước, cái thời PR nhỏ hơn, mọi thứ ít code hơn, toàn là code người viết. Còn bây giờ, bạn có cảm giác: thôi, mình chỉ lướt qua (skim) cái này thôi.

Diff của auth-presentation.md và phần đầu file research.md trong PR mẫu
Vẫn PR mẫu đó trong video đăng ngày 14/10/2026: sau đoạn spec dài của auth-presentation.md là tới file research.md bắt đầu hiện ra ở phía dưới.

Thêm vào đó, theo anh (video đăng ngày 14/10/2026), việc này chán kinh khủng. Mà khi một việc chán kinh khủng, thì bạn cũng sẽ không làm nó tốt bằng lúc nó còn thú vị. Vậy là một mặt, bạn đầu tư rất nhiều thời gian cho những lượt review từng dòng; mặt khác, bạn lại không thu được bao nhiêu từ chúng. Và bạn bắt đầu ngày càng ghét công việc của mình hơn. Anh nghĩ mọi chuyện không nên như vậy.

5. Tăng tốc nằm ở review, không phải bỏ review

Điều anh và team vừa nhận ra (theo video đăng ngày 14/10/2026) là trong cả thế giới agentic development này, mức tăng tốc lớn nhất đến từ việc làm cho khâu review nhanh hơn. Anh nhấn mạnh: anh không nói bỏ review. Anh chỉ nói bỏ kiểu review từng dòng, nơi bạn đi qua từng dòng một trong PR, trong các file spec, trong tài liệu, trong code implementation thật. Theo anh, cách đó không scale.

Cả làn sóng AI này lẽ ra phải giúp chúng ta làm việc hiệu quả hơn. Nhưng theo Philipp (video đăng ngày 14/10/2026), nếu sau đó ta dành hết thời gian để đọc lại từng dòng, thì ta cũng chẳng thật sự hiệu quả hơn. Anh bảo người xem thử hình dung toàn bộ khâu code review biến mất: bạn sẽ làm được bao nhiêu? Bạn có thể đẩy thay đổi ra suốt cả ngày theo đúng nghĩa đen, và có lẽ công việc cũng sẽ lại thú vị hơn.

Anh nói rõ một lần nữa: anh không bảo làm thế. Anh không bảo bỏ toàn bộ review, cũng không bảo bỏ mọi khâu kiểm chứng (verification). Nhưng rốt cuộc, theo anh (video đăng ngày 14/10/2026), điều bạn cần làm là xây những hệ thống verification thật vững, "chống đạn" (bulletproof). Bạn cần tập trung hơn nhiều vào verification, vào việc đảm bảo và thật sự chứng minh được code chạy đúng mà không cần một lượt review thủ công. Và đó chính là thử thách.

TrướcSau người đọc từng dòng: PR, spec, tài liệu, implementation hạ tầng verification chứng minh code chạy đúng, người review ở tầng cao dời thời gian
Hình 5.1Ý chính của Philipp trong video đăng ngày 14/10/2026: không bỏ review, mà dời thời gian từ việc đọc từng dòng sang xây hạ tầng verification.

6. Đầu tư vào hạ tầng verification

Vì vậy, theo Philipp (video đăng ngày 14/10/2026), bạn cần bỏ thời gian và đầu tư nó vào hạ tầng verification (verification infrastructure) của mình. Ví dụ, rất đáng công nếu bạn dành thời gian suy nghĩ xem nên viết những loại test case nào, thay vì phó mặc hoàn toàn cho AI. Lý do anh đưa ra: AI thích chỉ chứng minh rằng code của chính nó, cái implementation đã có sẵn, là đúng. Còn một bộ test (test suite) thật tốt và ổn định, mà ít nhất ở tầng high level do một người thiết kế (architect), thì theo anh sẽ sinh lời về sau.

Anh nói rõ anh đang nói tới một bộ test rất đầy đủ: unit test, integration test, end-to-end test. Bạn cần đo test coverage. Bạn cần phân tích code của mình, quét nó để tìm các vi phạm convention, bug, vấn đề. Anh cũng nêu một ví dụ mà anh không chắc bạn có làm được không: performance reporting, chẳng hạn quy định thời gian khởi động (startup time) phải dưới một số mili giây nhất định. Theo anh (video đăng ngày 14/10/2026), tất cả những thứ đó bạn đều đo được và thật sự đưa được vào workflow của mình, và tất cả đều độc lập với việc người review.

Diff của auth-presentation.md và research.md về các trường hợp granted, shouldShowRequestPermissionRationale và PermanentlyDeclined
Đoạn PR Philipp đang cuộn khi nói về việc "tấn công" code từ nhiều phía (video đăng ngày 14/10/2026): file research.md liệt kê từng nhánh của nút "Enable notifications", tuỳ granted và shouldShowRequestPermissionRationale, kể cả trường hợp chuyển sang PermanentlyDeclined.

Theo anh, bạn thật sự muốn "tấn công" code, tấn công app của mình từ đủ mọi góc để xem chỗ nào sai. Nhìn chung, theo anh, bạn muốn để agent làm việc lâu hơn một chút, trong khi giảm tối đa thời gian bạn phải tự đi qua mọi thứ. Đổi lại, khi agent báo đã xong, khả năng nó thật sự xong và code ở trạng thái rất tốt cũng cao nhất có thể (theo Philipp, video đăng ngày 14/10/2026).

Anh không nói nó sẽ luôn hoàn hảo. Tất nhiên vẫn sẽ có những thay đổi bạn phải tự làm. Nhưng theo anh (video đăng ngày 14/10/2026), bạn có thể tối đa hoá khả năng đó. Rồi anh chuyển sang câu hỏi: vậy anh và team đã thật sự thay đổi quy trình review như thế nào?

7. Agentic review cho mọi dòng code, người review thì được phép lướt

Trước hết, theo Philipp (video đăng ngày 14/10/2026), với mọi dòng code được viết ra, luôn phải có một lượt agentic review: một loại agent nào đó, những agent chuyên biệt đi qua mọi thứ, tìm bug, tìm các vấn đề về hành vi (behavioral issue). Lý do anh đưa ra là rốt cuộc việc đó vẫn rẻ, vì không cần một người phải làm.

Anh cũng nói rõ anh không bảo bạn bỏ hẳn review pull request. Theo anh (video đăng ngày 14/10/2026), bạn vẫn nên review PR, vẫn nên làm việc với pull request, và vẫn nên giữ chúng modular. Nhưng lướt qua chúng là được, và anh coi đây là một tư duy (mindset) quan trọng cần có.

Diff của auth-presentation.md và research.md, phần Primary CTA Enable notifications và Open settings
Phần cuối của file research.md trong PR mẫu (video đăng ngày 14/10/2026): các nhánh của "Primary CTA" như "Open settings", và "Secondary CTA" "Skip".

Theo anh, thỉnh thoảng có một con bug lọt qua chỗ này chỗ kia cũng không sao. Hồi người review thì chuyện đó cũng xảy ra: phần mềm của bạn hồi đó cũng có bug. Thay vào đó, theo Philipp (video đăng ngày 14/10/2026), bạn muốn tập trung nhiều hơn hẳn vào việc review đúng thứ.

8. Review đúng thứ: các quyết định ở tầng cao

Vậy đâu là những thứ đúng để review? Theo Philipp (video đăng ngày 14/10/2026), chắc chắn đó là các quyết định ở tầng cao. Anh liệt kê những câu hỏi mà anh và team đặt ra:

  • PR này thay đổi architecture tổng thể như thế nào? (theo video đăng ngày 14/10/2026)
  • Code có dễ mở rộng (extendable) không? (theo video đăng ngày 14/10/2026)
  • Có quyết định quan trọng nào ở tầng system design không, loại thật sự làm nền móng cho mọi thứ được xây lên trên nó về sau? (theo video đăng ngày 14/10/2026)
  • Có những class nào, và các class đó được nối (wire) với nhau ra sao? (theo video đăng ngày 14/10/2026)
  • Các thực hành kiến trúc phổ biến có được đáp ứng không? (theo video đăng ngày 14/10/2026)
  • Caching strategy được implement thế nào? (theo video đăng ngày 14/10/2026)
  • Có tuân theo nguyên tắc single source of truth không? (theo video đăng ngày 14/10/2026)

Anh nói đó chỉ là vài ví dụ về những gì anh và team tập trung vào khi review (theo video đăng ngày 14/10/2026).

Review ở tầng cao architecture tổng thểextendable?quyết định system design class và cách wirecaching strategysingle source of truth
Hình 8.1Các câu hỏi Philipp đưa làm ví dụ cho phần review ở tầng cao (video đăng ngày 14/10/2026).

9. Phần vẫn phải đọc từng dòng: tiền, dữ liệu người dùng, bảo mật

Theo Philipp (video đăng ngày 14/10/2026), review từng dòng vẫn nên có, nhưng chỉ dành cho code chạm tới tiền, dữ liệu người dùng hoặc bảo mật. Anh đưa từng ví dụ:

  • Các thuật toán mã hoá (cryptographic algorithm) mà bạn tự implement theo cách nào đó thì chắc chắn phải có người review từng dòng, rất cẩn thận (theo video đăng ngày 14/10/2026).
  • Nếu có logic thanh toán (payment logic), chắc chắn phải review (theo video đăng ngày 14/10/2026).
  • Nếu có logic liên quan tới những quy định (regulation) quan trọng mà công ty bạn phải tuân thủ, hãy review từng dòng (theo video đăng ngày 14/10/2026).
  • Nếu có logic về dữ liệu người dùng, nơi dữ liệu người dùng được lưu, dữ liệu nhạy cảm như mật khẩu, email hay bất cứ thứ gì, hãy review từng dòng (theo video đăng ngày 14/10/2026).

Nhưng mọi thứ còn lại, theo anh (video đăng ngày 14/10/2026), bạn không cần review từng dòng.

Review từng dòng Không cần review từng dòng thuật toán mã hoá tự implement payment logic logic theo regulation của công ty lưu dữ liệu nhạy cảm của người dùng UI component implementation của test case chi tiết thuật toán business logic (phần này đã có test bao phủ)
Hình 9.1Ranh giới Philipp vạch ra trong video đăng ngày 14/10/2026: code chạm tới tiền, dữ liệu người dùng hoặc bảo mật thì đọc từng dòng; các loại code anh kể ở phần sau thì không.

10. Những thứ Philipp không review từng dòng nữa

Đặc biệt là các UI component chẳng hạn. Philipp nói anh không review UI component nữa (theo video đăng ngày 14/10/2026). Anh có các preview của mình, anh biết chúng trông ra sao, anh biết chúng có trông đúng như mong muốn hay không.

Anh cũng không review implementation của các test case nữa, tức là không xem nội dung bên trong từng test có thật sự hợp lý hay không (theo video đăng ngày 14/10/2026). Thứ anh review là có những loại test case nào, và các test case đó đã đủ chưa, có hợp lý không; còn một test được implement chính xác ra sao thì không.

Diff của NotificationPermissionViewModelTest.kt: hai test cũ bị xoá, một test mới về PermissionResult được thêm
Loại code Philipp nói anh không đọc từng dòng nữa (video đăng ngày 14/10/2026): file NotificationPermissionViewModelTest.kt trong PR mẫu, hai test cũ bị xoá và một test mới tên "PermissionResult is permanently declined only when denied and the OS will not prompt again" được thêm.

Theo anh (video đăng ngày 14/10/2026), số lượng test case được viết ra bây giờ lớn tới mức, và thật ra phần lớn trong số đó khá chắc chắn, nhất là nếu bạn làm việc với skill, nếu bạn tự mình hiểu về testing và biết phải nhìn vào đâu.

Anh cũng không thật sự nhìn vào chi tiết implementation cụ thể của một thuật toán business logic nào đó, vì phần đó đã được test case bao phủ rất tốt (theo video đăng ngày 14/10/2026). Nói lại lần nữa, anh tập trung vào phía verification chứ không phải phía implementation.

Diff của NotificationPermissionViewModelTest.kt với hai test seedRationaleState bị xoá
Cùng file test đó, cuộn lên trên (video đăng ngày 14/10/2026): hai test seedRationaleState(false) và seedRationaleState(true) bị xoá. Thứ Philipp nói anh nhìn là PR có những loại test nào, không phải từng dòng bên trong.

Và đúng là có thể có một edge case lọt qua chỗ này chỗ kia. Nhưng theo Philipp (video đăng ngày 14/10/2026), một lần nữa, chuyện đó ổn với hầu hết trường hợp. Khi bạn phát hiện ra, bạn chỉ việc thêm một test case cho nó, sửa bug, rồi đi tiếp.

11. Chỉ lướt qua phần lớn PR, và framework verification riêng

Theo Philipp (video đăng ngày 14/10/2026), ít nhất 50, 60% những PR như vậy anh thật sự chỉ lướt qua. Anh nói việc đó hoàn toàn ổn, và nó chưa hề phản tác dụng với anh và team. Anh và team đã đầu tư rất nhiều vào hạ tầng verification, và thật ra đã tự xây một verification framework riêng cho Android development, tên là Prism.

Theo anh (video đăng ngày 14/10/2026), chỉ với những mẹo trong video này thôi, bạn cũng đã tăng tốc khâu review của mình được ít nhất 50, 60%. Và nhìn chung, việc có thêm khoảng 50, 60% thời gian để build, đó mới là thứ khiến bạn làm việc hiệu quả hơn với agent.

TrướcSau review từng dòngbuild reviewthêm khoảng 50, 60% thời gian để build
Hình 11.1Hình minh hoạ ý của Philipp trong video đăng ngày 14/10/2026: các mẹo này giúp review nhanh hơn ít nhất 50, 60% theo lời anh, và phần thời gian dư ra được dành để build. Độ dài các thanh chỉ để minh hoạ.

Nhưng theo anh (video đăng ngày 14/10/2026), riêng việc bạn bám vào agent không làm bạn nhanh hơn. Thứ làm bạn nhanh hơn là dùng chúng đúng cách, và chấp nhận rằng không phải dòng code nào cũng cần một người đọc nữa.

12. Codebase cho AI đọc, không phải cho người đọc

Philipp kể thêm (video đăng ngày 14/10/2026): anh cũng không còn sửa AI nữa khi có một tên biến anh không đồng ý, kiểu một cái tên đã đủ mô tả nhưng có thể mô tả rõ hơn chừng 10%. Anh không sửa. Anh chấp nhận nó.

Theo anh (video đăng ngày 14/10/2026), xu hướng đang dịch chuyển khỏi những codebase được tối ưu để con người hiểu và đọc qua, sang những codebase chỉ được tối ưu để AI hiểu và thay đổi. Dù chuyện đó có hay hay không, theo anh đó thật sự chỉ là xu hướng anh đang thấy mọi thứ đi tới.

Anh nói mình cũng có cảm xúc lẫn lộn về chuyện này, nhưng theo anh (video đăng ngày 14/10/2026), ta không thay đổi được những gì đang diễn ra. Ta phải chấp nhận nó. Ta phải thích nghi. Và đây là một khía cạnh quan trọng trong cách anh và team đang thích nghi với tất cả những xu hướng này.

Anh cảm ơn mọi người đã xem và chúc mọi người phần còn lại của tuần thật tuyệt.

Nguồn và liên kết 4 nguồn

  1. Tên gốc: Line-by-line review of AI code is a mistake
  2. Sự kiện: YouTube
  3. Video gốc: https://www.youtube.com/watch?v=wvDXaG2BDes youtube.com
  4. Kênh YouTube Philipp Lackner (Philipp Lackner): youtube.com/channel/UCKNTZMRHPLXfqlbdOI7mCkg youtube.com