Tại sao Scheme là ngôn ngữ đầu tiên của tôi ở trường đại học?


80

Tôi nghe về C, C ++, Java mỗi ngày khi mọi người bắt đầu nói về khoa học máy tính, nhưng trong lớp khoa học máy tính đầu tiên của tôi, chúng tôi được yêu cầu viết bằng Scheme (DrRacket).

Tại sao vậy?

Điều gì khác biệt này sẽ làm cho sự hiểu biết trong tương lai của tôi về lập trình?

CẬP NHẬT: Tôi đã hoàn thành nhiệm kỳ đầu tiên của mình, nhưng không hoàn thành với Scheme. Trong nhiệm kỳ thứ hai của tôi (bây giờ), chúng tôi đã tham gia vào lập trình C. Lúc đầu tôi cảm thấy thất vọng khi học con trỏ, nhưng bây giờ tôi cảm thấy tốt hơn nhiều.

Không có nhiều điều để nói hơn thế. Tôi đang cố gắng tự dạy Java (hoặc C ++?) Cho phần OOP mà tôi đang thiếu. Cho đến nay, tôi vẫn thích lập trình chức năng nhất. Lambda chỉ là hấp dẫn. :)


148
Xin chúc mừng, có vẻ như (với tôi) như bạn có thể sẽ đến một trong số ít các trường còn lại thực sự cố gắng dạy khoa học máy tính. Học tập như một ngôn ngữ đầu tiên là (IMO) là một điều rất tốt. Không, nó không mang tính thương mại như nhiều người khác, nhưng đó là một ngôn ngữ tuyệt vời để tìm hiểu bản chất thực sự của khoa học máy tính.
Jerry Coffin

21
C, C ++ và Java là sản phẩm phụ của ngành khoa học máy tính. Toàn bộ gốc rễ của khoa học là trong khoa học máy tính. Các ngôn ngữ trong sử dụng thương mại có liên quan nhiều đến khoa học máy tính như McDonalds phải làm với ẩm thực.
JasonTrue

33
Những kẻ này là chính xác; bạn đang nhầm lẫn lập trình máy tính với khoa học máy tính - như Dijkstra đã nói, điều đó giống như việc xây dựng kính viễn vọng khó hiểu với thiên văn học. Đề án là về ngôn ngữ tốt nhất dành cho việc học các khái niệm cơ bản trong khoa học máy tính . Nếu bạn đang mong đợi rằng lấy bằng khoa học máy tính là học cách viết các ứng dụng kinh doanh trực tuyến bằng Java, thì bạn có thể đã đăng ký vào chương trình sai.
Eric Lippert

29
Vì lý do tương tự mà các khóa học động vật học dạy sinh học tiến hóa, giải phẫu và hành vi động vật hơn là làm thế nào để nhét chuồng voi
jk.

4
Khi bạn đã hiểu rõ cú pháp cơ bản của Lược đồ, hãy thử đọc "Sơ đồ nhỏ". Đó là một cuốn sách mỏng, nhưng nếu bạn có thể hiểu mọi thứ trong đó, bạn sẽ có một nắm bắt thực sự vững chắc về các nguyên tắc cơ bản của ngôn ngữ lập trình chức năng.
Eric Lippert

Câu trả lời:


91

Âm thanh như một trường học tuyệt vời! Phương ngữ Lisp tuân theo mô hình toán học của các thuật toán chặt chẽ hơn nhiều. Họ buộc các lập trình viên phải học đệ quy và phong cách chức năng. Đây là kinh nghiệm tuyệt vời. Trường của bạn nằm trong hàng ngũ với MIT, trường vẫn sử dụng Abelson và Sussman cho CS 6,001.

Bạn có thể thấy bài viết này đáng khích lệ và hữu ích trong việc hiểu vấn đề.


6
"Lực lượng" có lẽ không phải là một từ tốt để sử dụng. Thế còn "tàu"?
Barry Brown

4
Trên thực tế, đã có những thay đổi sâu rộng trong chương trình giảng dạy EECS của MIT trong vài năm qua. Khóa học giới thiệu của họ được chia thành hai khóa ngay bây giờ (xem mit.edu/6.01/mercurial/fall11/www/index.html trong nửa đầu) và phần lớn các hướng dẫn ngôn ngữ là bằng Python.
jonsca

