C ++ có phù hợp làm ngôn ngữ đầu tiên không? [đóng cửa]


26

Một trường đại học địa phương đang dạy C ++ cho sinh viên đại học năm thứ nhất (16 tuổi) không có kinh nghiệm lập trình trước đó.

Là ngôn ngữ lập trình đầu tiên, C ++ có phù hợp không?


56
Bất kỳ ngôn ngữ có thể là ngôn ngữ đầu tiên. Nó không thực sự quan trọng.
Adam Lear

8
Điều này có thể khiến bạn quan tâm - joelonsoftware.com/articles/ThePerilsofJavaSchools.html
Craige

19
@Anna Lear: Tất nhiên, bất kỳ ngôn ngữ nào cũng có thể là ngôn ngữ đầu tiên, nhưng điều đó không đủ điều kiện C ++ là ngôn ngữ đầu tiên tốt. Nếu câu trả lời của bạn là Câu trả lời thực tế, tôi sẽ bỏ phiếu là không có ích.
Ed James

6
@Doug: Tôi đang lập trình C ++ để kiếm sống ... quan điểm của bạn là gì?
Matthieu M.

9
@Dough - 70% các dự án điện toán ngày nay liên quan đến việc viết phần mềm cho các hệ thống nhúng và thiết bị vi mô. Đoán những ngôn ngữ được sử dụng cho các dự án? Đoán xem ai được trang bị tốt nhất cho vị trí nhập cảnh? Chắc chắn không phải là ngựa con Java hay .NET. Nghe có vẻ khắc nghiệt, nhưng các trường học đã gây bất đồng lớn cho toàn bộ thế hệ sinh viên tốt nghiệp CS bằng cách đào tạo họ chỉ cho 30% thị trường việc làm lập trình. Chúng tôi có quá nhiều lập trình viên cho lĩnh vực ứng dụng (30%) và chúng tôi thiếu hụt trong lĩnh vực hệ thống (70%). Những con số đó sẽ không đi đến đâu. Cơ hội nghề nghiệp trong tương lai? Vâng, đúng rồi.
luis.espinal

Câu trả lời:


61

Nhấn mạnh không .

Đối với bất kỳ mục tiêu nào bạn có trong đầu cho sinh viên, một ngôn ngữ hoặc chuỗi ngôn ngữ khác sẽ nhanh hơn và tốt hơn. Ví dụ.

"Học sinh cần hiểu các khái niệm cấp thấp."

Mã hóa "cấp độ thấp" không bao gồm việc lấy các đối tượng từ đó new, đưa chúng trở lại deletevà đôi khi có một con trỏ trỏ đến một nơi nào đó không nên. Hàm, lớp và mẫu không phải là cấp thấp. RAII, 12 cách để sử dụng const, std::ostream::operator<<, protectednewkhông phải là khái niệm ở mức độ thấp. Những thứ đó có ý nghĩa cấp độ thấp và bạn sẽ bỏ qua những thứ đó trong nhiều tháng hoặc cho đến khi một lớp học trong tương lai và giảng dạy về ngữ nghĩa C ++ thay thế.

Tôi đề nghị trình biên dịch với một môi trường tốt và tài liệu giảng dạy như MIPS hoặc MMIX. Nếu bạn đang vội, hãy dạy C với các đường vòng ít nhất là nhìn vào đầu ra của trình biên dịch. Điều này sẽ cung cấp cho bạn tất cả những hiểu biết cấp thấp về C ++, và sau đó, một số, nhanh hơn.

"Học sinh cần hiểu hướng đối tượng."

Định hướng đối tượng được tích hợp trong C ++ là cách quá phức tạp để dạy các khái niệm OO hoặc gần như bất kỳ khái niệm cấp cao nào khác. Xem Câu hỏi thường gặp về C ++ để biết danh sách dài các lý do tiềm năng tại sao. Bạn có thể phải nhấn tất cả những thứ đó, sẽ mất một thời gian rất, rất lâu với các lập trình viên mới; nếu không, bạn phải bỏ qua rất nhiều thứ, khiến các lập trình viên mới chìm trong bóng tối - một cách hiệu quả, không thực sự biết về C ++!

Tôi khuyên bạn nên học một ngôn ngữ cấp cao, đơn giản hơn với các đối tượng trước tiên (Python, Ruby, Squeak, Common Lisp, Vợt), nếu bạn phải dạy C ++. Ngoài ra, học đa hình như một khái niệm tách biệt với OO bằng cách truy cập một ngôn ngữ chức năng.

"Học sinh cần hiểu các mẫu và siêu lập trình mẫu."

Không ai thực sự hỏi điều này, nhưng tôi ước họ sẽ làm thế. C ++ có các mẫu đẹp và STL rất tuyệt, nhưng chúng không nên là ưu tiên đủ cao để dạy C ++ trước. Dạy hệ thống loại OCaml hoặc Haskell và sau đó trang bị thêm các khái niệm đó có thể nhanh hơn.

"Học sinh cần học giải quyết vấn đề."

Vâng, bạn có được ngôn ngữ này bằng bất kỳ ngôn ngữ nào và bạn sẽ nhận được nhiều hơn nếu nó ở hầu hết các ngôn ngữ khác ngoài C ++ vì có ít hành lý hơn. Một lần nữa, hãy xem Câu hỏi thường gặp về C ++ để biết danh sách tất cả những điều học sinh sẽ học thay vì kỹ năng giải quyết vấn đề.

"Tất cả những điều trên, và chúng tôi chỉ cần sử dụng một ngôn ngữ." hoặc "Nhà tuyển dụng muốn nó." hoặc "Chúng tôi cần một ngôn ngữ kiểu C." hoặc là...

Dạy nhiều hơn một ngôn ngữ.

