Bất kỳ ngôn ngữ lập trình nào cũng có thể được làm chủ dễ dàng nếu các nguyên tắc cơ bản của lập trình là mạnh mẽ. Một sự thật hay một huyền thoại? [đóng cửa]


33

Có đúng là một người có kiến ​​thức cơ bản khá tốt trong lập trình có thể dễ dàng học bất kỳ ngôn ngữ lập trình nào không?

Vâng, khi tôi nói ngôn ngữ lập trình, tôi đề cập đến các ngôn ngữ nhanh và năng động như PHP, Perl, Ruby, v.v. nhưng không phải là ngôn ngữ lập trình trước đây của quá khứ xa xôi.

Tôi đã chỉ làm việc trên java, Groovy và flex ở một mức độ nào đó. Vì vậy, xem xét thực tế rằng tôi là một lập trình viên nghiệp dư nhưng là một người học nhanh, trên cơ sở sơ bộ, sẽ mất bao lâu để có chỗ đứng trên bất kỳ ngôn ngữ nào như vậy?


1
Thay thế "Bất kỳ" bằng "Hầu hết".

4
Điều gì làm cho một ngôn ngữ 'nhanh nhẹn'? Tôi nghĩ nhanh nhẹn là một quá trình phát triển .
oosterwal

17
Làm chủ dễ dàng? Không học dễ dàng? Vâng. Mastery ngụ ý một trình độ chuyên môn đòi hỏi nhiều năm sử dụng trong bất kỳ ngôn ngữ nào. Học cách sử dụng bất kỳ ngôn ngữ nào một khi các nguyên tắc cơ bản của bạn được đưa ra.
Joel Etherton

1
Không, nó chỉ đúng với các ngôn ngữ similair. Biết Java sẽ không giúp bạn học Haskell, nhưng giúp bạn học C ++, v.v. Biết PHP sẽ không giúp bạn học lắp ráp, nhưng nó sẽ giúp bạn học Ruby.
iveqy

Câu trả lời:


46

Vâng, với các đặt phòng.

Bốn tuần trước, tôi sẽ nói rằng tôi có kỹ năng cấp độ chuyên nghiệp về C và C ++ và kỹ năng cấp độ nghiệp dư trong Java. Sếp của tôi đã yêu cầu tôi viết một số phần mềm bằng JavaScript, trong đó tôi không có kinh nghiệm và tôi đã đi.

Trong hai tuần tiếp theo, tôi đã đọc nhiều đoạn mã mẫu, tìm thấy tất cả các thư viện thú vị và viết chương trình của mình. Thế là xong, và nó hoạt động. Sau đó tuần trước tôi đã mua một cuốn sách JavaScript và tôi đã đọc nó, và chàng trai, tôi không biết mình đang làm gì. Bây giờ tôi đã hiểu tại sao các đối tượng của tôi lại hành động kỳ lạ như vậy.

Vì vậy, bây giờ tôi nói, tôi biết một chút JS. Tôi có thể đọc nó và làm việc với nó, nhưng tôi chắc chắn những gì tôi viết là không hiệu quả, khó đọc và không tuân theo các thực tiễn tốt nhất.

Nói chung, một người học nhanh có thể mất một tuần và bắt đầu sản xuất sản phẩm chất lượng thấp bằng ngôn ngữ mới. Nếu bạn biết Java, bạn có thể nhanh chóng chọn C, C ++, PHP, Python, JavaScript, nhưng chỉ đủ để sửa đổi mã hoặc viết các hàm được xác định rõ. (Perl có thể khó hơn vì regex rất phức tạp.) Để kiến ​​trúc sư một hệ thống theo ngôn ngữ mới, bạn có thể muốn có một năm phát triển chuyên nghiệp dưới những cố vấn có kinh nghiệm.


18
Tôi muốn nói rằng phải mất hai năm. Năm đầu tiên nên để lại cho bạn tương đối thành thạo, năm thứ hai nên để lại cho bạn tương đối hiệu quả.
Tim Post

4
Tôi đã có kinh nghiệm này nhiều năm trước (sau khi học khoảng một tá ngôn ngữ) ... Tôi phải làm việc ở Ada. Để viết mã trong Ada mất vài ngày. Để thực sự hòa mình vào không gian của các nhà thiết kế hệ thống ngôn ngữ / thời gian chạy và viết mã TỐT, phải mất một năm.
quick_now

1
Thành thật mà nói, tôi cũng học Java theo cách này. Tôi hiện đang ở mốc 1 năm và tôi sẽ nói "tương đối thành thạo" là chính xác.
Brad

