Tôi có cần phải hiểu các thuật toán và cấu trúc dữ liệu để được gọi là lập trình viên không? [đóng cửa]


37

Đã sáu năm kể từ khi tôi viết mã. Viết mã vào tất cả mọi thứ như ActionScript, JavaScript, Java, PHP, Ajax, XML HTML, ASP, v.v. Tôi đã sử dụng mảng, bản đồ, danh sách liên kết, bộ, v.v. và bất cứ nơi nào tôi làm việc như những người như tôi. Nhưng bất cứ khi nào tôi được phỏng vấn, rất có khả năng mọi người hỏi tôi câu hỏi về băm, cây, ngăn xếp và hàng đợi. Một số câu hỏi về việc tung hứng một số thuật toán sắp xếp. Tôi không biết liệu tôi nên thực sự biết họ hay tôi nên ngừng tự gọi mình là lập trình viên. Có một cái gì đó trong tôi cũng cho tôi biết ngay cả khi những người đang hỏi tất cả những câu hỏi này chọn tôi, họ sẽ không bao giờ bắt tôi làm những việc này. Tôi có thực sự cần phải biết tất cả điều này?


10
Điều đó phụ thuộc vào nơi bạn làm việc và người mà bạn muốn gọi bạn là lập trình viên.
Tim

1
Có, nếu không có tính từ phủ định.
Duros

Câu trả lời:


79

Nếu tất cả những gì bạn biết làm là viết mã keo, bạn có thể gọi cho mình một con khỉ mã. Rất nhiều mã keo cần phải được viết và bạn có thể kiếm sống đàng hoàng như một con khỉ mã. Để gọi cho mình một Bất Programmer TM và được tin cậy khi nhu cầu mã để được viết từ đầu, bạn phải biết các thuật toán, cấu trúc dữ liệu, quản lý bộ nhớ, con trỏ, lắp ráp ngôn ngữ, vv và hiểu làm thế nào để sử dụng kiến thức này để đánh giá cân bằng.


6
Wow, tôi đã dự đoán một nửa điều này sẽ bị hạ thấp vào quên lãng bởi những người quá chính xác về mặt chính trị khi sử dụng thuật ngữ "khỉ mã".
dsimcha

15
"Simian phần mềm" luôn là thuật ngữ được ưa thích
STW

3
Tôi không hoàn toàn đồng ý. Loại phần mềm được viết "từ đầu" ảnh hưởng lớn đến người có khả năng viết nó. Một số phần mềm đòi hỏi sự tinh tế ít hơn (hoặc lớn hơn) so với những phần mềm khác.
Nick Spreitzer

8
+1, 20% vì tôi đồng ý, 5% vì "Lập trình viên thực sự TM" và 75% vì tôi học ngôn ngữ lắp ráp và muốn giả vờ rằng nó đáng để chịu đựng
Carson Myers