Ý tưởng rằng bạn tiết kiệm thời gian hoặc năng lượng bằng cách dạy hoặc học chỉ một ngôn ngữ là hoàn toàn vô lý. Nó dựa trên ý tưởng rằng việc học bất kỳ ngôn ngữ cụ thể nào cũng mất chính xác X tháng ( HINT! HINT! ) Trong đó X là một số duy nhất hoặc một số cho mỗi ngôn ngữ. Điều này gần giống với ý tưởng rằng bạn có thể tiết kiệm thời gian và tiền bạc bằng cách bỏ qua tất cả các 'yêu cầu' và 'thử nghiệm' rác.

Đối với nhiều cú pháp, bạn sẽ làm tê liệt các sinh viên một cách nguy hiểm nếu bạn dạy họ mong đợi cú pháp C trong mọi ngôn ngữ bằng cách khiến chúng thiên vị cực kỳ so với các ngôn ngữ khác.

Hầu như bất kỳ con đường nào đều nhanh hơn và tốt hơn so với bắt đầu với C ++. Học một ngôn ngữ cấp cao đơn giản và sau đó C ++ sẽ nhanh hơn. Học lắp ráp và sau đó C ++ sẽ nhanh hơn. Bất cứ điều gì khác ngoài C ++ sẽ đưa sinh viên đến đó nhanh hơn và họ sẽ biết nhiều hơn để khởi động. Đừng dạy C ++ trước.


4
Câu trả lời chính xác! Thật vậy, nhiều tính năng của C ++ hoàn toàn không liên quan đến lập trình cấp thấp.
Marco Mustapic

7
+1, câu trả lời xuất sắc. Đúng là đôi khi những ý tưởng bất chợt của C ++ bị đánh đồng là "mức độ thấp". Bạn đã liên kết với Câu hỏi thường gặp về C ++, nhưng tôi cũng khuyên mọi người nên xem C ++ FQA (hoặc "Câu hỏi thường gặp": P)
Andres F.

2
Ồ Điều đó làm tôi nhớ đến Java IAQ ...
Jesse Millikan

Hoàn toàn đồng ý. Thậm chí Malbolge sẽ tốt hơn C ++ cho người mới bắt đầu.
đúng

2
Đặt phòng duy nhất của tôi - bạn có thể dạy rất nhiều mà không cần đi sâu vào các chi tiết hầu như chỉ liên quan đến những người phát triển thư viện. Chừng nào bạn nói rõ rằng bạn chỉ đang làm C ++ cơ bản ... nhưng một lần nữa, bạn đã dạy ai điều gì chưa?
Steve314

54

Không, C ++ là một ngôn ngữ khó ngay cả đối với các nhà phát triển C ++ có kinh nghiệm. Ngay cả đối với các thuật toán đơn giản nhất, bạn phải giải thích nhiều sự tinh tế trong ngôn ngữ. Hãy xem xét một ví dụ Hello World:

#include <iostream>

int main()
{
  std::cout << "Hello World!" << std::endl;
}

#includeLệnh đó là gì? Có gì std::cout. Tại sao ::? Là <<gì Ohhh, nó là một nhà điều hành quá tải! Toán tử quá tải là gì? Sooo, vì ints, nó không thay đổi chút nào, nhưng cho dù std::coutlà gì , nó sẽ xuất công cụ lên bàn điều khiển. Ohhh, std::coutlà một luồng và các luồng có quá tải <<>>toán tử của chúng .

Chúng ta hãy xem cùng một mẫu trong Python:

print("Hello World!")

Vậy đó, hãy viết mã một số thuật toán.


15
Python sẽ thích hợp cho một học sinh lớp bảy. Một sinh viên đại học có thể nắm bắt nhiều hơn nữa.
Gul Sơn

13
Chắc chắn, nhưng chúng ta đang nói về một ngôn ngữ đầu tiên. C ++ được biết đến là khó học và thành thạo, so với các ngôn ngữ khác. Tại sao sử dụng nó để dạy lập trình? Một sinh viên có thể học C ++ sau này, khi anh ta biết một số điều cơ bản về lập trình.
Marco Mustapic

8
Bạn thậm chí không đề cập đến việc tra cứu phụ thuộc vào đối số của << :)
Hệ thống số liệu

6
Bạn không cần phải biết hoàn toàn mọi thứ để bắt đầu với một ngôn ngữ. cout << sao cũng được; "chỉ hoạt động", bạn không cần phải đi sâu vào các chi tiết khó chịu cho đến khi bạn bảo vệ quá tải toán tử, v.v.
Colen

6
Tôi sẽ lấy Python qua C ++ bất kỳ ngày nào trong tuần làm ngôn ngữ giới thiệu.
jprete

21

Đây có thể không phải là ngôn ngữ đầu tiên tốt: cú pháp phức tạp, nhiều quy tắc, ngôn ngữ cũ, quản lý bộ nhớ dễ bị lỗi. Tốt hơn là dạy cho sinh viên của bạn một cái gì đó OO hơn như Smalltalk, hoặc một cái gì đó đẹp hơn để lập trình với như Python, hoặc một cái gì đó có chức năng như Haskell.

Họ có thể học C ++ sau này trong cuộc sống (nếu họ không thể giúp nó), sau khi họ đã học các ngôn ngữ tốt hơn.


5
Haskell là ngôn ngữ đầu tiên sẽ là một thử nghiệm thú vị.
Larry Coleman

@Larry, khóa học CS của Đại học Cambridge dạy SML là ngôn ngữ đầu tiên.
Peter Taylor

1
Lập trình chức năng xoắn bộ não của bạn - Tôi biết MIT bắt đầu với Scheme từ khá sớm, nhưng tôi vui vì tôi đã không bắt đầu lập trình chức năng cho đến sau hai năm theo kiểu tiến trình lai / OO ở trường.
justkt

11
@justkt: Tất cả các ngôn ngữ xoắn não của bạn. Đó chỉ là vấn đề bạn muốn nó xoắn như thế nào.
David Thornley

+1, nhưng tôi sẽ không phân loại các ngôn ngữ khác ngoài C ++ vì nó nhất thiết phải "tốt hơn".
greyfade

18

Câu trả lời ngắn gọn: Có!