4
Tôi đồng ý rằng Scheme là một ngôn ngữ tuyệt vời và đó là một ý tưởng tốt để học nó. Tuy nhiên, hãy đối mặt với nó; hầu hết mọi công việc lập trình trong thế giới thực đều sử dụng một ngôn ngữ bắt buộc; hầu hết các công việc lập trình thực sự nghiêm túc đều yêu cầu C ++ và các lập trình viên C ++ thường chủ động không khuyến khích bạn sử dụng tất cả các ý tưởng dựa trên toán học tốt đẹp để thiết kế chương trình vì lý do này hay lý do khác. Đệ quy sẽ không đóng một vai trò lớn trong các chương trình bắt buộc của bạn.
Felix Dombek

4
@FelixDombek, bạn có chắc không? Tất cả ý tưởng? Có thật không? Một vòng lặp bắt buộc là một ý tưởng toán học quá, nhớ bạn.
SK-logic

3
@FelixDombek, tôi chỉ có thể thấy một lý do để sử dụng phép lặp thay vì đệ quy đuôi trong C ++. Tất cả các hình thức đệ quy khác được phục vụ chính xác giống như trong các triển khai ngôn ngữ chức năng. Vì vậy, tôi không thể đồng ý với nhận xét của bạn cả. Toán học bạn đưa vào mã hóa C ++ càng nhiều thì càng tốt. Tôi nghi ngờ bạn sẽ thử thực hiện, giả sử, cây đỏ đen trong C ++ mà không cần đệ quy.
SK-logic

37

Không ai mong muốn rằng khi là sinh viên năm nhất, bạn sẽ thành thạo bất kỳ ngôn ngữ nào để có được một công việc thực sự, vậy tại sao không bắt đầu với một thứ dễ học? Mong đợi người mới học lập trình bằng cách sử dụng ngôn ngữ chuyên nghiệp trong IDE chuyên nghiệp giống như đưa dao mổ cho sinh viên y khoa năm thứ nhất và để họ làm việc trên cơ thể sống.

Đừng lo lắng; cuối cùng bạn sẽ học Java / C / C ++, có thể bắt đầu năm thứ hai của bạn. Nếu bạn bắt đầu học Java 6 bây giờ, đến khi bạn tốt nghiệp Java 8 sẽ ra ngoài. Hoặc nó sẽ được thay thế bởi Python. Hoặc một số ngôn ngữ khác chưa được phát minh nhưng đã gây bão trong ngành. Tốt hơn hết là ngừng học những thứ "phổ biến" càng lâu càng tốt để nó không bị lỗi thời khi bạn ra khỏi lực lượng lao động.

Lược đồ / vợt sẽ giúp bạn tập trung vào các khái niệm quan trọng: thiết kế thuật toán, cấu trúc dữ liệu và thao tác thông tin. Bạn biết đấy, những thứ phổ biến cho tất cả các ngôn ngữ.


36

Xin chúc mừng, giờ bạn đã trở thành một người thuần chay trong thế giới máy tính, và trong hai năm nữa, bạn sẽ không thể kết thúc bất kỳ cuộc thảo luận nào mà không thông báo cho mọi người về nền tảng đạo đức cao hơn mà bạn đứng lên. ;)

Dù sao bạn đã hạ cánh một trường học rất tốt. Những trường không có ngành công nghiệp là tốt.
Như một người khác nói, họ dạy bạn về khoa học, từ đó bạn lấy được nghề .

Nhiều trang trại khỉ mã xấu dạy cho bạn nghề, và sau đó bạn có thể tình cờ suy ra khoa học từ nó, nhưng nó không được bảo đảm. (và bạn có thể kết thúc với những quan niệm sai lầm khá kỳ lạ về nó)

Dù sao, là một thành viên danh dự của đám đông chức năng, khi bạn ra khỏi đó, bạn sẽ luôn cảm thấy bị hiểu lầmbị đánh giá thấp .

Mà, hãy thừa nhận nó, đối với wiz máy tính trung bình không có gì mới.

