Có khó để chuyển từ python sang java không?

Khi một lập trình viên biết một ngôn ngữ, họ có thể tận dụng các khái niệm và kiến ​​thức đã học và dễ dàng chọn một ngôn ngữ lập trình khác. Nhưng đó có phải là luôn luôn như vậy? . Chúng tôi đã đưa ra giả thuyết rằng kiến ​​thức cũ có thể ảnh hưởng đến việc học một ngôn ngữ lập trình mới. Từ việc kiểm tra 450 câu hỏi về Stack Overflow, chúng tôi đã tìm thấy 276 trường hợp nhiễu xảy ra do các giả định sai bắt nguồn từ kiến ​​thức về một ngôn ngữ khác. Để hiểu tại sao những khó khăn này xảy ra, chúng tôi đã thực hiện các cuộc phỏng vấn bán cấu trúc với 16 lập trình viên chuyên nghiệp. Các cuộc phỏng vấn tiết lộ rằng các lập trình viên đã thất bại trong việc liên kết một ngôn ngữ lập trình mới với những gì họ đã biết. Phát hiện của chúng tôi cung cấp ý nghĩa thiết kế cho các tác giả kỹ thuật, thợ rèn công cụ và nhà thiết kế ngôn ngữ, chẳng hạn như thiết kế tài liệu và công cụ tự động giúp giảm nhiễu, dự đoán chuyển đổi ngôn ngữ không phổ biến trong quá trình thiết kế ngôn ngữ và chào đón các lập trình viên không chỉ vào một ngôn ngữ mà còn toàn bộ hệ sinh thái của nó

Trở lại đầu trang

1. Giới thiệu

Peter Norvig đã viết một hướng dẫn, Python cho Lập trình viên Lisp,13 để dạy Python từ quan điểm của Lisp. Chúng tôi đã phỏng vấn Peter về quá trình chuyển đổi này và anh ấy đã mô tả một số khía cạnh khó khăn khi chuyển sang Python, chẳng hạn như cách danh sách không được coi là danh sách được liên kết và các giải pháp mà trước đây anh ấy đã sử dụng macro cần phải suy nghĩ lại. Khi được hỏi về vấn đề chung của việc chuyển đổi ngôn ngữ lập trình, anh ấy nói: "Hầu hết các nghiên cứu đều tập trung vào những người mới bắt đầu học ngôn ngữ. Đối với các chuyên gia, nó hoàn toàn khác và chúng tôi không biết quy trình đó. Chúng tôi chỉ giả sử nếu bạn là một chuyên gia thì bạn không cần bất kỳ sự trợ giúp nào. Nhưng tôi nghĩ điều đó không đúng. " Peter tin rằng học ngôn ngữ mới rất khó—ngay cả đối với các chuyên gia—mặc dù họ đã có kinh nghiệm làm việc với các ngôn ngữ trước đây. Peter có đúng không?

Nhiều câu chuyện về chuyển đổi ngôn ngữ cho thấy rằng ngay cả những lập trình viên có kinh nghiệm cũng gặp khó khăn. Ví dụ: một lập trình viên Java đã chuyển đổi sang Kotlin24 báo cáo rằng những khác biệt như ký hiệu kiểu đảo ngược và cách các lớp trong Kotlin là cuối cùng theo mặc định, khiến quá trình chuyển đổi kém suôn sẻ hơn mong đợi. "nếu bạn nghĩ rằng bạn có thể học Kotlin nhanh chóng vì bạn đã biết Java thì bạn đã nhầm. Kotlin sẽ ném bạn vào vực sâu. " Tương tự, một lập trình viên có kinh nghiệm về C++ chuyển sang Rust4 nhận thấy rằng công cụ kiểm tra mượn của Rust "buộc một lập trình viên phải suy nghĩ khác đi. " Chuyển đổi giữa các ngôn ngữ hoàn toàn khác nhau đặc biệt khó khăn. Ví dụ, một lập trình viên Java đã chuyển sang Haskell10 và bày tỏ rằng "những điều dễ dàng thường khó thực hiện hơn một chút trong Haskell" và một lập trình viên16 khác có kinh nghiệm về các ngôn ngữ thủ tục đã cảnh báo rằng "[đánh giá lười biếng] có thể hơi khó hiểu để hiểu nó như thế nào. . " Ngay cả các ngôn ngữ chia sẻ cùng một thời gian chạy cũng có thể có vấn đề. "bất cứ khi nào tôi chọn CoffeeScript, tôi cảm thấy như thể phần lớn sự hiểu biết của tôi về JavaScript đột nhiên biến mất trong không khí. "14 Từ những câu chuyện này, một điệp khúc phổ biến xảy ra. kiến thức lập trình trước đây đôi khi ít hữu ích hơn mong đợi và có thể ảnh hưởng tích cực đến việc học. Điều này có vẻ phản trực giác. Tại sao kiến ​​thức trước đây thực sự có thể làm cho việc học khó hơn và không dễ hơn?

Trong tâm lý học và khoa học thần kinh, lý thuyết giao thoa đã giúp giải thích sự nhầm lẫn có thể xảy ra khi thông tin cũ hơn tương tác với thông tin mới hơn. 23 Để minh họa, giả sử lối đi bán bánh mì của cửa hàng yêu thích của bạn mới được chuyển đi. Theo phản xạ, bạn có thể bắt đầu đi về phía vị trí cũ do bị nhiễu—khi kiến ​​thức trước đó làm gián đoạn việc nhớ lại thông tin mới học được. Tuy nhiên, nếu gần đây bạn thấy rằng món bánh mì kẹp thịt bất khả thi đã được thêm vào cửa hàng, thì việc sử dụng kiến ​​thức rằng thực phẩm đông lạnh có thể được tìm thấy trong khu vực đông lạnh—chứ không phải lối đi riêng dành cho sức khỏe—là một ví dụ về sự hỗ trợ, trong đó kiến ​​thức trước đây của bạn giúp truy xuất thông tin mới. . Tương tự như vậy, khi một lập trình viên Java đang học Kotlin, chúng tôi cho rằng kiến ​​thức Java trước đây của họ sẽ tạo điều kiện thuận lợi hoặc cản trở việc học. Kiến thức rằng Java được hướng đối tượng và sử dụng kiểu gõ tĩnh tạo điều kiện thuận lợi cho việc học của họ khi Kotlin chia sẻ các thuộc tính tương tự. Kiến thức rằng các lớp Java không phải là ____ theo mặc định sẽ cản trở việc học của họ vì các lớp của Kotlin là ____ theo mặc định

Nếu kiến ​​thức lập trình trước đây có thể được đóng khung như một nguồn can thiệp vào việc tiếp thu ngôn ngữ lập trình mới, thì lý thuyết giao thoa có thể giải thích tại sao việc học ngôn ngữ lập trình có thể khó khăn đối với các lập trình viên có kinh nghiệm. Và khi kiến ​​thức lập trình trước đó không liên quan, việc học cũng có thể gặp khó khăn vì kiến ​​thức này không tạo điều kiện

Để điều tra giả thuyết của chúng tôi, trước tiên chúng tôi tìm kiếm bằng chứng cho thấy các lập trình viên có thể gặp khó khăn khi học một ngôn ngữ khác do sự can thiệp từ kiến ​​thức trước đó của họ. Để đạt được điều này, chúng tôi đã tiến hành một nghiên cứu thực nghiệm kiểm tra các câu hỏi được đăng trên một trang hỏi đáp phổ biến, Stack Overflow. a Chúng tôi đã phân tích 450 bài đăng cho 18 ngôn ngữ lập trình khác nhau và mã hóa chất lượng từng bài đăng, mô tả các bài đăng về việc liệu các lập trình viên có đưa ra các giả định sai dựa trên kiến ​​thức lập trình trước đây của họ hay không. Sau đó, để hiểu những chiến lược học tập mà các lập trình viên đã sử dụng khi học một ngôn ngữ khác—và tại sao kiến ​​thức trước đó có thể cản trở quá trình này—chúng tôi đã phỏng vấn 16 lập trình viên chuyên nghiệp gần đây đã chuyển sang một ngôn ngữ lập trình mới

Chúng tôi thấy rằng

  • Giao thoa ngôn ngữ là một vấn đề. 276 [61%] bài đăng đa ngôn ngữ trên Stack Overflow chứa các giả định không chính xác do can thiệp vào kiến ​​thức ngôn ngữ trước đó
  • Dựa trên các cuộc phỏng vấn của chúng tôi, các lập trình viên chuyên nghiệp chủ yếu tự học ngôn ngữ mới, sử dụng chiến lược cơ hội thường liên quan đến việc liên hệ ngôn ngữ mới với kiến ​​thức ngôn ngữ trước đó;
  • Học một ngôn ngữ mới liên quan đến việc phá vỡ những thói quen cũ, thay đổi suy nghĩ của một người, xử lý những ánh xạ ít hoặc không có đối với các ngôn ngữ trước đó, tìm kiếm tài liệu phù hợp và trang bị lại trong một môi trường mới. Tất cả cùng nhau, những thách thức này làm cho việc học một ngôn ngữ khác trở nên khó khăn