Tôi muốn nói rằng bất kỳ ngôn ngữ nào cũng là một khởi đầu phù hợp nhưng đặc biệt là C ++ (hoặc tương đương). Ngày nay, C # và Java là những ngôn ngữ chính được sử dụng và lập trình với những ngôn ngữ này, bạn nhanh chóng học cách dựa vào API và IDE, nhưng với C ++, bạn có cơ hội học lập trình từ đầu, bao gồm tối ưu hóa hiệu suất, v.v.

Không bao giờ là một ý tưởng tồi để tìm hiểu những điều cơ bản về lập trình, lặp và sắp xếp trước khi bạn chỉ mù quáng dựa vào một ngôn ngữ được xây dựng trong .Sort ();


11
Vòng lặp và phân loại, vâng. Bạn có thể làm điều đó với bất kỳ ngôn ngữ. Nhưng tại sao bắt đầu làm việc với con trỏ và cú pháp kỳ lạ khi bạn có thể tránh nó? Bạn có thể học tất cả những điều đó sau này, khi bạn có nhiều kinh nghiệm lập trình.
Marco Mustapic

4
@Marco: Sách giáo khoa giới thiệu của Stroustrup "Lập trình: Nguyên tắc và thực hành sử dụng C ++" giới thiệu các gợi ý ở giữa cuốn sách. Bạn có thể làm rất nhiều thứ trong C ++ mà không cần giới thiệu con trỏ.
David Thornley

4
Bạn không bao giờ là một ý tưởng tồi để tìm hiểu những điều cơ bản trước khi Tập, bạn có nghiên cứu nào để hỗ trợ cho yêu sách này không? Tôi biết rằng nhiều người thông minh gọi nó là kiến ​​thức phổ biến rằng từ dưới lên, đó là cách giảng dạy thực sự duy nhất nhưng đây là một điểm rất gây tranh cãi và là nghiên cứu giáo khoa duy nhất (rất hạn chế) mà tôi biết chỉ ra kết luận ngược lại.
Konrad Rudolph

1
@David: Vấn đề là, làm "nhiều thứ trong C ++" mà không có con trỏ thậm chí còn tồi tệ hơn. Không có con trỏ, tất cả các đối tượng của bạn được khai báo trên ngăn xếp, đó là một trong những ý tưởng lập trình tồi tệ nhất EVER. Các loại giá trị và tính kế thừa / đa hình chỉ không trộn lẫn và cố gắng trộn chúng dẫn đến toàn bộ các loại lỗi không tồn tại trong các ngôn ngữ được thiết kế tốt hơn.
Mason Wheeler

9
Trời ơi, không! Tại sao đốt cung cấp hạn chế của chu kỳ não trên các đặc điểm không cần thiết của C ++? Tại sao tập trung vào những thứ cấp thấp không liên quan, như quản lý bộ nhớ, khi mục tiêu là học các khái niệm cơ bản trong lập trình? Tại sao lại nhảy vào vực sâu?!
Maglob

14

Trên thực tế tôi tin rằng nó có thể là một lựa chọn tốt như một ngôn ngữ đầu tiên vì một lý do rất thực tế: Sau khi học C ++, bất kỳ ngôn ngữ nào khác mà bạn gặp sẽ có vẻ như dễ học.


10
Với tất cả các khoản tín dụng cho Dijkstra, thực tế không thể dạy lập trình tốt cho các sinh viên đã tiếp xúc với C ++ trước đó; là những lập trình viên tiềm năng, họ bị cắt xén tinh thần ngoài hy vọng tái sinh. ;)
Mason Wheeler

3
Họ sẽ phải học hỏi rất nhiều thói quen xấu từ C ++. Để sử dụng một ví dụ khác, việc biết trình biên dịch chương trình có làm cho bạn trở thành một lập trình viên Java tốt hơn không? Tôi muốn nói là KHÔNG.
Andres F.

16
@ Andrés F.: Gotta không đồng ý với điều đó. Biết trình biên dịch chương trình giúp bạn trở thành một lập trình viên tốt hơn bất kể bạn đang viết gì, bởi vì sau đó bạn có thể hiểu những gì đang thực sự xảy ra.
Mason Wheeler

2
@Andres: Tôi đã thấy quá nhiều lập trình viên Java / C # đến với các ngôn ngữ khác và nhồi nhét mọi thứ vào các đối tượng ... họ thiếu bề dày kinh nghiệm.
Matthieu M.

3
@Andres F. - Trong 12 năm làm Java, tôi đã gặp phải những chia sẻ của các lập trình viên Java thực sự bị thu hút vì không có bất kỳ loại tiếp xúc nào với các vấn đề như phân bổ tài nguyên, RAII, không biết cách lập trình các ứng dụng thân thiện với gc, v.v ... Biết lắp ráp và biết các ngôn ngữ được biên dịch mà không cần hỗ trợ rác tự động và với sự hỗ trợ cho các mô hình khác ngoài OO (C, C ++, Ada hoặc chỉ về bất kỳ ngôn ngữ được biên dịch nào trong họ Algol) dạy cho bạn cách viết các hệ thống lớn và hiệu quả trong Java, C #, Python, bạn đặt tên cho nó. Thêm vào đó, mô hình đối tượng trong C ++ hoàn toàn không giống với Java.
luis.espinal

10

Tôi đã tự học C ++ khi tôi 15-16 tuổi.

Tốt hơn là để lại phép thuật cho người khác và tự học các hoạt động bên trong của mọi thứ.


Nói một cách thẳng thắn, nếu bạn không thể tìm ra cú pháp và ngữ nghĩa C ++ cấp nhập cảnh, thì bạn không giỏi về máy tính. Nó không khó lắm đâu. Không có lý do chính đáng để tránh "C với các lớp".

Nếu bạn mong đợi sinh viên bắt đầu làm việc với siêu lập trình mẫu, suy ra các cuộc gọi đa hình và gỡ rối nhiều hệ thống phân cấp thừa kế - đó là điều vô lý đối với một lớp cấp nhập cảnh cho bất kỳ loại ngôn ngữ nào bạn sử dụng.

