0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Lập trình kể chuyện: Tư duy qua ẩn dụ trong mã nguồn

Đăng vào 6 ngày trước

• 11 phút đọc

Giới thiệu

Tóm tắt: Lập trình kể chuyện (Story-Coding) định hình lại lập trình như một hành động nhận thức, vượt qua sự lý trí thuần túy. Nó giới thiệu ngữ pháp kịch nghệ, kết hợp ẩn dụ và ý nghĩa xung quanh mã nguồn, biến các tác phẩm kỹ thuật thành trải nghiệm sống động. Đây không chỉ là mã cộng với tài liệu - mà là sự khơi gợi nhận thức.

Khi tôi là một lập trình viên mới vào những năm 80, một người đã nói với tôi rằng: "Nếu viết khó, thì đọc cũng sẽ khó". Tôi không nghĩ ông ấy hoàn toàn đùa, và có thể ông đã góp phần vào ý tưởng rằng C là một ngôn ngữ chỉ viết.

Tôi chưa bao giờ thấy lập trình như vậy. Đối với tôi, nó giống như một loại phép thuật hiện đại, cách mà những con số đơn giản (có lẽ là những con số đơn giản nhất, 0 và 1) có thể được chuyển từ trí tưởng tượng thành thế giới thực; để vẽ các điểm trên trang, màu sắc trên màn hình, hoặc điều khiển động cơ trên một cỗ máy khổng lồ (tôi làm việc trong lĩnh vực điều khiển quy trình - vì vậy, đúng là có rất nhiều robot nguyên thủy xung quanh). Lập trình thật thú vị, thậm chí cuốn hút. Và tôi tin rằng nó cần phải là một trải nghiệm dễ hiểu, có thể chia sẻ; như thể tôi không thể giữ 'điều tuyệt vời' này cho riêng mình.

Hiểu biết về lập trình

Khái niệm chính ở đây là mã nguồn nên là 'một trải nghiệm dễ hiểu'. Điều này thực sự có liên quan đến việc viết cho con người, chứ không phải cho máy móc - nếu không thì tại sao lại sử dụng các ngôn ngữ cấp cao? Việc uốn cong quá trình tư duy của chúng ta theo giới hạn của phần cứng chỉ làm hạn chế suy nghĩ của chính chúng ta. Các trình biên dịch và thông dịch viên nên đảm nhận nhiệm vụ trừu tượng hóa các cấu trúc lý trí từ ý định của chúng ta. Chúng ta nên thể hiện ý định đó theo những cách tự nhiên cho các quá trình tư duy của con người.

Chúng ta có thể biết một điều gì đó qua quan sát, nhưng chỉ có thể hiểu nó thông qua trải nghiệm. Một lập trình viên kỳ cựu có thể hiểu mã chỉ bằng cách nhìn vào nó, nhưng đó là nhờ vào nhiều năm (hoặc thập kỷ) kinh nghiệm. Sự hiểu biết luôn là sản phẩm của việc biết và trải nghiệm.

Vậy nếu chúng ta có thể làm cho mã không chỉ là một cấu trúc lý trí có thể được biết đến, mà còn là một trải nghiệm tự thân? Nghĩa là, làm cho mã khơi dậy nhận thức thông qua sức mạnh của câu chuyện.

Tác động của câu chuyện

Câu chuyện không chỉ mang tính trang trí - nó không phải là một sự tô điểm cho nhận thức; nó là một trong những hình thức vốn có của nó. Từ mô hình dự đoán đến xây dựng trí nhớ, câu chuyện cho phép chúng ta suy nghĩ, cảm nhận và hành động một cách mạch lạc.
Câu chuyện "được tích hợp sâu sắc vào cách chúng ta hiểu những gì xảy ra và cách chúng ta tự định hình bản thân trong đó" (Brooke Miller, Narrativity in Cognition, 2023). Gerrig & Egidi (Cognitive Psychological Foundations of Narrative Experiences, 2003) khám phá cách hiểu câu chuyện dựa vào trí nhớ, suy luận và mô phỏng - các chức năng nhận thức cốt lõi được kích hoạt thông qua cấu trúc câu chuyện. Bouizegarene et al. (Narrative as Active Inference, 2024) lập luận rằng câu chuyện giúp các cá nhân và nhóm tạo ra các mô hình hữu ích về thế giới, phối hợp hành vi và thích ứng theo thời gian.