1
Lý do là các nguyên tắc cơ bản của bạn, thậm chí mạnh mẽ có thể, chỉ là nơi không rộng. Nếu bạn đã biết về các ngôn ngữ khác, với các bao đóng, hiểu danh sách, các cấu trúc dữ liệu khác và các quy tắc phạm vi ohter trước jscript, bạn có thể đã gặp ít vấn đề hơn.
Peter

Tôi đã có một trải nghiệm tương tự với VB.net, cho đến khi tôi đọc đoạn mã mà ông chủ của tôi (với vài năm kinh nghiệm VB) đã viết ... trời ơi. Mã có mùi như mã trùng lặp có xu hướng siêu việt ngôn ngữ!
DisgruntledGoat

28

Về cơ bản câu trả lời là có ... và không ... nó phụ thuộc vào ý của bạn bởi những nguyên tắc cơ bản và thành thạo dễ dàng .

THỰC TẾ

  • Biết các nguyên tắc cơ bản của lập trình sẽ giúp bất kể ngôn ngữ. Theo nguyên tắc cơ bản ở đây tôi có nghĩa là những điều không cụ thể cho một mô hình nhất định. Những thứ như thuật toán, mức độ trừu tượng, sự cô lập, v.v.

  • Biết rõ các nguyên tắc cơ bản của một mô hình nhất định (OOP, functionnal, v.v.) sẽ giúp bạn dễ dàng học các ngôn ngữ hỗ trợ cho mô hình tương tự. Người ta có thể nói, biết một ngôn ngữ tốt sẽ cho phép bạn tiếp thu nhanh các ngôn ngữ của cùng một gia đình.

  • Với mỗi ngôn ngữ được học trong cùng một gia đình, ngôn ngữ tiếp theo sẽ giúp tôi dễ dàng hơn rất nhiều, tôi sẽ không ngạc nhiên nếu đường cong học tập này nhanh hơn theo cấp số nhân như bạn biết nhiều hơn.

MTH

  • Khi chuyển sang một mô hình khác mới biết rõ một ngôn ngữ của mô hình đầu tiên sẽ không hữu ích như học một ngôn ngữ trong cùng một gia đình. Trong thực tế, tùy thuộc vào sự khác biệt giữa chúng, trước tiên bạn có thể phải học một vài điều trước khi bạn có thể tiến về phía trước và thực sự mò mẫm mô hình mới.

--- chỉnh sửa phần cuối dựa trên ý kiến ​​---

Thực tế...

  • Biết một mô hình đầu tiên có thể giúp bạn học ...

nhưng

Chuyện hoang đường

  • Đừng tự phụ, nó cũng có thể làm bạn chậm lại hoặc không giúp được gì cho mô hình thứ ba.

tất cả đều tốt trừ cái cuối cùng thông thường, việc biết một ngôn ngữ lập trình thủ tục như C không giúp ích được gì khi cố gắng học một ngôn ngữ logic như Prolog, và trong trường hợp của tôi, nó đã cản trở, ví dụ: "Làm thế nào để tôi viết mã vòng lặp trong prolog?" ==> "A: bạn không".
Steven A. Lowe

2
Bằng chứng giai thoại tôi đã nghe ở đây và ở đó cho thấy rằng bạn có thể bắt đầu một người mới lập trình trên Scheme khá dễ dàng, nhưng sẽ khó hơn rất nhiều nếu họ đã lập trình bằng BASIC hoặc C # hoặc một cái gì đó tương tự trước tiên.
David Thornley

1
@Steven & David: Tôi không chắc lắm về cái cuối cùng đó. Tôi đã đi từ thủ tục đến Object sang chức năng nhưng chưa thử gia đình logic. Tôi đã tìm thấy nó dễ dàng hơn khi thời gian và kinh nghiệm đi nhưng không dám khái quát. Tôi sẽ sửa đổi câu trả lời dựa trên nhận xét của bạn.
Newtopian

14

cho bất kỳ ngôn ngữ tương tự , có

đối với các ngôn ngữ có mô hình hoàn toàn khác nhau, không quá nhiều

ví dụ: bạn biết C ++, bạn muốn học Java, miếng bánh; bạn biết VB.NET, bạn muốn học Prolog ... toàn bộ bánh, có thể là ba hoặc bốn bánh


1
Tôi đồng ý. Có một số ngôn ngữ chỉ theo một triết lý hoàn toàn khác nhau; do đó, việc chuyển đổi ví dụ từ ngôn ngữ bắt buộc như C sang ngôn ngữ lập trình logic như Prolog mà không cần nỗ lực là điều không quan trọng.
sakisk