Có một xu hướng rất xấu là muốn che giấu sự phức tạp của lập trình cho sinh viên. Điều đó không kết thúc tốt (bài tiểu luận Trường học Java của Spolsky). Những người đó kết thúc trên DailyWTF nếu họ không thẳng thắn. Sự trừu tượng bị rò rỉ, và khi (không nếu) sự trừu tượng bị rò rỉ, điều đó còn tệ hơn là phải đối phó với nó. Tôi đã làm việc như một TA cho sinh viên cấp C ++. Hoặc là mọi thứ phải được giấu kín tất cả các cách, hoặc chúng phải được đưa ra ánh sáng để được kiểm tra. Phép thuật là kẻ thù của người học.

Nếu tôi phải đề xuất một ngôn ngữ bắt đầu được biên dịch thành mã máy, một biến thể Pascal có lẽ sẽ là cách tiếp cận tốt nhất. Nó có một cách tiếp cận thường xuyên và có cấu trúc hơn so với gia đình C từ những gì tôi nhớ lại.


1
@Ed: Không hẳn. Tôi đã thành thạo If và Goto trong QBASIC, và đó là về nó. Con trỏ, mảng, hàm, lớp, v.v ... đều nằm trong tương lai C ++ của tôi. Đệ quy cũng không thể hiểu được.
Paul Nathan

5
Đợi đã, không ai mong đợi ai đó sẽ làm việc trên một dự án bằng C ++ mà không hiểu C ++ trước! Điều đó thực sự sẽ dẫn đến mã xứng đáng với TheD DailyWTF. Nhưng trái với yêu cầu của bạn, việc học C ++ không phải là chuyện nhỏ (và cũng không phải là "C với các lớp"). C ++ có cú pháp và ngữ pháp rất lớn, phức tạp và đôi khi không nhạy cảm, và vô số từ khóa và quy tắc. Đó là một ngôn ngữ khủng khiếp để bắt đầu. Là một ngôn ngữ giảng dạy, điều đó thật tồi tệ vì nó khiến sinh viên nghĩ rằng sự thiếu sót của C ++ là điều tự nhiên và không thể tránh khỏi trong thế giới lập trình.
Andres F.

1
Andr: Bạn đang khăng khăng đòi phân đôi giả: "~ C ++ hoặc All C ++". Đó là ngụy biện.
Paul Nathan

1
@Paul: đủ công bằng. Nhưng hãy xem xét điều này: ngay cả cú pháp & ngữ pháp của một C ++ đơn giản hóa cũng bị sai lệch bởi vì nó phải hỗ trợ tất cả các tính năng của ngôn ngữ đầy đủ. Vì vậy, bạn đã thỏa hiệp về việc sử dụng một ngôn ngữ xấu xí, ngay cả khi bạn dạy nó ở dạng đơn giản hơn. Tôi giả sử bạn không chỉ mã hóa bằng C với một số đường tổng hợp (còn gọi là "C với các lớp"), bởi vì trong trường hợp đó, bạn được phục vụ tốt hơn bởi đồng bằng C!
Andres F.

2
@Andr: Không hẳn. C ++ cung cấp đơn giản hóa cú pháp đáng kể so với C89. Hơn nữa, đối với các mục đích cấp nhập cảnh, mọi thứ rất đơn giản cho tất cả các trường hợp tôi có thể nghĩ đến ...
Paul Nathan

8

Tôi sẽ nói 'không' - tôi có một sự háo hức và mong muốn học lập trình, và đã đi ngay vào năm giới thiệu của tôi ở trường đại học với C ++ ngay lập tức. Cùng với một giáo viên dạy C ++ như thể đó là một ngôn ngữ khác (các khái niệm có ý nghĩa với họ, không nhất thiết là các khái niệm về ngôn ngữ hoặc ứng dụng trong thế giới thực), và các dự án ném vào chúng tôi ngay lập tức mỗi tuần, tôi đã sụp đổ và bị đốt cháy cùng với một nửa lớp Vào thời điểm tôi thậm chí có thể tiêu hóa, thử nghiệm và áp dụng những gì tôi được dạy, tôi đã vật lộn với bài tập về nhà của dự án, nhân đôi khi làm bài kiểm tra. Tôi sẽ tranh luận rằng đó là một khóa học 200 cấp hơn 100.

Tôi thực sự đã cố gắng hết sức. Tôi không yêu cầu sự thông cảm, tôi biết đó sẽ là một thử thách, nhưng giáo viên thậm chí sẽ không giúp tôi. Chỉ bảo tôi đi đọc sách giáo khoa, như tôi đã từng làm.

Tôi sẽ tranh luận (và một số người sẽ không đồng ý) rằng Ruby hoặc Python là ngôn ngữ tốt hơn nhiều để đưa ai đó vào thế giới lập trình. Sạch sẽ, súc tích, dễ đọc, cú pháp rõ ràng hơn.


8
Bất kỳ ngôn ngữ nào cũng là ngôn ngữ đầu tiên tồi nếu được dạy không tốt.
David Thornley

3
@David Thornley: tuy nhiên, ngay cả khi được dạy chính xác, một số ngôn ngữ là một lựa chọn kém như ngôn ngữ đầu tiên. Ví dụ, Cobol.
Andres F.

Tôi đồng ý, tôi cảm thấy rằng với một giáo viên tốt hơn, một người quan tâm đến việc thu hút người khác và không chỉ thông qua tài liệu khóa học với tốc độ nhanh như chớp, kết quả có thể khác. Nó chỉ lăn quá nhanh đối với tôi.
Kevin

@ Andrés F.: Tôi không đồng ý với điều đó. Tuy nhiên, tài khoản của Kevin là về một giáo viên tồi và một giáo viên tồi có thể sử dụng Python hoặc Scheme như một ngôn ngữ đầu tiên (hai đề cử của tôi cho ngôn ngữ đầu tiên tốt).
David Thornley

