3 điểm bởi GN⁺ 2023-11-11 | 1 bình luận | Chia sẻ qua WhatsApp
  • Trong bối cảnh RSI tái phát buộc phải thay đổi lại cách nhập liệu khi lập trình, tiện ích mở rộng VS Code Cursorless đã trở thành công cụ trung tâm cho việc chỉnh sửa mã bằng giọng nói
  • Cursorless gắn các hat dựa trên màu sắc và chữ cái vào các token trong mã, để người dùng có thể gọi tên vị trí trên màn hình bằng lời nói và thực hiện các thao tác như xóa, di chuyển, chèn
  • Điểm mạnh hơn việc chỉ di chuyển con trỏ là khả năng kết hợp chỉ định đường dẫn như green urge past green bat với nhận biết AST của ngôn ngữ, nhờ đó có thể thao tác với các đơn vị cấu trúc như hàm, lambda, hay phần thân của định nghĩa
  • Nếu tự viết lệnh Talon, có thể tự động hóa những thao tác như chèn async <destination> hoặc các khai báo phương thức Go dài thành các lệnh giọng nói ngắn hơn
  • Lập trình bằng giọng nói không thể loại bỏ hoàn toàn các từ phải nói ra, nhưng có thể tạo ra một hệ thống lệnh gần hơn với cách hiểu mã trong đầu

Bối cảnh RSI tái phát và lý do dùng Cursorless

  • Đúng lúc bắt đầu công việc mới thì RSI tái phát, và thay vì tiếp tục dựa vào viết bài kỹ thuật như trước, cần tìm lại cách để lập trình
  • Dù là người dùng Emacs, lần này lại đang dùng Visual Studio Code chỉ vì một tiện ích mở rộng cụ thể
  • Tiện ích đó là Cursorless, và khi kết hợp với phần mềm điều khiển bằng giọng nói, nó cho phép chỉnh sửa mã ở mức AST
  • Trước đây Cursorless chủ yếu được dùng để di chuyển trên màn hình, nhưng lần này muốn áp dụng nó sâu hơn cho toàn bộ các thao tác có thể làm
  • Cũng mong giá như Slack và Discord có kiểu nhập liệu như vậy cho tin nhắn

Cách gọi vị trí bằng hat, target và destination

  • Đơn vị cơ bản của Cursorless là targetdestination
    • target chỉ một điểm neo riêng lẻ trong tài liệu
    • destination là vị trí tương đối dựa trên một target cụ thể
  • Các token trong tài liệu được gắn hat gồm màu sắc và chữ cái
    • vị trí của hat quyết định tên gọi
    • màu của hat giúp loại bỏ sự mơ hồ
  • Trong ví dụ mã JavaScript, nếu có một hat màu xanh lá trên chữ u của từ function, thì có thể gọi từ đó là green urge
  • Có thể ra lệnh xóa từ đó hoặc di chuyển nó sang vị trí khác bằng cách nhắm vào target này
  • Chỉ riêng cách này thôi cũng đã cho phép thao tác bằng giọng nói gần giống Vim motion

Chỉnh sửa có cấu trúc nhờ nhận biết AST

  • Sức mạnh của Cursorless không chỉ nằm ở việc chỉ vị trí đơn thuần mà còn ở việc dùng kết hợp đường dẫn (path) và nhận biết AST của ngôn ngữ
  • Có thể dùng cách diễn đạt như green urge past green bat để chọn phạm vi function fetchBlog trên màn hình
  • Vì hiểu được cấu trúc AST của ngôn ngữ, nó cũng có thể xóa toàn bộ một hàm hoặc chuyển hàm đó sang vị trí khác
  • Lệnh visualize lambdas trực quan hóa các lambda bên trong hàm thành những đơn vị cấu trúc riêng
  • Vì các đơn vị AST cũng trở thành target, có thể chọn phần thân của một định nghĩa rồi tiếp tục refactor trong phạm vi đó
  • Trong ví dụ, việc refactor để biến hàm thành hàm bất đồng bộ trở nên đơn giản hơn

Mở rộng lập trình bằng giọng nói với lệnh Talon

  • Khi dùng Cursorless cùng với Talon, có thể tự viết các lệnh giọng nói
  • Ví dụ async <user.cursorless_destination> là một lệnh chèn "async" vào trước destination được chỉ định
