Một chút của lý thuyết khoa học máy tính tôi nên biết là gì? [đóng cửa]


27

Nói như một người có bằng Kỹ thuật điện tử chứ không phải bằng Khoa học Máy tính, một chút là gì về khoa học máy tính mà tôi nên biết để biến tôi thành một lập trình viên thế giới thực tốt hơn gì?

. của các thư viện).


42
1 (xin lỗi, tôi đã phải)
haylem

5
oh, hoặc quan trọng nhất (Tôi sẽ đi ngay bây giờ ...)
haylem 7/12/2016

Khoa học máy tính lý thuyết stackexchange xác nhận những gì mọi người khác ở đây đề cập: độ phức tạp, cấu trúc dữ liệu và thuật toán. cstheory.stackexchange.com/tags
chrisaycock

2
Tôi cảm thấy cần phải phản đối câu hỏi này. Không có một bit bit nào đủ để học, và hơn thế nữa, không có (IMHO) một bit bit quan trọng nhất. Có một số khía cạnh (một lần nữa, IMHO) không kém phần cần thiết đối với CS. Vì vậy, tôi nghĩ rằng trong khi các câu trả lời cho câu hỏi này có thể thú vị, thì câu hỏi có thể đã được đưa ra tốt hơn.
Konrad Rudolph

1
Nếu bạn chưa có eeng của bạn, tôi sẽ nói logic boolean và / hoặc lý thuyết số rời rạc. Gần như mọi iflooptuyên bố từng được sử dụng một tập hợp con của hai lĩnh vực nghiên cứu đó.
Steven Evers

Câu trả lời:


52

Nếu tôi phải chọn chỉ là một chút, đó là một quyết định khó khăn, tôi muốn nói đi cho ký hiệu Big O . Hiểu được ý nghĩa của O (n), O (ln n), O (n²), O (2 ^ n), O (n!) Giúp bạn tránh được rất nhiều sai lầm đắt tiền, loại hoạt động tốt trong môi trường thử nghiệm nhưng thất bại thảm hại trong sản xuất.


2
+1 và tôi nói rằng điều quan trọng hơn là chỉ cần biết rằng O (n ^ 2) còn tệ hơn O (lg n) (chẳng hạn) là biết cách lấy Big-O cho một đoạn mã nhất định.
Dean Harding

3
Không đồng ý mạnh mẽ. Công cụ này tương đối tầm thường, và có nhiều chủ đề thú vị hơn trong CS. Ngoài ra, tôi nghĩ rằng hầu hết mọi người nghĩ về sự phức tạp theo trực giác, mặc dù họ có thể không gọi đó là sự phức tạp và họ có thể không gọi nó là bậc hai, theo cấp số nhân, v.v.
Magnus Wolffelt

Magnus: Theo kinh nghiệm của tôi, hầu hết những người không lập trình không nghĩ gì về sự phức tạp, họ trực giác cho rằng O (n) cho tất cả các vấn đề.
user281377

Tôi vẫn chưa cần điều này một cách chính thức.
CaffGeek

1
Chad: Không có gì về ký hiệu Big O là quá chính thức, nhưng không có tên cho mọi thứ, bạn khó có thể nghĩ về những điều đó, hãy nói về nó với các đồng nghiệp của bạn.
user281377

19

Đây là một câu hỏi, mọi người sẽ có một câu trả lời khác nhau. Tôi muốn nói: lý thuyết phức tạp là phần quan trọng nhất, dù sao bạn không trực tiếp học làm lập trình viên (như thuật toán và cấu trúc dữ liệu), nhưng điều gì có thể ảnh hưởng đến công việc của bạn. Nó giúp nếu tôi biết rằng một vấn đề có độ phức tạp hình khối, tôi biết rằng nó sẽ có quy mô xấu nếu kích thước vấn đề được tăng lên.


Tôi sẽ nói thêm rằng nó giúp ích rất nhiều để biết nếu bạn đang giải quyết một vấn đề có thể dễ dàng được trình bày lại bằng một ngôn ngữ đơn giản hơn.
philosodad

