Là khái niệm về độ phức tạp tính toán có quan trọng đối với các nhà phát triển phần mềm không? [đóng cửa]


11

Tôi có ấn tượng rằng các khái niệm về độ phức tạp của thời gian và bộ nhớ là điều bắt buộc đối với sinh viên tốt nghiệp các khóa học compsci, nhưng khi học ngành kỹ thuật tôi không có kiến ​​thức nếu đó là trường hợp. Gần đây tôi đã rất ngạc nhiên khi phỏng vấn một số sinh viên tốt nghiệp của một trường đại học địa phương thậm chí không biết khái niệm này. Tôi đoán câu hỏi của tôi là:

Là khái niệm về độ phức tạp tính toán có quan trọng đối với các nhà phát triển phần mềm không? Và nó có nên được dạy trong các khóa học đại học?


1
Để giải thích câu hỏi bằng một ví dụ: những sinh viên tốt nghiệp tôi đi qua không biết O(n^2)nghĩa là gì .
Muhammad Alkarouri

1
Câu hỏi liên quan thú vị: lập trình
viên.stackexchange.com / q / 20832/6184

Câu trả lời:


12

Trong hầu hết các trường đại học, tôi cho rằng (tôi hy vọng!) Rằng sự phức tạp về thời gian và trí nhớ chắc chắn là một phần trong các khóa học của họ.

Bây giờ, những "phức tạp" này là một chủ đề rất đàn hồi. Liệu mọi người có thực sự biết tất cả các lý thuyết như "ZPP là lớp phức tạp của các vấn đề quyết định có thể được giải quyết với sai số không trên máy Turing xác suất trong thời gian đa thức". và những thứ như vậy là nghi vấn. Cá nhân tôi cho rằng những lý thuyết tiên tiến này không liên quan đến phát triển phần mềm.

Ngược lại, tôi cho rằng mọi nhà phát triển nên nhận thức được sự phức tạp về thời gian / không gian của các cấu trúc dữ liệu và thuật toán họ sử dụng.


8

Nhiều người mới bắt đầu bị ám ảnh bởi tối ưu hóa vi mô. Học comp. sự phức tạp thúc đẩy sinh viên hướng tới một cách thực tế hơn nhiều để ước tính hiệu suất và khả năng mở rộng, theo kinh nghiệm của tôi.


6

Từ những gì tôi đã thấy, có vẻ như ký hiệu lớn và sự phức tạp về thời gian và trí nhớ được nhấn mạnh rất nhiều trong giáo dục khoa học máy tính chính thức ... tuy nhiên, tự học, nhận thức này dựa trên việc nghe và đọc những gì mọi người có giáo dục như vậy noi va viet.

Mặc dù tôi tin rằng các ý tưởng và khái niệm chung là quan trọng, tôi không tin việc chính thức hóa nó (chẳng hạn như ký hiệu big-O và các thuật ngữ khác nhau) gần như nhiều, ngoại trừ mục đích giao tiếp. Chỉ vì ai đó không quen thuộc với ký hiệu và thuật ngữ chính thức không có nghĩa là họ không thể thấy cách thức và lý do tại sao một thuật toán sẽ nhanh hơn thuật toán khác trong một trường hợp cụ thể. Mọi người có thể thấy rằng thời gian tìm kiếm cây nhị phân cân bằng liên quan đến logarit cơ sở 2 của số nút mà không cần tìm hiểu về lý thuyết phức tạp theo bất kỳ ý nghĩa chính thức nào, nếu họ hiểu cách cây hoạt động và có độ nắm bắt hợp lý ở mức cao toán học. Điều quan trọng là phải biết khi nào cần chú ý đến sự phức tạp và sử dụng bộ nhớ và xem xét các trường hợp điển hình và tồi tệ nhất, mặc dù ... nhưng một số người thì không.

Các ký hiệu và thuật ngữ trở nên quan trọng cho giao tiếp. Họ đưa ra một cách hay để truyền tải một lượng hóa hiệu suất của thuật toán cho người khác. Bởi vì nó xuất hiện trong các bài báo và giải thích thường xuyên, nên có ít nhất một sự hiểu biết mơ hồ về nó để chúng dễ theo dõi hơn.