[state] async <user.cursorless_destination>:
    user.cursorless_insert(cursorless_destination, "async")
  • Lệnh Talon nhìn chung được chia thành hai phần lớn
    • pattern: các từ người dùng nói ra
    • capture: đối tượng được trích xuất từ nội dung đã nói
  • Trong ví dụ này, pattern là async, còn capture là đích để chèn async
  • Capture <user.cursorless_destination> là một capture đặc biệt cho phép chỉ định phía trước hoặc phía sau của một target bất kỳ
  • Các lệnh phức tạp hơn cũng có thể thực hiện được, và một quy tắc Talon tạo khai báo phương thức Go được đưa ra làm ví dụ
(method|meth) <user.letter> [<user.go_pointer>] [<user.go_visibility>] <user.text> [over] [<user.go_visibility>] named <user.text> [over]:
    user.go_method(go_pointer or "", letter, go_visibility_1 or "public", text_1, go_visibility_2 or "public", text_2)

Thử nghiệm với khai báo phương thức Go và cách biểu đạt con trỏ

  • Trong Go, phương thức có dạng như sau
func (reciever *Type) MethodName() {
    // function body here or something
}
  • Kèm theo đó là giải thích rằng trong Go không có phương thức theo nghĩa truyền thống, mà là các hàm nhận một receiver được gắn namespace vào một struct cụ thể
  • Nếu nhập đoạn mã này bằng giọng nói mà không có tự động hóa, sẽ phải nói một lệnh rất dài

state funk args word reciever space star hammer type over go right space hammer method name args go right brack enter

  • Dùng quy tắc Talon thì có thể nói ngắn hơn nhiều

meth r raised type named method name over

  • Dù vậy số từ phải nói ra vẫn còn nhiều, nhưng việc nhập liệu trở nên hiệu quả hơn và gần hơn với cách khái niệm hóa trong đầu
  • raised là một thử nghiệm nhằm diễn đạt khái niệm con trỏ trong Go theo cách khác
    • Cú pháp con trỏ của Go mang kiểu C, và cách diễn giải được dùng ở đây là * được dùng để hạ (lower) một giá trị con trỏ xuống giá trị thường, còn & được dùng để nâng (raise) một giá trị thường thành giá trị con trỏ
    • Khi thiết kế lại các binding Talon cho Go, tác giả đang thử hợp nhất giá trị con trỏ theo khái niệm raising/lowering để xem cách này có dễ hiểu hơn không
  • Muốn tham gia GitHub Copilot Voice beta để so sánh với lập trình bằng giọng nói dựa trên Talon