Bây giờ bạn đang có nguy cơ cao:

  • cố gắng để quấn lên trong một sự nghiệp học tập ,
  • bắt tay vào việc theo đuổi PHD ,
  • ... emacs .

Bạn cũng có thể sẽ thích nguồn mở, nhưng bạn sẽ không bao giờ tìm thấy đủ cộng tác viên cho các dự án chức năng của mình.


2
Xin lỗi, để nhận xét, nhưng tại sao emacs? Tôi tò mò. Tôi ở cùng thuyền với OP (bắt đầu học năm thứ nhất đại học vào mùa thu này) và chúng tôi sẽ sử dụng Vợt (tương tự như Đề án).
Kevin Johnson

2
@KevinJohnson emacs thường được gọi là một hệ điều hành được viết bằng LISP, vô tình giúp nhiều người chỉnh sửa mã . Nếu bạn thực hiện các mô hình chức năng và (được dạy) như những lời tục tĩu của các cú pháp giống như LISP, nó có thể sẽ phát triển trên bạn như là trình soạn thảo văn bản ưa thích của bạn.
ZJR

1
"dạy cho bạn khoa học, từ đó bạn lấy được nghề": +1
Giorgio

23

Điều gì khác biệt này sẽ làm cho sự hiểu biết trong tương lai của tôi về lập trình?

Điều đó giống như hỏi cách đọc Shakespeare sẽ giúp bạn viết các bài thi học kỳ. Lập trình (bằng bất kỳ ngôn ngữ nào) chỉ là phương tiện để thể hiện ý tưởng của bạn dưới dạng thực thi. Khoa học máy tính cung cấp các khối xây dựng khái niệm sẽ cung cấp cho bạn một điều thú vị để nói. Cú pháp lược đồ tương đối đơn giản, vì vậy bạn có thể nhanh chóng nhận được các ý tưởng thú vị và không gặp phải nhiều lỗi biên dịch, thư viện chuẩn, v.v.

Hãy chú ý trong lớp học - bạn sẽ học được rất nhiều điều thú vị trong học kỳ này.


14

Có vẻ như bạn rất mới đối với lập trình không có kinh nghiệm trước đó. Vì vậy, đây là một số làm rõ:

Tại sao Scheme mà không phải C / C ++ / Java ...?

Khi học một ngôn ngữ lập trình (một sự tương tự có thể được thực hiện với ngôn ngữ tiếng Anh), bạn học cú pháp bạn cần tuân theo để mã của bạn đúng ngữ pháp. Tuy nhiên, một ngôn ngữ sẽ không dạy bạn logic đằng sau việc giải quyết vấn đề. Để học logic đó, bạn học các mô hình lập trình khác nhau .

Mỗi ngôn ngữ có thể thực hiện (chính xác hơn hoặc ít hơn) một hoặc nhiều mô hình. Một mô hình là một cách để cấu trúc logic của bạn và mô hình được thực hiện bởi Scheme được gọi là Lập trình hàm (FP).

Vì vậy, câu hỏi thực sự bạn đang hỏi là: Tại sao FP?

Như bạn đã đề cập, C, C ++ và Java (những người không triển khai FP) phổ biến hơn nhiều. Như một vấn đề thực tế, (và vì nhiều lý do, mọi người đều có ý kiến ​​của họ) FP không phổ biến lắm trong ngành.

Mặt khác, FP được đánh giá rất cao trong giới học thuật. Nó gần gũi hơn với cách tiếp cận toán học thông thường, tập trung nhiều hơn vào khả năng chứng minh và tối ưu hóa thuật toán, và hầu hết mọi người sẽ đồng ý rằng nó sẽ giúp bạn trở thành một lập trình viên giỏi hơn nói chung.

Nó tương tự như các trường dạy tiếng Latin để học tiếng Anh.


1
Lược đồ không phải được sử dụng theo chức năng, mặc dù nhiều khả năng là bạn sẽ làm như vậy hơn là trong C, C ++ và Java.
Ricky Clarkson

"Nó tương tự như các trường dạy tiếng Latin để học văn học Anh.": Hoặc với các lớp hệ điều hành dạy HĐH giống Unix thay vì các HĐH khác, phổ biến rộng hơn.
Giorgio

11