Trở lại đầu trang

2. phương pháp luận

Để khám phá cách các lập trình viên học một ngôn ngữ mới và hiểu các nguồn gây nhầm lẫn tiềm ẩn của họ, chúng tôi đã tiến hành một nghiên cứu theo phương pháp hỗn hợp thông qua điều tra thực nghiệm các bài đăng trên Stack Overflow trên nhiều ngôn ngữ khác nhau và thông qua các cuộc phỏng vấn bán cấu trúc. Chúng tôi làm như vậy thông qua các câu hỏi nghiên cứu sau đây

2. 1. câu hỏi nghiên cứu

  • RQ1. Giao thoa ngôn ngữ có xảy ra không?
  • RQ2. Làm thế nào để các lập trình viên có kinh nghiệm học ngôn ngữ mới?
  • RQ3. Các lập trình viên có kinh nghiệm thấy khó hiểu gì trong các ngôn ngữ mới?

2. 2. Giai đoạn I. Nghiên cứu thiết kế cho Stack Overflow

Để trả lời RQ1, chúng tôi đã tiến hành một nghiên cứu bằng cách sử dụng các bài đăng trên Stack Overflow

Thu thập dữ liệu. Để thu thập các câu hỏi về Stack Overflow, chúng tôi đã sử dụng nguồn dữ liệu SOTorrent2 từ Thử thách khai thác MSR 2019. Chúng tôi đã truy vấn 26 ngôn ngữ lập trình đã được Erikb và Warenc sử dụng trước đây trong cuộc điều tra về việc di chuyển ngôn ngữ phổ biến của họ, dựa trên các từ khóa tìm kiếm trên Google và kho lưu trữ GitHub. Chúng tôi tập hợp các câu hỏi Stack Overflow cho từng cặp. Để giữ cho phân tích có thể xử lý được, chúng tôi chỉ xem xét mối liên hệ giữa hai ngôn ngữ chứ không phải hướng của sự giao thoa có thể xảy ra. Chúng tôi đã sử dụng tiêu chí quy tắc dừng để bao phủ hơn 95% tổng số bài đăng, dẫn đến 15 trong số 26 cặp ngôn ngữ như trong Bảng 1. Các tài liệu cho nghiên cứu có sẵn trực tuyến. d


Bảng 1. Bài viết theo cặp ngôn ngữ

tiêu chí truy vấn. Chúng tôi đã sử dụng BigQuerye để truy vấn cơ sở dữ liệu SOTorrent và sử dụng các tiêu chí lọc sau để nắm bắt các bài đăng tiềm năng mà các lập trình viên đang đặt câu hỏi về một ngôn ngữ mới [mục tiêu] đến từ một ngôn ngữ trước đó [nguồn]

  1. Câu hỏi được gắn thẻ với cả hai ngôn ngữ, hoặc
  2. Câu hỏi được gắn thẻ ngôn ngữ nguồn nhưng chứa văn bản của ngôn ngữ đích trong tiêu đề hoặc nội dung, ngược lại

Phân tích. Để hiểu liệu có xảy ra giao thoa ngôn ngữ hay không, chúng tôi đã thực hiện kiểm tra thủ công các bài đăng trên Stack Overflow [xem Bảng 1]. Chúng tôi đã kiểm tra một mẫu ngẫu nhiên gồm 30 bài đăng cho mỗi cặp để giữ cho việc phân loại có thể quản lý được, như được thực hiện trong các tác phẩm của Barik et al. 3 Chúng tôi đã loại trừ thủ công các bài đăng không tạo ra bất kỳ mối liên hệ rõ ràng nào giữa các ngôn ngữ của từng cặp, lấy mẫu một bài đăng ngẫu nhiên khác để thay thế nếu cần. Vì các tiêu chí bao gồm và loại trừ có thể có nhiều cách hiểu, hai đồng tác giả đầu tiên đã gắn nhãn một mẫu ngẫu nhiên gồm 30 bài đăng. Việc gắn nhãn này có sự đồng ý 100% giữa các đồng tác giả và gợi ý cách hiểu rõ ràng về cách phân loại bài đăng. Hai đồng tác giả đã tiến hành gắn nhãn phần còn lại của bài viết Stack Overflow bằng cách sử dụng hai cách phân loại

  • Chính xác. Bài đăng tạo kết nối với ngôn ngữ lập trình trước đó với các giả định chính xác về ngôn ngữ đích như được tiết lộ bởi câu trả lời được chấp nhận hoặc
  • Không đúng. Bài đăng tạo kết nối với ngôn ngữ lập trình trước đó với các giả định không chính xác về ngôn ngữ đích như được tiết lộ bởi câu trả lời được chấp nhận

Tiếp theo, chúng tôi đã tính toán và đạt được thỏa thuận về độ tin cậy giữa các bên [IRR] giữa hai đồng tác giả [Cohen's k = 0. 89]. Những bất đồng về cách phân loại - ngay cả sau khi thảo luận - đã được tác giả đầu tiên hòa giải. Cuối cùng, chúng tôi đã tính toán tỷ lệ phần trăm bài đăng đúng và sai, sử dụng các trường hợp giả định đúng và sai làm bằng chứng về sự can thiệp và hỗ trợ giữa các ngôn ngữ

2. 3. giai đoạn hai. Học thiết kế phỏng vấn lập trình viên chuyên nghiệp

Để trả lời RQ2 và RQ3, chúng tôi đã tiến hành phỏng vấn bán cấu trúc với các lập trình viên chuyên nghiệp

Những người tham gia. Chúng tôi đã sử dụng phương pháp lấy mẫu có mục đích21 để tuyển dụng 16 lập trình viên chuyên nghiệp đang học một ngôn ngữ lập trình mới trong vòng sáu tháng qua [xem Bảng 2]; . Những người tham gia [12 nam, 4 nữ, tự báo cáo] đến từ các công ty phần mềm, công nghệ và phân tích dữ liệu lớn với nhiều năm kinh nghiệm lập trình từ 5 đến 31 năm [μ = 12. 8, sd = 6. 6]. Có tổng cộng 14 chuyển đổi ngôn ngữ độc đáo. Trước cuộc phỏng vấn, những người tham gia đã hoàn thành một bảng câu hỏi cơ bản hỏi họ về ngôn ngữ trước đây của họ và một trở ngại mà họ đã gặp phải khi thích nghi với ngôn ngữ mới


ban 2. Những người tham gia

giao thức. Chúng tôi đã thực hiện các cuộc phỏng vấn bán cấu trúc tại chỗ hoặc từ xa, trong khoảng thời gian 60 phút. Hai trong số các tác giả đã thực hiện và ghi âm các cuộc phỏng vấn riêng biệt. Tất cả các phiên được thực hiện với một người quan sát và một lập trình viên duy nhất về các chủ đề sau. [1] nền tảng của người tham gia, [2] bước đầu tiên, [3] trở ngại, [4] quá trình học tập và [5] chiến lược chung. Thông tin cơ bản từ bảng câu hỏi được sử dụng để điều chỉnh các câu hỏi cho những người tham gia. Định dạng phỏng vấn bán cấu trúc cho phép linh hoạt đặt câu hỏi ngẫu hứng và tìm hiểu sâu hơn về những trở ngại cụ thể hơn. Các bản ghi âm sau đó đã được tác giả đầu tiên sao chép để phân tích

Phân tích. RQ2. Làm thế nào để các lập trình viên có kinh nghiệm học ngôn ngữ mới? . sao chép các cuộc phỏng vấn, tạo mã mở bằng cách dán nhãn các tuyên bố định kỳ đáng chú ý của những người tham gia, xác định mối quan hệ giữa các mã và sắp xếp chúng thành các chủ đề có ý nghĩa

RQ3. Các lập trình viên có kinh nghiệm thấy khó hiểu gì trong các ngôn ngữ mới?

Trở lại đầu trang

3. Kết quả

3. 1. RQ1. Giao thoa ngôn ngữ có xảy ra không?

Giao thoa giữa các ngôn ngữ xảy ra trên Stack Overflow trên các cặp ngôn ngữ khác nhau. Chúng tôi đã tìm thấy tổng cộng 276 trường hợp giả định không chính xác [xem Bảng 1], chiếm khoảng 61% trong số 450 bài đăng được kiểm tra. Có tổng cộng 174 bài đăng với các giả định được nêu chính xác, chỉ chiếm khoảng 39% tổng số bài đăng. Điều quan trọng cần lưu ý là điều này cung cấp bằng chứng về sự can thiệp xảy ra nhưng không có nghĩa là các lập trình viên có giả định sai trong 61% thời gian. Cặp đôi này có số lượng bài viết giả định sai cao nhất, điều này phản ánh sự nhầm lẫn của lập trình viên Java đã đề cập trong Phần 1. Hai cặp tiếp theo và , cũng chứa nhiều giả định sai. Tuy nhiên, có những cặp khác, chẳng hạn như , và , có số lượng bài đăng phân phối đồng đều hơn với các giả định đúng và sai; . Mặc dù đã xem lại 450 bài viết về Stack Overflow, chúng tôi đã gặp phải các trường hợp ngôn ngữ lập trình hoạt động theo những cách đáng ngạc nhiên đối với các lập trình viên. Chúng tôi nhấn mạnh ba ví dụ, hai trong số đó liên quan đến sự giao thoa giữa cú pháp và khái niệm, và một ví dụ liên quan đến sự hỗ trợ—làm cho việc sử dụng suy luận kiểu trở nên dễ dàng hơn

Sự can thiệp. R ⇒ Pythonf

Một lập trình viên R hiện đang sử dụng Python và thư viện xử lý dữ liệu của nó, Pandas. Họ không thể liên hệ thành công kiến ​​thức trước đây của họ về tập hợp con, trong R, với Python. "Tôi thực sự bối rối. Có lẽ tôi đang suy nghĩ quá nhiều về thuật ngữ R và không thể hiểu được những gì đang diễn ra trong Python. "

Họ trình bày biểu thức R mà họ muốn dịch, cũng như một số bản dịch đã thử bằng Python

# R

data[data$x > value, y] value] = 1