Khơi gợi cảm xúc

Tại thời điểm này, có lẽ bạn nhớ đến khái niệm Lập trình Văn học (Literate Programming) của Knuth (và các cộng sự), khái niệm này chưa bao giờ thực sự phát triển mạnh mẽ trong cộng đồng lập trình. Có nhiều chỉ trích đối với phương pháp đó, nhưng với tôi, vấn đề chính nằm ở chỗ kết quả của nó, thật sự, chỉ là nhàm chán. Bạn không thể đọc một tác phẩm LP và cảm thấy hứng thú về mặt nhận thức với nó!

"Cảm xúc không phải là một sự xa xỉ, nó là điều thiết yếu cho tư duy lý trí."
Antonio Damasio, Lỗi của Descartes (1994)

Nếu chúng ta muốn mã được hiểu, thì nó cần khơi gợi một phản ứng cảm xúc.

Tôi không quan tâm đến việc chỉ trích hay bác bỏ Knuth (vì vào thời của ông, đó thực sự là một tác phẩm tuyệt vời) - mà là hướng đến sự tiến bộ.

Và tôi nghĩ rằng các tiến bộ chính là:

  • Không chỉ ghi chú mã tại chỗ, mà còn áp dụng một ngữ pháp của câu chuyện
  • Không cưỡng ép một cấu trúc cứng nhắc, mà cung cấp cho việc tạo ra một đường đi câu chuyện có thể vuông góc với cấu trúc mã
  • Không yêu cầu một giọng điệu tác giả duy nhất, mà cho phép nhiều đặc điểm khác nhau

Lập trình kể chuyện là về việc dệt những ẩn dụ phong phú xung quanh và bên trong mã; áp dụng các cấu trúc câu chuyện đã được phát triển và tinh chỉnh từ rất sớm trong nền văn minh.

Một ví dụ có thể giúp làm rõ... mà tôi đã có trong kho lưu trữ GitHub này - hãy kiểm tra expo.md để xem hướng dẫn đã được trích xuất từ mã nguồn.

Cơ bản về lập trình kể chuyện

Về cơ bản, lập trình kể chuyện là việc thêm một chiều kích bổ sung cho mã mà chúng ta viết. Nó không nhằm thay thế tài liệu kỹ thuật, cũng không ép buộc một cấu trúc cho kiến trúc mã lý trí. Mã vẫn chứa suy nghĩ lý trí, trong khi các thành phần câu chuyện thêm vào sự khơi gợi nhận thức - tạo ra một phản ứng cảm xúc cho phép nhận thức, trải nghiệm và cảm xúc.

Và điều này không chỉ liên quan đến tài liệu. Sự khơi gợi nhận thức đó cũng mang lại lợi ích cho lập trình viên, cũng như cho những người khác. Viết câu chuyện thật thú vị. Dệt những câu chuyện giúp thúc đẩy suy nghĩ mạch lạc.

Dù phần lớn của lập trình kể chuyện dựa vào việc thêm (được hướng dẫn) các phần giải thích vào mã, nhưng đó là một phương pháp tinh tế hơn rất nhiều. Chúng ta sử dụng các khái niệm (đã được biết đến) về phần câu chuyện (ngữ pháp câu chuyện) để nghĩ ra những ẩn dụ phong phú cho mã. Chúng ta thể hiện những ẩn dụ đó trong phần giải thích, nhưng cũng trong chính mã - đặc biệt thông qua việc đặt tên cho các đối tượng (do đó, việc định danh các đối tượng qua các ranh giới ẩn dụ).