Bạn phải học cách lập trình đang được thực hiện và các khái niệm cơ bản là gì. Các ngôn ngữ hàng ngày được sử dụng trong hầu hết các doanh nghiệp có thể rất phù hợp để sản xuất phần mềm cần thiết ngày nay, nhưng không nhất thiết phải phù hợp nhất để dạy cho bạn các nền tảng lập trình.

Khi bạn đã nắm được các khái niệm, thật dễ dàng để áp dụng chúng cho các ngôn ngữ khác.


4
"Các ngôn ngữ hàng ngày được sử dụng trong hầu hết các doanh nghiệp có thể rất phù hợp để sản xuất phần mềm cần thiết hiện nay" - Xem xét chi phí, chất lượng và tỷ lệ thành công điển hình, đó là một tuyên bố khá lạc quan :-)
Jörg W Mittag

Điều đó hoàn toàn đúng! Đó là lý do tại sao tôi viết "có thể" thay vì "là" :-)
perdian

1
"Một khi bạn đã nắm được các khái niệm, thật dễ dàng để áp dụng chúng cho các ngôn ngữ khác." - Tuyên bố này là quá đúng. Tôi nghi ngờ sẽ mất khoảng một tuần để chọn cú pháp trong bất kỳ ngôn ngữ mới nào và thành thạo. Tôi đã được dạy C / C ++ và hội ở trường, nhưng tôi đã tự dạy Python ở bên và Lisp cho một dự án nghiên cứu. Không có sự hiểu biết cơ bản mà tôi có được từ Python, Lisp và hội, tôi nghi ngờ tôi sẽ gần như là lập trình viên mà tôi có ngày hôm nay.
Wayne Werner

9

Nếu bạn đang học với DrRacket, tôi cá là bạn cũng đang sử dụng giáo trình Cách thiết kế chương trình.

Dưới đây là những gì một trong những tác giả (thừa nhận thiên vị) của HtDP đã nói về cách thức Chương trình giảng dạy đã chuẩn bị cho sinh viên đại học tại Đại học Đông Bắc cho chương trình giáo dục hợp tác ("co-op": sinh viên xen kẽ các học kỳ học tập với học kỳ toàn thời gian việc làm).

Trước khi tôi đến, Đông Bắc đã sử dụng một chương trình giảng dạy tiêu chuẩn trong hai thập kỷ: ba thuật ngữ của ngôn ngữ thời trang hiện tại (Pascal, C ++, Java), sử dụng một bộ các bài tập cực kỳ giàu đồ họa đan xen với các bài học về các ứng dụng thực tế. Chương trình giảng dạy đã được xuất bản rộng rãi trên SIGCSE và các cộng đồng liên quan, nhưng nó không hoạt động. Ở đỉnh cao của bong bóng web, chỉ có khoảng một phần ba số sinh viên có các chương trình hợp tác; hầu hết những người khác đã kết thúc với tư cách là những người yêu thích công nghệ, vì họ tự gọi mình: di chuyển máy tính, chạy tập lệnh, thiết lập bộ định tuyến và mạng, v.v. Và tất cả giáo dục này có giá 150.000 đô la học phí.

Sau một năm ở Đông Bắc, trưởng khoa của chúng tôi yêu cầu tôi tiếp quản khóa học đầu tiên. Trường hợp đầu tiên là một thành công, trái với dự đoán từ một số giảng viên địa phương. Mặc dù nó đã được coi là một thử nghiệm, chúng tôi đã chuyển sang Dạy học! chương trình giảng dạy vĩnh viễn; trưởng khoa đề nghị tôi thiết kế một khóa cầu nối để kết nối khóa học HtDP với phần còn lại của chương trình giảng dạy; điều này đã bắt đầu sự hợp tác của tôi trên HtDC với Viera Proulx. Xem phần tái bút bên dưới. Trong một vài năm, tôi bắt đầu nghe từ giảng viên hợp tác của chúng tôi rằng tỷ lệ các vị trí lập trình đang tăng lên. Đến năm 2007, lần cuối cùng tôi tham gia khóa học, tôi được thông báo rằng tỷ lệ lập trình trên hợp tác đầu tiên lên tới hai phần ba và cao hơn. Trong khi đó, tất cả các Dạy học! các khóa học đã được giảng dạy bởi nhiều giảng viên với phong cách giảng dạy và tính cách khá khác biệt so với của tôi. Tỷ lệ hợp tác lập trình đã tăng lên ba phần tư và hơn thế nữa, và tất cả các giảng viên hạ lưu đều hài lòng về các kỹ năng lập trình của sinh viên.