Sự phức tạp là quan trọng như một khái niệm, nhưng thực sự tính toán nó thường không. Hiểu những gì ít phức tạp là bit quan trọng.
Hóa đơn

@Bill: Chính xác. Nhưng phần đó là điều bạn không nhất thiết phải có được thông qua thực hành. Lý thuyết rất hữu ích về phần đó.
Mnementh

12

Tìm hiểu về cấu trúc dữ liệu, thuật toán và độ phức tạp.

Không quá nhiều chỉ để hiểu rằng một cỗ máy không phải là một chiếc hộp ma thuật với sức mạnh vô hạn. Bạn không thể ném bất cứ thứ gì vào nó và hy vọng nó sẽ giòn nó trong một phần nghìn giây. Nó có giới hạn mà bạn biết. Bạn cần học cách không kiểm tra chúng với mã của bạn.

Cũng có một cái nhìn về các phương pháp phổ biến để giải quyết các vấn đề thiết kế cụ thể trong lập trình. Mẫu thiết kế cụ thể. Đừng tôn thờ họ chỉ lấy những ý tưởng mà họ truyền đạt.

Kiến thức về mô hình cơ sở dữ liệu là rất cần thiết là tốt.

Sau đó, nó chỉ là các ngôn ngữ lập trình, khung và thư viện khác nhau thực hiện hoặc cho phép bạn thực hiện các khái niệm cốt lõi. Chọn bất cứ thứ gì bạn thích và thực hành với những thứ đó.


Cụ thể - có rất nhiều thuật toán và cấu trúc dữ liệu.
Jon Hopkins

Chỉ là những người cơ bản để có được một ý tưởng về những điều. Chọn một số cuốn sách không quá dày và làm việc với nó.

1
Đó là khá nhiều hơn một chút.

7

Đây là một câu hỏi khó.

Tất cả các khía cạnh của khoa học máy tính đều quan trọng theo cách này hay cách khác.

Xét về những gì bạn sẽ được hưởng lợi hàng ngày, có lẽ là một tổng quan tổng quát về cách mã của bạn hoạt động "dưới mui xe" từ mã đến CPU.

Hiểu ký hiệu Big O rất quan trọng và cũng hiểu cách mã của bạn có thể được thực thi cũng rất quan trọng trong các tình huống trong thế giới thực.


7

Vâng, điều này khiến tôi suy nghĩ hàng giờ.

Trong quá trình đó, tôi đã phải loại bỏ một số câu trả lời phổ biến được đưa ra ở đây.

KHÔNG DANH SÁCH

  1. Ký hiệu Big O (n) . Khó có thể đặt nó ở đây nhưng Không, chúng ta có thể tìm ra sự thiếu hiệu quả và so sánh các quy trình khác nhau mà không cần phải nghe từ xa về phân tích thuật toán tiệm cận.

  2. Ngôn ngữ chức năng Không, Một họ ngôn ngữ chỉ là một cách tiếp cận để suy nghĩ về các vấn đề. Tại sao chỉ có bit này nên quan trọng?

  3. Vấn đề tạm dừng Một số chỉ là quá cụ thể và mọi người đã sống cuộc sống mà không biết rằng họ tồn tại.

  4. Lắng nghe Nếu bạn không lắng nghe thì bạn sống trong thế giới của riêng bạn. Không nhất thiết là bất lợi!

  5. Chu kỳ phát triển phần mềm Nah! Chúng tôi vẫn có thể tìm đường đến một số phần mềm đáng kinh ngạc hoặc nỗ lực anh hùng solo.

  6. lý thuyết phức tạp Tôi đoán điều này có thể là nó nhưng không có tất cả các hình thức

Đó là một chút ý tưởng từ Comp Science

Tôi sẽ nói - " Trừu tượng trừu tượng Trừu tượng ... ". Tìm hiểu về nó. Xem các ví dụ xung quanh nó và tìm hiểu cách xây dựng bằng cách sử dụng nó. Nó ở khắp mọi nơi. Toàn bộ khoa học máy tính, kỹ thuật và ứng dụng trông giống như các lớp trừu tượng.

Một khi bạn biết điều này, bạn bắt đầu học cách nhìn xung quanh tốt.