4

Tôi tin rằng câu trả lời ngắn gọn là: "loại đúng nhưng khó kiểm chứng". Rất khó để tìm hiểu API, cách sử dụng, thành ngữ và mô hình liên quan chặt chẽ (OO, chức năng, v.v.) so với cú pháp thực tế của ngôn ngữ. Tôi nghĩ rằng ngôn ngữ tự nó dễ dàng bị chinh phục nếu bạn có kiến ​​thức và kinh nghiệm mạnh mẽ về các nguyên tắc cơ bản lập trình và một số kiến ​​thức về trình biên dịch, nhưng khó thành thạo vì các công cụ phụ trợ.

Ví dụ rõ ràng sẽ đi từ ngôn ngữ này sang ngôn ngữ khác; C sang Java. Cú pháp mã gần giống với các chương trình kiểu C, nhưng bạn cũng cần biết java api (generic, bộ sưu tập rác, v.v.) và rất có thể, trong "cảnh quan CNTT" hiện tại của chúng tôi, một số khung bên thứ ba (Spring, jUnit , Hibernate và vv) để làm một cái gì đó hữu ích cho các doanh nghiệp. Vì vậy, nếu bạn đã thực hiện C trước đó, cú pháp ngôn ngữ sẽ không phải là vấn đề, đó là phần còn lại.

Điều này đến từ tôi, người biết Java, C #, Javascript, HTML, CSS, Delphi, v.v. Tôi có thể không biết mọi ngóc ngách về các khung hoặc thư viện mà tôi sử dụng, nhưng tôi biết cách của mình và có thể học nhanh vì kinh nghiệm của tôi sử dụng những người khác nhau từ trước đó. Đối với một "người học nhanh", tất cả chỉ là suy nghĩ bên.


Tôi hoàn toàn đồng ý với điều này. Học các cách thực hành tốt nhất / apis / thư viện phổ biến / vv mất nhiều thời gian hơn nhiều so với học cú pháp của ngôn ngữ lập trình, và đó là thách thức thực sự, và điều gì đó chỉ có thể có được bằng cách dành thời gian làm việc với ngôn ngữ và ngôn ngữ của nó hệ sinh thái.
jviotti

3

Nguyên tắc cơ bản của Khoa học máy tính mà bạn cần biết không chỉ bao gồm nền tảng toán học (lý thuyết tập hợp, logic, lý thuyết đồ thị, đại số, lý thuyết thông tin, lý thuyết thông tin thuật toán, v.v.) mà còn một số ngôn ngữ lập trình, ít nhất là một ngôn ngữ lập trình nhóm - tức là, một mệnh lệnh (có thể với OOP, nhưng bit đó không bắt buộc), một chức năng háo hức, một chức năng lười biếng, một logic, một liên kết hoặc dựa trên ngăn xếp.

Với cơ sở này, bạn có thể dễ dàng học bất kỳ ngôn ngữ mới nào trong thời gian ngắn. Nếu một số bit bị thiếu, bạn có thể phải đối mặt với sự kháng cự nghiêm trọng.

Và cách tốt nhất để học ngôn ngữ từ trong ra ngoài là triển khai trình biên dịch đồ chơi hoặc trình thông dịch cho một tập hợp con quan trọng của nó (tất nhiên không có thư viện chuẩn - đó là phần phức tạp nhất và nhàm chán nhất của bất kỳ ngôn ngữ nào).


2

Tôi cho rằng sự đồng thuận ở đây là việc có những nguyên tắc cơ bản tốt sẽ giúp ích ở một mức độ nào đó và tôi không đồng ý với điều đó. Tuy nhiên, một điểm còn thiếu trong các câu trả lời khác là vấn đề chọn thành ngữ của ngôn ngữ và tôi nghĩ để thành thạo một ngôn ngữ bạn phải viết nó một cách thành ngữ.

Ví dụ, bạn có thể viết các ram của C # hoàn toàn chính xác mà không bao giờ sử dụng usingcâu lệnh để tự động loại bỏ các đối tượng, nhưng trong C # thành ngữ được viết tốt, bạn sẽ thấy using {...}rất nhiều. Tôi không biết bất kỳ ngôn ngữ nào-.Net có cấu trúc này (mặc dù tôi biết rất ít ngôn ngữ khác và Java của tôi khá thô sơ nên tôi có thể sai), vì vậy ngay cả một chuyên gia đến từ ngôn ngữ khác không có ngôn ngữ này tính năng sẽ cần phải học thành ngữ này từ đầu.


