Não xử lý việc đọc mã máy tính khác với đọc ngôn ngữ (2020)
(news.mit.edu)- Nghiên cứu của MIT cho thấy việc hiểu mã phụ thuộc nhiều hơn vào mạng đa nhu cầu dùng để giải quyết các vấn đề phức tạp, thay vì xử lý ngôn ngữ
- Trong thí nghiệm fMRI khi đọc mã Python và ScratchJr, mạng ngôn ngữ ở bán cầu trái như vùng Broca hầu như không phản ứng
- Đọc mã sử dụng cùng mạng với các tác vụ toán học và logic, nhưng các vùng chi tiết được kích hoạt bên trong mạng đó không hoàn toàn giống nhau
- ScratchJr kích hoạt mạng đa nhu cầu bên phải nhiều hơn một chút, và các nhà nghiên cứu so sánh điều này với xu hướng lệch bán cầu phải của các tác vụ điều hướng không gian
- Thay vì dạy lập trình chỉ như một phần của toán học hoặc ngôn ngữ, cần có phương pháp sư phạm riêng phù hợp với việc học mã
Đọc mã cho thấy hoạt động não khác với đọc ngôn ngữ
- Học lập trình giống với quá trình học một ngôn ngữ mới
- Phải học các ký hiệu và thuật ngữ mới
- Phải tổ chức mã đúng cách để chỉ dẫn máy tính thực hiện công việc
- Phải viết đủ rõ ràng để các lập trình viên khác có thể đọc và hiểu
- Nhưng khi đọc mã máy tính, các vùng xử lý ngôn ngữ của não không được kích hoạt
- Thay vào đó, mạng đa nhu cầu (multiple demand network) dùng cho các tác vụ nhận thức phức tạp được kích hoạt là chính
- Mạng này cũng được huy động trong các tác vụ như bài toán hay ô chữ
- Đọc mã cũng không hoàn toàn giống với các bài toán và logic
- Ngay cả trong mạng đa nhu cầu, nó có xu hướng phụ thuộc nhiều hơn vào những phần khác với các tác vụ toán học và logic
- Anna Ivanova cho rằng việc hiểu mã máy tính gần với “một thứ riêng của nó”, không phải ngôn ngữ, cũng không phải toán học hay logic
Lập trình gần với ngôn ngữ hay toán học hơn
- Nhóm nghiên cứu của Evelina Fedorenko đã nghiên cứu mối quan hệ giữa ngôn ngữ và các chức năng nhận thức khác
- Câu hỏi cốt lõi là liệu các chức năng khác có phụ thuộc vào mạng ngôn ngữ của não hay không
- Mạng ngôn ngữ này bao gồm vùng Broca và các vùng khác ở bán cầu trái
- Các nghiên cứu trước đây của phòng thí nghiệm Fedorenko cho thấy âm nhạc và toán học không kích hoạt mạng ngôn ngữ này
- Lập trình máy tính là một phát minh tương đối gần đây, nên khó có thể cho rằng con người có cơ chế bẩm sinh chuyên biệt cho lập trình
- Các quan điểm quanh việc học lập trình được chia thành hai hướng lớn
- Quan điểm cho rằng muốn lập trình giỏi thì phải giỏi toán học
- Quan điểm cho rằng do sự tương đồng giữa coding và ngôn ngữ, năng lực ngôn ngữ có thể liên quan nhiều hơn
Thí nghiệm fMRI: đọc mã Python và ScratchJr
- Các ngôn ngữ được đưa vào thí nghiệm là Python và ScratchJr, vốn được biết đến là các ngôn ngữ lập trình có tính dễ đọc cao
- ScratchJr là một ngôn ngữ lập trình trực quan được thiết kế cho trẻ em từ 5 tuổi trở lên
- Người tham gia là các thanh niên trưởng thành thành thạo ngôn ngữ mà họ được kiểm tra
- Người tham gia xem các đoạn mã bên trong máy quét cộng hưởng từ chức năng (fMRI)
- Nhiệm vụ là dự đoán đoạn mã đó sẽ tạo ra hành động nào
Kết quả: mạng đa nhu cầu là trung tâm hơn các vùng ngôn ngữ
- Các vùng ngôn ngữ của não hầu như không, hoặc hoàn toàn không, phản ứng với mã
- Tác vụ liên quan đến mã chủ yếu kích hoạt mạng đa nhu cầu
- Hoạt động của mạng này phân tán khắp thùy trán và thùy đỉnh
- Nó thường được huy động trong các tác vụ đòi hỏi phải đồng thời giữ nhiều thông tin trong đầu
- Nó liên quan đến khả năng thực hiện nhiều tác vụ tinh thần khác nhau
- Ivanova nói mạng này tham gia vào gần như mọi việc mang tính thách thức về nhận thức và đòi hỏi phải “suy nghĩ nghiêm túc”
- Các nghiên cứu trước đây cho thấy các bài toán và logic chủ yếu phụ thuộc vào các vùng đa nhu cầu ở bán cầu trái
- Các tác vụ điều hướng không gian được biết là kích hoạt bán cầu phải nhiều hơn bán cầu trái
Khác biệt theo ngôn ngữ lập trình và ảnh hưởng của chuyên môn
- Nhóm MIT, cùng với Marina Bers, thu được kết quả rằng đọc mã kích hoạt cả bên trái lẫn bên phải của mạng đa nhu cầu
- ScratchJr kích hoạt bên phải nhiều hơn bên trái một chút
- Không xác định được vùng não chuyên biệt chỉ dành riêng cho lập trình
- Tuy nhiên, vẫn còn khả năng hoạt động não chuyên biệt sẽ phát triển ở những người có kinh nghiệm coding nhiều hơn đáng kể
- Fedorenko nói rằng ở các lập trình viên chuyên nghiệp đã coding bằng một ngôn ngữ cụ thể trong 30 hoặc 40 năm, có thể quan sát thấy sự chuyên môn hóa hoặc kết tinh của một phần hệ thống đa nhu cầu
- Ở những người quen với coding và có thể thực hiện tác vụ hiệu quả nhưng kinh nghiệm tương đối hạn chế như các người tham gia lần này, sự chuyên môn hóa như vậy không xuất hiện
Hàm ý giáo dục và các bài báo liên quan
- Một bài báo đồng hành của nhóm nghiên cứu Johns Hopkins University đăng trong cùng số eLife cũng báo cáo rằng việc giải quyết vấn đề về mã kích hoạt mạng đa nhu cầu, chứ không phải các vùng ngôn ngữ
- Chỉ dựa trên các kết quả lần này thì khó quyết định nên dạy coding như một kỹ năng dựa trên toán học hay dựa trên ngôn ngữ
- Trong quá trình học lập trình, cả hệ thống ngôn ngữ lẫn hệ thống đa nhu cầu đều có thể tham gia
- Nhưng sau khi đã học, lập trình dường như không phụ thuộc vào các vùng ngôn ngữ
- Ivanova cho rằng các nhà giáo dục khoa học máy tính cần phát triển cách tiếp cận riêng để dạy mã hiệu quả nhất
- Bài báo liên quan: Comprehension of computer code relies primarily on domain-general executive brain regions
1 bình luận
Ý kiến trên Hacker News
Có vẻ thiếu link bài báo khoa học, nhưng nhiều khả năng là https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7738192/pdf/eli...
Nội dung nói rằng các lập trình viên nhìn các đoạn mã trong máy quét fMRI và dự đoán đoạn mã đó sẽ tạo ra hành vi gì, nhưng khả năng viết mã và khả năng hiểu mã do người khác viết có lẽ là hai kỹ năng khác nhau
Nó gần với việc suy luận xem những gì được viết ra có ý nghĩa gì, hơn là hiểu nội dung được viết
Bill và Tom đến cửa hàng giày; Bill mua đôi giày đen giá 23,56 đô la, còn Tom mua đôi giày đỏ giá 40,30 đô la. Sau đó họ đến cửa hàng tạp hóa; Tom mua bánh mì giá 3,50 đô la và sữa giá 5,99 đô la, còn Bill cũng mua bánh mì nhưng không mua sữa.
Hoạt động não để trả lời câu hỏi cụ thể này khác với việc trả lời “Tom và Bill đã làm gì?”, và nếu phải sửa câu chuyện hiện có như “hãy thêm chi tiết Bill ghé tiệm cắt tóc sau cửa hàng giày”, thì lại hoàn toàn khác nữa vì phải phân tích ngữ pháp và giữ tính nhất quán
Bức tranh tổng thể !== chi tiết !== viết mới !== chỉnh sửa nội dung hiện có, và nếu nghiên cứu không hỏi ngang nhau cả bốn kiểu hiểu này đối với cả truyện lẫn mã, thì cảm giác là nghiên cứu chưa đầy đủ
Bài viết cũng không nói về bản thân việc viết mã, mà chỉ liên hệ đến việc viết trong phạm vi rằng người khác phải hiểu được
Điều còn đáng ngạc nhiên hơn là có người có kinh nghiệm với ngôn ngữ lập trình lại thật sự nghĩ kết quả như vậy có thể xảy ra
Làm cho ngôn ngữ lập trình trông bề ngoài giống ngôn ngữ con người là một trong những sai lầm nhập môn điển hình trong thiết kế ngôn ngữ. Cứ nhìn mô hình “do what I mean” của Perl và sự hỗn loạn sau đó là thấy
Khác biệt quan trọng là ngôn ngữ lập trình gần với việc cấu thành một đối tượng nào đó hơn là giao tiếp. Nó gần với việc tạo ra công thức, thuật toán, cấu trúc dữ liệu, kiến trúc của nhiều component, v.v.; vì vậy nhiều suy nghĩ trong khi lập trình bị chi phối bởi các thuộc tính ngầm của thứ đang được tạo ra hơn là các chi tiết ngữ pháp
Với ngôn ngữ con người cũng có thể làm những việc tương tự như công thức nấu ăn, văn bản pháp lý, định nghĩa toán học, luật chơi board game, chỉ thị cho LLM, nhưng ngôn ngữ con người cũng có thể được dùng cho những phương thức giao tiếp có mục đích hoàn toàn khác
Có lẽ sẽ thú vị hơn nếu so sánh hoạt động não khi đọc mã với khi đọc ngôn ngữ con người đã được hình thức hóa, hoặc khi đọc ngôn ngữ con người đã được hình thức hóa với ngôn ngữ phi hình thức
Học ngôn ngữ lập trình giống học một kỹ năng cụ thể khác; có hứng thú thì tốt hơn, chứ không hẳn là “bộ não lập trình viên”. Ngược lại, học ngôn ngữ con người hoàn toàn khác và khó hơn rất nhiều, phần lớn diễn ra ở mức bán ý thức, nên lợi ích thu được từ “học” theo nghĩa thông thường cũng rất thấp
Việc hình dung cấu trúc dữ liệu trong đầu cũng không khác nhiều so với hình dung các cảnh trong một cuốn sách
Theo bài viết được liên kết, đọc mã kích hoạt những vùng não dùng để suy luận cẩn thận về các vấn đề xa lạ
Bài cũng phỏng đoán rằng điều này có thể không khái quát được cho người có 30 năm kinh nghiệm lập trình; tôi hiểu là nghiên cứu học thuật thường được làm nhiều trên sinh viên. Nhưng chẳng phải việc so sánh với xử lý ngôn ngữ tự nhiên, thứ mà đối tượng thí nghiệm đã có hàng chục năm kinh nghiệm, tự nó đã làm phép so sánh mất hiệu lực sao?
Là một lập trình viên tự học có nền tảng ngôn ngữ học lý thuyết và từng tiếp xúc ở trình độ đại học với nhiều ngôn ngữ khá khác tiếng mẹ đẻ, tôi không thấy kết quả này đáng ngạc nhiên. Ở một số tầng bậc thì rõ ràng có điểm tương đồng, nhưng sự tương đồng giữa ngôn ngữ con người và mã máy tính thường bị thổi phồng, và trông như di sản của kiểu ngôn ngữ học sơ khai hơn từng tập trung hẹp vào ngữ pháp
Dù trong repository có mã lần đầu thấy, sự quen thuộc với phong cách, quy ước, và việc đoạn mã đó khớp vào toàn bộ chương trình như thế nào có lẽ sẽ ảnh hưởng lớn đến cách nhận thức
Nếu chưa quen với lập trình thì việc vùng xử lý vấn đề xa lạ bật lên là hợp lý. Sẽ rất thú vị nếu nghiên cứu xem vùng này bật lên vì nó xa lạ, hay vì khi xử lý đối tượng là mã thì dù có kinh nghiệm nó vẫn tiếp tục bật lên
Khi đọc mã, thường ngay từ đầu ta đang xử lý điều mình chưa biết, nên ở mức nào đó nó có thể luôn xa lạ; ngược lại, bản thân việc đọc mã có thể trở nên quen thuộc đến mức không còn vận hành như vậy nữa
Để so sánh công bằng, đối tượng cần có kinh nghiệm ở cả xử lý ngôn ngữ tự nhiên lẫn lập trình, nhưng vì khó tìm người quen thuộc như nhau với cả hai lĩnh vực, cuối cùng rất có thể phải thỏa hiệp ở mức “đủ quen với mã”
Đây chính là lý do tôi thấy sợ tương lai khi mọi người nói “chỉ cần bảo AI bằng ngôn ngữ thông thường là nó sẽ làm đúng như vậy”
Tôi không muốn trò chuyện bằng văn bản hay lời nói thông thường 8 tiếng mỗi ngày. Nghe thôi đã thấy kiệt sức. Ngược lại, làm việc với ngôn ngữ lập trình 8 tiếng thì thú vị
Cần có cách nói kiểu
unsafecủa Rust: “chỗ này tôi biết mình đang làm gì, đừng can thiệp”. Sau đó để AI kiểm chứng tính đúng đắn của phần con người viết bằng test hoặc cách khácHiện tại chúng ta đã làm được ở một mức nào đó, nhưng bây giờ vẫn là con người kiểm chứng mã do AI sinh ra; để đổi vai trò thì theo tôi còn một chặng đường dài
Lex Fridman gần đây đã phỏng vấn nhà ngôn ngữ học Edward Gibson, và họ nói nhiều về cách não xử lý ngôn ngữ
Trong đó cũng có phần nói rằng việc đọc code làm lộ ra những vùng não hoàn toàn khác với ngôn ngữ
#426 https://lexfridman.com/podcast/
Theo tôi biết, Evelina Fedorenko của bài báo này là vợ của Edward
Với tôi, đó là một nhóm kỹ năng hoàn toàn khác
Tôi vận hành một kênh YouTube chủ yếu đọc code: https://www.youtube.com/@ants_are_everywhere
Tôi thử đọc và hiểu code của các dự án mã nguồn mở phổ biến trong trạng thái lần đầu nhìn thấy, hơi giống đọc nhạc thị tấu trong âm nhạc
Với tôi, lời giải thích rằng các nhà nghiên cứu hầu như không thấy phản ứng với code ở các vùng ngôn ngữ, mà thay vào đó mạng multiple demand trải rộng ở thùy trán và thùy đỉnh được kích hoạt chủ yếu, nghe khá hợp lý. Mạng này được huy động trong các nhiệm vụ cần giữ nhiều thông tin cùng lúc trong đầu và liên quan đến năng lực thực hiện nhiều tác vụ tinh thần khác nhau
Tất nhiên là có ngôn ngữ, nhưng có thể ta không tốn nhiều công sức cho chính việc xử lý ngôn ngữ nên tín hiệu fMRI không hiện ra. Tôi thường phải giữ cùng lúc nhiều thứ trong đầu: code đang làm gì, tác giả định làm gì, nền tảng của tác giả, phần mềm tương tự vận hành ra sao, v.v.
Tôi từng học toán, nhưng việc này cũng không giống mấy với cảm giác đọc văn bản hay làm toán
Mất một lúc để “nạp” những thứ đó vào đầu, và nó giống như giữ thăng bằng, phải liên tục cân chỉnh để toàn bộ không sụp xuống
Nếu bị ngắt giữa chừng thì cảm giác như mất thăng bằng và mọi thứ rối tung lên, sau đó phải nhặt lại từng thứ, tốn thời gian và công sức. Nếu chuyện này xảy ra vài lần liên tiếp thì cực kỳ bực bội
Paul Graham có bàn về điều này trong bài viết về maker schedule và manager schedule: (2009) https://paulgraham.com/makersschedule.html
Cảm giác giống hệt, và kiểu phải giữ nhiều thứ cùng lúc trong đầu cũng giống nhau
Nhìn theo tiêu chuẩn của khoa học thần kinh hiện đại và ảnh não, kết luận sẽ là đọc code về cơ bản giống với tỉnh lại khỏi hôn mê nhờ zolpidem
Hồi nhỏ và thời thiếu niên tôi chơi vài nhạc cụ, nhưng không giỏi thị tấu. Tôi nghe nói năng lực âm nhạc và năng lực lập trình thường có tương quan, nhưng chắc tôi đã không thể trở thành nhạc công chuyên nghiệp. Thay vào đó, tôi đã xây dựng được sự nghiệp tốt bằng lập trình
Hoàn toàn không ngạc nhiên. Đọc code khác với đọc văn xuôi, cũng khác với làm toán, và gần với việc lắp ráp một câu đố trong đầu hơn
Để hiểu code làm gì, ta phải kết nối, thay thế và diễn dịch theo thời gian thực rất nhiều thứ như hàm, symbol, biến, câu lệnh, abstraction. Vì vậy việc đọc code đôi khi còn phức tạp hơn viết code từ đầu
Thực ra điểm chung gần như chỉ là cả hai đều được gọi là “ngôn ngữ”
Vì nó là tập hợp lệnh máy viết ra để máy tính biết phải làm gì, và không thể, cũng không nên, trở thành ẩn dụ cho một thứ khác như trong vùng ngôn ngữ
Với tôi, đọc code giống như nhìn một hình vẽ các bánh răng và được hỏi “bánh răng A quay ngược chiều kim đồng hồ hay thuận chiều kim đồng hồ”
Cảm giác gần với phân tích cơ chế hơn là hiểu ngôn ngữ
Có thể thấy điều đó ở chỗ khi đọc code, trong đầu không có giọng tường thuật
Khi tôi cố đọc code, nếu có tiếng ồn nền mà tôi nghe ra được từ ngữ, như tiếng nói hoặc giai điệu của một ngôn ngữ quen thuộc, thì rất mất tập trung và khó chịu. Tôi cũng không thể nói chuyện khi đang code, nếu làm vậy thì gõ phím sẽ rối
Tôi cũng thích các ngôn ngữ gần với câu tiếng Anh như Ruby hơn nhiều so với những ngôn ngữ nhiều ký hiệu như Rust hoặc nhiều viết tắt và toán tử như Haskell. Tất nhiên các lập trình viên khác có thể sẽ kích hoạt những đường dẫn não khác
Code khó đọc thường khó xử lý, có lẽ vì nhịp điệu của lời tường thuật đó bị phá vỡ nên không trôi chảy tự nhiên
Khi tôi giải thích cách một thứ hoạt động, nhìn chung tôi cũng đi theo cùng nhịp điệu với lời tường thuật này, và điều đó giúp tôi giải thích súc tích, truyền đạt kiến thức nhanh
Tuy nhiên nó rõ ràng khác với giọng tường thuật khi đọc tiểu thuyết. Có lẽ là do giữa hai bên có hay không có ngôn ngữ mang tính cảm xúc. Điều này có thể giống hiện tượng một số người có độc thoại nội tâm còn một số thì không, hoặc mức độ chi tiết khi tưởng tượng sự vật dù không nhìn thấy thật sự khác nhau
Ở đây “giống” nghĩa là giống về cách hoạt động và cách nó “nghe” trong đầu, còn tất nhiên ngữ pháp và từ vựng thì theo ngôn ngữ ký hiệu được dùng. Thực tế là cùng các vùng não hoạt động
Điều này có vẻ cho thấy giọng tường thuật không chỉ là “tiếng vọng của âm thanh”, mà là chính quá trình hiểu. Cũng như khi đọc chữ vậy
Riêng việc đánh giá vòng lặp đòi hỏi phải lặp đi lặp lại việc tạm thời sửa code
Chủ yếu làm việc ở nhà, và khi lập trình thì thường bật nhạc
Vì thích hát theo nhạc nên tôi ngồi ở bàn cả ngày vừa hát vừa lập trình
Nhưng khi đọc thứ gì đó thì tuyệt đối không thể làm như vậy. Không thể vừa đọc một bài viết nào đó vừa hát một bài hát khác, nhưng khi lập trình thì việc đó rất dễ