Tại sao CS được dạy để ghi nhớ? [đóng cửa]


23

Tôi đã học Khoa học máy tính nâng cao trong năm vừa qua ở trường trung học. Có vẻ như chúng ta được dạy đơn giản là ghi nhớ mã và các chức năng chứ không phải làm thế nào để tháo vát và hiệu quả trong việc sử dụng tài liệu và những thứ tương tự.

Thực tế, tôi tưởng tượng nhiều công việc lập trình (nếu không phải tất cả) sẽ cho phép bạn lướt qua tài liệu, xem lại mã quá khứ và mã của người khác, về cơ bản là làm những gì giáo viên của tôi sẽ coi là "gian lận".

Mặc dù tôi đồng ý các khái niệm cốt lõi là rất cần thiết để ghi nhớ (trong bất kỳ vấn đề nào), nhưng đối với tôi, việc kiểm tra bút và giấy cho một lớp CS, đặc biệt là khi bạn thực sự có trình biên dịch, trình gỡ lỗi, tài liệu tham khảo hướng dẫn sử dụng, và toàn bộ internet để tham khảo trong bất kỳ tình huống làm việc trong thế giới thực.

Tại sao CS được dạy tập trung vào việc ghi nhớ mã và các chức năng trái ngược với việc dạy các kỹ năng hữu ích bao gồm cách sử dụng và giải thích tài liệu, mã mẫu, trình gỡ lỗi và như vậy?


34
CS không phải là về việc ghi nhớ mã và chức năng. Bạn đang học CS ở đâu vậy? Tôi có thể đề nghị vấn đề thực sự là khóa học bạn tham gia là tào lao không?
Andres F.

1
@AresresF. OP thuộc Khoa học máy tính nâng cao , đây là khóa học dành cho học sinh trung học (trước khi học đại học).

3
@GlennNelson Rất tiếc! Tôi đọc sai điều đó. Ok, trong trường hợp đó: esqew : bạn sẽ cảm thấy nhẹ nhõm khi biết, ở cấp đại học, CS (hầu hết) không phải về việc ghi nhớ mã. Tuy nhiên, bạn sẽ phải đọc rất nhiều thứ;) Giáo dục CS cũng không nhất thiết là tìm việc làm (có lẽ bạn sẽ thất vọng nếu bạn nghĩ vậy)
Andres F.

1
Bạn nên biết nó không phải là cách này tại hầu hết các trường đại học. Ở trường tôi, mỗi bài kiểm tra khoa học máy tính đều được ghi chú mở / mở sách.
Casey Patton

2
Lưu ý rằng một phần của câu trả lời rất có thể là CS không phải là bằng cấp lập trình . Đừng mong đợi học lập trình từ một lớp CS. Mong đợi để tìm hiểu tất cả các loại lý thuyết và khái niệm cơ bản có liên quan đến một lập trình viên. Và chắc chắn, bạn sẽ học một vài ngôn ngữ lập trình và được dạy một chút về lập trình cơ bản, nhưng chủ yếu, lập trình thực tế là thứ mà họ cho rằng bạn sẽ có để bạn có thể tập trung vào tất cả các công cụ CS , chứ không phải theo cách khác xung quanh.
jalf

Câu trả lời:


37

Trong một lớp học cấp ba, bạn đang ở cấp độ cơ bản nhất của con đường dẫn đến thành thạo. Những thứ được bao phủ trong lớp của bạn là những thứ mà một lập trình viên chuyên nghiệp dự kiến ​​sẽ biết lạnh. Theo nhiều cách, đây giống như học "bảng thời gian" của bạn. Tất nhiên, bạn sẽ luôn có thể lấy một máy tính trong cài đặt "thế giới thực", nhưng việc ghi nhớ này không chỉ làm tăng tốc độ của bạn trong các nhiệm vụ phức tạp hơn, mà còn thúc đẩy sự hiểu biết kỹ lưỡng hơn về các nguyên tắc cơ bản.

Ví dụ: bạn nên biết một số thuật toán sắp xếp, cách chúng được triển khai, cách chúng hoạt động, khi nào chúng được sử dụng tốt nhất và khi nào không sử dụng chúng. Điều này luôn có thể được tra cứu, nhưng không cần phải như vậy - hơn là một nhà toán học phải tìm kiếm 6 lần 8.


9
Bạn nên biết bản chất cơ bản của các thuật toán sắp xếp nhưng đã khoảng 15 năm kể từ khi tôi có dịp viết bất cứ thứ gì ngoài một loại bong bóng. (Đối với N rất nhỏ đôi khi câu trả lời tốt hơn.)
Loren Pechtel