2
@Chris: Tôi đã lập trình ở Cobol và tôi thương hại bạn :)
Andres F.

8

Không.

Là một ngôn ngữ giảng dạy, C ++ chỉ nhỉnh hơn C, một trong những ngôn ngữ giảng dạy tồi tệ nhất xung quanh. Nó giới thiệu rất nhiều sự phức tạp ở phía trước, một số phần của ngôn ngữ không trực quan sâu sắc và hầu hết thời gian bạn học nhiều về C ++ hơn là về lập trình nói chung.

Điều đó không có nghĩa là C ++ (hoặc C) là ngôn ngữ xấu hoặc không đáng để học; chỉ là có sẵn các ngôn ngữ giảng dạy tốt hơn, chẳng hạn như Python.


1
C là một ngôn ngữ khó giảng dạy, nhưng nó chắc chắn là một trong những ngôn ngữ tồi tệ nhất. COBOL và Java coi chiếc bánh là một trong những điều tồi tệ nhất, tồi tệ hơn nhiều so với C. Điều tốt ở C là bạn phải đối phó với kim loại bên trong ở phía trước (mà không phải đào sâu vào trình biên dịch). Mọi người đã được dạy thành công với C là ngôn ngữ chính của nó. Tất nhiên, có những lựa chọn khác thanh lịch hơn, như Python hoặc Ruby (hoặc bất kỳ ngôn ngữ nào là đa mô hình và không cần thiết phải đẩy OO lên phía trước cho ngay cả những nhiệm vụ đơn giản nhất.) C không phải là một trong những cách dạy tồi nhất sự lựa chọn, không phải bởi một cú sút xa.
luis.espinal

1
Marginally tốt hơn? Làm thế nào để bạn hình? C ++ lấy mọi thứ tệ về C và xây dựng trên đó !
Mason Wheeler

1
@MasonWheeler: Chủ yếu là vì C ++ cung cấp một-to-trung thực của Đức Chúa Trời stringkiểu dữ liệu mà quá tải khai thác thích +, ===làm những điều mà sinh viên nhiều hơn hoặc ít hơn mong đợi, so với cách ứng nhu cầu xử lý chuỗi để được thực hiện trong C. Do đó "nhẹ" . Tôi sẽ không đề nghị hoặc là một ngôn ngữ giảng dạy.
John Bode

7

Có hai loại giáo dục sau trung học thiết yếu: trường đại học và trường thương mại. Sự khác biệt là ở những gì bạn muốn được chuẩn bị để làm sau khi tốt nghiệp. Trong lĩnh vực ô tô, đó là việc bạn sẽ là thợ cơ khí hay kỹ sư cơ khí.

Điều đó đang được nói, C ++ là một ngôn ngữ đầu tiên tuyệt vời nếu bạn muốn trở thành một kỹ sư, và là một ngôn ngữ tệ hại nếu bạn muốn trở thành người lập trình tương đương với một thợ máy.

Một lớp giới thiệu về C ++ sẽ dành nhiều thời gian để nói về các kiểu dữ liệu, định nghĩa, khai báo, con trỏ, cấp phát bộ nhớ, v.v. Đây là một nền tảng tuyệt vời nếu bạn dự định dành một vài học kỳ để xây dựng để có thể làm bất cứ điều gì hữu ích, nhưng muốn biết rằng một khi bạn đến đó, bạn có nền tảng để xử lý bất kỳ mức độ phức tạp nào.

Mặt khác, nếu bạn muốn có thể làm điều gì đó hữu ích nhanh hơn, nhưng đừng bận tâm nếu tên miền và độ phức tạp bị hạn chế, thì việc dành toàn bộ thời gian cho những khái niệm cấp thấp hơn đó sẽ là một sự lãng phí. Có rất nhiều lập trình viên có thể viết một trình xác nhận mẫu html tuyệt vời, nhưng không biết cách tiếp cận thiết kế trình điều khiển thiết bị.


5

Chắc chắn rồi. Ngôn ngữ đầu tiên của tôi là C, nhưng đó thực sự chỉ là để dễ dàng cho lớp chúng tôi vào C ++. Nó làm cho Java dễ xử lý hơn nhiều khi tôi vào Đại học. C ++ có thể có một đường cong học tập hơi dốc hơn, nhưng nếu nó được dạy đúng cách thì nó sẽ ổn thôi.


4

Không, C ++ không phù hợp làm ngôn ngữ đầu tiên. Như được hiển thị ở đây, nhiều lập trình viên chuyên nghiệp chia sẻ ý kiến ​​này, nhưng đây cũng là một ý kiến ​​mà các giáo viên chuyên nghiệp có.

Dưới đây là những gì một báo cáo từ trưởng khoa của Đại học Carnegie Mellon nói về việc sử dụng C ++ cho một khóa học giới thiệu để lập trình cho sinh viên năm nhất:

Các ngôn ngữ tiêu chuẩn như C hoặc C ++ không phù hợp với khóa học này vì sự phức tạp và thiếu sót của chúng cản trở cả các kỹ thuật lý luận không chính thức và cơ giới hóa.

CMU cung cấp hai khóa học giới thiệu, một khóa học bắt buộc và một khóa học chức năng. SML đã được chọn để lập trình chức năng. Tôi không biết những gì đã được chọn cho khóa học bắt buộc, nhưng báo cáo đề cập đến việc sử dụng một tập hợp con của C.


2

Chắc chắn rồi. Có những ngôn ngữ khác có thể dễ dàng hơn cho sinh viên năm đầu tiên nắm bắt. Tuy nhiên, có nhiều cách mà một giáo viên có thể từ từ giới thiệu các khái niệm trong C ++.


2

Chắc chắn C ++ có thể là ngôn ngữ đầu tiên. Nhưng đó là về cách nó được dạy.

