it-swarm-vi.com

Những sinh viên khoa học máy tính nên được dạy ngôn ngữ nào?

Theo bạn, ngôn ngữ nào (hoặc các lớp học (như trong mô hình) của ngôn ngữ lập trình, cộng với ngôn ngữ được đề xuất của lớp đó) mỗi sinh viên khoa học máy tính sẽ được dạy ở trường đại học? Thúc đẩy câu trả lời của bạn; tại sao ngôn ngữ đó Người ta sẽ sử dụng cái gì từ nó? Những khái niệm nào nó dạy (tốt hơn ngôn ngữ X không)?

Lưu ý/làm rõ: Câu hỏi này là về khoa học máy tính tập trung nhiều vào công nghệ phần mềm, không phải khoa học máy tính thuần túy. Nó vẫn là giáo dục khoa học máy tính và không phải là giáo dục kỹ thuật phần mềm là trọng tâm.

13
Anto

Tôi sẽ đưa ra một danh sách:

  • Hội (một phương ngữ tương đối đơn giản): Điều quan trọng là phải hiểu ít nhất một ít về các nguyên tắc cơ bản
  • C: Ngôn ngữ thủ tục, được sử dụng ở nhiều nơi. Không gây gánh nặng cho sinh viên mới với các khái niệm hoàn toàn mới như tất cả cùng một lúc.
  • Java/C #/Eiffel/C++: Một cái gì đó hướng đối tượng là tốt, bất kỳ một trong số này sẽ hoàn thành mục tiêu giảng dạy cho sinh viên và khi họ hiểu một trong những ngôn ngữ này, họ sẽ có thể học những ngôn ngữ khác .. Có rất nhiều ngôn ngữ tốt, tôi liệt kê Eiffel vì nó cũng có hợp đồng thiết kế.
  • LISP và Prolog: Dạy cho học sinh một cách suy nghĩ hoàn toàn mới, đó là quan trọng, ngay cả khi họ không bao giờ sử dụng một trong hai "trong thế giới thực" này.
  • SQL và XML: Giới thiệu các cách mới để suy nghĩ về dữ liệu và cách truy xuất và quản lý dữ liệu.

Học sinh nên được tiếp xúc với tất cả trong số các mô hình này . Không chỉ một hoặc hai.

Tôi cho rằng nhiều người sẽ đề xuất Python để bao quát phong cách thủ tục, kiểu OOP và có thể những người khác, nhưng tôi không có đủ kinh nghiệm cá nhân với Python để có thể tự tin giới thiệu nó.

21

Cá nhân tôi thấy hơi buồn khi các ngôn ngữ chức năng không được dạy chủ yếu như trước đây. Tôi nghĩ rằng ít nhất comp sci sinh viên nên được tiếp xúc với một ngôn ngữ từ tất cả các mô hình chính: thủ tục, hướng đối tượng, chức năng và năng động.

45
Michael Brown

Tôi nghĩ rằng một sinh viên CS cân bằng tốt nên được dạy một ngôn ngữ trong mỗi 4 loại ngôn ngữ lập trình:

Chức năng - LISP/Haskell/PostScript. Tôi không có nhiều kinh nghiệm với Haskell, nhưng tôi đã nghe các lập trình viên khác phát cuồng về nó. Hiểu các cấu trúc của lập trình chức năng và tại sao chúng hữu ích trong nhiều tình huống sẽ giúp lập trình viên trở nên tốt hơn trong việc tổ chức các thuật toán bằng các ngôn ngữ khác.

Hướng đối tượng - Hãy lựa chọn. C #/Java/Python/Ruby/yadda yadda yadda. Loại này cần được dạy đơn giản vì đó là những gì doanh nghiệp hiện đại muốn.

Bắt buộc - C/Fortran/Pascal. Những điều này ít phổ biến hơn những ngày này, nhưng chúng vẫn nên được học từ góc độ thực tế/lịch sử. Các phương pháp họ sử dụng vẫn có tính thực tiễn bởi vì trong mọi ngôn ngữ, tất cả đều nắm bắt được một hướng dẫn. Và ngôn ngữ bắt buộc là rất tốt trong việc liệt kê và làm theo hướng dẫn.