Khi bạn thấy một số người sử dụng list insertiontrong pythonnot append, bạn mỉm cười bởi vì bạn biết rằng danh sách python được xây dựng bằng cách sử dụng trừu tượng mảng trong đó các phần chèn thêm tốn kém và nối thêm rẻ hơn.

Đây chỉ là một ví dụ.


+1 cho một câu trả lời rõ ràng là bạn đã suy nghĩ rất nhiều.
Jon Hopkins

chỉ là một nhận xét về nhận xét của bạn về Vấn đề Ngừng: "Sống cuộc sống mà không biết hiện tại" là đúng đối với BẤT K topic chủ đề khoa học máy tính nào.


3

Các trường hợp sử dụng cạnh tranh của cấu trúc dữ liệu.

Có những tình huống đòi hỏi phải có bản đồ với cây đỏ đen để đảm bảo hiệu suất và những trường hợp khác bạn không thể sử dụng một mảng để đảm bảo hiệu suất. Biết khi nào nên chọn cấu trúc dữ liệu nào là một kỹ năng vô giá.


3

chỉ có ba số quan trọng:

  • số không
  • một
  • nhiều

Nhưng điều đó có nghĩa là '3' cũng quan trọng chứ?
Javier

Nó được coi là số không, một và vô cùng: en.wikipedia.org/wiki/Zero_One_Infinity
Thomas Owens

@Javier: 3 là tập hợp con của nhiều người
Steven A. Lowe

@Thomas: nói ai?
Steven A. Lowe

@Steven Sự hiểu biết của tôi có thể không phải là 100%, ở đây, nhưng tôi nghĩ ý tưởng là bạn không có gì, một điều duy nhất hoặc số lượng những thứ mà bạn có nên không bị ràng buộc. Nếu bạn không giới hạn ở một hoặc một thể hiện, thì bạn không nên giới hạn các thể hiện đó. Tuy nhiên, tôi không hoàn toàn chắc chắn TẠI SAO đây là trường hợp (tôi chỉ quen thuộc một cách mơ hồ với khái niệm Zero / One / Infinity).
Thomas Owens

3

Điều quan trọng nhất tôi học được trong CS (và là một nhà phát triển trong nhiều năm và là một kiến ​​trúc sư) là khả năng phá vỡ một vấn đề dựa trên sự biến động và không hoạt động. Tất cả các thiết kế tốt cô lập và đóng gói biến động. Tất cả các nhà phát triển / kiến ​​trúc sư giỏi đều làm điều này bằng trực giác ngay cả khi họ chưa chính thức hóa nó trong suy nghĩ của họ. Một lý do lớn cho thất bại của dự án là sự thất bại trong việc phá vỡ một vấn đề trên cơ sở biến động và gói gọn nó. Một thất bại trong việc đóng gói sự biến động chắc chắn sẽ dẫn đến sự chạy trốn sự phức tạp và thất bại của dự án.


Bạn có ý nghĩa gì bởi sự biến động chính xác?
amara

3

Vấn đề dừng

Thực tế là các vấn đề liên quan đến máy tính tồn tại mà đơn giản là không thể giải quyết bằng máy tính.


3

Bạn nên biết đủ lý thuyết automata để có thể biết vấn đề bạn đang giải quyết nằm ở đâu trong hệ thống phân cấp của các ngôn ngữ chính thức. Từ đó, bạn có thể tìm ra một vài cách sử dụng thực tế quan trọng, như tại sao bạn không nên sử dụng REGEX để phân tích HTML (HTML cần một ngữ pháp không ngữ cảnh để mô tả nó) và tại sao phải mất quá nhiều thời gian để biên dịch C ++ thay vì Java hoặc C # (C ++ yêu cầu máy Turing, trong khi Java và C # có thể được mô tả bằng ngữ pháp không ngữ cảnh).