Một số khái niệm trong R đã can thiệp, nhưng chúng tôi sẽ nêu bật ý nghĩa quan trọng nhất. Python ngăn việc gán cho các bản sao của khung dữ liệu. Trong trường hợp này, thao tác lập chỉ mục data ['y'] trả về một bản sao của khung dữ liệu và đặt giá trị bằng [data ['y'] > value] = 1 sẽ không hoạt động như lập trình viên R mong đợi. Biết rằng biểu thức R tương đương sẽ đặt giá trị 1 mà không có bất kỳ cảnh báo nào can thiệp vào cảnh báo của Python

Sự can thiệp. PHP ⇒ JavaScriptg

Một lập trình viên PHP đã chuyển sang lập trình bằng JavaScript hỏi cách lưu trữ thông tin tạm thời [phiên], chẳng hạn như trạng thái ứng dụng về người dùng. Thông thường, PHP sử dụng các biến phiên phía máy chủ [$_SESSION] cho mục đích này. Mặc dù tồn tại các khái niệm liên quan, chẳng hạn như bộ nhớ cục bộ và phiên dựa trên trình duyệt, lập trình viên được cảnh báo rằng các phiên không thể được lưu trữ trực tiếp một cách an toàn và bảo mật trên máy khách—kiến thức của lập trình viên về các phiên phía máy chủ dẫn đến một giả định sai lầm về khả năng ứng dụng của chúng trong các phiên khác.

Sự can thiệp. Java ⇒ Kotlin

Một nhà phát triển Java đang học Kotlin. Họ hỏi liệu biểu thức Kotlin sau có thể được đơn giản hóa không

final0

Nhà phát triển nghi ngờ phần khai báo của họ dài dòng hơn mức cần thiết, dựa trên kiến ​​thức của họ về suy luận kiểu biến cục bộ trong Java. Họ cho rằng việc khai báo có thể được đơn giản hóa

val boundsBuilder = LatLngBounds. Người xây dựng[]

Đây là một ví dụ về sự hỗ trợ—câu trả lời được chấp nhận xác nhận rằng nhà phát triển có thể đơn giản hóa biểu thức vì Kotlin hỗ trợ suy luận kiểu, cho phép loại bỏ khai báo kiểu rõ ràng

Những ví dụ này minh họa cách kiến ​​thức cũ về cú pháp ngôn ngữ và các khái niệm tương tác với kiến ​​thức đã học trong một ngôn ngữ mới. Trong một số trường hợp, điều này dẫn đến nhiễu, gây hại cho khả năng nắm bắt cú pháp và khái niệm mới của lập trình viên trong ngôn ngữ mới. Trong các trường hợp khác, điều này dẫn đến sự thuận lợi, giúp các lập trình viên tạo ra các kết nối có ý nghĩa với các ngôn ngữ trước đó và giúp họ học ngôn ngữ mới

Sự can thiệp giữa các ngôn ngữ xảy ra trên các quá trình chuyển đổi ngôn ngữ khác nhau trên các bài đăng trên Stack Overflow. Chúng tôi nhận thấy rằng 61% trong số 450 bài đăng chứa các giả định không chính xác về ngôn ngữ đích và chỉ 39% chứa các giả định đúng

3. 2. RQ2. Làm thế nào để các lập trình viên có kinh nghiệm học ngôn ngữ mới?

Trong phần này, chúng tôi trình bày các chủ đề về cách các lập trình viên có kinh nghiệm học ngôn ngữ mới

Lập trình viên tự học ngôn ngữ. Các lập trình viên chuyển nhóm không được đào tạo bài bản về ngôn ngữ mới và hệ thống công nghệ liên quan của nó, khiến họ phải tự học. Ví dụ: khi P1 chuyển từ C# sang Python cho một dự án mới, không có bất kỳ khóa đào tạo nào liên quan và quy trình giới thiệu là "này, chúng tôi muốn tiếp xúc với thế giới Python, hãy bắt đầu. " Mặc dù một số lập trình viên đã được đào tạo ban đầu về dự án, "thực tế để học ngôn ngữ mới [họ] đã phải tự [họ] làm khá nhiều việc" [P7]. Điều này buộc các lập trình viên phải xem "video hướng dẫn ngôn ngữ trên Plural-sight"i [P5] hoặc đọc tài liệu trực tuyến. Một số lập trình viên "đã nhận được lời khuyên ban đầu từ một số người trong nhóm về cái gì là cái gì" [P6] và khi gặp phải các vấn đề phức tạp, "đã liên hệ với nhóm và nói rằng trước đây đã có ai đó xử lý vấn đề này chưa?"

Just-in-time learning là một chiến lược vượt trội. Để học ngôn ngữ mới, mọi lập trình viên mà chúng tôi phỏng vấn đều sử dụng phương pháp học đúng lúc,8 một chiến lược cơ hội chỉ tập trung vào việc học các tính năng khi cần thiết. Do hạn chế về thời gian, các lập trình viên đã sử dụng các tài nguyên có sẵn ngay lập tức như tài liệu trực tuyến, hướng dẫn bằng video, tìm kiếm trực tuyến và các chuyên gia có sẵn. Các tài nguyên truyền thống như sách ngôn ngữ lập trình chỉ được sử dụng làm tài liệu tham khảo, bởi vì các lập trình viên "không có thời gian để làm điều đó" [P5]. Lập trình viên chủ yếu quan tâm đến việc hoàn thành công việc trong thời gian hợp lý và "tìm cách để không đốt hàng tấn thời gian cho một bài toán" [P1]. Các tài nguyên nhanh hơn, chẳng hạn như cheat sheet, được ưu tiên cho việc chuyển đổi ngôn ngữ. Ví dụ: điều đầu tiên P2 làm là sử dụng cheat sheet để giúp họ chuyển từ Python sang Julia. P15 cũng là một fan hâm mộ của cheat sheet

Có vẻ như nếu bạn đang đi từ khuôn khổ này sang khuôn khổ khác, từ ngăn xếp công nghệ này sang ngăn xếp công nghệ khác—ngay cả khi bạn không đi từ A đến B, thì bạn chỉ mới bắt đầu từ B—có thể có một bảng gian lận nội dung mà mọi nhà phát triển . [P15]