Hợp lý - ProLog. Tôi chưa bao giờ tìm thấy một cách sử dụng thực tế tốt cho bất kỳ ngôn ngữ nào trong số này, nhưng tôi đã tìm thấy một số khái niệm đằng sau các ngôn ngữ logic có ích khi cố gắng tìm ra cách viết một số phương thức của tôi bằng các ngôn ngữ hướng đối tượng hơn. Tôi đã không tập trung lâu vào các ngôn ngữ logic trong những năm học đại học và tôi nghĩ rằng một sự tập trung mạnh mẽ hơn có thể đã giúp tôi làm tốt điều đó.

33
Joel Etherton

Ngôn ngữ số 1 mà mọi chuyên gia CS tốt nghiệp nên biết là ngôn ngữ tối đa hóa tiềm năng của họ để đạt được một công việc tuyệt vời. Điều đó sẽ thay đổi theo thời gian, nó sẽ thay đổi dựa trên định nghĩa của từng cá nhân về công việc tuyệt vời và nó sẽ thay đổi theo vùng địa lý.

Hiện tại, tôi sẽ nói rằng Tiếng Anh là ngôn ngữ số 1 mà mọi chuyên gia CS nên biết (tất nhiên, điều này , thay đổi theo vùng.)

6
oosterwal

Đối với một sinh viên CS, hãy tìm các ngôn ngữ lập trình được ánh xạ chặt chẽ với các khái niệm CS đang được thảo luận. Tôi muốn đề xuất:

  • Đề án, để hiểu rõ hơn về phép tính lambda
  • Erlang, để hiểu mô hình diễn viên
  • Prolog, cho hệ thống logic và chứng minh vị ngữ
  • Haskell, đối với lý thuyết loại/loại và vì đánh giá lười biếng được thể hiện đầy đủ bằng ngôn ngữ
  • ít nhất một ngôn ngữ hội - nếu bạn muốn đếm nó dưới biểu ngữ này, tôi cũng sẽ sử dụng ngôn ngữ mã byte, như Java hoặc mã byte CLR và LLVM IR
  • có lẽ là ngôn ngữ định nghĩa phần cứng, như Verilog hoặc VHDL
  • Bison cho một lớp biên dịch-xây dựng
  • một cái gì đó với một hệ thống kiểu động (Ruby xuất hiện trong tâm trí) ...

Danh sách này có thể tiếp tục theo cách này, nhưng ý tưởng cơ bản khá đơn giản: Dạy cho học sinh ngôn ngữ lập trình sẽ phù hợp nhất với cách bạn muốn dạy các khái niệm.

4
Aidan Cully

Tôi nghĩ nó thay đổi theo thời gian, nhưng lý tưởng nhất - 3 ngôn ngữ từ 3 quan điểm rất khác nhau. Trong thời của tôi, nó là thủ tục, OO và chức năng - Pascal, C++ và LISP. Tôi không quá bán cho ba người đó. Nhưng khi tôi phỏng vấn tôi tìm kiếm:

  • Một số mức độ trải nghiệm với một ngôn ngữ mà bạn phải chú ý đến việc quản lý bộ nhớ (C/C++ và nhiều ngôn ngữ khác)
  • Một số mức độ trải nghiệm với ngôn ngữ hướng đối tượng với những kỳ vọng về việc sử dụng API và các khái niệm trừu tượng khác nhau có sẵn (C++/Java)
  • Một ngôn ngữ "kéo dài" - một thứ gì đó kỳ lạ, khó và đầy thách thức. Tôi sẽ không thuê vì ai đó biết LISP, hội hoặc một số ngôn ngữ thách thức khác, nhưng tôi muốn thấy rằng kỹ sư phải đối mặt với một thử thách nào đó liên quan đến việc giải quyết vấn đề nghiêm trọng và rất nhiều "cái quái gì thế này?" khoảnh khắc.

Là một giao dịch khác - tôi nghĩ các chương trình CS cần phải đào tạo sinh viên về các ngôn ngữ nổi bật trên thị trường. Tại bất kỳ thời điểm nào, tôi nghĩ 2-3 ngôn ngữ có sự nổi bật nghiêm trọng đối với phần lớn các công việc. Tôi nghĩ rằng một trường nợ học sinh để cung cấp cơ hội học 2 trong số 3 ngôn ngữ đó với độ sâu đào tạo có sẵn trong ít nhất một.

4
bethlakshmi

yacc

để có được ý tưởng về những gì đang diễn ra đằng sau hậu trường, bất cứ ngôn ngữ lập trình nào bạn đang sử dụng. nó giúp nắm bắt các khái niệm cơ bản như mã chết và nhiều loại tối ưu hóa khác nhau mà trình biên dịch (tốt) sẽ có thể làm cho bạn.