Mọi người đều nói, ngôn ngữ đầu tiên nên rất dễ nắm bắt. Nhưng quan điểm của tôi là, hầu hết mọi người bắt đầu lập trình ở bậc đại học. Vì vậy, bạn có thể dạy một cái gì đó họ có khả năng nắm bắt. Và với C ++, bạn có thể đi từ cấp thấp hơn đến cấp cao hơn về lập trình.


Nhưng tại sao không bắt đầu ở cấp độ cao hơn của lập trình? Tất nhiên, đó là mức độ chúng tôi giải quyết hầu hết các vấn đề (ngoại trừ một số vấn đề cụ thể về tên miền). Sau đó, nếu họ cần đến gần hơn với kim loại, họ có thể học C ++, trình biên dịch, v.v.
Andres F.

Tôi đồng ý, đó là về cách nó được dạy!
Gary Willoughby

2

Không. Hoàn toàn không.

Nếu tôi có cách của mình, tôi sẽ không cho phép sử dụng nó trong môi trường học thuật gần như hoàn toàn. Không phải vì những lý do trái ngược với những lý do đã được đưa ra, mà vì quá nhiều người nghĩ C ++ (hoặc nó biến thể) là câu trả lời cho gần như mọi vấn đề vì bạn có thể sử dụng nó trong gần như mọi tình huống. Nó là tuốc nơ vít lập trình.

Một số người sử dụng nó để thắt chặt ốc vít, một công cụ hoàn toàn hợp lý cho công việc. Những người khác sử dụng nó như một prybar, trong khi thường hiệu quả, không thực sự lý tưởng bởi vì một cái tuốc nơ vít, bất kể cha bạn có thể nói gì với bạn, không phải là một prybar, và có thể thất bại thảm hại do sử dụng sai vì cấu tạo của chuôi không được xây dựng có chủ ý đối với loại lực lượng mà một prybar sẽ gặp phải. Vẫn còn những người khác có thể thử và sử dụng nó như một cú đấm hoặc một cái đục, và họ hầu như sẽ luôn gặp phải vấn đề vì tay cầm của tuốc nơ vít không được chế tạo cho loại lạm dụng nổi bật mà đục hoặc đục được thiết kế để chịu được.

Theo tôi, công việc của một lập trình viên là thường biến các vấn đề thực sự thành tự động hóa để cung cấp một mức độ hiệu quả được cải thiện (giảm sự cam kết tài nguyên cho một nhiệm vụ), vận tốc (giảm thời gian thực hiện một nhiệm vụ), khả năng dự đoán (tăng độ lặp lại của một nhiệm vụ), hoặc tổ chức (tăng nhận thức về mối quan hệ giữa các nhiệm vụ).

Mặc dù có thể hiểu rằng mọi người lập trình nên có một số kiến ​​thức phổ biến về hoạt động của máy tính ở mức độ thấp, và cụ thể là phân bổ IO và bộ nhớ, nhưng thực sự không phổ biến để sử dụng kiến ​​thức đó ở bất kỳ mức độ đáng kể nào, chứ đừng nói đến việc tận dụng nó cho đại đa số các nhiệm vụ. Cố gắng làm như vậy mà không hiểu bối cảnh rộng lớn hơn của vấn đề sẽ đưa rủi ro không ngừng vào một nỗ lực.

Thật phi lý khi một ngôn ngữ lập trình đầu tiên phải là C / C ++ hoặc các biến thể gần gũi, vì loại vấn đề mà C và các dẫn xuất của nó giải quyết chắc chắn không phù hợp với một số phần trăm lớn các vấn đề hiện tại và tương lai (trừ trường hợp phải giải cứu một chương trình trước đây, có tua vít), và trên thực tế là nhiều hơn một loạt các vấn đề sắp tới. Hầu hết các lập trình viên sẽ không bao giờ tiến gần đến việc phát triển các tính năng hệ điều hành cốt lõi hoặc giao diện thiết bị trực tiếp, mặc dù làm tăng tính phổ biến của các thiết bị di động nhỏ, được kết nối với nhau. Hầu hết sẽ làm việc và sống như chúng ta đã làm. Sửa và loại bỏ mã đã hơn hai thế hệ cũ, thực hiện trên công nghệ đã hiển thị tuổi hoặc làm việc trong rìa công nghệ trên ứng dụng sát thủ (x + 1).

Đối với ngôn ngữ đầu tiên, tôi sẽ xem xét Lego NXT, một biến thể LabView phong phú nhưng có tính năng cao. Mặc dù Lego NXT không được sử dụng rộng rãi trong các dự án thương mại, nhưng nó sẽ trình bày bản chất cơ bản của chương trình theo cách "giàu cảm biến". Tôi có thể ghép nối nó với một ngôn ngữ kịch bản trung lập có phần nền tảng như Javascript hoặc TCL / TK. Cả hai sẽ có tác động tương đối thấp về những gì bạn phải khám phá để thực hiện các nhiệm vụ rất cơ bản nhưng hiệu quả, với lợi nhuận cao về vòng phản hồi và tính linh hoạt để giới thiệu và giải quyết các mức độ phức tạp khác nhau của vấn đề. Thêm vào đó, nó cung cấp một cơ hội tốt cho sinh viên khi họ tiến lên để khám phá tiềm năng vượt quá những gì được cung cấp trong môi trường đóng hộp: cơ hội để thử làm việc trong bóng tối, ẩm ướt,

Sau khi họ học lái bốn xi-lanh tự động, sau đó đẩy họ lên hotrod thủ công v8 lớn, nếu họ thực sự quan tâm và có động lực. Nếu Joel không thể tìm thấy các lập trình viên ngôi sao nhạc rock dưới bất kỳ hòn đá nào dưới chân anh ta, anh ta có thể phải tiếp tục tìm kiếm một nơi khác, hoặc suy nghĩ lại tại sao anh ta có thể cần nhiều hơn một tua vít trong hộp công cụ của mình.


1

Một số điểm mà người mới bắt đầu dễ mắc lỗi trong C ++ là:

thực hiện các bài tập mà bạn muốn kiểm tra = vs ==