Các tầng quan trọng nhất của ngôn ngữ chính thức là, từ yếu nhất đến mạnh nhất:

  1. Các ngôn ngữ có thể được phân tích cú pháp bởi một automata hữu hạn hoặc REGEX (Việc triển khai REGEX với phản hồi mạnh hơn thể loại này, nhưng chúng vẫn không thể phân tích mọi thứ trong loại 2)

  2. Các ngôn ngữ có thể được phân tích cú pháp bởi một automata với bộ nhớ ngăn xếp hoặc ngữ pháp không ngữ cảnh.

  3. Các ngôn ngữ có thể được phân tích cú pháp bằng máy Turing hoặc automata với bộ nhớ truy cập ngẫu nhiên.


À, không. Một biểu thức chính quy phân tích một ngữ pháp thông thường. Đó chính xác là phạm trù ngữ pháp có thể được chấp nhận bởi một automata trạng thái hữu hạn. Và một 'Ngữ pháp Chomsky' không chỉ đề cập đến ngữ pháp miễn phí ngữ cảnh, đó là những gì máy stack stack xử lý.
philosodad

@philosodad - Ngữ pháp miễn phí ngữ cảnh chính xác hơn và tôi đã cập nhật bài đăng để sử dụng thuật ngữ này. Tôi không hiểu vấn đề của bạn với những gì tôi nói về các biểu thức thông thường.
Dan Monego

@Dan - Vấn đề của tôi là một biểu thức chính quy mạnh mẽ như một máy tự động trạng thái hữu hạn và nếu bạn có thể phân tích BẤT K gram ngữ pháp không ngữ cảnh xác định nào với một máy hơn bạn có thể phân tích TẤT CẢ ngữ pháp không ngữ cảnh xác định.
philosodad

Hoặc, chính xác hơn: hoặc bạn cần một ngăn xếp hoặc bạn không. Nếu bạn cần một ngăn xếp để phân tích một ngôn ngữ, thì bạn phải có một ngăn xếp để phân tích ngôn ngữ, và do đó, nếu một ngôn ngữ yêu cầu một ngăn xếp để phân tích ngôn ngữ đó, bạn có thể phân tích ngôn ngữ đó.
philosodad

@philosodad - Có hai loại biểu thức chính quy - biểu thức chính quy trong lý thuyết và biểu thức chính quy được triển khai trong phần mềm. Bạn đã đúng về các biểu thức chính quy lý thuyết, nhưng hầu hết các triển khai đều có một số tính năng vượt quá cơ sở lý thuyết của chúng và có thể khớp với một số ngôn ngữ không thông thường, như a ^ n cho non n. Bởi vì đây là một chủ đề về lý thuyết trong thực tế, tôi đã đi ra ngoài để đề cập rằng có một sự khác biệt giữa định nghĩa chính thức và định nghĩa được sử dụng trong tự nhiên.
Dan Monego

2

Chà, tôi có thể cho bạn một câu trả lời buồn tẻ: lý thuyết automata và lý thuyết thông tin.

Hoặc tôi có thể nói với bạn những gì tôi học được từ một nhà tư vấn phần cứng từ lâu:

  • "Đủ tốt" không đủ tốt.

1

Vòng đời phát triển phần mềm là điều tôi khuyên bạn nên biết nếu bạn chưa có. Cấp điều này đã được giới thiệu trong một khóa học Khoa học Máy tính năm thứ hai và là thứ được sử dụng nhiều lần trong các dự án phần mềm. Điều này có thể hữu ích để có được một ý tưởng chung về cách một dự án đi từ đầu đến cuối, mặc dù nếu bạn muốn đi sâu hơn, có những phương pháp như Waterfall hoặc Agile mà bạn có thể nghiên cứu để có kiến ​​thức cụ thể hơn.


2
Luật của Murphy: Bất cứ điều gì có thể sai, sẽ sai
Richard

Đó không phải là lý thuyết CS, nhưng đây là một câu trả lời tuyệt vời.
justkt

1

Lập trình

Từ Khoa Toán học và Khoa học Máy tính, Đại học Hobart và William Smith đến Khoa học Máy tính 124 Giới thiệu về Lập trình :

Các chủ đề bao gồm các cấu trúc điều khiển, các đối tượng, các lớp, kế thừa, các cấu trúc dữ liệu đơn giản và các khái niệm cơ bản về phát triển phần mềm.