1 bình luận

 
GN⁺ 2023-11-11
Ý kiến trên Hacker News
  • Tôi là tác giả bài viết, và không ngờ ở đây lại được đón nhận tốt đến vậy
    Nếu bạn quan tâm, tôi đã đăng kho lưu trữ cấu hình Talon đang thử nghiệm của mình ở đây: https://github.com/Xe/invocations

    • Cổ tay tôi nhìn chung vẫn ổn, nhưng vì thoái hóa khớp khởi phát sớm do tiền sử gia đình nên các khớp ngón tay không phải lúc nào cũng ổn
      Tôi nghĩ một ngày nào đó làm việc theo cách này thay vì dùng bàn phím sẽ không hẳn là bắt buộc, nhưng chắc chắn sẽ ít đau hơn nhiều; và thật tốt khi biết rằng có một lựa chọn thực tế
    • Có vẻ đây là bài viết rất hợp gu HN
      Mỗi lần thấy kiểu thiết lập này, tôi lại cảm nhận rằng sự đa dạng thần kinh của mình khá khác với người khác. Lượng ngữ cảnh và trừu tượng hóa phải giữ trong đầu để hiểu và di chuyển trên màn hình là rất lớn, và có vẻ chỉ khả thi khi đã quen với ngôn ngữ cùng IDE/CLI trong hàng chục năm
      Phần “theo thời gian nó sẽ trở thành bản năng thứ hai như lệnh Vim” cũng có vẻ đúng là phải học như vậy. Tôi đã dùng máy tính 30 năm, nhưng mức thành thạo lập trình như thế này vẫn vừa khó hiểu vừa đáng khâm phục
    • Không biết bạn đã xem qua giải pháp Emacs chưa
      Tôi muốn biết nó không ổn lắm, hay giải pháp phía VS Code trông tốt hơn nhiều
    • Nhờ bài viết này mà tôi thật sự tò mò về Talon và lao vào ngay; tôi đã tạo một lớp ứng dụng cho terminal Warp và cũng đưa terminal Emacs, vốn bình thường không được phát hiện, ra cho Talon
      Tôi không quan tâm nhiều đến Cursorless, vì tôi không dùng VSCode và các text object của Vim/Evil mode cũng mạnh tương tự mà ít gây nhiễu thị giác hơn. Toàn bộ ý tưởng này rất đáng mong đợi
  • Cái này trông giống cách dùng tree-sitter AST để thao tác trên “các phần” của buffer
    Nếu vậy thì rất giống text object của Vim/Evil, nhưng có thêm yếu tố giọng nói
    Nếu thêm các tính năng như “ghi âm rồi thực thi” thì tiềm năng có vẻ lớn. Trong lúc đang làm thao tác X bằng bàn phím, nếu thao tác Y tiếp theo đã hiện trên màn hình và là việc đơn giản, bạn có thể nói sẵn lệnh Y rồi sau khi X kết thúc bấm nút để chạy lệnh thoại. Tốt hơn nhiều so với việc luân phiên giữa gõ và nói
    Gõ phím và nói dùng các vùng nhận thức khác nhau, và việc viết phần mềm sau khi đã hiểu cú pháp thì không mang tính ngôn ngữ đến vậy. Nếu có thể vừa gõ vừa nói cùng lúc, có lẽ sẽ dễ đi vào trạng thái flow, trông như một dạng rubber duck debugging tăng cường. Có lẽ cũng ghi chú được
    Chắc sẽ có gói Emacs ra đời

    • Nhờ Emacspeak, Emacs khá tốt theo hướng ngược lại, tức là khi vẫn gõ được nhưng không nhìn thấy màn hình
      Nhưng có lẽ sẽ mất thời gian để bắt kịp lĩnh vực này. Engine hiển thị chưa xử lý được kiểu ký hiệu của Cursorless, và tích hợp tree-sitter cũng chưa chín muồi. Tôi đã tự thử rồi
    • Nên xem bản demo lập trình bằng giọng nói này: https://youtu.be/GM_siEPD4Ws?si=f52wK3tqqJaCQPp7
    • Có một gói Emacs để điều khiển VSCode hoặc JetBrains bằng plugin Cursorless
      Dù vậy vẫn sẽ tuyệt nếu có bản native cho Emacs
  • Không phải chính Cursorless, nhưng ở đây có một bài thuyết trình và demo tuyệt vời về lập trình bằng giọng nói: https://youtu.be/GM_siEPD4Ws?si=99ZhC1P4irOyu1pH
    Rất đáng xem, và diễn giả cũng đề cập tốt đến các vấn đề chung hiện nay của lĩnh vực này

    • Tôi nhớ bài thuyết trình đó. Kênh của diễn giả còn có thêm video, nhưng tiếc là có vẻ giờ họ không còn code bằng giọng nói nữa: https://www.youtube.com/@mccGoNZooo
  • Tôi vẫn đang cố hiểu hoàn toàn cách nó hoạt động
    Nghe giống avy dùng giọng nói thay cho bàn phím, cộng thêm các lệnh nhận biết AST: https://karthinks.com/software/avy-can-do-anything/

    • Đúng vậy. Thực ra khi tôi định triển khai lại cho Emacs, bước đầu tiên là tạo hats theo phong cách avy
      Sau đó tôi muốn làm cho overlay luôn hiển thị, nhưng bị kẹt ở đâu đó
  • Bài thuyết trình Strange Loop của tác giả Cursorless: https://www.youtube.com/watch?v=NcUJnmBqHTY

  • Tôi thắc mắc vì sao lại dùng “urge” và “bat”
    Không thể dùng bất kỳ từ nào bắt đầu bằng chữ cái liên quan sao?

    • Không. Talon có một bảng chữ cái thoại được chọn sao cho ngắn và dễ phân biệt
      Chi tiết ở đây: https://whalequench.club/blog/2019/09/03/learning-to-speak-c...
    • Vì chúng dễ nói và Talon dễ phân biệt
      Trước đây khi thử code bằng giọng nói 6–8 giờ mỗi ngày, bạn sẽ thấy biết ơn từng tối ưu hóa vi mô kiểu này
  • Với công nghệ theo dõi ánh mắt ngày nay, chẳng phải đặt con trỏ ở vị trí nhìn hơn 2 giây là đã đủ sao?
    Tôi nhớ đến các nghiên cứu về nơi ánh mắt dừng lại khi lái xe hoặc xem tác phẩm nghệ thuật

    • Có thể, nhưng dừng hơn 2 giây để chỉ định vị trí trên màn hình là quá lâu
      Khi code có rất nhiều lúc bạn dừng kiểu đó
    • Bạn có thể xem các trường hợp dùng thiết bị theo dõi ánh mắt để code hoặc chơi game trên YouTube rồi tự đánh giá độ trễ. Ví dụ ở đây: https://youtu.be/FZRgBw8m34c?feature=shared&t=90
    • Cần theo dõi ánh mắt có kèm nhấp bằng tín hiệu thần kinh
      Cần một thiết bị theo dõi ánh mắt cực kỳ phản hồi nhanh và chính xác, có thể phát hiện ít nhất 3–5 nút: nhấp, nhấn, thả, di chuyển sang phải, di chuyển sang trái
  • Phong cách viết này tạo cảm giác rất giống phần đối thoại giữa Rùa và Achilles trong Gödel, Escher, Bach
    Tôi 52 tuổi và đã gõ phím hằng ngày trong các vị trí kỹ thuật từ năm 1995. Khoảng năm 2000, tôi bị chấn thương do lặp lại; đã thử các thiết bị hỗ trợ công thái học như miếng đệm mềm để đặt cổ tay trước bàn phím hay thiết bị trượt để tì khuỷu tay, nhưng không có tác dụng gì
    Thay vào đó, tôi đã thay đổi cách gõ. Tôi để bàn tay và cổ tay ở trạng thái thả lỏng, và thay vì duỗi ngón tay để nhấn phím thì dùng cánh tay để di chuyển; cách đó có hiệu quả
    Đến giờ tôi vẫn gõ rất nhiều mỗi ngày nhưng đã 20 năm không còn đau. Tùy mỗi người, nhưng việc thay đổi cách dùng cánh tay và bàn tay có thể giúp ích rất nhiều

    • Điều lớn nhất tôi nhận ra khi chơi guitar bass hồi trung học cũng chính là vậy
      Nếu có thể chuyển chuyển động sang các nhóm cơ lớn hơn thì nhìn chung nên làm như thế. Tức là dùng vai/lưng thay cho cánh tay, dùng cánh tay thay cho bàn tay, dùng bàn tay thay cho ngón tay
    • Gần 15 năm trước, tôi từng bị chấn thương do lặp lại khá nặng trong vài tháng, và nó biến mất sau khi tôi thay đổi nhiều thói quen
      Tùy mỗi người, nhưng trackball đã giúp tôi rất nhiều. Một thời gian tôi đặt chuột bên trái và trackball bên phải rồi dùng luân phiên, nhưng giờ thì không cần nữa
      Nghỉ ngơi và chú ý tư thế cũng quan trọng. Đặc biệt là tư thế cổ tay: tôi không tì cổ tay hay cánh tay vào bất cứ đâu, chỉ để các ngón tay chạm bàn phím
      Mãi về sau tôi bắt đầu tập sức mạnh với kettlebell, và cảm thấy sức mạnh cùng tuần hoàn máu cải thiện khá rõ
    • Tác giả cố ý viết như vậy. Nhìn trang nhân vật thì thấy được thiết kế để phản ánh cuộc đối thoại giữa Socrates và học trò. Tôi thấy khá thông minh
    • Thay đổi cách gõ phím là mấu chốt
      Khoảng 10 năm trước tôi từng bị đau lưng, đau cổ và vấn đề chấn thương do lặp lại. Tôi học cách ngồi thẳng lưng, chỉnh lại chiều cao bàn, sắp xếp lại đồ trên bàn để không gõ trong tư thế co quắp như con tôm. Và tôi cũng nhận ra rằng thực ra mình không cần gõ nhiều đến vậy
      Từ đó về sau hoàn toàn không còn đau nữa
    • Phần còn lại của cơ thể cũng quan trọng. Đặc biệt đáng chú ý đến đầu và vai, rồi cả core, hông và bàn chân
  • Nếu muốn xem tổng quan về Cursorless và cách dùng thực tế, bài thuyết trình Strange Loop năm nay khá hay: https://youtube.com/watch?v=NcUJnmBqHTY

  • Tôi rất thích và vui vì nó vẫn tiếp tục được phát triển, nhưng để thật sự đào sâu thì có lẽ phải bị chấn thương ở cánh tay/bàn tay hoặc chấn thương do lặp lại nghiêm trọng
    Có vẻ chi phí nhập môn ban đầu về mặt tinh thần khá cao

    • Đồng ý, nhưng các công cụ như Emacs/Vim, Dvorak/Colemak hay bàn phím chorded cũng có chi phí nhập môn ban đầu cao
      Tuy nhiên, hạn chế lớn nhất có lẽ là về cơ bản chỉ có thể dùng nó khi làm việc từ xa một mình. Khó tưởng tượng cảnh dùng nó ở ngoài hoặc trong văn phòng
    • Thật tốt khi nó đang được phát triển tích cực
      Nếu không dùng được tay nữa thì có lẽ tôi sẽ dùng