Còn thiếu ;

Khả năng đọc của dấu ngoặc nhọn so với đầu pascal chẳng hạn

Và sau đó có tất cả các tập tin bao gồm, macro, quản lý bộ nhớ, vv để gây nhầm lẫn.

Vì vậy, tôi sẽ nói C ++ không phải là ngôn ngữ tốt nhất để bắt đầu - tuy nhiên không có nghi ngờ gì rằng nó có thể rất hữu ích khi bạn đã học nó.

Tôi sẽ - như những người khác cũng đề xuất - sử dụng C #, Java hoặc thậm chí là VB - và một IDE tốt với cú pháp tô sáng, trình gỡ lỗi, v.v. để giúp cho việc khôi phục lỗi dễ dàng hơn.


1

Khi tôi học đại học, C ++ là ngôn ngữ nền tảng được dạy trong suốt năm đầu đại học. Lý thuyết là nó chứa một số khái niệm lập trình phức tạp, vì vậy nếu bạn có thể thành thạo nó, bạn có thể chọn các ngôn ngữ khác. Nó phục vụ tôi tốt như một nền tảng tốt.

Phải nói rằng, trong năm cuối cấp, tôi đã phục vụ trong một ủy ban để xác định xem có nên chuyển ngôn ngữ cốt lõi sang Java hay không. Sau khi nói chuyện với một số nhà tuyển dụng nổi tiếng và một số cựu sinh viên của khoa, người ta đã xác định rằng việc chuyển sang Java là mối quan tâm tốt nhất của sinh viên. Các nhà tuyển dụng chúng tôi đã nói chuyện muốn mọi người có kinh nghiệm về ngôn ngữ họ đang sử dụng để thuê họ. Tôi tin bây giờ, 10 năm sau, họ vẫn đang sử dụng Java làm ngôn ngữ cốt lõi.

Một lưu ý tương tự, chúng tôi đã tìm cách thuê một vài sinh viên tốt nghiệp đại học gần đây với các kỹ năng C ++ thực sự tốt. Chúng tôi không thể tìm thấy bất kỳ.


1

Tôi sẽ nói có. Nhưng bất kỳ ngôn ngữ nào thực sự có thể là ngôn ngữ đầu tiên. Tôi nghĩ C ++ là tốt bởi vì mặc dù nó phức tạp và đôi khi khó khăn, nhưng nó cho bạn thấy những gì bạn thực sự có thể làm (ít hạn chế hơn). Ngoài ra, nó có một số thiết kế hướng đối tượng có thể giúp bạn sẵn sàng tiếp nhận các ngôn ngữ khác.

C ++ là ngôn ngữ đầu tiên của tôi và tôi rất vui vì điều đó. Nó khiến tôi suy nghĩ trong suy nghĩ OOP từ rất sớm và tôi rất biết ơn vì điều đó. Nhưng cuối cùng, nó thực sự đi xuống với những gì bạn muốn làm. Ngôn ngữ không quan trọng bằng vì nếu bạn có thể làm tốt với một ngôn ngữ, rất có thể bạn sẽ không gặp vấn đề gì khi chọn ngôn ngữ khác. Bạn muốn làm gì? Làm game? Chương trình cho điện thoại di động? Mỗi người sẽ có công cụ và ngôn ngữ phù hợp hơn với nó.


1

C ++ là ngôn ngữ chuyên gia, không phải ngôn ngữ mới bắt đầu ... sẽ nói C trước, không phải Java hay C # hay Python ... tại sao? bởi vì C dạy bạn quan tâm đến trí nhớ của bạn và một số khái niệm phức tạp như con trỏ bị "ẩn" bởi tất cả các ngôn ngữ vẫn hiện diện ở mọi nơi. Tôi đã thấy rất nhiều nhà phát triển trẻ thậm chí không hiểu tại sao đôi khi bộ nhớ nên được giải phóng và tin rằng trình thu gom rác không phải là một chú lùn nhỏ giúp xóa sạch mọi cơn điên mã hóa: chúng khởi tạo, chúng khởi tạo và bùng nổ ngay cả khi chúng có XXXXGb RAM ... Nhưng họ không hiểu tại sao người dọn rác không chỉ đơn giản là làm sạch mọi thứ! Và tôi đã thấy loại nhà phát triển mã hóa trong C ++ (và thậm chí điên rồ hơn, ở Corba) và đó là một cuộc tàn sát !!!!!!!!!! Vì vậy, tôi sẽ khuyên bạn nên học mã hóa trong C và sau đó đi tới Python / Java / C # cho các khái niệm đối tượng và tất cả các đường xung quanh. Sau đó, khi bạn hiểu tất cả những điều đó, bạn đi đến C ++ và bạn cảm thấy sức mạnh của C ++ nhưng bạn cũng khám phá tất cả những nguy hiểm của nó và tại sao nó không được sử dụng bởi bất kỳ ai;)


1

KHÔNG. Có rất nhiều thứ mà C ++ có, điều đó khiến người mới khó hiểu. Đừng tham gia vào fallacie "tất cả các ngôn ngữ lập trình đều như nhau".

Bắt đầu với Basic hoặc Pascal, (bỏ qua nội dung "chúng bị phản đối") và sau đó, với C / C ++ / Java / C # / Perl. Hoặc nếu bạn có cơ hội, đầu tiên với Logo & Karel, sau đó là Cơ bản hoặc Pascal.

PD Một số trường đại học & trường đại học có lớp so sánh & sử dụng Ngôn ngữ lập trình, và điều xảy ra là tôi đã dạy lớp đó ;-)


0

Bạn có thể chọn bất kỳ ngôn ngữ nào để học các nền tảng của lập trình. Tôi đã học được những thứ trong C / C ++. nhưng 7 năm sau, các công cụ / ngôn ngữ được thay đổi trong trường của tôi và họ thích java / C #. các ngôn ngữ chỉ là công cụ. Những gì bạn cần để có được tốt hơn là các nguyên tắc cơ bản. ví dụ, ở MIT, người ta học các nguyên tắc cơ bản của thuật toán bằng python. ví dụ Java có thể tốt cho lập trình web. nhưng C / C ++ tốt cho các dịch vụ và ứng dụng hiệu suất cao. Vì vậy, nó phụ thuộc vào tình huống của bạn.