3
Hầu hết các công việc hiện tại chỉ yêu cầu 'khỉ mã'. Thật bình thường khi những người làm công việc 'khỉ mã' có xu hướng quên đi tất cả kiến ​​thức trước đây của anh ta, khiến anh ta trở thành một "con khỉ mã" hơn mỗi ngày, bất chấp tiềm năng của anh ta. :(
cag

32

những người không biết lịch sử bị kết án để phát minh lại nó


75
Trên thực tế, những người không biết lịch sử bị kết án để phát minh lại bằng phương pháp O (N 2) hoặc O (N 3) thay vì sử dụng các phương pháp O (N log N) nổi tiếng đủ cũ để mua booze trong tất cả 50 tiểu bang.
John R. Strohm

@ John ROFLMAO - quá đúng!
Steven A. Lowe

3
.... chắc chắn sẽ giới thiệu nó

30

Chà, làm việc trong một ngôn ngữ như JavaScript làm cho điều này trở nên khá lỗi thời, vì Mảng là sự pha trộn giữa một vectơ, hàm băm và cây và có thể được sử dụng như một ngăn xếp hoặc hàng đợi. Rất có khả năng bạn sẽ không cần hoặc có thể triển khai cấu trúc dữ liệu trong JavaScript vượt trội hơn lớp Array. Đây cũng là trường hợp trong PHP.

Đối với Java OTOH, có một sự khác biệt. Tôi cho rằng thư viện tiêu chuẩn của Java cung cấp cho bạn về bất kỳ cơ sở hạ tầng nào bạn cần. Tuy nhiên:

  1. Bạn cần biết và phân biệt các cơ sở dữ liệu đó và hiểu cách chúng thực hiện trong các tình huống khác nhau để bạn có thể chọn đúng.
  2. Trong Java, cuối cùng bạn không muốn viết bản triển khai của riêng mình cho hashmap để có tốc độ tốt hơn trong một số trường hợp rất cụ thể (ví dụ: nếu các khóa bạn muốn xử lý đầy đủ một số ràng buộc đặc biệt cho phép tối ưu hóa).

Khi nói đến việc sắp xếp các thuật toán, không cần phải biết hoặc hiểu chúng nhiều, bởi vì không cần phải tự mình thực hiện một thuật toán. Tuy nhiên, nếu một thuật toán như vậy được trao cho bạn, bạn sẽ có thể hiểu và thực hiện nó.

Hai điều chắc chắn:

  1. Bạn có thể làm nghề lập trình mà không cần dựa vào kiến ​​thức như thế này.
  2. chắc chắn nhất sẽ không làm tổn thương bạn biết chúng.

Cấu trúc dữ liệu và thuật toán chỉ đơn giản là một điều, đó là điều tốt để hiểu. Và nó là một cái gì đó cực kỳ rõ ràng và chính thức và do đó khá tầm thường so với những rắc rối của ứng dụng hoặc kỹ thuật hệ thống. Chúng chỉ là một mảnh nhỏ trong câu đố, nhưng chúng rất dễ nắm bắt - nếu bạn sẵn sàng đầu tư một chút thời gian.

Vì vậy, không, bạn không cần đến chúng, nhưng nó sẽ chỉ được cho lợi ích của bạn để biết chúng.


13

Đây có thể là một dịp mà có thể có sự phân biệt có ý nghĩa về mặt ngữ nghĩa giữa 'lập trình viên' và 'kỹ sư phần mềm'. Trong bối cảnh này, cụ thể, chúng tôi thấy rằng bạn có kiến ​​thức về một số ngôn ngữ lập trình và các công nghệ liên quan và bạn có thể sử dụng chúng để tạo ra kết quả mong muốn. Đây là một định nghĩa hoạt động tốt của 'lập trình viên máy tính.'

Tôi coi mình là một kỹ sư phần mềm. Trong hầu hết các khía cạnh hàng ngày trong công việc của tôi, tôi có thể làm những việc tương tự như bạn làm. Tôi sử dụng ngôn ngữ máy tính và các công nghệ liên quan để tạo ra một số kết quả mong muốn. Tuy nhiên, tôi có hiểu biết về cấu trúc dữ liệu và thuật toán và tôi coi kiến ​​thức đó là nền tảng cơ bản cho khả năng của mình để làm được nhiều hơn thế.

Thông thường - mặc dù không phải ngày nào - công việc của tôi liên quan đến việc tìm giải pháp cho các vấn đề phức tạp mà không có giải pháp rõ ràng, không có gì được giải quyết trực tiếp bằng các tính năng của khung mà tôi đang sử dụng hoặc khả năng của ngôn ngữ mà tôi đang làm việc với. Trong phần này, tôi cần phân tích vấn đề và đưa ra giải pháp và đôi khi quá trình này diễn ra trong lĩnh vực kiến ​​trúc quy mô lớn.

Mặc dù một sự hiểu biết tuyệt vời về những vấn đề sâu sắc hơn là cần thiết để thực hiện loại công việc đó, nhưng nó không đủ . Nói cách khác, chỉ cần biết cách bảng băm hoạt động hoặc tại sao một loại heap thường có các đặc tính hiệu suất tốt là không đủ để trở thành một kiến ​​trúc sư hệ thống hoặc một kỹ sư cao cấp. Đó là nơi bắt đầu hợp lý, và từ đó bạn có thể bắt đầu đào sâu hơn và đi du lịch rộng rãi hơn và có được trải nghiệm cũng cần thiết để giải quyết các vấn đề lớn hơn.

Tôi cho rằng để trả lời câu hỏi của bạn, bạn nên tự hỏi: "Tôi muốn trở thành gì? Tôi sẽ đi đâu với sự nghiệp của mình?" Nếu bạn có ý định tiếp tục làm những gì bạn đang làm, thì bạn có thể chỉ muốn tìm hiểu đủ cấu trúc dữ liệu và thuật toán để vượt qua các câu hỏi phỏng vấn chủ yếu mà bạn đang phải đối mặt.

Nếu bạn muốn phát triển trong sự nghiệp và bạn có niềm đam mê với nó là điều cần thiết, bạn nên nắm bắt những chủ đề này càng chặt chẽ càng tốt. Nếu bạn có thời gian để làm việc với họ, một tâm hồn cởi mở và nhiệt tình thực sự, bạn sẽ tìm thấy một số điều tuyệt vời và thú vị. Tôi sẽ không bao giờ quên ngày đầu tiên tôi hiểu quicksort. Cảm giác phấn khích và khám phá đã tạo ra quá trình cho phần còn lại của cuộc đời tôi, và tôi không thể biết ơn nhiều hơn về điều đó. Bây giờ, tôi không thể tưởng tượng làm bất cứ điều gì ngoài làm việc như một kỹ sư phần mềm.

Tốt nhất của may mắn với bất cứ điều gì bạn chọn.


2
Luôn có những giải pháp rõ ràng. Chúng chỉ ngừng hoạt động khi yêu cầu thay đổi;) Tôi không nghĩ kiến ​​thức sâu sắc về thuật toán và cấu trúc dữ liệu là tiền đề thực sự cho một kỹ sư phần mềm giỏi. Chỉ là bạn hiếm khi nhìn thấy một cái mà không có nó, bởi vì những gì một kỹ sư phần mềm giỏi có, là một khao khát kiến ​​thức không thỏa mãn.
back2dos