Lập trình viên liên quan, ngôn ngữ mới cho các ngôn ngữ trước đó. Để giúp đẩy nhanh quá trình học tập, các lập trình viên thường cố gắng liên hệ ngôn ngữ mới với ngôn ngữ trước đây của họ. Các lập trình viên bắt đầu bằng cách "lấy một cách lỏng lẻo các ý tưởng từ việc làm việc trong một ngôn ngữ khác" [P14] hoặc xem mã hiện có bởi vì "nó có thể đã được viết sẵn và nó ở đâu đó hoặc ít nhất là một cái gì đó gần với nó" [P1]. Mặc dù chiến lược học tập này rất hữu ích cho quá trình khởi động, nhưng một số lập trình viên đã bắt đầu từ đầu. Ví dụ: khi chuyển từ C# sang Ruby, P11 đã mô tả "cố gắng hết sức thận trọng và lưu tâm và cố gắng không lập bản đồ bất cứ thứ gì, mà chỉ coi mọi thứ như một thứ hoàn toàn mới. " Tương tự, P12 giải thích rằng họ không cố gắng ánh xạ mọi thứ từ Python khi học SAS "chủ yếu là vì cú pháp quá mới nên mỗi khi [họ] cố gắng làm bất cứ điều gì, [họ] sẽ phải tra cứu cú pháp trên google. " P10 bày tỏ vấn đề tương tự khi tìm hiểu về quản lý bộ nhớ trong Rust sau nhiều năm sử dụng C#. "không có cách nào sạch sẽ để tôi đến đó. Tôi đã phải đi và học những thứ đó từ đầu. " Những ví dụ này minh họa rằng các lập trình viên thường cố gắng sử dụng lại kiến ​​thức [tạo thuận lợi], nhưng đôi khi tránh làm như vậy khi nó rắc rối hơn

Các lập trình viên sử dụng chiến lược học tập theo cơ hội, liên hệ cú pháp và khái niệm của ngôn ngữ mới với ngôn ngữ trước đó của họ. Điều này mang lại sự tiện lợi nhưng gây nhiễu khi có sự khác biệt lớn giữa hai ngôn ngữ

3. 3. RQ3. Các lập trình viên có kinh nghiệm thấy khó hiểu gì trong các ngôn ngữ mới?

Trong phần này, chúng tôi trình bày các chủ đề giải thích cách các lập trình viên nhầm lẫn giữa các khái niệm ngôn ngữ

Thói quen cũ khó thay đổi. Các lập trình viên đã phải liên tục loại bỏ những thói quen cũ có được từ các ngôn ngữ trước đó. Ví dụ: P3—người đã quen với Python—gặp sự cố khi thích ứng với các dấu phân cách khối trong PHP, trong đó "gần như không thể tìm ra chính xác bạn đang đóng dấu ngoặc mở nào sau khi HTML/PHP của bạn đạt đến độ phức tạp nào đó. " Tương tự, P15 nhận ra rằng "trong Swift, dấu ngoặc nhọn mở cần phải ở dòng đầu tiên của khai báo phương thức và nếu bạn đặt nó ở dòng tiếp theo, phương thức có thể không thực thi theo cách mong muốn. " Sự khác biệt như lập chỉ mục 0 so với 1 cho danh sách giữa các ngôn ngữ như Python và R đã gây ra sự thất vọng cho P4. "gõ final1 nghĩ rằng đó là final2, và sau đó lãng phí 5 phút chẳng hạn như một kẻ ngốc hoàn toàn không hiểu tại sao không có ý nghĩa gì. " Các lập trình viên có thể giải quyết những khác biệt nhỏ này, nhưng nó vẫn gây trở ngại khi bắt đầu học một ngôn ngữ mới

Cần phải thay đổi tư duy khi chuyển đổi mô hình. Một số quá trình chuyển đổi ngôn ngữ đòi hỏi những thay đổi cơ bản trong tư duy, hay "sự thay đổi tư duy". "1 Ví dụ, khi P2 chuyển từ Python sang Julia, họ liên tục cố gắng tạo một đối tượng và nhận ra rằng "không có đối tượng, chỉ có cấu trúc. " Với Julia, họ cần viết nhiều mã chức năng hơn, một bước chuyển từ lập trình hướng đối tượng mà họ đã quen thuộc với Python. "chỉ cần thay đổi điều đó và nhận ra rằng tôi sẽ không bao giờ hoặc hiếm khi viết 'cái-gì-chấm-cái-gì-khác'. " P10 đã phải suy nghĩ lại hoàn toàn về các vấn đề mà họ đã giải quyết trong C# khi chuyển sang Rust do tính năng sở hữu để đảm bảo an toàn cho bộ nhớ

Một điều thực sự thú vị khi học Rust là khi tôi bắt đầu làm những việc này—những việc mà tôi sẽ đạt được trong C# mà tôi biết là sẽ hiệu quả—Rust không cho phép điều đó và kết quả là tôi phải suy nghĩ lại vấn đề và . [P10]

Những thay đổi lớn về mô hình đã xảy ra đối với P5, P6 và P13—tất cả đều chuyển đổi từ mã hóa mệnh lệnh hoặc hướng đối tượng sang mã hóa hướng sự kiện và không đồng bộ—buộc họ phải suy nghĩ khác đi. Các lập trình viên phải học các khái niệm hoàn toàn mới trong JavaScript như lập trình bất đồng bộ hay "DOM bóng tối và ảo" [P13]. P6 đã mô tả việc hiểu mã không đồng bộ khó như thế nào bởi vì "bạn có cả đống chế độ final3' đang hoạt động trong đầu và bạn phải chuyển đổi nó. " Tệ hơn nữa, "phần khó hiểu nhất là có một số cách để thực hiện lập trình không đồng bộ, với các quan sát hoặc lời hứa" [P13]. Đối với P5, code front-end trong TypeScript là một thách thức lớn vì "đối với back-end, code tôi nghĩ đơn giản hơn. Bạn có logic và rất có thể bạn biết những nơi duy nhất bạn sẽ xử lý nó. Nó không giống như giao diện người dùng. " Ở đây, các vấn đề nhiễu không phải do bất kỳ cú pháp hay khái niệm cụ thể nào mà do cách một người giải quyết vấn đề trong ngôn ngữ mới

Học một ngôn ngữ khó khăn khi có rất ít hoặc không có sự liên kết với các ngôn ngữ trước đó. Các lập trình viên gặp khó khăn hơn khi học ngôn ngữ mới khi có rất ít hoặc không có ánh xạ các tính năng sang các ngôn ngữ trước đó. Ví dụ: P12 không thể hiểu được một số tính năng ngôn ngữ lập trình cơ bản của SAS rõ ràng trong Python, chẳng hạn như câu lệnh so với tham số phương thức. Họ không thể hiểu "tại sao một số thứ là các câu lệnh ảnh hưởng đến một thủ tục, nhưng không phải là các tham số" và "vẫn còn nhầm lẫn về cú pháp tổng thể và đâu là hoặc không phải là một câu lệnh"—ngay cả sau khi đã làm việc với ngôn ngữ này trong một thời gian dài. . Một ví dụ điển hình là P5, người đã trải qua một quá trình chuyển đổi lớn từ C++ sang TypeScript, dẫn đến cú sốc công nghệ. "Mọi thứ đều khác nhau. Không chỉ ngôn ngữ lập trình—IDE, kiểm soát nguồn, mọi thứ đều khác. " Tương tự, P13 nhận thấy rằng các khái niệm là thách thức trong JavaScript vì chúng "không thể đánh đồng nó trở lại với C++. "

Trong trường hợp cực đoan, các lập trình viên buộc phải học cú pháp hoặc khái niệm hoàn toàn xa lạ. Ví dụ: P9 gặp khó khăn khi học các đặc điểm trong Scala vì chúng "chưa bao giờ có ngôn ngữ có đặc điểm trước đây. Các đặc điểm có cách triển khai mặc định và hiểu được điều gì sẽ hiệu quả và điều gì không—và khi nào thì sử dụng điều gì—đó là phần phức tạp. " P7 đã học được điều đó đối với Python, "sự khác biệt chính là tính đa thừa kế, mà Python kế thừa từ thế giới C++, hỗ trợ đa kế thừa. Trong C# bạn không thể làm điều đó. " Trong một trường hợp khác, khó khăn là do sự khác biệt trong quản lý bộ nhớ, chẳng hạn như khi P10—người trước đây đã sử dụng C#—đang học Rust

Có một khái niệm rất xa lạ trong Rust đó là trình kiểm tra mượn, đó là khái niệm để trình biên dịch xác minh nhiều thứ hơn và cách thức hoạt động của nó hơi bí truyền. Điều đó rất xa lạ và đó là điều mà tôi nghĩ là thực sự tuyệt vời nhưng nó cũng rất khó khăn vào lúc này và vì vậy đó là điều mà tôi gặp khó khăn nhất khi cố gắng học Rust. [P10]