Vì vậy, có, các khái niệm là quan trọng (mặc dù ít hơn khi tài nguyên và thời gian dồi dào nhưng dữ liệu thì không). Nhưng mặc dù các khái niệm là quan trọng, việc chính thức hóa chúng thường không quá quan trọng - và người ta cần nhớ rằng ký hiệu và thuật ngữ không giống với bản thân các khái niệm.

Biên tập:

Tôi sẽ không yêu cầu hiểu các khái niệm chi tiết như một người chính thức nghiên cứu, nhưng rất nhiều ý tưởng chung chỉ có ý nghĩa. Tôi nghĩ rằng có giá trị trong việc chính thức nghiên cứu điều này, nhưng một số giá trị đó vẫn có thể tồn tại mà không có.

Đối với việc giới thiệu các khái niệm (bên ngoài nghiên cứu chính thức), tôi nghĩ rằng một khởi đầu tốt là khuyến khích mọi người suy nghĩ về cấu trúc dữ liệu có bao nhiêu bộ nhớ, các bước thuật toán liên quan và cách thức những thứ này thay đổi với các dữ liệu khác nhau.

Nó cũng giúp xem xét các tình huống và thay đổi giả thuyết, như xem xét điều gì xảy ra nếu một cây cân bằng so với những gì xảy ra nếu nó mất cân bằng nhất có thể, hoặc hầu hết các nút sẽ có bao nhiêu cấp độ trong cây, hoặc có thể có thêm bao nhiêu nút giữ nếu độ sâu được tăng một cấp. Cách suy nghĩ này thường hữu ích cho các lập trình viên, không chỉ khi nhìn vào sự phức tạp; và nếu được áp dụng để suy nghĩ về cách các thuật toán và cấu trúc dữ liệu thực hiện trong các trường hợp khác nhau, nó tự nhiên chỉ theo cùng một hướng như một sự kiểm tra chính thức hơn về độ phức tạp.


Quan điểm thay thế thú vị. Bạn có thể giải thích làm thế nào bạn sẽ giới thiệu các khái niệm? Hay làm thế nào bạn hiểu được chúng? Điều này có thể chỉ ra một cách khác để có được sự hiểu biết cần thiết.
Muhammad Alkarouri

1
@MuhammadAlkarouri Tôi đã chỉnh sửa câu trả lời của mình để giải quyết vấn đề này một chút.
Dmitri

4

Đúng

Hiểu những điều cơ bản của sự phức tạp là rất quan trọng và nên là điều mà bạn học được khi chưa tốt nghiệp. Trong thực tế tôi nghĩ rằng nó thường được chạm vào trong bất kỳ lớp nào dạy bạn về cấu trúc dữ liệu. Tôi có thể hiểu sinh viên tốt nghiệp không hiểu hoặc không nhớ, nhưng tôi không thể thấy họ không được dạy những điều cơ bản về sự phức tạp.

Cập nhật: Tại sao nó quan trọng

Tôi đã di chuyển cơ sở dữ liệu tại một công việc cụ thể. Chúng tôi đã có thời hạn khi di chuyển cần hoàn thành. Người viết kịch bản không có bất kỳ căn cứ phức tạp nào. Thật không may, không ai khác nhìn kỹ vào logic mà anh ta sử dụng trong kịch bản. Tôi không nhớ các chi tiết cụ thể ngoài việc anh ấy đã sử dụng một vòng lặp gấp đôi thay vì một hàm băm. Sau một tuần kịch bản chạy liên tục, chúng tôi đã xem xét logic, nhận ra vấn đề. Phải mất khoảng 5 giờ để hoàn thành sau khi thay đổi. Chúng tôi gần như đã bỏ lỡ thời hạn hoàn thành di chuyển do một người không hiểu sự phức tạp.