Không có nỗ lực nào để ép buộc một ẩn dụ duy nhất cho toàn bộ mã nguồn, vì điều đó sẽ gây ra sự không đồng nhất giữa các cộng tác viên. Cũng không cần thiết. Những câu chuyện hay dệt nhiều đặc điểm khác nhau cùng nhau, tạo ra sự cộng hưởng hoặc va chạm nội bộ.

Cuối cùng, nếu chúng ta cung cấp đủ phần giải thích (như những phần khác nhau của câu chuyện) thì chúng ta có thể tự tin rằng chúng sẽ lắp ghép thành một đường đi câu chuyện hoàn chỉnh, vào thời điểm thích hợp. Nghĩa là, trong các cấu trúc câu chuyện, thường có sự phân biệt giữa các phần của câu chuyện và cốt truyện. Trong lập trình kể chuyện, có một sự tách biệt có chủ ý giữa những vấn đề này. Cấu trúc mã (lý trí) được phép có kiến trúc riêng của nó, trong khi (biểu cảm) câu chuyện trích xuất và nhóm các thành phần thành cấu trúc cốt truyện riêng của nó.

Ngữ pháp câu chuyện

Lập trình kể chuyện không chỉ kêu gọi việc thêm văn bản mà chính nó tạo ra tia lửa nhận thức, mà còn cung cấp một loạt 'gợi ý viết' mà, khi kết hợp với ẩn dụ hiện có, dẫn chúng ta đến một trải nghiệm mạch lạc.

Có nhiều công thức (đã được tài liệu hóa) cho việc kể chuyện, và chúng ta có quyền tự phát triển của riêng mình. Thực tế, ngữ pháp của câu chuyện có thể là một khoảnh khắc nền tảng trong việc phân tích cao cấp một miền vấn đề. Không nhất thiết phải có một tuyên bố duy nhất, cứng nhắc và xác định về những gì cấu thành ngữ pháp câu chuyện (mặc dù cho một mã nguồn cụ thể, nó nên được xác định).

Cách tiếp cận của tôi dựa trên bằng thạc sĩ của tôi trong lĩnh vực viết kịch, vì vậy có thể là một điểm khởi đầu hợp lý - mặc dù vẫn còn khá sơ khai. Các thành phần (hiện tại là):

  • THẾ GIỚI VIEW: Một cuộc thảo luận thiết lập cảnh ban đầu ở mức ứng dụng. Cũng giới thiệu các ẩn dụ khác nhau sẽ được sử dụng
  • LIÊN TỤC: Mô tả một 'thực thể xa lạ' - một điều gì đó xâm nhập vào thế giới câu chuyện, có thể trong ẩn dụ của riêng mình (các khái niệm thường được nhập hoặc bao gồm)
  • ĐƯỜNG ĐI: Một cuộc thảo luận kết nối ẩn dụ hiện tại (của mô-đun hiện tại) với thế giới view. Giúp chúng ta liên kết các khái niệm ẩn dụ với cơ chế mã, thường là một cho mỗi mô-đun.
  • ĐẶC TÍNH: Một hình thức hoặc khả năng, một gói phức tạp của các phần câu chuyện nhỏ hơn với mục đích rộng. Các nhân vật chính trong câu chuyện.
  • KIẾN THỨC: Những điều đã biết, hoặc sẽ được biết.
  • THÁI ĐỘ: trạng thái hoặc thái độ
  • HÀNH VI: Một chuỗi hoặc lặp lại các hành động dựa trên kiến thức và thái độ
  • CƠ CHẾ: Các hành động chuyển hóa có tác động vật chất
  • KỸ NĂNG: Các hành động thông tin
  • KHIẾM KHUYẾT: Tất cả những thứ sai sót
  • VĂN BẢN: Những thảo luận chi tiết hơn...