Việc thiếu ánh xạ gây ra nhiều nhầm lẫn ngay cả trong cùng một bối cảnh. Ví dụ: P14, người đã chuyển từ một ngôn ngữ phân tích dữ liệu [R] sang một ngôn ngữ khác [Python/Pandas], không thể tìm thấy một ngôn ngữ tương đương ngay lập tức cho các hàm final4 và final5 của R. "Gấu trúc đã có chức năng nhưng nó bị ẩn nhiều hơn khi sử dụng cấp độ thả và giải nén. Những điều này thực sự khó hiểu trong Pandas—đó là một số thứ khá kỳ lạ. " Tương tự, P15, người đã chuyển từ C# sang Swift, đã rất ngạc nhiên khi biết mã giao diện người dùng và chế độ xem bố cục đồ họa của nó trong Xcode được kết nối như thế nào. "Biết rằng bạn không thể tương tác với một đối tượng giao diện người dùng ngay lập tức từ mã là rất quan trọng. Khi bạn vẽ kết nối đầu ra tham chiếu giữa Chế độ xem và Bộ điều khiển, bạn có thể kích hoạt các phương thức và thuộc tính final6 như bạn mong đợi trong. thế giới mạng. "

Tìm kiếm đúng thuật ngữ và ví dụ mã là khó khăn. Chúng tôi nhận thấy rằng việc chuyển sang một ngôn ngữ lập trình mới khiến việc tìm kiếm thông tin về ngôn ngữ đó và các công nghệ liên quan trở nên khó khăn hơn. Các lập trình viên gặp khó khăn trong việc lấy từ vựng ngay cả trước khi thực hiện tìm kiếm. Đối với P12, tên của các cấu trúc giống nhau trong Python hơi khác so với SAS trong đó "khung dữ liệu là tập dữ liệu, hàng là quan sát, cột là biến. " Tìm kiếm rất khó vì một mặt, "chính độ rộng của các thư viện thường khiến bạn không biết cái gì tồn tại, thậm chí tìm kiếm cái gì để xem có thứ gì ở đó không" [P1]. Mặt khác, kết quả tìm kiếm không đầy đủ cung cấp rất ít hoặc không hỗ trợ. P4 gặp khó khăn khi tìm kiếm thông tin cho thư viện Python final7—so với thư viện R tương đương final8—bởi vì "đối với ggplot, nếu bạn tìm kiếm bất cứ thứ gì trên Google, bạn sẽ nhận được khoảng 100 lượt truy cập và những lượt truy cập hàng đầu chắc chắn là tốt do lựa chọn kết quả của Google. Với seaborn, bạn nhận được 10 lượt truy cập. "

Ngay cả khi các lập trình viên tìm thấy tài liệu và ví dụ về mã, chúng vẫn chưa đầy đủ hoặc thiếu chi tiết. P2 đã thất vọng với tài liệu của Julia vì "thật vô ích khi tìm ra các lần nhập. " Tương tự, P12 bày tỏ rằng tài liệu SAS "chỉ cho bạn biết cách sao chép-dán và chạy một chương trình đơn giản, khiến bạn hoàn toàn bối rối về cách thức hoạt động của quy trình thực thi và kiểm soát của một chương trình SAS. " Điều này dẫn đến sự thất vọng, đặc biệt là khi tài liệu tốt hơn tồn tại trong các ngôn ngữ trước đó. "Các mẫu tài liệu Xcode đủ tốt để chạy ở đâu. Nhưng tài liệu, MSDN và các mẫu có sẵn để tạo các ứng dụng dựa trên nền tảng của Microsoft sâu hơn, phong phú hơn và dễ sử dụng hơn gấp 10 lần. " [P15]

Trang bị lại là bước đầu tiên cần thiết và đầy thách thức. Cuối cùng, trước khi lập trình bằng ngôn ngữ mới, các lập trình viên gặp khó khăn trong việc trang bị lại bản thân trong một môi trường mới. Điều này thường liên quan đến việc thích ứng với sự khác biệt của môi trường phát triển tích hợp [IDE] mới để lập trình bằng ngôn ngữ. Mặc dù các lập trình viên có thể thích nghi với các tính năng cơ bản của IDE [tạo thuận lợi], nhưng vẫn có sự can thiệp khi một số khía cạnh của IDE khác với các IDE trước đây của họ. Ví dụ: P15 đã phát hiện ra rằng trong Xcode "các mục tiêu xây dựng không phải là 'Phổ quát' theo định nghĩa [như. NET] và khi các thuật ngữ được chia sẻ trên các nền tảng nhưng không triển khai cùng một khái niệm, bạn sẽ bị mất nhiều ngày. " Thật thú vị, đối với P9, đã có sự can thiệp khi họ cố gắng xây dựng dự án Scala của mình trong IntelliJ vì IDE đã cố gắng hỗ trợ Scala, nhưng vẫn tiếp tục trình bày các hộp thoại bằng ngôn ngữ trước đó

Một phần của vấn đề là IntelliJ nhắm đến nhà phát triển Java và tôi đang sử dụng SBT, từ thế giới Scala. Và đó là cách nhập SBT vào các khái niệm trong IDE của IntelliJ. Vì vậy, tôi đang xem các hộp thoại nói về Java và JDK nào và điều đó không ánh xạ tới những gì tôi đã viết bằng ngôn ngữ SBT khai báo. [P9]

Các mối quan tâm khác liên quan đến việc thiếu các tính năng IDE hoặc tìm hiểu các tính năng mới gây mất tập trung. P2 đã "làm hỏng Python và PyCharm" và rất khó tìm được hỗ trợ IDE thích hợp cho Julia; . " P1 nhận thấy rằng việc học một tính năng mới—chẳng hạn như trình gỡ lỗi—là phản tác dụng "bởi vì bạn đang học và gỡ lỗi cùng lúc thay vì chỉ gỡ lỗi khi bạn đã thành thạo. " Tuy nhiên, đôi khi việc chuyển đổi sang các công cụ mới trong ngôn ngữ cũng mang lại lợi ích cho các lập trình viên

Tôi nghĩ ngay bây giờ hệ thống xây dựng dành cho chúng tôi, tôi nghĩ sẽ tốt hơn vì hiện tại chúng tôi đang sử dụng DevOps—một quy trình để xây dựng mã. Chúng tôi thậm chí còn rất dễ dàng lên lịch xây dựng riêng và cũng rất dễ dàng để chúng tôi nhanh chóng nhận được những thứ mới, kiểm tra mã, kiểm tra và thậm chí xây dựng mọi thứ trên đó. [P5]

Các lập trình viên nhầm lẫn cú pháp và khái niệm của một ngôn ngữ mới với các ngôn ngữ trước đó, dẫn đến một số vấn đề như cố gắng loại bỏ thói quen cũ, vật lộn với các vấn đề về bản đồ, đấu tranh để tìm và sử dụng tài liệu phù hợp, trang bị lại và thay đổi tư duy của một người cho các mô hình mới

Trở lại đầu trang

4. Hạn chế

Cách tiếp cận theo phương pháp hỗn hợp của chúng tôi trong việc điều tra Stack Overflow và thực hiện các cuộc phỏng vấn đưa ra những hạn chế và đánh đổi nhất định

Phương pháp lấy mẫu của chúng tôi cho Stack Overflow nhắm đến tính đa dạng [chứ không phải tính đại diện] để xác định bằng chứng về sự can thiệp trên nhiều ngôn ngữ lập trình khác nhau. Các bài đăng mà chúng tôi đã kiểm tra trên Stack Overflow cũng như các cuộc phỏng vấn của chúng tôi không bao gồm hoàn toàn tập hợp tất cả các chuyển đổi ngôn ngữ, vì không gian hoán vị đầy đủ của các chuyển đổi ngôn ngữ là khó hiểu. Cách tiếp cận của chúng tôi cố gắng xử lý các chuyển đổi có nhiều khả năng xảy ra nhất trong thực tế, điều đó có nghĩa là chúng tôi có thể bỏ sót các vấn đề nhiễu khác

Chúng tôi đã sử dụng các giả định đúng và sai làm cấu trúc đại diện để hỗ trợ và can thiệp. Mặc dù cách tiếp cận này đã cung cấp một đặc tính hữu ích, ở mức cao của các bài đăng trên Stack Overflow, nhưng mã hóa mở—một kỹ thuật mã hóa định tính phức tạp hơn—có thể đã cung cấp những hiểu biết sâu sắc hơn. Tuy nhiên, mã hóa mở tốn kém hơn đáng kể để thực thi và chúng tôi đã thực hiện các cuộc phỏng vấn bán cấu trúc với các lập trình viên có kinh nghiệm để tìm hiểu sâu hơn về sự giao thoa giữa các ngôn ngữ

Cuối cùng, nghiên cứu định tính không chỉ liên quan đến dữ liệu định tính đang được điều tra mà còn ở mức độ chủ quan và diễn giải từ phía nhà nghiên cứu để đóng khung và tổng hợp kết quả. Để hỗ trợ hiệu lực diễn giải, chúng tôi đã thực hiện kiểm tra thành viên một sự kiện với kết quả của mình. sáu người tham gia đã trả lời đồng ý với cách trình bày kết quả của chúng tôi và chỉ muốn có những thay đổi nhỏ đối với phần trích dẫn của họ. Các lý thuyết khác như máy khái niệm, cũng có thể được sử dụng để xác định và giải thích những nhầm lẫn khi học một ngôn ngữ lập trình. 6

