... Làm thế nào tôi có thể phát triển các kỹ năng lập trình có thể áp dụng cho tất cả các ngôn ngữ thay vì chỉ một ngôn ngữ?
Chìa khóa của câu hỏi này là vượt qua ngôn ngữ và suy nghĩ không phải ngôn ngữ bạn đang mã hóa.
BÌNH THƯỜNG?
Các lập trình viên polyglot có kinh nghiệm nghĩ về cây cú pháp trừu tượng (AST) của mô hình tinh thần của ngôn ngữ. Người ta không nghĩ rằng "Tôi cần một vòng lặp for ở đây", mà là "Tôi cần lặp lại một cái gì đó" và dịch nó thành thích hợp cho, hoặc trong khi, hoặc trình lặp hoặc đệ quy cho ngôn ngữ đó.
Điều này tương tự với những gì người ta nhìn thấy khi học một ngôn ngữ nói. Những người nói nhiều ngôn ngữ lưu loát nghĩ ý nghĩa , và nó phát ra trong một ngôn ngữ nhất định.
Người ta có thể thấy một số manh mối của AST này trong cặp video về khả năng hiểu mã với theo dõi bằng mắt và thí nghiệm mã theo dõi mắt (Novice) trong đó các chuyển động của mắt của một người mới bắt đầu và lập trình viên có kinh nghiệm được xem. Người ta có thể thấy lập trình viên có kinh nghiệm 'biên dịch' mã thành mô hình tinh thần của họ và 'chạy' nó trong đầu, trong khi người mới bắt đầu phải lặp lại từ khóa mã theo từ khóa.
Do đó, chìa khóa cho câu hỏi phát triển kỹ năng lập trình để áp dụng cho tất cả các ngôn ngữ là học nhiều ngôn ngữ để người ta có thể tránh xa mô hình tinh thần của một ngôn ngữ và phát triển khả năng tự tạo AST cho một vấn đề một ngôn ngữ đầu sau đó được dịch sang một ngôn ngữ nhất định.
Khi một người có khả năng sử dụng AST trong đầu, việc học một ngôn ngữ khác trong trường phái tư tưởng tương tự (đi đến Befunge là một bước nhảy vọt từ Java, nhưng không nhiều từ Forth ) trở nên dễ dàng hơn nhiều - đó là 'chỉ' dịch AST sang một ngôn ngữ mới dễ dàng hơn nhiều trong lần thứ 3, 4 và 5 (v.v ...).
Có một bài viết kinh điển, Lập trình viên thực sự Đừng sử dụng Pascal . Một phần của điều này đọc:
... Lập trình viên thực sự quyết tâm có thể viết các chương trình Fortran bằng bất kỳ ngôn ngữ nào
Cũng có những bit mà bạn không thể sử dụng AST tinh thần - bạn cũng cần phải suy nghĩ bằng ngôn ngữ. Điều này cần một chút thời gian để hoàn thành (Tôi vẫn bị cáo buộc viết mã Perl bằng Python và mã Lisp đầu tiên của tôi đã được xem xét nói rằng "Đây là một chương trình C rất tốt.").
Về vấn đề này, tôi phải chỉ ra một bài báo được xuất bản bởi ACM, Làm thế nào để không viết Fortran bằng bất kỳ ngôn ngữ nào . Đoạn thứ ba của bài viết (không phải là trích dẫn hàng đầu) trực tiếp giải quyết câu hỏi:
Có những đặc điểm của mã hóa tốt vượt qua tất cả các ngôn ngữ lập trình có mục đích chung. Bạn có thể thực hiện thiết kế tốt và phong cách minh bạch trong hầu hết mọi mã, nếu bạn tự áp dụng nó. Chỉ vì một ngôn ngữ lập trình cho phép bạn viết mã xấu không có nghĩa là bạn phải làm điều đó. Và một ngôn ngữ lập trình đã được thiết kế để thúc đẩy phong cách và thiết kế tốt vẫn có thể được sử dụng để viết mã khủng khiếp nếu người viết mã đủ sáng tạo. Bạn có thể bị chết đuối trong một bồn tắm với một inch nước trong đó, và bạn có thể dễ dàng viết một chương trình hoàn toàn không thể đọc được và không thể nhầm lẫn bằng một ngôn ngữ không có số gotos hoặc số dòng, với xử lý ngoại lệ và loại chung và bộ sưu tập rác. Cho dù bạn đang viết Fortran hay Java, C ++ hay Smalltalk, bạn có thể (và nên) chọn viết mã tốt thay vì mã xấu.
Nó không đủ để có AST - cần có AST để người ta có thể dịch sang các ngôn ngữ khác. Có một Fortran AST trong đầu và viết mã Fortran bằng Java không phải là một điều tốt. Người ta cũng phải đủ quen thuộc với ngôn ngữ và thành ngữ của nó để có thể suy nghĩ bằng ngôn ngữ (bất chấp những gì tôi đã nói ở trên cùng).
Tôi đã thấy mã Java được viết bởi một người chưa ngừng viết mã C. Có một đối tượng với một phương thức chính. Trong đối tượng này là một loạt các phương thức tĩnh được gọi bởi main
và các lớp bên trong riêng có các trường công khai (và do đó trông rất giống các thanh chống). Đó là mã C được viết bằng Java. Tất cả những gì đã được thực hiện là dịch cú pháp của ngôn ngữ này sang ngôn ngữ khác.
Để vượt qua điểm này, người ta cần tiếp tục viết mã bằng nhiều ngôn ngữ, không nghĩ theo các ngôn ngữ đó khi thiết kế mã, mà hãy nghĩ về chúng khi dịch thiết kế thành mã để làm việc với các thành ngữ ngôn ngữ một cách chính xác.
Cách duy nhất để đạt được điều đó - có thể phát triển các kỹ năng lập trình có thể áp dụng cho tất cả các ngôn ngữ - là tiếp tục học ngôn ngữ và giữ cho ngôn ngữ lập trình tinh thần đó linh hoạt thay vì liên kết với một ngôn ngữ.
(Tôi xin lỗi ChaosPandion vì đã vay mượn rất nhiều từ ý tưởng mà anh ấy trình bày .)