Có những thành ngữ tương tự được sử dụng rộng rãi trong Lisp và Scheme, vì vậy nó sẽ không có gì mới đối với một người đến từ nền tảng đó và người ta sẽ cố tình tìm kiếm tính năng này trong bất kỳ ngôn ngữ mới nào.
SK-logic

Đúng, nhưng nếu bạn đến từ, giả sử, Pascal hoặc ADA, đó sẽ là một thành ngữ hoàn toàn mới mà bạn thậm chí sẽ không biết để ý cho đến khi bạn nhìn thấy nó.
Steve

đó chính xác là lý do tại sao tôi tin rằng người ta phải biết ít nhất một ngôn ngữ từ mỗi nhóm để có thể học bất kỳ ngôn ngữ mới nào và chọn công cụ một cách khôn ngoan.
SK-logic

@ SK-logic: Khi tôi thấy những thứ như "sử dụng" và "thử ... cuối cùng", tôi không gặp vấn đề gì khi hiểu chúng là tương đương thô của "Lisp-bảo vệ" chung Lisp. Tuy nhiên, các tính năng ngôn ngữ như thế có thể không hiển thị trong một lựa chọn ngôn ngữ đa mô hình nhất định.
David Thornley

1

Đó là một tuyên bố đúng cho một số định nghĩa "khá tốt" và "dễ dàng".

Bạn càng hiểu rõ hơn về các nguyên tắc cơ bản, thì việc chuyển đổi từ ngôn ngữ này sang ngôn ngữ khác càng dễ dàng hơn. Ví dụ, nếu bạn là một lập trình viên Java chuyên nghiệp có hiểu biết vững chắc về các ngôn ngữ hướng đối tượng, thì sự khác biệt cú pháp cơ bản giữa Java và C # sẽ tương đối dễ dàng để làm chủ trong một hoặc hai tuần. Sẽ mất nhiều thời gian hơn để hiểu làm thế nào chức năng trong tất cả các thư viện liên kết ánh xạ từ cái này sang cái khác, nhưng có lẽ bạn sẽ có cách xử lý tốt các thư viện cơ bản trong một hoặc hai tháng. Sau đó, vấn đề là tìm ra những trường hợp trong đó cách tiếp cận tiêu chuẩn cho một vấn đề trong ngôn ngữ A không dịch trực tiếp sang cách tiếp cận tiêu chuẩn trong ngôn ngữ B (tức là bạn muốn sử dụng LINQ trong C # thay vì JPA trong Java) và cảm thấy thoải mái đủ trong ngôn ngữ mới mà bạn ' đang suy nghĩ trong đó thay vì suy nghĩ bằng ngôn ngữ cũ và "dịch". Điều đó có thể sẽ mất từ ​​ba đến sáu tháng tùy thuộc vào chức năng bạn thường sử dụng bản đồ. Ở mốc sáu tháng, lập trình viên Java chuyên gia có thể sẽ là một nhà phát triển C # có năng lực và hiệu quả. Nhưng như với bất cứ điều gì, bạn có thể dành nhiều năm để tìm hiểu tất cả các chi tiết phức tạp, thành thạo các thư viện và tiện ích bổ sung khác nhau không phải là một phần của ngôn ngữ mà là một phần của hệ sinh thái xung quanh và nói chung là cải thiện bản thân như một nhà phát triển ngôn ngữ đó. lập trình viên Java chuyên gia có thể sẽ là một nhà phát triển C # có năng lực và hiệu quả. Nhưng như với bất cứ điều gì, bạn có thể dành nhiều năm để tìm hiểu tất cả các chi tiết phức tạp, thành thạo các thư viện và tiện ích bổ sung khác nhau không phải là một phần của ngôn ngữ mà là một phần của hệ sinh thái xung quanh và nói chung là cải thiện bản thân như một nhà phát triển ngôn ngữ đó. lập trình viên Java chuyên gia có thể sẽ là một nhà phát triển C # có năng lực và hiệu quả. Nhưng như với bất cứ điều gì, bạn có thể dành nhiều năm để tìm hiểu tất cả các chi tiết phức tạp, thành thạo các thư viện và tiện ích khác nhau không phải là một phần của ngôn ngữ mà là một phần của hệ sinh thái xung quanh và nói chung là cải thiện bản thân như một nhà phát triển ngôn ngữ đó.


1

Tôi muốn nói rằng nó hoàn toàn phụ thuộc vào sự nhiệt tình của một người để học ngôn ngữ mới. Khi các yếu tố cơ bản là mạnh mẽ và nếu anh ta có thể hiểu ngôn ngữ mới diễn giải bất cứ điều gì thì việc học bất kỳ ngôn ngữ nào cũng khá dễ dàng.