Trở lại đầu trang

5. Công việc liên quan

quan niệm sai lầm của người mới. Các lập trình viên thường có những quan niệm sai lầm khi học ngôn ngữ lập trình mới, nhưng hầu hết các nghiên cứu đều tập trung vào người mới. Swidan và cộng sự. 20 đề xuất "các phương pháp can thiệp để chống lại những quan niệm sai lầm đó càng sớm càng tốt", nhưng công việc này chủ yếu nhắm vào những người mới. Tương tự, Kaczmarczyk và cộng sự. 12 đã kiểm tra quan niệm sai lầm và cách đo lường chúng cho người mới. Ngược lại, tính mới trong công việc của chúng tôi là hướng tới những lập trình viên có kinh nghiệm, những người cần chuyển đổi ngôn ngữ và yêu cầu các phương pháp học khác với những phương pháp được thiết kế cho người mới. Nghiên cứu của chúng tôi đã điều tra việc chuyển đổi ngôn ngữ cho các lập trình viên có kinh nghiệm và kiểm tra xem kiến ​​thức về các ngôn ngữ trước đó can thiệp như thế nào khi học một ngôn ngữ khác

Chuyển đổi ngôn ngữ lập trình. Có một vài nghiên cứu về chuyển đổi giữa các ngôn ngữ lập trình. Scholtz và Wiedenbeck15 đã nghiên cứu các lập trình viên Pascal hoặc C có kinh nghiệm viết một chương trình bằng ngôn ngữ mới, Icon, và thấy rằng họ bị ảnh hưởng mạnh mẽ bởi kiến ​​thức của họ về những gì sẽ phù hợp trong các ngôn ngữ trước đó. Tương tự, Uesbeck và cộng sự. 22 đã nghiên cứu tác động của việc sử dụng nhiều ngôn ngữ [SQL và Java] trong một nghiên cứu có kiểm soát và mặc dù kết quả không thuyết phục, các tác giả cho rằng phương pháp thử nghiệm ngẫu nhiên có kiểm soát có thể hiệu quả để nghiên cứu chi phí năng suất liên quan đến việc trộn các ngôn ngữ. Đối với các can thiệp, Bower et al. 7 đã khám phá một phương pháp giảng dạy mới gọi là So sánh liên tục và rõ ràng [CAEC] để dạy Java, sử dụng sự hỗ trợ, cho những sinh viên có kiến ​​thức về C++. Họ phát hiện ra rằng sinh viên được hưởng lợi từ việc so sánh liên tục các khái niệm C++ với Java. Shrestha và cộng sự. 17 đã sử dụng một kỹ thuật tương tự bằng cách sử dụng một công cụ có tên là Transfer Tutor để dạy R từ quan điểm của Python; . Chúng tôi đã sử dụng lăng kính của lý thuyết giao thoa để phát hiện ra các vấn đề giao thoa trong bối cảnh hiện đại, kiểm tra nhiều quá trình chuyển đổi ngôn ngữ và phát hiện ra các vấn đề khác chưa được khám phá, chẳng hạn như ít hoặc không có ánh xạ các đặc điểm ngôn ngữ [Tiểu mục Học một ngôn ngữ rất khó khi có ít

Kiến thức lập trình. Các nhà nghiên cứu đã gợi ý rằng các kế hoạch lập trình có thể không khái quát hóa trên các ngôn ngữ khác nhau và các kế hoạch đó không thể đại diện cho cấu trúc sâu bên dưới của các chương trình. Các kế hoạch lập trình là các lược đồ được khởi tạo lần đầu tiên và sau đó các vị trí của nó được lấp đầy bằng các giá trị cụ thể khi lập trình viên xây dựng sự hiểu biết về mã. 19 Ví dụ, trong các tác phẩm của Bellamy và Gilmore,5 các tác giả đã kiểm tra các giao thức được tạo ra từ các chuyên gia thuộc các ngôn ngữ khác nhau khi họ tạo ra các chương trình, các chuyên gia ngôn ngữ lập trình khác nhau đã tạo ra các kiểu biểu diễn khác nhau. Chúng tôi tin rằng kết quả của chúng tôi cung cấp thêm thông tin chi tiết về lý do tại sao các kế hoạch có thể không khái quát hóa trên các ngôn ngữ. chúng tôi nhận thấy các lập trình viên có xu hướng liên kết một ngôn ngữ mới với các ngôn ngữ trước đó [Tiểu mục Liên quan đến lập trình viên, ngôn ngữ mới với các ngôn ngữ trước đó] [sử dụng lại các kế hoạch lập trình trước đó], nhưng do các vấn đề về nhiễu, các kế hoạch trước đó có thể cần sửa đổi đáng kể [Tiểu mục Học một ngôn ngữ

Trở lại đầu trang

6. Thảo luận và ý nghĩa

Phát hiện của chúng tôi chứng minh rằng sự can thiệp là một hiện tượng phổ biến, buộc các lập trình viên phải áp dụng các chiến lược học tập cơ hội, dưới mức tối ưu. Trong Stack Overflow, các trường hợp can thiệp được tìm thấy trên tất cả các ngôn ngữ lập trình mà chúng tôi đã điều tra. Hơn nữa, trong các cuộc phỏng vấn của chúng tôi, những người tham gia báo cáo rằng sự cản trở phát sinh thường xuyên khi họ học một ngôn ngữ mới—ví dụ, do phải loại bỏ các thói quen cũ từ các ngôn ngữ trước đó [Tiểu mục Thói quen cũ khó chết] hoặc phải "suy nghĩ lại về chương trình" [P10] do . Trái ngược với việc học "từng bước một" [P5], các lập trình viên có kinh nghiệm trong nghiên cứu của chúng tôi đã sử dụng các chiến lược cơ hội để học về cơ bản là "tự [của họ]" [P7] hoặc "học qua công việc" [P13], chẳng hạn như sử dụng . Thật không may, những cách tiếp cận không chính thức này để học đôi khi dẫn đến một lăng kính không hoàn chỉnh về cách thức hoạt động của ngôn ngữ, dẫn đến "lỗi không chủ ý" [P5] và các vấn đề khó chẩn đoán khác trong mã khi một số thứ không hoạt động như mong đợi

Trong phần còn lại của phần này, chúng tôi trình bày các hàm ý thiết kế cho các tác giả kỹ thuật, thợ chế tạo công cụ và nhà thiết kế ngôn ngữ lập trình có thể giúp giảm bớt một số vấn đề gây nhiễu này cho các lập trình viên

Hàm ý I—Thiết kế tài liệu giúp giảm nhiễu và hỗ trợ chuyển giao kiến ​​thức. Các lập trình viên trong nghiên cứu của chúng tôi mong muốn các nguồn tài nguyên dễ tiếp cận hơn để tận dụng kiến ​​thức lập trình mà họ đã có [Các tiểu mục Học đúng lúc là chiến lược chủ đạo và liên quan đến Lập trình viên, ngôn ngữ mới so với các ngôn ngữ trước đây]. Những tài nguyên như vậy bao gồm "cheat sheet", trình bày các đoạn mã ánh xạ ngôn ngữ quen thuộc của họ sang ngôn ngữ mới của họ [P2] và liên hệ các khái niệm mà họ đã biết "khi làm việc bằng ngôn ngữ khác" [P14], với các hướng dẫn ngôn ngữ mới và thậm chí là dùng đến . Phát hiện của chúng tôi cho thấy rằng các tài nguyên dạy ngôn ngữ thông qua việc liên hệ một ngôn ngữ mới với một ngôn ngữ đã biết sẽ hữu ích và dễ tiếp cận hơn đối với các lập trình viên so với các tài nguyên trình bày ngôn ngữ lập trình mới một cách cô lập

Tuy nhiên, những tài nguyên này được làm thủ công bằng cách sử dụng trực giác của tác giả về những quan niệm sai lầm tiềm ẩn và không nhất thiết là những quan niệm mà các lập trình viên thực sự có. Mặc dù đã có nghiên cứu trước đây về những quan niệm sai lầm về lập trình viên mới làm quen,12 quan niệm sai lầm về lập trình viên có kinh nghiệm tương đối ít được nghiên cứu. Shrestha và cộng sự. 18 đã trình bày ba thiết kế công cụ khả thi có thể được sử dụng để khám phá và xác thực những quan niệm sai lầm khi chuyển đổi ngôn ngữ dành cho các lập trình viên có kinh nghiệm. Nghiên cứu như vậy là cần thiết để làm cho tài nguyên học tập hiệu quả hơn và phù hợp hơn với các lập trình viên có kinh nghiệm

Hàm ý II—Xây dựng các công cụ tự động để cung cấp phản hồi theo yêu cầu. Các công cụ tự động có thể giúp các lập trình viên tránh được việc thay đổi ngữ cảnh liên quan đến việc đọc tài liệu kỹ thuật bằng cách cung cấp thông tin trong môi trường chương trình của họ khi họ làm việc [Các tiểu mục Học vừa phải là một chiến lược nổi bật và việc tìm kiếm các ví dụ mã và thuật ngữ phù hợp rất khó]. Ví dụ, Johnson và cộng sự. 11 đề xuất các công cụ thông báo "bespoke" cung cấp phản hồi thích ứng cho lập trình viên dựa trên kiến ​​thức trước đó của lập trình viên về các khái niệm và ngôn ngữ lập trình. Python 3 áp dụng ý tưởng sử dụng kiến ​​thức lập trình viên trước đó để hỗ trợ các lập trình viên có nền tảng Python 2, thông qua các thông báo lỗi được mã hóa cứng

final9

,0

,1

,2

,3

,4

Thông báo ,5 đưa ra giả định rằng lỗi này là do một quan niệm sai lầm [in dưới dạng một câu lệnh] thấm nhuần từ kinh nghiệm với Python 2. Chúng ta có thể sử dụng lại ý tưởng này nói chung để chuyển đổi ngôn ngữ và giúp các lập trình viên giải quyết các thông báo lỗi hiệu quả hơn

Hàm ý III—Hãy cố ý về cú pháp, ngữ nghĩa và ngữ dụng của ngôn ngữ lập trình. Một số ngôn ngữ lập trình dự đoán rằng những người dùng mới sẽ đến thông qua các con đường chung. Chúng tôi mong đợi hầu hết người dùng Rust mới đến từ các ngôn ngữ lập trình hệ thống như C++ và chúng tôi mong đợi hầu hết người dùng TypeScript mới đến trực tiếp từ JavaScript. Đối với những người dùng này, việc thiết kế có chủ ý các tính năng của ngôn ngữ bằng cách xem xét các hiệu ứng giao thoa có thể giảm bớt các rào cản [Các tiểu mục Cần thay đổi tư duy khi chuyển đổi mô hình và Học một ngôn ngữ khó khăn khi có ít hoặc không có ánh xạ với các ngôn ngữ trước đó] để áp dụng ngôn ngữ lập trình mới

Tuy nhiên, thiết kế ngôn ngữ lập trình cho các lộ trình chung đòi hỏi thiết kế cẩn thận. Ví dụ: trình kiểm tra mượn—một tính năng thời gian biên dịch giúp thực thi quản lý bộ nhớ an toàn25—tạo ra một rào cản đáng kể đối với người dùng Rust mới và là "một khái niệm rất xa lạ" [P10]. Trình kiểm tra mượn có vẻ tương tự như các mô hình hiện có, chẳng hạn như "thu thập tài nguyên là khởi tạo" [RAII], trong C++, nhưng cuối cùng hoạt động đủ khác để nó có thể can thiệp vào kiến ​​thức trước đây của các lập trình viên khác. Một ví dụ khác, TypeScript được thiết kế để cung cấp tính năng gõ tĩnh cho JavaScript và giảm nhu cầu viết lại mã để quá trình chuyển đổi mượt mà hơn. Nhưng cung cấp quá trình chuyển đổi suôn sẻ này có một hậu quả tốn kém. "hệ thống loại TypeScript không phải là âm thanh tĩnh theo thiết kế. "

Để cải thiện khả năng sử dụng ngôn ngữ lập trình, chúng tôi cần xem xét cách các quyết định thiết kế ngôn ngữ của chúng tôi can thiệp hoặc tạo điều kiện thuận lợi cho kiến ​​thức trước đây của các lập trình viên dự đoán của chúng tôi

Hàm ý IV—Không chỉ hỗ trợ các ngôn ngữ lập trình mà cả hệ sinh thái ngôn ngữ lập trình. Vấn đề nhiễu khi học ngôn ngữ lập trình mới càng trở nên trầm trọng hơn khi ngôn ngữ lập trình mới mang theo hệ sinh thái ngôn ngữ lập trình mới – nghĩa là “mọi thứ đều khác, không chỉ ngôn ngữ lập trình” [P5] mà cả môi trường mà lập trình viên xây dựng, chỉnh sửa.

Để giải quyết những thách thức này, chúng tôi khuyên các thợ chế tạo công cụ và nhà thiết kế ngôn ngữ xây dựng các công cụ để khởi động các lập trình viên hoặc thống nhất môi trường công cụ. Ví dụ: các nhà phát triển React cung cấp hỗ trợ công cụ để chào đón các lập trình viên vào hệ sinh thái mới. Cụ thể, ,610, j là một chuỗi công cụ tích hợp giúp loại bỏ sự phức tạp của việc quản lý thư viện bên thứ ba, chỉnh sửa trực tiếp, tối ưu hóa và cấu hình. ,6 cho phép người dùng bắt đầu thử nghiệm thư viện một cách nhanh chóng và dễ dàng cho đến khi lập trình viên đủ thoải mái để thoát khỏi chuỗi công cụ ,6. Thay vì cung cấp công cụ tùy chỉnh và trải nghiệm chỉnh sửa cho IDE, chúng tôi đề xuất các giải pháp như giao thức máy chủ ngôn ngữ [LSP],k cho phép hỗ trợ ngôn ngữ lập trình được triển khai và phân phối độc lập với bất kỳ trình soạn thảo hoặc IDE cụ thể nào, miễn là IDE đó triển khai LSP

Nói tóm lại, các nhà thiết kế ngôn ngữ nên hợp tác với các nhà thiết kế công cụ để các lập trình viên có thể dễ dàng áp dụng các ngôn ngữ lập trình mới hơn thông qua các môi trường chỉnh sửa đã quen thuộc với họ.

Trở lại đầu trang

7. Sự kết luận

Trong nghiên cứu này, chúng tôi đã tiến hành một nghiên cứu theo nhiều phương pháp khác nhau để hiểu tác động của trải nghiệm ngôn ngữ lập trình trước đây đối với các lập trình viên. Chúng tôi đã tiến hành một nghiên cứu thực nghiệm về những quan niệm sai lầm được tìm thấy trong các câu hỏi về Stack Overflow trên 18 ngôn ngữ lập trình khác nhau và các cuộc phỏng vấn bán cấu trúc với 16 lập trình viên chuyên nghiệp. Từ Stack Overflow, chúng tôi đã tìm thấy 276 trường hợp nhiễu xảy ra trên nhiều ngôn ngữ. Sau đó, chúng tôi đã phỏng vấn các lập trình viên, những người đã báo cáo những thách thức khác nhau khi học một ngôn ngữ mới—chẳng hạn như trộn lẫn cú pháp và khái niệm với ngôn ngữ lập trình trước đó của họ—do sự can thiệp. Chúng tôi đã thảo luận về ý nghĩa thiết kế đối với các tác giả kỹ thuật, thợ rèn công cụ và nhà thiết kế ngôn ngữ, chẳng hạn như thiết kế tài liệu và xây dựng các công cụ tự động giúp giảm nhiễu, dự đoán các chuyển đổi ngôn ngữ không phổ biến trong quá trình thiết kế ngôn ngữ và chào đón các lập trình viên không chỉ tham gia vào một ngôn ngữ mà còn toàn bộ hệ sinh thái của ngôn ngữ đó. Để trả lời câu hỏi đặt ra ở phần mở đầu, ngay cả những lập trình viên chuyên nghiệp cũng gặp khó khăn khi học ngôn ngữ lập trình, và chúng ta nên cung cấp các công cụ và kỹ thuật để giúp họ học tập hiệu quả hơn

Trở lại đầu trang

Sự nhìn nhận

Tài liệu này một phần dựa trên công việc được hỗ trợ bởi Quỹ khoa học quốc gia dưới Grant Nos. 1559593, 1755762 và 1814798

Trở lại đầu trang

Người giới thiệu

1. Armstrong, Đ. J. , Hardgrave, B. C. Hiểu về học tập thay đổi tư duy. Quá trình chuyển đổi sang phát triển hướng đối tượng. MIS Q. 31, 3 [2007], 453–474

2. Baltes, S. , Treude, C. , Diehl, S. sotorrent. Nghiên cứu nguồn gốc, sự phát triển và cách sử dụng các đoạn mã tràn ngăn xếp. CoRR, abs/1809. 02814 [2018]

3. Barik, T. , Ford, D. , Murphy-Hill, E. , Parnin, C. Trình biên dịch nên giải thích các vấn đề cho nhà phát triển như thế nào?

4. Barragan, N. Kinh nghiệm của tôi khi học Rust. 2018

5. Bellamy, R. và D. Gilmore. kế hoạch lập trình. cấu trúc bên trong hoặc bên ngoài. dòng suy nghĩ. phản ánh tâm lý. Suy nghĩ 2, [1990], 59–72

6. Quả mọng, M. , Kolling, M. tình trạng chơi. Một cỗ máy đáng chú ý để học lập trình. Trong Kỷ yếu Hội nghị Đổi mới & Công nghệ trong Giáo dục Khoa học Máy tính năm 2014 [2014], Hiệp hội Máy tính. New York, NY, Hoa Kỳ, 21–26

7. Bower, M. , McIver, A. So sánh liên tục và rõ ràng để thúc đẩy tạo thuận lợi chủ động trong quá trình học ngôn ngữ máy tính thứ hai. Trong Kỷ yếu của Hội nghị chung thường niên lần thứ 16 về Đổi mới và Công nghệ trong Giáo dục Khoa học Máy tính, ITiCSE '11 [2011], Hiệp hội Máy tính. New York, NY, Hoa Kỳ, 218–222

8. Brandt, J. , Guo, P. J. , Lewenstein, J. , Dontcheva, M. , Klemmer, S. R. Hai nghiên cứu về lập trình cơ hội. Đan xen tìm kiếm, học tập và viết mã trên web. Trong Kỷ yếu Hội nghị SIGCHI về Yếu tố Con người trong Hệ thống Máy tính [2009], Hiệp hội Máy tính. New York, NY, Hoa Kỳ, 1589–1598

9. Braun, V. , Clarke, V. , Hayfield, N. , Terry, G. phân tích chuyên đề. Springer Singapore, Singapore, 2019, 843–860

10. Coelho, L. P. Tôi đã thử Haskell trong 5 năm và đây là kết quả, 2017

11. Johnson, B. , Pandita, R. , Murphy-Hill, E. , Heckman, S. công cụ riêng. thích ứng với các khái niệm mà các nhà phát triển biết. Trong Kỷ yếu của Cuộc họp chung lần thứ 10 năm 2015 về Nền tảng của Kỹ thuật phần mềm [2015], ACM, New York, NY, USA, 878–881

12. Kaczmarczyk, L. C. , Petrick, E. R. , Đông, J. P. , Herman, G. L. Xác định quan niệm sai lầm của sinh viên về lập trình. Trong Kỷ yếu của Hội nghị Chuyên đề Kỹ thuật ACM lần thứ 41 về Giáo dục Khoa học Máy tính [2010], ACM, New York, NY, USA, 107–111

13. Norvig, P. Python cho Lập trình viên Lisp, 2000

14. Paskvan, D. Tại sao lại là Coffeescript?, 2014

15. Scholtz, J. , Wiedenbeck, S. Học ngôn ngữ lập trình thứ hai và tiếp theo. Vấn đề chuyển nhượng. số nguyên. J. Hừm. –Máy tính. Tương tác. 2, 1 [1990], 51–72

16. Shankar, H. Tại sao việc học Lập trình hàm và đặc biệt là Haskell có thể khó, 2011

17. Shrestha, N. , Barik, T. , Parnin, C. Nó giống trăn nhưng. Hướng tới hỗ trợ chuyển giao kiến ​​thức ngôn ngữ lập trình. Năm 2018, Hội nghị chuyên đề của IEEE về Ngôn ngữ hình ảnh và Điện toán lấy con người làm trung tâm [VL/HCC] [2018], IEEE, Manhattan, NY, U. S. , 177–185

18. Shrestha, N. , Parnin, C. Thiết kế công cụ để xác nhận sự khác biệt về hành vi giữa các ngôn ngữ. Năm 2019 Hội nghị chuyên đề của IEEE về Ngôn ngữ hình ảnh và Điện toán lấy con người làm trung tâm [VL/HCC] [2019], IEEE, 205–209

19. Soloway, E. , Ehrlich, K. , Bonar, J. Khai thác kiến ​​thức lập trình ngầm. Trong Kỷ yếu Hội nghị về Yếu tố Con người trong Hệ thống Máy tính năm 1982, CHI '82 [1982], 52–57

20. Thụy Điển, A. , Hermans, F. , Smit, M. Quan niệm sai lầm về lập trình cho học sinh tiểu học. Trong Kỷ yếu Hội nghị ACM 2018 về Nghiên cứu Giáo dục Máy tính Quốc tế [2018], ACM, 151–159

21. Tongco, M. D. C. Lấy mẫu có mục đích như một công cụ để lựa chọn người cung cấp thông tin. Ethnobotany Res. ứng dụng. 5, [2007], 147–158

22. Uesbeck, P. M. , Stefik, A. Một thử nghiệm ngẫu nhiên có kiểm soát về tác động của lập trình đa ngôn ngữ trong bối cảnh cơ sở dữ liệu. trong T. Barik, J. Nắng, S. Chasins, biên tập viên, Hội thảo lần thứ 9 về Đánh giá và Khả năng Sử dụng của Ngôn ngữ Lập trình và Công cụ [PLATEAU 2018], tập 67 của Sê-ri OpenAccess trong Tin học [OASIcs] [2019], Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik, Dagstuhl, Đức, trang 1. 1–1. 8

23. Underwood, B. J. Can thiệp và lãng quên. tâm thần. Tái bản. 64, 1 [1957], 49

24. Walacik, B. Từ Java đến Kotlin và ngược lại, 2018

25. Zeng, A. , Crichton, W. Xác định các rào cản đối với việc áp dụng bệnh rỉ sắt thông qua diễn ngôn trực tuyến. Trong Hội thảo lần thứ 9 về Đánh giá và Khả năng Sử dụng của Ngôn ngữ Lập trình và Công cụ [2019], Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik, Dagstuhl, Đức, 15

Trở lại đầu trang

tác giả

Nischal Shrestha [nshrest@ncsu. edu], Đại học Bang NC Raleigh, NC, Hoa Kỳ

Colton Botta [cgbotta@ncsu. edu], Đại học Bang NC Raleigh, NC, Hoa Kỳ

Tít Barik [tít. barik@microsoft. com], Microsoft Redmond, WA, Hoa Kỳ

Chris Parnin [cjparnin@ncsu. edu], Đại học Bang NC Raleigh, NC, Hoa Kỳ

Trở lại đầu trang

©2022 ACM  0001-0782/22/3

Quyền tạo bản sao kỹ thuật số hoặc bản cứng của một phần hoặc toàn bộ tác phẩm này để sử dụng cho mục đích cá nhân hoặc lớp học được cấp miễn phí với điều kiện là các bản sao đó không được tạo ra hoặc phân phối vì lợi nhuận hoặc lợi thế thương mại và các bản sao đó có thông báo này và trích dẫn đầy đủ trên trang đầu tiên. Bản quyền cho các thành phần của tác phẩm này thuộc sở hữu của người khác ngoài ACM phải được tôn trọng. Tóm tắt với tín dụng được cho phép. Để sao chép theo cách khác, để xuất bản lại, đăng trên máy chủ hoặc phân phối lại vào danh sách, cần có sự cho phép và/hoặc phí cụ thể trước. Yêu cầu quyền xuất bản từ permissions@acm. org hoặc fax [212] 869-0481

Thư viện số được xuất bản bởi Hiệp hội máy tính. Bản quyền © 2022 ACM, Inc

Chuyển từ Python sang Java có khó không?

Học Java sau khi học Python có dễ hơn không? . Nhưng không phải vì Python mà vì việc học một ngôn ngữ lập trình mới sau khi bạn đã biết ngôn ngữ lập trình đó luôn dễ dàng hơn .

Java có khó hơn Python nhiều không?

Java và Python là hai ngôn ngữ lập trình phổ biến nhất. Trong hai ngôn ngữ này, Java là ngôn ngữ nhanh hơn nhưng Python đơn giản và dễ học hơn . Mỗi cái đều được thiết lập tốt, độc lập với nền tảng và là một phần của cộng đồng lớn, hỗ trợ.

Học Java sau Python có tốt không?

Vì vậy, không có gì lạ khi nhiều trường dạy học sinh lập trình bằng Python. Tuy nhiên, biết hai ngôn ngữ luôn tốt hơn một. Nếu bạn đang nghĩ đến việc học một ngôn ngữ thứ hai sau Python, thì Java có thể là một lựa chọn thực sự tốt .

3 tháng có đủ để học Java không?

Nhiệm vụ học Java chắc chắn có thể hoàn thành trong 3 đến 12 tháng , tuy nhiên, có nhiều sắc thái mà chúng ta sẽ thảo luận trong bài viết này. Ở đây chúng ta cũng sẽ cố gắng trả lời câu hỏi “làm thế nào để học Java nhanh”.

Chủ Đề