0

Nếu "phù hợp" là viết tắt của "có thể", có. Nếu cho "tốt", chắc chắn là không.

Bạn có thể thích, thậm chí yêu C ++, nhưng để bạn học tốt hơn một số ngôn ngữ và làm việc vài thập kỷ với các cơ sở mã hóa thối nát, hãy trải nghiệm "chế tạo phần mềm không cần thiết thực sự hoạt động" - thì C ++ sẽ có sức hấp dẫn.

Không phải lúc bắt đầu khi bạn còn trinh, hãy nghịch ngợm với những vấn đề nhỏ, đơn giản (nhưng được cho là thú vị và vui vẻ).

Tôi sẽ bắt đầu với python, tiếp theo là SICP (lược đồ) hoặc một cái gì đó tương tự. Có thể đảo ngược hoặc xen kẽ. Với những người bạn chỉ có thể đi và giải quyết vấn đề. Thay vì chiến đấu với hệ thống, đi bộ trong bùn sâu và tìm hiểu tất cả các loại kỳ quặc phi lý và lý do lịch sử của chúng.

Sau này, khi bạn đã có thể lập trình thoát khỏi túi giấy, hãy chuyển sang kim loại trần: tìm hiểu cách lắp ráp và một số kiến ​​trúc, cộng với có thể là Knuth's Mix. Tôi không có nghĩa là ghi nhớ opcodes hoặc làm nhiều thứ thực sự, chỉ để hiểu bộ nhớ, đăng ký, ALU, bộ nhớ cache, ngắt, và ở cấp độ đọc.

Sau đó, với nền tảng đó, bạn có thể tiếp xúc với các ngôn ngữ khác, bao gồm cả C ++. Có lẽ một ý tưởng tốt để thêm một số "lịch sử và sự phát triển của ngôn ngữ" ở giữa.


0

Tôi bắt đầu với C ++ ở trường trung học. Tôi đã chọn một bản sao của cuốn sách này: C ++ Cách lập trình bởi Delist và Delist . Cuốn sách này khá hay.

Thành thật mà nói không có câu trả lời đúng hay sai ở đây, cá nhân tôi thấy rằng C ++ có thể nắm bắt được. Tôi đã học được tất cả các cách để OOP (Tôi đã gặp phải "điều này" mà bây giờ tôi không hiểu làm thế nào tôi không thể có được điều đó nhưng bất cứ điều gì). Hãy thử nó, đừng nản lòng. Nếu bạn gặp khó khăn, hãy kiểm tra các ngôn ngữ khác và tiếp tục học những ngôn ngữ mới. Ý tưởng là khi bạn thấy cùng một khái niệm trong 2-3 hình thức khác nhau, bạn sẽ hiểu chúng hơn. Như tôi đã nói, khái niệm về con trỏ "này" làm tôi bối rối nhưng khi tôi thấy điều tương tự trong Python (tự đặt tên thay thế), nó có ý nghĩa với tôi ngay lập tức vì tôi đã hiểu nó trong C ++. Đừng học Java nếu bạn có thể dạy nhiều trường như vậy. Hãy học python hoặc ruby ​​vì đó là ngôn ngữ du jour và nếu bạn có thể khám phá thêm nhiều thứ thích hợp / mới như Clojure (và tất cả các lisps khác), Haskell, Scala ...


-1

Không. Tôi sẽ bắt đầu với Java hoặc C #. Nếu bạn muốn học C ++, có thể dễ dàng hơn sau khi bạn đã học những điều cơ bản, chẳng hạn như lớp học là gì, cách thực hiện các vòng lặp và dĩa (nếu, sau đó là câu lệnh), v.v ... Điều quan trọng hơn nhiều là học cách xem một vấn đề hoặc một phương trình toán học và lập trình nó hơn là tìm hiểu xem bạn đã giải phóng tất cả bộ nhớ hay chưa.


2
Tại sao Java hoặc C # khi Python thậm chí còn đơn giản hơn?
David Thornley

-3

Có vẻ như giả định đằng sau câu hỏi này là "C ++ có vẻ phức tạp như vậy, liệu một người 16 tuổi có thể chọn nó làm ngôn ngữ đầu tiên (lập trình máy tính) không?"

Khi chúng tôi lên 4 hoặc 5 tuổi, chúng tôi nhận được hầu hết các cấu trúc bằng tiếng mẹ đẻ, chỉ cần tiếp xúc nhiều với nó thông qua việc nghe người khác nói nó. Hình thành những câu tuyệt vời cần một thời gian cuộc sống, không có câu hỏi đó.

C ++ chắc chắn ít phức tạp / phức tạp hơn nhiều so với hầu hết các ngôn ngữ của con người. 16 tuổi chắc chắn có thể nhận nó. Họ sẽ viết mã tuyệt vời với nó? Phải chờ đợi và xem.


4
Ngôn ngữ của con người có thể đủ khả năng để có cú pháp phức tạp bởi vì nếu bạn có ngữ pháp hoặc speling rong, mọi người vẫn có thể hiểu bạn. Không như vậy với ngôn ngữ máy tính.
dan04

-3

Người mới bắt đầu cần đánh giá cao 'lập trình' trước. Theo kinh nghiệm của tôi trong việc đào tạo một lớp người mới bắt đầu, họ đánh giá cao những gì họ hiểu nhất. Giống như Python so với C #, họ đánh giá cao Python vì mức độ rất cao và không sử dụng các ký hiệu như C #, nghĩa là rất gần với ngôn ngữ của con người, rất tiếng Anh. Vì vậy, tôi khuyên bạn nên học lập trình từ cấp cao đến cấp thấp.

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.