1
Tôi ước tôi có thể nói rằng tất cả các lớp Khoa học Máy tính đều tốt như vậy. Ở trường trung học của tôi, họ đã dạy cú pháp cơ bản của java ... Trong cả năm. Nhiều người trong lớp đã tự hào là "lập trình viên" khi họ thậm chí không thể giải thích sự khác biệt giữa thuật toán Bubble sort và thuật toán của Dijkstra.
Daniel Gratzer

2
Ví dụ, cho rằng bạn có thể tra cứu bất kỳ từ nào trong từ điển, về mặt lý thuyết bạn sẽ có thể hiểu bài viết này trên meanone . Nhưng bộ não của chúng ta chỉ xử lý một số lượng hạn chế lồng ghép.
Stewol

1
Và thật ngạc nhiên khi ghi nhớ các bảng thời gian của tôi hoàn toàn không có ích gì với tôi. Kỹ sư phần mềm trung bình dành bao nhiêu thời gian để thực hiện các thuật toán sắp xếp? Oh chờ đợi - có lẽ khoảng 0 . Ngay cả trong trường hợp cực kỳ xa vời mà loại môi trường cung cấp không đủ tốt cho bạn, bạn chỉ cần một anh chàng viết một thuật toán phù hợp hơn - và anh ta có thể sử dụng thông tin tầm thường trên một cái gì đó như Wikipedia để chọn và thực hiện thuật toán tối ưu - và sau đó bạn có thể sử dụng lại nó trong thời gian còn lại.
DeadMG

2
@kaoD: Và ghi nhớ tài liệu tham khảo sẽ không giúp được chút nào. Nó không liên quan đến việc nghĩ ra bất cứ điều gì, nó chỉ là một bản sao dán. Sự khác biệt duy nhất giữa trả lời từ bộ nhớ và dán sao chép từ Wikipedia là một được lưu trữ trong RAM và một được lưu trữ trong não của bạn. Nó vẫn là một bản sao dán.
DeadMG

14

Nó thường được dạy theo cách này bởi vì giáo viên thường không biết cách kiểm tra sự hiểu biết nào khác. Cảm xúc của bạn là hoàn toàn chính xác ở chỗ nó là vô giá trị để được dạy như thế này. Cách mọi người được giáo dục nói chung là cần cải cách một cách tuyệt vọng!

Cuộc sống trở nên tốt hơn, ít nhất là tại UIUC tôi đã thấy rằng bạn càng lên lớp CS càng cao thì các bài kiểm tra càng được định hướng như bạn mô tả và trong phần lớn các khóa học của tôi, chúng tôi đã được phép có một bảng cheat cho tất cả những thứ nhảm nhí rằng bạn có thể đã bị choáng nếu bạn thực sự ngồi trước máy tính.

Điều đó đang được nói, tôi càng lên lớp càng cao, họ càng thực sự dạy bạn về ngôn ngữ hoặc cách thực hiện một cái gì đó. Thực tế tôi chỉ có một lớp mà họ thực sự dạy chúng tôi bất cứ điều gì về lập trình, đó chủ yếu là các khái niệm toán học trừu tượng và chúng tôi dự kiến ​​sẽ tự mình tìm ra phần lập trình (với điều kiện họ luôn sẵn lòng giúp đỡ nhưng đây là không bao giờ một cái gì đó trong một kỳ thi).


2
+1 Amen. Tôi đã từng dạy lập trình ở cấp đại học, và mục tiêu của tôi là chuyển sinh viên nhanh nhất có thể đến mức họ có thể thực hiện các dự án độc đáo của riêng mình. Tôi ghét nó khi giáo viên coi nó như ghi nhớ hoặc làm mọi thứ "đúng cách". Những gì tôi đã cố gắng làm là đặt đủ các kỹ năng để giải phóng sự sáng tạo của chính học sinh.
Mike Dunlavey

... Tôi có những học sinh rất thông minh và rất giỏi ghi nhớ. Sẽ phải mất một hoặc hai bài kiểm tra trước khi tôi có thể truyền đạt rằng bạn cần viết chương trình để học lập trình, không phải ghi nhớ công cụ.
Mike Dunlavey