Nếu bạn không thể lập trình, bạn sẽ không đi quá xa trong điện toán thế giới thực.

Và, vâng, tôi đã lưu ý rằng bạn là lập trình viên. Điều này là để cải thiện kiến ​​thức tổng thể của bạn về lý thuyết lập trình và những cách tiếp cận khác có sẵn cho bạn.

Là lập trình Khoa học Máy tính như chúng ta biết?

Đáp lại bình luận từ @Thomas Owens, người đã chỉ ra (hoàn toàn đúng) rằng lập trình không hoàn toàn đúng về Khoa học Máy tính, tôi muốn trích dẫn từ bài báo Khoa học Máy tính của Wikipedia :

... trọng tâm của khoa học máy tính là tập trung vào việc hiểu các thuộc tính của các chương trình được sử dụng để triển khai phần mềm như trò chơi và trình duyệt web và sử dụng sự hiểu biết đó để tạo chương trình mới hoặc cải thiện các chương trình hiện có ...

Vì vậy, khi tôi đọc nó, bằng cách lập trình, bạn đang thể hiện sự hiểu biết của mình về lý thuyết lập trình. Điều này sẽ lần lượt giúp bạn tạo mã đơn giản, thanh lịch, là niềm vui cho người khác làm việc.


Lập trình không phải là lý thuyết CS. Trên thực tế, tôi có thể dễ dàng lập luận rằng lập trình hoàn toàn không phải là khoa học máy tính.
Thomas Owens

@Thomas Owens Tôi đã cập nhật câu trả lời của mình để sao lưu khiếu nại của mình rằng nó hợp lệ. Bạn có thể xem lại và cho tôi biết suy nghĩ của bạn?
Gary Rowe

1
Vẫn không nghĩ rằng lập trình là CS. Lập trình MIGHT hữu ích cho một nhà khoa học máy tính muốn thực hiện thuật toán hoặc cấu trúc dữ liệu, nhưng các chủ đề trong lý thuyết CS (từ cuốn sách Giới thiệu về CS của tôi, vì vậy có lẽ cũng có nhiều chủ đề nâng cao hơn) bao gồm logic, lý thuyết tự động, lý thuyết đồ thị , khả năng tính toán, độ phức tạp tính toán và phân tích các thuật toán. Tôi cũng sẽ nói rằng các ngôn ngữ lập trình (lý thuyết đằng sau việc thiết kế và triển khai ngôn ngữ) cũng là một phần của khoa học máy tính. Tuy nhiên, bạn không cần phải có khả năng lập trình để trở thành một nhà khoa học máy tính giỏi.
Thomas Owens

@Thomas Owens Tôi thấy quan điểm của bạn, và (đội mũ thuần túy) Tôi đồng ý. Tuy nhiên, OP đang yêu cầu một chút CS sẽ giúp anh ta trong thế giới thực. Tôi giữ vững quan điểm của mình rằng lý thuyết lập trình (được triển khai theo mã tốt) là một bit. Tôi đã chỉnh sửa một chút cho phù hợp.
Gary Rowe

Vâng. Từ CS, tôi muốn nói rằng việc hiểu ngôn ngữ lập trình và mô hình có thể giúp ích (đặc biệt nếu bạn đang triển khai DSL, nhưng biết nhiều mô hình như thủ tục, chức năng, OO, logic chỉ giúp phát triển phần mềm). Hiểu các thuật toán và cấu trúc dữ liệu cũng giúp bạn chọn đúng (các) vấn đề để giải quyết vấn đề của bạn một cách hiệu quả nhất. Lý thuyết tự động có thể giúp ích (tôi đã từng làm việc với một hệ thống từng là một FSM khổng lồ, nhưng tôi không biết mức độ phổ biến của nó). Vì vậy, tôi muốn nói rằng cấu trúc dữ liệu, thuật toán và lý thuyết PL sẽ là những điều hữu ích nhất để biết từ CS.
Thomas Owens

1