3
mariotomo

Tôi nghĩ rằng ngôn ngữ không quan trọng như mọi người tin.

Vâng, bạn cần biết cách lập trình, v.v., nhưng nhiều lập trình viên tuyệt vời tự học dựa trên kinh nghiệm thực tế của họ giúp họ khi phát triển.

Học sinh có thể làm với một số bài học về cách lập trình trong thế giới thực và không chỉ là phương pháp sách, điều này sẽ khiến chúng trở nên "tròn trịa" hơn và trong lựa chọn của tôi là nhà phát triển/sinh viên tốt nghiệp tốt hơn.

Tôi đã học được nhiều hơn về lập trình và phát triển phần mềm sau khi tôi rời trường đại học và bắt đầu làm việc!

2
user18041

LISP (với CLOS cho OOP) và Haskell. Câu hỏi này không giới hạn cho sinh viên. Các ngôn ngữ lập trình ưa thích mới đã mượn (sao chép, đánh cắp? ... không, nó không tệ) rất nhiều tính năng từ hai tính năng này. Bạn có thể chuẩn bị cho tương lai. Lập trình hàm (kiểu) ngày nay quan trọng hơn và được giới thiệu bằng các ngôn ngữ lập trình bắt buộc như C # (LINQ) hoặc C++ (lambda) và nhiều ngôn ngữ khác. Thật tệ khi một số sinh viên đang học Java.

2
knivil

CÓ THỰC SỰ THỰC HIỆN KHÔNG?

Thông thường, vấn đề đằng sau câu hỏi này là "Những từ thông dụng nào tôi có thể đưa vào sơ yếu lý lịch của mình sẽ mang lại cho tôi những công việc sinh lợi/thú vị/thử thách/dễ dàng nhất?". Mặc dù câu hỏi có giá trị vì hầu hết các sơ yếu lý lịch đều được sàng lọc bởi những người nhân sự mà không hiểu được những gì họ đang tìm kiếm. nhưng nó rất nông, vì một khi bạn đã đi qua cổng bạn cần giao hàng.

Đó không phải là ngôn ngữ bạn biết làm cho bạn trở thành một lập trình viên tốt hay xấu, đó là cách bạn có thể sử dụng nó. Đối với điều này về cơ bản có hai loại lập trình viên:

  1. Những người tập trung vào việc học một ngôn ngữ đến cốt lõi của nó. Điều quan trọng nhất là ngôn ngữ và cách sử dụng nó. Ở các thái cực, họ có xu hướng siêu tối ưu hóa mọi đốm mã nhỏ và thường sẽ sử dụng các tính năng tối nghĩa chỉ vì chúng có thể.

  2. Sau đó, có những người muốn tìm hiểu về kỹ thuật và mô hình. Ngôn ngữ họ sử dụng không thực sự quan trọng miễn là nó có thể diễn tả bức tranh tinh thần của họ một cách thanh lịch. Ở các thái cực, những điều này sẽ có xu hướng sử dụng UML hoặc các hệ thống khác như vậy với hy vọng những người khác sẽ thực hiện công việc mã hóa nó.

Theo tôi bạn cần cả hai. # 1 sẽ cung cấp các kỹ năng ngắn hạn và khi được lựa chọn một cách khôn ngoan sẽ giúp bạn dễ dàng vượt qua các cổng nhân sự nhưng # 2 sẽ ở lại với bạn trong suốt sự nghiệp và sẽ xác định bạn là một lập trình viên.

# 2 sẽ cung cấp hướng dẫn và sắp xếp lối suy nghĩ của bạn hướng tới giải pháp giải quyết vấn đề trong tay nhưng không có 1 thì đó vẫn là một ý tưởng, mãi mãi trôi nổi trong các thiên đường của phần mềm hơi nước (hoặc địa ngục tùy thuộc vào nơi bạn nhìn vào nó).

# 1 sẽ cung cấp cho bạn phương tiện để thực hiện ý tưởng thành các hệ thống làm việc thực sự nhưng không có 2 hệ thống của bạn sẽ có xu hướng hướng tới những con quái vật biến hình ung thư.

2
Newtopian

Ngôn ngữ hội và microcode. Một sinh viên CS nên hiểu tất cả các lớp nền tảng trừu tượng giữa các máy trạng thái boolean và chức năng cấp cao mới nhất/OOP/vv. mô hình ngôn ngữ lập trình.