+1 Câu nói hay 'Tôi cho rằng để trả lời câu hỏi của bạn, bạn nên tự hỏi: "Tôi muốn làm gì? Tôi sẽ đi đâu với sự nghiệp của mình?'
Hóa đơn

12

Nó phụ thuộc vào những gì các công việc được cho. Những thứ này là những câu hỏi phỏng vấn khá chuẩn nhưng chúng cũng không bắt mắt và có lẽ không liên quan đến công việc - chắc chắn không phải là công việc sử dụng các công nghệ mà bạn liệt kê.

Đối với tôi khi các câu hỏi phỏng vấn, họ là một thẩm phán tốt về việc bạn đã có bằng Khoa học Máy tính (và có thể nhớ nó) chứ không phải là bất kỳ thước đo nào về khả năng hoặc kiến ​​thức lập trình chung.

Tôi khuyên bạn nên học những thứ này để bạn có thể vượt qua cuộc phỏng vấn, hoặc bạn chấp nhận rằng bất cứ nơi nào hỏi những điều này không phù hợp với bạn, nhưng không, bạn không cần phải biết họ tự gọi mình là lập trình viên.


1
cảm ơn câu trả lời của bạn. Tôi sẽ chia sẻ với mọi người cuộc phỏng vấn hài hước, tôi yêu cầu một số người giỏi về phía Giao diện người dùng bằng cách sử dụng json css ajax javascript jquery, v.v. Họ hỏi tôi làm thế nào bạn sẽ viết một máy chủ web. Và điều gì xảy ra khi lưu được nhấn trong một tệp từ
sushil bharwani

2
@sushil - Tôi nghĩ đó là nơi bạn không muốn làm việc ...
Jon Hopkins

@sushil: Tôi hoàn toàn đồng ý với @Jon Hopkins. Làm việc tốt hơn như một người phục vụ chờ đợi một công việc tốt hơn là nhận một công việc như thế. Có những kẻ ngốc bất tài như cấp trên sẽ khiến bạn vô cùng thất vọng và cản trở bạn trong quá trình phát triển cá nhân.
back2dos

6

Câu hỏi tuyệt vời. Javascript hoặc Java hoặc VC ++ là những ngôn ngữ lập trình siêu thông minh, nơi bạn sẽ không bao giờ cần phải tạo danh sách liên kết hoặc bảng băm từ đầu. Nhưng bạn vẫn cần có khả năng quyết định khi nào nên sử dụng cái này hơn cái kia, hình phạt hiệu suất và tiền thưởng mỗi lần tích lũy, v.v.

Tôi đã phỏng vấn rất nhiều lập trình viên API hay còn gọi là khỉ mã, và trong hầu hết các cuộc phỏng vấn, họ thường xuyên thất bại trong việc thiết kế các hệ thống có hiệu suất và khả năng mở rộng hiệu quả. Điểm mấu chốt: biết vô số API sẽ giúp bạn có được bánh mì, nhưng đối với bơ, bạn cần bắt đầu từ những điều cơ bản của điện toán.


Cảm ơn rất nhiều, tôi sẽ lấy lời khuyên của bạn và bắt đầu tìm hiểu về những chủ đề đó
Mahmoud Hossam

3

Tôi sẽ thêm "có, tất nhiên bạn vẫn có thể gọi cho mình một lập trình viên". Nhưng loại lập trình viên nào bạn muốn trở thành? Tôi nghĩ rằng các lập trình viên giỏi nhất có ít nhất một số nền tảng cơ bản về lý thuyết. Họ biết tại sao họ chọn một cấu trúc / thuật toán dữ liệu cụ thể cũng như sự đánh đổi đi kèm với điều đó. Tôi hy vọng bất kỳ nhà phát triển nào tôi phỏng vấn đều có ít nhất một sự hiểu biết cơ bản, ngay cả khi họ không sử dụng cùng một thuật ngữ (mặc dù không biết biệt ngữ có nghĩa là bạn sẽ gặp khó khăn hơn khi giao tiếp với các nhà phát triển khác).