Nghe nghe! Thật buồn cười, lớn lên tôi chưa bao giờ học giỏi; điểm ACT kém, điểm kém, v.v ... Nhưng khi được giới thiệu với CS, mọi thứ chỉ có ý nghĩa. Tôi chắc chắn phải vật lộn trong một số lĩnh vực nhất định nhưng tôi chỉ học cách vượt qua những điều đã kìm hãm tôi thông qua việc hiểu các khái niệm tôi đã học được trong các lớp CS của mình.
rudolph9

10

Đừng để việc học cản trở việc học của bạn.

- Đánh dấu

Tôi là một người Mexico và nói với bạn điều này bởi vì ở Mexico không hẳn là một nơi tốt cho giáo dục (ở bất kỳ cấp độ nào), ít nhất là trong giáo dục công cộng.

Chà, ở giữa sự nghiệp (CS) tôi cảm thấy chính xác giống như cảm giác của bạn, vì vậy tôi bắt đầu tự học và tôi dành một năm để học các thuật toán, linux, kịch bản, cách máy tính của tôi hoạt động, một chút quan hệ cơ sở dữ liệu, html, css, v.v (một chút về tất cả). Và tất nhiên, tôi đã phải bỏ qua các lớp *, để điểm số của mình xuống * và tốt nghiệp một năm sau *, tất cả để học.

Sau năm đó, tôi trở lại thói quen "bình thường" của mình, trở lại lớp học bình thường, bài tập về nhà, bài kiểm tra và dự án. Các lớp học vẫn còn nhàm chán, không có gì mới để học, tất cả đều giống nhau. Vì vậy, tôi quyết định tham gia vào các trang web của cuộc thi lập trình như UVA thẩm phán trực tuyến , đầu bếp mã và người dự án , sau đó tôi xem một số bài giảng tại MIT Open Course Ware và tôi vẫn đang tự học, nhưng theo một cách khác.

Bài học: Đừng để mọi thứ xảy ra, hãy làm mọi thứ xảy ra. Nếu bạn không hài lòng với cách bạn học, hãy thay đổi nó!

* Không phải là quyết định khôn ngoan nhất mà tôi đã đưa ra.


4
"Đừng để mọi thứ xảy ra, làm cho mọi thứ xảy ra", - Nếu có những từ để sống, đó là những từ!
GrandmasterB

+1 cho báo giá. Tôi <gần như> không phải đọc phần còn lại của câu trả lời
Chani

3

Nó phụ thuộc vào những gì bạn đang cố gắng ghi nhớ ...

Ví dụ, để học toán, bạn phải làm quen với đại số và bạn thường phải khá sáng tạo trong cách bạn thực hiện các thao tác đại số để đơn giản hóa các phương trình. Nhưng bạn phải ghi nhớ các khối xây dựng nhất định để có thể tập trung vào các bit thú vị đó. Ví dụ, bạn phải biết các bảng nhân của mình và bạn phải biết một số danh tính để bạn có thể nhận ra cách thao tác các phương trình để sử dụng các định danh đó.

Để nghiên cứu khoa học máy tính, bạn cũng cần phải làm quen với các thuật toán và cấu trúc dữ liệu khối xây dựng cơ bản vì bạn sẽ cần phải áp dụng chúng cho các vấn đề cấp cao hơn. Ví dụ, rất khó có khả năng bạn viết triển khai danh sách được liên kết của riêng bạn trong thế giới thực, bạn chỉ cần sử dụng thư viện do thư viện của bạn cung cấp. Nhưng biết cách danh sách được liên kết được triển khai và cách triển khai danh sách của riêng bạn, bạn có thể suy luận về việc sử dụng danh sách được liên kết ở đâu và khi nào bạn bắt đầu làm việc với các vấn đề cấp cao hơn. Tương tự, bạn sẽ không bao giờ viết hàm tìm kiếm nhị phân của riêng mình nhưng điều quan trọng là phải hiểu cách thức hoạt động của nó để bạn có thể suy luận về những thứ như cơ sở dữ liệu có thể sử dụng một chỉ mục và nơi không thể.

Khi bạn đã ghi nhớ một số khối xây dựng cơ bản, việc thực hiện các tài liệu như diễn giải tài liệu sẽ dễ dàng hơn nhiều. Tài liệu có thể chỉ ra rằng một danh sách đang được sử dụng và giả sử rằng lập trình viên hoàn toàn biết rằng điều này có nghĩa là các phần chèn là O (1) và các tìm kiếm là O (n). Các khối xây dựng cũng ổn định hơn theo thời gian - bạn rất có thể sẽ sử dụng trình gỡ lỗi mới cứ sau vài năm, bạn có thể sử dụng cùng một tìm kiếm nhị phân trong toàn bộ sự nghiệp của mình.