Ví dụ tốt nhất là bản thân tôi. Tôi đã làm việc với khá nhiều ngôn ngữ mặc dù tôi đã thực hiện hầu hết công việc của mình ở C # nhưng tôi đã bắt đầu sự nghiệp từ C và tiếp tục học C ++, Java, VB, PHP, ngôn ngữ kịch bản, perl, v.v. Bất cứ nơi nào trong suốt thuật ngữ này, tôi không bao giờ cảm thấy như tôi không thể học ngôn ngữ này.


3
Và các ngôn ngữ bạn mô tả ít nhiều giống nhau. Đối với một thử thách, hãy thử học Haskell, hoặc Scheme, hoặc Forth hoặc Prolog.
David Thornley

1

Tôi thấy không bao giờ khó để học một ngôn ngữ lập trình mới, ngược lại, nó là niềm vui lớn hầu hết thời gian. Tuy nhiên, có những ngôn ngữ tôi đã xem nhưng không bao giờ hiểu, bởi vì tôi không thể nắm bắt được ý tưởng đằng sau chúng, nếu có bất kỳ ngôn ngữ nào. Một ví dụ là COBOL, tôi không bao giờ hiểu những gì phải đi trong đó PHÂN CÔNG và PHẦN và tại sao. Các ví dụ khác là PHP và Groovy. Với PHP tôi đã cố gắng để hiểu tại sao người ta sẽ cần nó ngay từ đầu, với điều kiện là có perl. Có lẽ ai đó có thể giải thích. Với Groovy tôi cũng không hiểu một chút khái niệm nào đằng sau nó.


1

Tất cả phụ thuộc vào.

Tôi biết đó thường là câu trả lời ...

Nhưng nguyên tắc cơ bản có nghĩa là gì ?? Rất nhiều người có nguyên tắc cơ bản cho một mô hình (như OO) không có chúng cho các mô hình khác (như chức năng).

Rất nhiều người đến từ OO và biết tất cả các mẫu thiết kế, có thể không có manh mối nào về các mẫu thiết kế chức năng hoặc các thứ như hiểu danh sách, cà ri, đệ quy đuôi, đóng cửa ...

Vì vậy, CÓ: nếu nguyên tắc cơ bản có nghĩa là nguyên tắc cơ bản của tất cả các mô hình.

Trong trường hợp này, vấn đề là javascript sử dụng rất nhiều mô hình, như thủ tục, OO và chức năng một chút và có một phạm vi kỳ lạ đến từ java, c ++, ...

Vì vậy, các nguyên tắc cơ bản không giúp ích trong trường hợp này, nhưng chọn thêm các nguyên tắc cơ bản ở đây và vẫn chuyển đổi sang ngôn ngữ khác có thể trở nên dễ dàng và dễ dàng hơn với nhiều mẫu bạn có trong hộp công cụ của mình.


0

Đừng quên rằng nghệ thuật lập trình máy tính là nghệ thuật duy trì CHÍNH XÁC những gì bạn muốn nói. Vì vậy, bất kỳ phương tiện nào nói cho máy tính biết phải làm gì, từ Java đến Access sang Excel đến Visual Fortran, là một ngôn ngữ lập trình.

Và một số ngôn ngữ chỉ đơn giản là xấu. IMHO Excel và Basic là những ngôn ngữ xấu; Java và C ++ là những ngôn ngữ tốt. Kịch bản FileMaker là một ngôn ngữ khủng khiếp. HTML có thể là tuyệt vời nếu bạn không cẩu thả.

Bạn có thể học nó không? Nếu nó tốt, vâng. Nếu nó xấu, phụ thuộc vào sự ghê tởm của bạn. Những điều khiến bạn muốn nôn là khó học.

Đừng cam kết sử dụng ngôn ngữ X trên một dự án trừ khi bạn đã thấy và chơi với ngôn ngữ X rồi.


0

Câu trả lời là "Đây là một thực tế không phải là một huyền thoại!"

Tôi cũng giống như bạn, tôi cũng đã làm việc trong nhiều công nghệ khác nhau. java, .net và gần đây đã làm việc với iPhone, Android và blackberry.

Mạng có đầy đủ các tài nguyên, chỉ cần thông qua thông tin hiểu rằng, thực hiện điều đó và di chuyển xa hơn.

Trong thực tế "Công nghệ được tạo ra cho nhà phát triển không phải nhà phát triển được tạo ra cho công nghệ, Công nghệ thay đổi nhưng nhà phát triển thì không".

:)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.