Tôi phải không đồng ý với Konrad Rudolph. Có "Một chút" về khoa học máy tính mà bạn nên biết để làm cho bạn trở thành một "lập trình viên thế giới thực" tốt hơn. Nếu bạn không có gì khác ngoài câu trả lời bạn nhận được ở đây, ít nhất hãy xem xét điều này- Đáp ứng các yêu cầu KHÔNG giống như thỏa mãn khách hàng! Người dùng cuối sẽ LUÔN cố gắng sử dụng chương trình của bạn theo cách bạn không bao giờ nghĩ tới hoặc mã hóa. LUÔN, LUÔN, LUÔN.

Do đó, để trở thành một lập trình viên tốt hơn, trước tiên bạn phải NGHE. Lắng nghe khách hàng. Lắng nghe nhu cầu của họ. Lắng nghe mong muốn của họ. Và đặc biệt, hãy lắng nghe mức độ "công nghệ-pertise" của họ. Tôi không thể nói cho bạn biết bao nhiêu lần tôi đã thấy một dự án được xây dựng chính xác là những gì được yêu cầu, nhưng không phải tất cả những gì khách hàng thực sự đã xem. Tất cả chỉ vì lập trình viên tập hợp các req không thực sự lắng nghe.

Một thứ khác mà bạn có thể lấy đi là, trừ khi bạn có nền tảng về thiết kế giao diện người dùng, hãy nhờ ai đó thiết kế giao diện người dùng. Tôi có thể LUÔN phát hiện ra một ứng dụng trong đó UI được thiết kế bởi lập trình viên chứ không phải chuyên gia. Điều gì hợp lý và có ý nghĩa với bạn sẽ không có ý nghĩa với khách hàng. Và, nếu khách hàng của bạn không thích công nghệ, (và ai là ai?) Thì giải pháp "đúng chức năng, nhưng xấu về mặt thẩm mỹ" của bạn sẽ được đáp ứng với sự ấm áp của chồn hôi trong bữa tiệc tối.


3
Câu trả lời này không liên quan đến lý thuyết CS, đó là những gì Hopkins đã hỏi.
James

1

Ngôn ngữ chức năng!

Học ngôn ngữ chức năng làm cho bạn suy nghĩ về các biểu thức, thay vì các bước và được đặt tên trạng thái có thể thay đổi (biến). Điều này có tác động đáng kể đến khả năng của bạn để giải quyết hiệu quả các vấn đề lập trình hàng ngày - đặc biệt là bây giờ hầu như mọi ngôn ngữ phổ biến đều có các tính năng chức năng.

Thuật toán và lý thuyết phức tạp cũng rất quan trọng, nhưng nó hơi thú vị ở chỗ nó chủ yếu cho phép bạn đặt tên cho những thứ mà bạn thường biết và có thể suy luận.


0

Máy tính đó về cơ bản là khớp mẫu, không có gì hơn. Mọi thứ sôi sùng sục xuống Turing Machine - Scienceconcept máy tính cổ điển để giải thích việc gia công mô hình.


-2

Giải quyết vấn đề và mong muốn tiếp tục học tập!

Họ phục vụ tôi tốt hơn nhiều so với việc biết sắp xếp nhanh chóng và chuẩn hóa cơ sở dữ liệu.


6
Đó không phải là lý thuyết khoa học máy tính, họ áp dụng như nhau cho kỹ thuật điện tử (hoặc gần như bất kỳ hình thức nào khác).
Jon Hopkins

Theo cách tôi thấy, để đưa ví dụ của bạn vào tài khoản biết cách sắp xếp nhanh chóng không hữu ích. Biết nó tồn tại và điều gì là đặc biệt là hữu ích, nhưng cũng là một tìm kiếm google nếu tôi không biết gì về nó. Biết bất kỳ một thuật toán cũng không hữu ích. Tuy nhiên, biết cách tạo một và giải thích một là! Có lẽ nếu tôi có thể thay đổi câu trả lời của mình, thì Độ phức tạp có lẽ là quan trọng nhất.
Bryan Harrington

1
Bạn không thể tìm kiếm thứ gì đó nếu bạn không biết bạn cần nó hoặc nó tồn tại. Câu trả lời của bạn liệt kê những phẩm chất quan trọng để nhà phát triển có, nhưng không trả lời câu hỏi được đặt ra.
Adam Lear
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.