Cơ bản hoặc Logo hoặc Squeak (et.al.), nếu họ muốn có thể hiểu làm thế nào để dạy trẻ nhỏ một số kiến ​​thức máy tính.

Fortran, Cobol và LISP, nếu họ muốn hiểu lịch sử của các ngôn ngữ lập trình, và những vấn đề thực tế mà các thực tiễn hiện đại đã khắc phục.

1
hotpaw2

Chọn 3 ngôn ngữ trở lên từ các mô hình khác nhau không khó lắm, nhiều câu trả lời hay đã được đưa ra. Nhưng nếu tôi phải chọn duy nhất một ngôn ngữ, tôi sẽ chọn Scala, vì đó là cả chức năng và hướng đối tượng. Bạn có thể giải thích và so sánh các cách tiếp cận khác nhau trong cùng một ngôn ngữ.

1
Sean Patrick Floyd

Đừng quên các ngôn ngữ theo hướng ngăn xếp/ghép! Họ có thể là người uốn cong tâm trí thực sự. Họ nhấn mạnh việc xây dựng sự phức tạp bằng cách sử dụng các nguyên thủy nhỏ, dễ hiểu. Bạn có thể sử dụng chúng để viết pointfree (hoặc ngầm) mã mà cảm thấy rất rõ ràng.

Ngôn ngữ cổ điển là Forth , nhưng ngày nay tôi đi là Yếu tố . Cũng đáng kiểm tra là JoyCat . Đừng bỏ lỡ wiki ngôn ngữ nối . Nó vui hơn một cái túi đầy búa!

1
Scant Roger

Tôi tin rằng bạn đã trả lời một phần câu hỏi của bạn.

Điều quan trọng thực sự là cung cấp cho sinh viên cơ hội tiếp xúc với một số mô hình, ngôn ngữ thực tế không nên quan trọng.

Tất nhiên, điều quan trọng là chủ yếu dạy những mô hình đó mang lại hầu hết các cơ hội làm việc (có lẽ OOP tại thời điểm này). Theo đó, tốt hơn là dạy một ngôn ngữ được sử dụng rộng rãi cho mô hình này, vì đây là hữu ích hơn là học một cái gì đó mà bạn sẽ không bao giờ sử dụng. Vì vậy, tôi cũng ghét phải viết mã giả trong các bài kiểm tra của mình. Mã giả vẫn ổn, miễn là nó không có cú pháp 'cố định'. Bạn chỉ cần có thể mang các khái niệm băng qua.

Rất cụ thể:

OOP: .NET hoặc Java

Ít nhất 1 mô hình lập trình bổ sung, để làm cho sinh viên nhận thức được các phương pháp khác.

Chức năng: Lisp?

1
Steven Jeuris

Mặc dù thiếu tính chính thống, tôi thấy rằng D, cụ thể là phiên bản 2, cung cấp một số bài học thú vị không thể dễ dàng học được ở nơi khác. Nó thực hiện một nỗ lực nghiêm túc hơn bất kỳ ngôn ngữ nào khác mà tôi có thể nghĩ đến để có được lập trình bắt buộc/thủ tục, hướng đối tượng và chức năng để chơi Nice với nhau và cho phép lập trình ở mức rất thấp (con trỏ, quản lý bộ nhớ thủ công, nội tuyến Ngôn ngữ hội) và trình độ rất cao (lập trình chung và tổng quát) trong cùng một ngôn ngữ.

Điều này rất có giá trị bởi vì, thay vì nhìn thấy các mô hình cô lập như thể chúng tồn tại trong các vũ trụ khác nhau, bạn có thể nhìn thấy khu rừng qua những tán cây. Bạn có thể thấy những điểm mạnh và điểm yếu của mỗi mô hình ở mức độ chi tiết tốt khi bạn kết hợp chúng vào các chương trình của mình. Bạn có thể thấy các khía cạnh chính của mô hình có thể được thực hiện trong các thư viện theo mã cấp thấp hơn. Mô-đun thư viện tiêu chuẩn std.alerskym thực hiện các nguyên hàm lập trình chức năng quan trọng, nhưng mã D đơn giản, đơn giản không có phép thuật. Tương tự, std.range thực hiện đánh giá lười biếng, nhưng một lần nữa là mã D khá đơn giản. Bạn có thể hiểu được các chi phí liên quan đến nguyên thủy của mỗi mô hình, bởi vì các tính năng gần gũi với kim loại của D làm cho những gì thực sự diễn ra dưới mui xe tương đối trong suốt. Bạn thậm chí có thể viết một cái gì đó ở cấp độ thấp trông giống như C, và sau đó tạo ra một giao diện cấp cao, đẹp mắt cho nó, trong cùng một ngôn ngữ, không có lớp keo ma thuật nào cản trở.

