Một người bắt đầu học làm phần mềm hôm nay, ngay từ buổi đầu đã có AI viết code giúp, thì có trở thành người làm nghề có năng lực được không?
Tôi vào nghề năm 2011, và bây giờ ngày nào cũng làm việc với các AI agent. Nghĩa là tôi đứng ở vị trí rất dễ thiên vị: học theo lối cũ, đang dùng công cụ mới, và dễ tin rằng con đường mình đã đi là con đường duy nhất dẫn tới chỗ mình đang đứng.
Tầng vào nghề từng dịch chuyển
Năm 1957, IBM phát hành bản thương mại của Fortran, ngôn ngữ do nhóm của John Backus xây dựng. Theo tư liệu lịch sử của IBM , nó cho phép các nhà khoa học và kỹ sư diễn đạt bài toán của mình mà không phải tự tay dịch từng chỉ thị cho máy. Thời đó cũng có người hoài nghi rằng code do trình biên dịch sinh ra khó mà hiệu quả bằng code viết tay.
Vậy năng lực của một người làm phần mềm có phụ thuộc vào tầng mà họ bước vào hay không?
Rất nhiều lập trình viên giỏi hôm nay chưa từng viết một dòng mã máy. Họ bắt đầu từ Python, JavaScript hay Java, và điều đó không ngăn họ hiểu sâu công việc của mình. Họ không bắt đầu từ đáy. Họ bước vào ở một tầng do người khác xây sẵn.
Nhưng phép so sánh này gãy ở một chỗ, và tôi nghĩ đó là chỗ quan trọng nhất của cả vấn đề. Trình biên dịch làm việc với một ngôn ngữ có đặc tả. Nghĩa của chương trình do ngôn ngữ quy định từ trước, không phải do trình biên dịch tự đoán, và việc của nó là giữ đúng nghĩa ấy. Trình biên dịch cũng có lỗi, nhưng khi nó dịch sai thì có một chuẩn để gọi đó là sai. Người viết Python dựa vào bản giao kèo ấy để làm việc ở tầng ngôn ngữ mà không phải đọc mã máy.
AI thì khác. Nó nhận một yêu cầu thường là chưa đủ rõ, tự diễn giải, rồi sinh ra code. Code ấy có thể đúng, có thể sai, có thể đúng với điều bạn nói mà sai với điều bạn muốn. Chính tài liệu của GitHub về gợi ý code của Copilot cũng ghi rằng gợi ý có thể sai về cú pháp hoặc ngữ nghĩa, có thể không đúng ý người dùng, và test do công cụ sinh ra có thể bỏ sót tình huống.
Cho nên "tầng AI" không phải một tầng theo nghĩa cũ. Giữa người yêu cầu và AI không có bản giao kèo nào như thế: một yêu cầu bằng lời không có nghĩa định sẵn để đem ra đối chiếu. Thứ người dùng nhận về vẫn là code, vẫn nằm ở tầng dưới, và vẫn cần một người đủ sức đánh giá. Người viết Python có thể cả đời không đọc mã máy. Người bắt đầu bằng AI thì sớm muộn phải đọc được thứ AI viết ra, nếu muốn biết mình đang đưa cho người khác dùng cái gì.
Làm được và hiểu được
Điều thay đổi thật sự, theo tôi, không nằm ở tốc độ gõ. Nó nằm ở khoảng cách giữa việc làm ra một sản phẩm và việc hiểu sản phẩm ấy. Khoảng cách này không phải do AI tạo ra, nhưng AI cho phép nó rộng hơn nhiều.
Khoảng cách ấy có từ trước. Người ta vẫn chép code mẫu, ghép thư viện, dựng ứng dụng trên những framework mình không hiểu hết, và nhiều thứ làm theo cách đó vẫn chạy. Nhưng khi phần lớn code phải do chính tay mình viết và tự gỡ cho tới lúc chạy được, việc làm ra sản phẩm thường kéo theo một phần hiểu biết. Nhìn một sản phẩm, người ta đoán được phần nào về người làm ra nó. Phép đoán ấy thô, nhưng có cơ sở.
Giờ cơ sở ấy yếu đi nhiều. Một người mới có thể có trong tay một ứng dụng với đăng nhập, cơ sở dữ liệu và giao diện tử tế mà không hiểu dòng nào trong đó. Khoảng cách giữa thứ mình làm ra và thứ mình hiểu giờ rất xa, và có thể nằm im bất động cho tới khi gặp một lỗi mà AI sửa mãi không xong. Hoặc tệ hơn, một lỗi không ai nhìn thấy.
Vậy học là gì, nếu không đo bằng sản phẩm? Tôi nghĩ làm là thay đổi ở ngoài đời, còn học là thay đổi ở trong người. Một người đã học được điều gì đó thì đoán được chương trình sẽ làm gì trước khi chạy. Họ giải thích được vì sao nó sai. Họ nhận ra khi câu trả lời của AI có vấn đề. Lần sau gặp chuyện tương tự, họ cần ít trợ giúp hơn, hoặc hỏi được câu hỏi tốt hơn. Không điều nào trong số này hiện ra trên một bản demo.
Hệ quả đầu tiên rơi vào chính người học. Cảm giác "mình làm được rồi" giờ nói rất ít về điều mình thật sự hiểu. Hệ quả thứ hai rơi vào người dạy và người tuyển: một mình sản phẩm không còn đủ để suy ra năng lực, và phải hỏi thêm người làm đã hiểu nó tới đâu.
Học theo thứ tự ngược
Nếu vậy thì người bắt đầu từ AI học theo đường nào? Tôi nghĩ họ học theo một thứ tự ngược với thứ tự quen thuộc, và ngược không có nghĩa là kém.
Lộ trình quen thuộc trong nhiều giáo trình đi từ dưới lên: cú pháp, vòng lặp, hàm, cấu trúc dữ liệu, rồi thường khá lâu sau mới tới một sản phẩm có người dùng thật. Thứ tự mới đi từ trên xuống. Người học có một thứ chạy được ngay từ đầu, rồi mới lần ngược vào bên trong. Họ đọc code trước khi viết code. Họ gặp yêu cầu mơ hồ, dữ liệu bẩn và người dùng làm những điều không ai ngờ, trước khi biết con trỏ là gì. Họ có thể phải học cách kiểm chứng trước khi học cách xây.
Thứ tự này có cái lợi thật. Người học từ dưới lên thường phải tin rằng những bài tập nhỏ rồi sẽ có ích, và phải giữ niềm tin ấy khá lâu. Người học từ trên xuống có thể gặp một khái niệm đúng lúc cần nó. Khi ứng dụng của họ chậm đi vì một câu truy vấn, chỉ mục cơ sở dữ liệu không còn là một chương trong giáo trình. Nó là lời giải cho một việc đang làm họ khó chịu.
Cái giá nằm ở chỗ khác. Trên lộ trình từ dưới lên, cái khó thường nằm sẵn trên đường đi: muốn bài chạy được, cách gần nhất thường là tự viết và tự gỡ. Với AI, cách gần nhất là nhờ. Lối tắt vốn đã có, giờ nó rộng hơn, nhanh hơn và có mặt ở mọi bước. Lúc nào cũng có thể nhờ AI sửa thêm một lần nữa. Đi xuống vì thế phụ thuộc nhiều hơn vào lựa chọn của người học, và lựa chọn ấy phải được lặp lại mỗi ngày, ngược chiều với sự tiện lợi.
Điều đáng nói là cùng một công cụ phục vụ được cả hai hướng. AI viết thay được thì cũng giảng giải được, không ngại câu hỏi ngây ngô và không cần hẹn trước. Một người kèm riêng như thế trước đây không phải ai cũng có. Khác biệt nằm ở câu người học gõ vào: "sửa giúp tôi" hay "vì sao nó sai". Câu đầu cho ra sản phẩm. Câu sau mới có cơ hội cho ra hiểu biết, với điều kiện người học tự kiểm lại lời giải thích, vì lời giải thích của AI cũng có thể sai. Cách kiểm thì không có gì cao siêu: đổi một chỗ trong code, đoán trước kết quả, rồi chạy xem mình đoán có đúng không.
Cái khó nào đáng giữ
Tôi không tiếc mọi cái khó của ngày trước. Thuộc cú pháp, vật lộn với cấu hình môi trường, tra đi tra lại tên một hàm: phần lớn những thứ đó là ma sát tình cờ, mất đi cũng không sao.
Nhưng có những cái khó không tình cờ. Tôi nghĩ có thể phân biệt bằng một câu hỏi khá đơn giản: việc khó ấy bắt mình nhớ, hay bắt mình tự dựng một mô hình trong đầu rồi đem ra thử? Loại thứ nhất giao cho máy được. Loại thứ hai thì không, vì cái mô hình trong đầu chính là thứ cần có.
Gỡ lỗi thuộc loại thứ hai. Đặt giả thuyết, tìm cách kiểm, thấy mình sai, đặt giả thuyết khác. Lần theo từng bước chương trình chạy cũng vậy. Tự thiết kế một thứ, rồi sống với nó đủ lâu để thấy vì sao thiết kế ấy tệ, cũng vậy. Những việc này có thể làm sản phẩm tốt hơn, nhưng lý do để giữ chúng nằm ở chỗ khác. Chúng là lúc mô hình trong đầu người làm được đem ra thử và sửa lại.
Còn một thứ nữa khó gọi tên hơn: khả năng ở yên trong trạng thái chưa hiểu. Khi câu trả lời tới sau vài giây, trạng thái ấy hiếm đi, và người ta ít có dịp tập chịu đựng nó. Trong khi đó những bài toán khó của nghề này, ở tầng nào cũng thế, thường đòi người làm phải ở trong trạng thái ấy khá lâu, có khi nhiều ngày liền.
Lý do cuối cùng thực dụng hơn. Đánh giá code của AI nghe có vẻ dễ hơn viết code. Nhưng để nhận ra một lời giải sai một cách kín đáo, người ta cần loại hiểu biết thường đến từ việc tự viết và tự sai. Thiếu nó, người ta vẫn kiểm được những gì nhìn thấy từ bên ngoài, nhất là khi rành lĩnh vực mà phần mềm phục vụ. Còn với phần bên trong thì dễ chỉ dựa vào việc code chạy được, và đó là một phép thử yếu.
Những điều này không dẫn tới kết luận rằng người mới phải cấm mình dùng AI. Chúng dẫn tới một việc cụ thể hơn: chọn chỗ để tự làm. Tự viết một hàm nhỏ trước khi nhờ. Đoán kết quả trước khi chạy. Tự gỡ một lỗi trong nửa giờ trước khi hỏi. Khi lối tắt luôn ở sẵn, cái khó là thứ phải tự chọn, và đã tự chọn thì phải biết mình chịu khó để được gì. Một người mới rất khó tự biết cái khó nào đáng giữ. Đây là chỗ cần tới người đi trước, vì họ biết cái khó nào đã thật sự dạy mình điều gì và cái khó nào chỉ làm mình mất thời gian.
Người có chuyên môn bước vào
Có một nhóm mà tôi cho là được lợi nhiều nhất từ sự thay đổi này: những người đã giỏi sẵn một lĩnh vực khác. Kế toán, điều dưỡng, người điều phối kho vận, giáo viên.
Phần khó nhất của rất nhiều phần mềm chưa bao giờ là viết code. Nó là biết phần mềm ấy phải làm gì, và nhận ra khi nó làm sai. Một kế toán nhìn bảng đối chiếu là biết con số có hợp lý hay không. Người viết phần mềm đứng từ bên ngoài phải ngồi với họ rất lâu mới có được con mắt ấy, có khi vẫn không có. Khi người có chuyên môn tự làm được công cụ cho mình, chuyện không còn là gõ nhanh hơn. Họ có thể làm ra những thứ trước đây thường bị bỏ qua, vì bài toán quá nhỏ để thuê một đội phần mềm và quá riêng để người ngoài hiểu.
Họ cũng có sẵn thứ mà người học theo giáo trình hay thiếu: bài toán thật, và tiêu chuẩn đúng sai thật.
Nhưng chuyên môn chỉ soi được phần hành vi nhìn thấy. Người kế toán biết báo cáo đúng hay sai. Họ không tự nhiên mà biết chuyện gì xảy ra khi hai người cùng sửa một bản ghi, dữ liệu có được sao lưu không, hay ai khác đang đọc được bảng lương. Những lỗi ấy không hiện lên màn hình trong ngày đầu. Hiểu nghiệp vụ là một nửa rất quý, nhưng nó không tự mọc ra nửa kia. Nửa kia vẫn phải học.
Ai làm tiếp phần nền móng
Tới đây thì phải hỏi câu khó nhất. Nếu phần đông người mới vào nghề từ tầng trên cùng, ai sẽ làm tiếp những việc mà lập trình viên hiện tại và các thế hệ đầu đang làm? Trình biên dịch, hệ điều hành, cơ sở dữ liệu, hạ tầng mạng và lưu trữ.
Những việc này không biến mất. Chính AI đứng trên chúng: một mô hình chạy được là nhờ phần mềm và phần cứng bên dưới nó, từ hệ điều hành, trình biên dịch tới mạng và hệ thống lưu trữ. Một lỗi ở các tầng ấy có thể lan tới nhiều hệ thống đứng bên trên, chứ không dừng ở một ứng dụng, nên đòi hỏi về hiểu biết ở đó không thấp đi. AI có giúp được việc ở đó. Nhưng một cơ sở dữ liệu thỉnh thoảng làm mất dữ liệu thì không thể được duyệt bằng tiêu chí "nó chạy".
Một trong những lối dẫn người ta xuống các tầng dưới là lối tình cờ: làm việc gần máy, va vào giới hạn của nó, thấy thích rồi đi sâu thêm. Nếu người mới ít khi phải chạm vào những giới hạn ấy, lối tình cờ này có thể thưa người đi.
Mặt khác, AI cũng làm cho việc đi xuống dễ bắt đầu hơn. Một người tò mò có thể nhờ AI dựng một cây B-tree nhỏ, phá nó, hỏi vì sao nó hỏng, rồi đọc mã nguồn của một cơ sở dữ liệu thật với một công cụ giảng giải ở bên. Rào cản để bắt đầu khám phá thấp hơn. Thứ AI không cấp được là lý do để đi, và những năm luyện tập sau đó. Tò mò giúp người ta bắt đầu, nhưng không bảo đảm gì.
Hai hướng này kéo ngược nhau, và tôi không có cơ sở để nói hướng nào mạnh hơn. Chính vì vậy tôi không muốn trông vào tình cờ. Phần nền móng cần được đào tạo có chủ đích: trường vẫn dạy hệ điều hành và trình biên dịch một cách nghiêm túc, các dự án mã nguồn mở vẫn có chỗ cho người mới, các công ty vẫn để người trẻ làm việc thật bên cạnh người có kinh nghiệm.
Điểm cuối cùng là điều tôi băn khoăn nhất. Những việc nhỏ thường được giao cho người mới vào nghề, như sửa một lỗi vặt, viết một hàm phụ, thêm vài test, cũng thuộc loại việc dễ giao cho AI. Tính riêng từng việc thì giao cho AI có thể là hợp lý. Nhưng những việc ấy còn là một trong những nơi kiến thức được truyền từ người này sang người khác. Tôi không có số liệu để nói chuyện này đang diễn ra tới đâu. Điều làm tôi băn khoăn là nếu nó diễn ra, hậu quả có thể không lộ ngay, vì việc vẫn xong và sản phẩm vẫn ra, còn chỗ hổng nằm ở những người lẽ ra đã được kèm qua các việc ấy. Một rủi ro khó thấy như vậy đáng được tính tới từ trước, bằng cách cố ý giữ lại một phần việc thật cho người mới làm cùng người có kinh nghiệm.
Con đường đi xuống
Nghĩ tới cuối, tôi thấy hai câu hỏi của bài này thật ra là một. Thế hệ bắt đầu từ AI có giỏi nghề được không, và ai sẽ giữ phần nền móng, cả hai đều tùy vào việc con đường đi xuống có còn đi được hay không. Còn đi được nghĩa là code AI viết ra vẫn có người đọc. Người học vẫn có chỗ để tự làm và tự sai. Các tầng bên dưới vẫn có người dạy, và người đang làm ở đó vẫn có ai để truyền lại.
Còn tầng bước vào, tôi nghĩ, ít quan trọng hơn mức chúng ta đang lo. Thế hệ tôi cũng không bắt đầu từ đáy: chúng tôi đứng trên những tầng mình không xây, và phần lớn không hiểu hết. Điều làm nên một người làm nghề có năng lực không phải là biết mọi tầng. Đó là khi cần thì xuống được thêm một tầng, và biết lúc nào là lúc cần.
Người bắt đầu từ AI có thể trở thành người như vậy. Không có gì bảo đảm, cũng như lối học cũ chưa từng bảo đảm ai sẽ giỏi. Những người tới được sẽ đi theo một thứ tự khác chúng tôi, và có thể mang những chỗ mạnh, chỗ hổng khác với chúng tôi. Phần của những người đi trước là giữ cho các tầng bên dưới còn mở, và đừng nhầm con đường mình đã đi với năng lực mà con đường ấy đem lại.
No comments yet