Vấn đề là thật dễ dàng để vô tình tạo ra thứ gì đó có độ lớn chậm hơn hoặc sẽ luôn hết bộ nhớ trước khi công việc hoàn thành. Mặc dù các máy nhanh hơn có nhiều bộ nhớ hơn có thể giảm thiểu các lỗi nhỏ, nhưng chúng thường không thể giảm thiểu các vấn đề phức tạp.


Tuy nhiên, câu hỏi là "nó có quan trọng không?". Bởi vì ngay cả khi chúng lặp đi lặp lại trong danh sách các cặp, điều đó có nghĩa là sản phẩm cuối cùng không hoạt động đúng không? Có nghĩa là nó chậm? Điều đó có nghĩa là họ đã không thực hiện công việc mà họ được trả tiền để làm?
Yam Marcovic

Nếu chương trình sẽ kết thúc sau 2 ngày, nhưng thay vào đó sẽ mất 2 năm, tôi sẽ nói rằng họ không thực hiện được công việc họ được trả tiền để làm.
dietbuddha

Vấn đề như bạn mô tả không phải là vấn đề của nhà phát triển kém, mà là vấn đề trong quá trình ra quyết định khiến một lập trình viên không đủ tiêu chuẩn phụ trách một chương trình như vậy.
Yam Marcovic

Hoặc có lẽ là một quá trình ra quyết định dẫn đến việc thuê một người không đủ điều kiện để lập trình là "nhà phát triển phần mềm" thay vì "nhà phát triển phần mềm jr." Hoặc "thực tập".
dietbuddha

3

Tôi thấy rằng việc hỏi liệu nó "quan trọng hay không" là khá mơ hồ.

Bạn sẽ thấy nhiều người truyền giáo về cách từng chút kiến ​​thức nhỏ nhất trong thế giới này được yêu cầu nghiêm ngặt theo quan điểm của họ. Nhưng điều đó hơi vô nghĩa, bởi vì người ta không bao giờ có thể biết tất cả mọi thứ, và người ta không nên mong đợi trừ khi điều đó giúp người ta đáp ứng các yêu cầu mà công việc của anh ta đặt ra. Nói chung, tôi thích áp dụng một cách tiếp cận thực tế hơn đối với các điều kiện tiên quyết về giáo dục, trừ khi đó là vấn đề sở thích hoặc sở thích cá nhân tùy tiện.

Có quan trọng đối với các lập trình viên dự kiến ​​sẽ viết mã cực kỳ hiệu quả hoặc các thuật toán cơ sở hạ tầng sáng tạo không? Đúng.

Có quan trọng đối với các lập trình viên phát triển các ứng dụng web thông thường? Họ có thể quản lý mà không cần nó hoặc có được các triển khai hiệu quả trong thế giới nguồn mở.

Có quan trọng đối với các lập trình viên phát triển GUI cho các ứng dụng không? Có lẽ là không, bởi vì các khung GUI thành công trừu tượng hóa tất cả những chi tiết nhỏ đó.

Luôn luôn tốt để biết, giống như bất cứ điều gì, nhưng nó không khiến nhiều lập trình viên (hoặc thậm chí là hầu hết) đơn giản làm công việc của họ đến sự hài lòng của chủ nhân.

Mặt khác, nếu một người đăng ký các nghiên cứu cao hơn, để tìm kiếm giáo dục cơ bản và lý thuyết, người ta nên học các môn học theo định nghĩa nhiều lý thuyết hơn là thực tế. Theo tôi, điều cần thiết là CompSci. sinh viên học về sự phức tạp, cũng như điều quan trọng là họ học về phép tính.

Nhưng dù sao, kể từ khi làm CompSci. chương trình dạy mọi người làm thế nào để trở thành lập trình viên giỏi? Cho rằng bạn có các chương trình đào tạo chuyên ngành và kinh nghiệm thực tế (của bạn hoặc các lập trình viên đồng nghiệp của bạn, những người có thể chia sẻ chúng với bạn).


1
Phần thứ hai có lẽ ít mơ hồ hơn: nó có nên được dạy cho sinh viên compsci ở cấp độ BSc không?
Muhammad Alkarouri

1
Tôi đã chỉnh sửa bài viết của mình để trả lời câu hỏi đó.
Yam Marcovic
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.