0
dsimcha

Mã giả.

Mọi người trong lĩnh vực này có thể giải thích các ý tưởng của họ theo cách mạch lạc, có cấu trúc mà không có biệt ngữ cụ thể theo khung hoặc theo cú pháp. Tôi không cần phải biết sự khác biệt giữa dấu ngoặc vuông và dấu ngoặc nhọn để hiểu thuật toán của bạn. Tôi không cần biết ?? Nghĩa là gì, hoặc các công tắc grep là gì.

Viết bằng ngôn ngữ đơn giản, nhưng cấu trúc và định dạng nó giống như mã. Bất cứ ai cũng có thể thực hiện nó bằng bất cứ ngôn ngữ nào họ thích.

chỉnh sửa: Câu trả lời này một phần được thúc đẩy bởi sự bất lực của một số lập trình viên để viết mã giả.

"Chỉ cần viết thuật toán bằng mã giả"

"Cái gì thế?"

Lợi ích của mã giả là các bên liên quan không lập trình có thể hiểu nó. Tôi không gợi ý rằng bạn muốn BA và người dùng chứng minh mã của mình, tuy nhiên nó có thể giúp ích khi người không lập trình có hiểu biết về thuật toán cần thiết. Psuedocode loại bỏ sự cần thiết phải giải thích for (int i = 0; i < j; i++) và về cơ bản là biệt ngữ luồn lách.

0
Kirk Broadhurst

Một số ngôn ngữ lập trình được áp dụng để đạt được các kỹ năng giải quyết vấn đề chung và các khái niệm lập trình là Logo và Karel, chúng nên được dạy trước C/C++/Java/LISP/Perl/hội/bất kỳ mô hình lập trình nào.

Học sinh được giới thiệu rất thực tế về lập trình.

0
umlcat

C.

  • Trước hết, nó vẫn được sử dụng (sử dụng rộng rãi!), Và không chỉ cho hạt nhân. Tôi hiện đang duy trì một ứng dụng kinh doanh được mã hóa bằng C. Vì vậy, ngay cả với C thuần túy và đơn giản, bạn vẫn có thể có được một công việc. Trong các công ty lớn, trong ngành công nghiệp, hầu hết mọi nơi (nhưng trong web dev).
  • Nếu bạn sẽ làm việc trong môi trường Unix/Linux, không biết ít nhất một chút về C cũng giống như đi mua sắm và không thể đọc được giá trên các thẻ.
  • Con trỏ! Mọi người nên hiểu con trỏ (xem Joel Spolsky ). Ngoài ra, một khi bạn đã nắm bắt được khái niệm malloc, bạn sẽ biết chính xác những điều gì sẽ xảy ra khi bạn bất cẩn gõ một "cái mới" trong một lang OOP.
  • Hầu hết các cú pháp "phổ biến" đều xuất phát từ C.
  • Vâng, nó không phải lúc nào cũng rõ ràng. Vâng, nó rất khó để học. Vâng, chuỗi là một cơn ác mộng cho người mới bắt đầu. Nhưng lập trình không phải lúc nào cũng rõ ràng và khó học, và bạn sẽ thực sự hiểu điều gì tuyệt vời về OOP khi, sau khi học C, bạn thử C++ và khám phá std :: string.

Tất nhiên, người ta nên biết nhiều hơn một ngôn ngữ, và không chỉ là một ngôn ngữ thủ tục cũ. Nhưng nếu tôi phải đi trên một hòn đảo sa mạc chỉ với một trình biên dịch, tôi sẽ đi với gcc cũ tốt của tôi. Bạn có thể hiểu lập trình cấp cao nếu bạn biết về lập trình cấp thấp. Tôi nghĩ nó không đúng theo cách khác.

0
Raveline

Một cái gì đó chức năng, Haskell hoặc LISP sẽ là lựa chọn đầu tiên của tôi, nhưng có lẽ là Erlang. Các ngôn ngữ chức năng thực sự dạy cho bạn cách xây dựng trừu tượng một cách rất mạnh mẽ.

0
Zachary K