Chỉnh sửa: đối với những người rất quan tâm đến lý do đằng sau chương trình giảng dạy, đây là lời giải thích của kiến ​​trúc sư chính - http://www.youtube.com/watch?v=m3be1PHW5X0


6

Trường tôi cũng bắt đầu với Scheme. Một lý do đã được đề cập là điều này đã giúp san bằng sân chơi. Hầu hết các Compri đầu tiên có thể có một số hoặc rất nhiều tiếp xúc với các ngôn ngữ phổ biến hơn. Ít có khả năng là bất cứ ai cũng có nhiều kiến ​​thức về Đề án.


4
Tôi đồng ý; Tôi bắt đầu CS biết Pascal, C, Basic, x86 Trình biên dịch, trong khi những người khác có kinh nghiệm trong các ngôn ngữ khác nhau hoặc không có gì cả. Chúng tôi đã được giới thiệu về ML mà không chỉ không ai có kinh nghiệm trước đó mà còn có một mô hình rất xa lạ đến nỗi nó giống như bắt đầu lại ngay cả đối với những người có kinh nghiệm nhất trong số chúng tôi. Sau đó, tôi nghĩ ML (mô hình chức năng) là điều hữu ích nhất tôi học được ở CS.
KaptajnKold

6

Trên thực tế, vì Lisp (Scheme là một phương ngữ) là Grande Dame của các ngôn ngữ chức năng (nghĩ về F #, Groovy, Clojure, Haskell, v.v.), nên khóa đào tạo này cũng không khiến bạn gặp bất lợi về mặt thương mại nào, vì đây là điểm nóng nhất chủ đề về khối phát triển ngay bây giờ.


4

Đề án sẽ giúp bạn có được tốt và suy nghĩ theo cách thích hợp để sử dụng các ngôn ngữ lập trình chức năng. Scala là một ví dụ về chức năng / OO khá rực rỡ, mặc dù hơi dày đặc. Ngôn ngữ như thế này mặc dù đánh dấu tương lai - hy vọng.

Các ngôn ngữ giống như Lisp mặc dù có sự tinh khiết và đơn giản trong thiết kế của chúng giúp chúng dễ dàng hơn trong việc giảng dạy. Tuy nhiên, lợi ích tốt đẹp là bạn sẽ có thời gian dễ dàng hơn để học một cái gì đó như Scala sau đó.


3

Chúng tôi đã hoàn thành Đề án trong nửa đầu và nửa đầu của học kỳ thứ hai. Mãi đến khi chúng tôi thực sự bắt tay vào làm việc với C, tôi mới bắt đầu nhận ra sức mạnh của Đề án.

Đối với câu hỏi của bạn, tại sao Scheme được chọn: câu trả lời là đây là một trong những ngôn ngữ đơn giản nhất và nó cho phép bạn thực hiện rất nhiều (đặc biệt là khi chúng ta bắt đầu chơi với các danh sách lười biếng sau này). Hơn thế nữa :

  1. Đối với những người không có kinh nghiệm lập trình, nó sẽ dễ học hơn. Không có nhiều chi tiết kỹ thuật và chỉ một vài hình thức đặc biệt.
  2. Nó cho phép mức độ trừu tượng cao hơn. Một khóa học tốt có thể tập trung vào việc dạy các lập trình viên cách suy nghĩ thay vì tập trung vào các chi tiết kỹ thuật cho phép sinh viên trở thành lập trình viên giỏi hơn.
  3. Các danh sách là tuyệt vời. Có rất nhiều mà bạn có thể làm với họ. Xe hơi và cdr là những công cụ mạnh mẽ và chỉ đến khi bạn bắt đầu làm việc với con trỏ, bạn mới nhận ra rằng Scheme rất tuyệt vời trong việc xử lý danh sách.
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.