2

Kiến thức về các thuật toán cho phép bạn tự tin nói rằng các lựa chọn của bạn sẽ mở rộng như thế nào ! Cá nhân tôi cho rằng điều này là cần thiết để trở thành một lập trình viên cao cấp


2

"Nếu bạn muốn trở thành một lập trình viên giỏi, bạn chỉ cần lập trình mỗi ngày trong hai năm. Nếu bạn muốn trở thành một lập trình viên đẳng cấp thế giới, bạn có thể lập trình mỗi ngày trong mười năm, hoặc bạn có thể lập trình mỗi ngày trong hai năm và học một lớp thuật toán . "

-Charles E. Leiserson

Lời khuyên tốt từ Phân tích thuật toán của Charles E. Leiserson - MIT


1

Nó phụ thuộc vào dự án: Tôi là một kỹ sư máy tính và tôi làm lập trình viên phân tích.

Tôi đã dành rất nhiều thời gian để làm việc trong thiết kế (thử nghiệm, tài liệu, thiết kế mã). Nhưng, khi tôi tìm thấy một lỗi (hoặc hiệu năng kém) hoặc tôi phải mã hóa cấu trúc dữ liệu mới (vì yêu cầu rất MỚI cho ứng dụng), tôi phải hiểu vấn đề trong algoritm ở đâu và tôi phải sửa nó ( Tôi đã làm điều này không tốt lắm, vì vậy :))

Các thuật toán cổ điển và cấu trúc dữ liệu là một loại "mẫu từ điển" trong thế giới của nhà phát triển.

Một số liên kết tuyệt vời:


1

Bạn có thể là một lập trình viên giỏi ngay bây giờ, nhưng kiến ​​thức về Cấu trúc dữ liệu, Thuật toán và kiến ​​thức về các chủ đề khác trong khoa học máy tính chắc chắn sẽ giúp ích rất nhiều trong việc cải thiện bản thân theo nhiều cách:

  • Bạn có thể có thể hiệu quả hơn và nhanh hơn trong việc làm. Ngay cả những người đã có bằng Khoa học Máy tính và biết nhiều chủ đề này cũng có xu hướng theo kịp những tiến bộ mới nhất để cải thiện bản thân.

  • Kiến thức này cũng sẽ tốt cho, nếu ở mức độ thấp hơn, nói rằng nếu bạn chuyển từ lập trình viên sang theo dõi quản lý sau này, bởi vì bạn vẫn có thể hiểu các khía cạnh kỹ thuật của các dự án tốt hơn với kiến ​​thức này.

  • Tất nhiên cấu trúc dữ liệu và thuật toán được hỏi rất nhiều trong các cuộc phỏng vấn, vì vậy đó là một lý do nữa tại sao có thể hữu ích khi biết chúng.


0

Bạn đề cập đến băm, cây, ngăn xếp, hàng đợi và thuật toán sắp xếp. Chà, các công nghệ bạn đã đề cập chủ yếu liên quan đến trang web và kịch bản web. Bạn chắc chắn nên hiểu cây ít nhất, để bạn có thể làm việc với DOM tốt. Nhưng nếu kịch bản là tất cả những gì bạn cần làm, thì có lẽ bạn sẽ ổn. Bạn sẽ không cần hầu hết các công cụ giao dịch cho một lập trình viên thực thụ. Nhưng đó là bởi vì có một sự khác biệt lớn giữa việc tung hứng chuỗi tạo nên phần lớn kịch bản Web và điều mà hầu hết chúng ta coi là "chương trình viết".

Tôi làm việc với băm và cây thực tế hàng ngày, và ngăn xếp và xếp hàng ít thường xuyên hơn nhưng thường xuyên đủ. Sắp xếp về cơ bản là một vấn đề được giải quyết; bất kỳ ngôn ngữ nào cũng có quicksort được tích hợp vào thư viện chuẩn, phương thức Sắp xếp trên các loại bộ sưu tập cơ bản, v.v., nhưng bạn nên biết trong trường hợp nào hiệu suất của quicksort có thể làm giảm nghiêm trọng và các chiến lược phù hợp để trì hoãn sắp xếp.

Nếu tôi không biết những nguyên tắc này và cách chúng hoạt động, có lẽ tôi có thể hack các giải pháp mã hóa hoạt động, nhưng chúng sẽ không phải là giải pháp chất lượng rất tốt. Chúng chạy chậm, khó đọc và khó sửa đổi, tái sử dụng hoặc mở rộng. Vì vậy, nếu bạn muốn học để trở thành một lập trình viên giỏi, bạn chắc chắn nên đọc các thuật toán và cấu trúc dữ liệu của mình. Họ sẽ thực sự cải thiện chất lượng mã của bạn.

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.