Việc sử dụng danh sách được liên kết ở đâu và dựa trên những thứ như sự phức tạp của nó đối với các hoạt động khác nhau và đó là hiệu suất bộ nhớ. Bạn không cần phải thực hiện một để biết một trong những điều đó. Cơ sở dữ liệu có thể sử dụng tìm kiếm nhị phân ở đâu? Đối với các khóa mà nó biết làm thế nào để so sánh. Vâng, đó là dễ dàng.
DeadMG

3

"Tại sao CS được dạy tập trung vào việc ghi nhớ ... trái ngược với việc dạy các kỹ năng hữu ích" - Tôi nghĩ rằng bạn đang giảm giá việc ghi nhớ một chút quá nhiều. Giống như bạn nên thực hành viết mã, giải thích tài liệu, sử dụng trình gỡ lỗi, bạn cũng nên thực hành ghi nhớ.

Bạn có thể ngạc nhiên về mức độ hiệu quả của mình nếu bạn không phải truy cập API thường xuyên hoặc tìm kiếm nhiều lệnh gỡ lỗi.

Một trong những điều tốt nhất tôi học được ở trường trung học là bằng cách quan sát một người bạn không bao giờ ghi chép trong lớp. Lập luận của ông là ông có thể nhớ những gì quan trọng. Tôi bắt đầu làm điều tương tự và nghĩ rằng nó đã cải thiện các kỹ năng ghi nhớ của tôi mà tôi thấy rất hữu ích trên cơ sở hàng ngày ngay cả với tất cả các tài liệu tham khảo API có sẵn.


2
Không phải tìm kiếm API thông qua thực tiễn, không dạy API như giáo dục chính thức.
DeadMG

@DeadMG: Có thể nhớ nhiều thứ hơn đi kèm với thực hành, giống như mọi thứ khác. Yêu cầu bạn phải nhớ một số API nhất định không phải là mục tiêu, mà là phương tiện để rèn luyện khả năng giữ thông tin của bạn để bạn không phải tìm kiếm nó thường xuyên. Và tôi không chỉ nói về API, nếu tôi có thể nhớ thêm một điều nữa, đó là một chuyến đi ít hơn tôi cần thực hiện với Google / MSDN / một tệp nguồn khác và thực tế điều này sẽ tạo ra sự khác biệt về tốc độ bạn có thể làm việc nhanh như thế nào .
DXM

Thực hành với API cụ thể đó . Không ghi nhớ mọi thứ nói chung. Và thời gian dành cho giáo dục là một chú thích nhỏ so với thời gian chuyên nghiệp.
DeadMG

2

Bài kiểm tra bút và giấy thực sự có ý nghĩa nếu mục tiêu là kiểm tra sự hiểu biết đầy đủ về chủ đề trong tay. Tôi đã làm bài kiểm tra Khoa học Máy tính AB gần một thập kỷ trước và tôi đồng ý với phương pháp bút và giấy.

Bạn nên biết đủ về bất kỳ thuật toán nào bạn học ở các cấp độ thấp hơn của Khoa học máy tính để có thể giải thích cách viết mã triển khai bằng ngôn ngữ mục tiêu của bạn. Học sinh cũng có thể viết mã bằng tay với cú pháp chính xác. Tất cả chúng ta đôi khi bỏ lỡ một dấu chấm phẩy hoặc dấu ngoặc đơn :). Ngoài ra các kỹ năng gỡ lỗi và thiết kế có thể được kiểm tra mà không cần suy luận từ một IDE hữu ích.

Nếu một sinh viên không thể làm điều này, thì họ không nắm vững chủ đề đó, có lẽ chỉ là một sự quen thuộc trôi qua.


-1: Tất cả các mã viết tay về mặt cú pháp đều cho bạn biết rằng người đó có khả năng viết một chương trình có thể biên dịch được (Có lẽ chậm hơn một triệu lần so với máy tính chậm nhất) -có thể không hoạt động như dự định. Tồi tệ hơn, họ chỉ có một trí nhớ tốt và có thể đọc thuộc lòng Shakespare nếu được hỏi. Nó đi ít cách để chỉ ra kỹ năng của một người là nhà phát triển.
mattnz

Câu trả lời này trình bày không có lý do cho ý kiến ​​trình bày. Tại sao mọi người có thể viết một triển khai cho bất kỳ thuật toán sắp xếp nào bằng ngôn ngữ yêu thích của họ?
DeadMG