Chúng ta sử dụng ngữ pháp để giới thiệu các bình luận hoặc khối bình luận trong mã nguồn mà gắn liền với các từ ngữ có ý nghĩa tiếp theo - ví dụ: một lớp hoặc phương thức hoặc biến. Những phần giải thích này đứng trước thứ mà chúng mô tả, thảo luận nhiều hơn về 'tại sao' nó tồn tại hơn là 'làm thế nào' nó hoạt động. Điều này hoàn toàn vuông góc với các ghi chú kỹ thuật (về cách thức) thường nằm bên trong (không trước) thứ mà chúng thảo luận (ví dụ: các chuỗi tài liệu Python nằm bên trong bộ bao gói của chúng).

Có một vài ngoại lệ đối với mong đợi về vị trí đó:

  • Các phần giải thích cấp mô-đun (THẾ GIỚI VIEW và ĐƯỜNG ĐI) nằm trong mô-đun mà chúng liên quan đến
  • Các phần giải thích VĂN BẢN dệt quanh mã mà chúng liên quan đến

Các phần giải thích VĂN BẢN giúp giữ cho các cơ chế cụ thể của các câu lệnh mã gắn liền với câu chuyện, và dường như hữu ích nhất trong các HÀNH VI.

Quan điểm ban đầu của tôi về ngữ pháp câu chuyện phức tạp hơn, bao gồm các mối quan tâm như GIỚI HẠN CÂU CHUYỆN, GÓC NHÌN, XUNG ĐỘT và NGẪU NHIÊN. Kịch nghệ thường nghĩ về ĐẶC TÍNH như có CÁC KHẢ NĂNG ĐỘC NHẤT và KHIẾM KHUYẾT QUAN TRỌNG; nó cũng có thể xem xét CÁC TRỞ NGẠI và MỤC TIÊU. Có một mạch phong phú của các khái niệm kịch nghệ có thể được áp dụng khi mô tả mã như một câu chuyện - bất cứ điều gì tốt nhất khơi gợi nhận thức. Nhưng những điều trên đã là đủ, ít nhất là ban đầu.

Đường đi câu chuyện

Mã ví dụ (các tập lệnh Python trích xuất các phần giải thích từ các tập lệnh Python) được viết bằng ngữ pháp câu chuyện.

Ẩn dụ từ điển trải dài qua 2 mô-đun, lớp cơ bản của kỹ năng LEXICOGRAPHICS và lớp phái sinh của hành vi LEXICOGRAPHER - đây không phải là một phân rã kiến trúc bất thường.

Câu chuyện được trích xuất thì hơi khác. Đường đi liên kết ẩn dụ (chia sẻ) được trích xuất từ LEXICOGRAPHER, có một đường đi cho một ẩn dụ mặc dù ẩn dụ mở rộng qua hai mô-đun. Phần còn lại của chương về lexicographics sau đó trộn lẫn các phần giải thích từ hai mô-đun để cung cấp một câu chuyện mạch lạc hơn là chỉ theo cấu trúc mã.

Tệp câu chuyện được tạo ra bằng cách biên tập danh sách các thực thể từ vựng mà có các phần giải thích đính kèm. Danh sách được nhóm và sắp xếp lại để tạo thành đường đi câu chuyện, với các tiêu đề chủ đề được chèn vào. Việc kể chuyện diễn ra trong mã, nhưng câu chuyện thực tế được lập kế hoạch như một hoạt động riêng.

Kết luận

Điều quan trọng nhất trong lập trình kể chuyện là hiểu rằng nó không chỉ là về việc tài liệu hóa mã. Đó là về việc áp dụng một tư duy nhận thức, thay vì lý trí; nhận thức là một tập hợp của lý trí. Ngữ pháp câu chuyện giúp tạo ra sự nhất quán khi viết các đoạn câu chuyện, và một đường đi ẩn dụ giúp khơi gợi nhận thức trong lập trình viên và cho những người đến sau.

Hơn nữa, ẩn dụ rất thú vị - và những nhiệm vụ thú vị thường đơn giản hơn, thực hiện tốt hơn.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào