it-swarm-vi.com

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?

Đã 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?

38
sushil bharwani

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 lập trình viên thực sự TM và được tin cậy khi mã cần được viết từ đầu, bạn phải biết thuật toán, cấu trúc dữ liệu, quản lý bộ nhớ, con trỏ, ngôn ngữ hội, v.v. và hiểu cách sử dụng kiến ​​thức này để đánh giá sự đánh đổi.

80
dsimcha

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

33
Steven A. Lowe

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 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ể tạo dựng sự nghiệp như một lập trình viên 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 bạn đau khi biết họ.

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 chúng, nhưng nó chỉ dành cho lợi ích của bạn để biết chúng.

30
back2dos

Đâ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ữ 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ù 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 phải là đủ. 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.

13
Adam Crossland

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 có gì đặc biệt và có lẽ không liên quan đến công việc - chắc chắn không phải là một 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.

12
Jon Hopkins

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 được 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 một ngôn ngữ khác, các hình phạt hiệu suất và tiền thưởng mỗi tích lũy, vv.

Tôi đã phỏng vấn rất nhiều lập trình viên API aka 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.

6
Fanatic23

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).

3
Martijn Verburg

Kiến thức về các thuật toán cho phép bạn tự tin nói rằng lựa chọn của bạn sẽ tỷ lệ! 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
user1249

"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

2
milan-j

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.

1
aditya

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
alepuzio

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.

0
Mason Wheeler