Vấn đề không phải là người này là một nhà phát triển giỏi, mà là họ biết tài liệu Khoa học Máy tính được dạy trong lớp của họ. Nếu một học sinh đã được dạy làm thế nào để vẽ đồ thị một hàm, thì thật hợp lý khi mong đợi học sinh đó làm như vậy trong một bài kiểm tra. Các bài kiểm tra tốt cũng đánh bại khả năng ghi nhớ bằng cách đặt các câu hỏi đòi hỏi sự hiểu biết về khái niệm, chẳng hạn như thực hiện sắp xếp bong bóng bằng nhiều khóa cho cấu trúc dữ liệu này.
Peter Smith

-2

Theo kinh nghiệm của tôi, ghi nhớ đi kèm với thực hành đơn giản và hoàn toàn không cần phải dạy nó. Quan trọng hơn, phương pháp này có nghĩa là chỉ ghi nhớ những gì bạn thực sự cần nhớ trong bất cứ điều gì bạn đang làm, không phải là một đống rác ngẫu nhiên mà giáo viên của bạn hy vọng bạn có thể cần và luôn luôn là bạn sẽ không. Thời gian dành cho việc ghi nhớ việc thực hiện một số thuật toán có thể được dành nhiều hơn cho một số nguyên nhân khác.

Rốt cuộc, tại sao bạn cần phải thực hành viết một thuật toán? Khi bạn viết nó một lần, bạn có thể sử dụng lại nó mọi lúc - thậm chí với khả năng rất xa mà người khác đã không viết một triển khai có sẵn miễn phí cho ngôn ngữ bạn chọn môi trường của bạn không cung cấp như vậy một thuật toán cho việc sử dụng của bạn, điều này không đúng với phần lớn các thuật toán đơn giản như sắp xếp và như vậy. Thực hành một cái gì đó rất khó có thể bạn sẽ phải làm nó ngay từ đầu và ngay cả khi bạn làm bạn sẽ chỉ phải làm một lần? Không sử dụng thời gian có giá trị.

Điều quan trọng cần biết về Heapsort không phải là cách thực hiện nó. Đó là sự phức tạp hoạt động trong các trường hợp tốt nhất và tồi tệ nhất, và những điều tương tự. Nhưng thật bất ngờ, có một bảng tiện lợi trên Wikipedia sẽ ngay lập tức cung cấp cho bạn thông tin này. Vì vậy, một lần nữa, không có giá trị trong việc có kiến ​​thức đó. Nó ngay lập tức có sẵn cho bạn bất cứ khi nào bạn muốn từ bây giờ cho đến hết thời gian mà không mất phí. Vậy tại sao bạn muốn ghi nhớ nó? Nó là vô nghĩa.

Theo kinh nghiệm của tôi, hoàn toàn không có lý do gì để yêu cầu học sinh ghi nhớ bất cứ điều gì. Nếu bạn đang hỏi một câu hỏi có thể được trả lời từ một nguồn tham khảo, thì bạn đang hỏi một câu hỏi mà việc trả lời nó không có giá trị.


2
Gee, các bạn, đừng bận tâm giải thích các downvote của bạn hoặc bất cứ điều gì tương tự ....
DeadMG

Lần duy nhất tôi cần biết heapsort là khi tôi cần một hàng đợi ưu tiên có thể sửa đổi (heapsort hoạt động tuyệt vời như một hàng đợi ưu tiên). Có thể thích ứng các thuật toán đã biết là một lý do tốt để biết cách thực hiện chúng.
David Thornley

@David: Bạn không cần biết heapsort hoạt động như thế nào. Một triển khai sử dụng bất kỳ thuật toán sắp xếp sẽ tốt.
DeadMG

Không phải trong trường hợp cụ thể, nó sẽ không. Nó đã phải xử lý rất nhiều sự kiện, thường xuyên, trên một hệ thống có thể đã quá căng thẳng. Đối với dự án đó, chúng tôi cần hiệu quả, và chúng tôi đã nhận được nó. Đối với bối cảnh, điều đó đã xảy ra một lần trong một sự nghiệp khá dài và tất cả sự sắp xếp của tôi trong một thời gian dài là những thứ như gia đình của SQL ORDER BYvà C ++ std::sort.
David Thornley

@David: Do đó, tôi đề nghị rằng hầu như không phải thứ gì mà mọi lập trình viên đều cần.
DeadMG
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.