Series phản phác qui chân – Học thuật toán để làm vẹo gì?
Mình thường nghe các bạn sinh viên hỏi về tầm quan trọng của việc học thuật toán. Ý kiến của các bạn được chia làm hai luồng trái chiều như sau: Thần thánh hoá thuật toán : Muốn lập trình giỏi phải giỏi thuật toán. Các công ty lập trình lớn toàn phỏng vấn về thuật toán còn ...
Mình thường nghe các bạn sinh viên hỏi về tầm quan trọng của việc học thuật toán. Ý kiến của các bạn được chia làm hai luồng trái chiều như sau:
- Thần thánh hoá thuật toán: Muốn lập trình giỏi phải giỏi thuật toán. Các công ty lập trình lớn toàn phỏng vấn về thuật toán còn gì.
- Coi thường thuật toán: Thuật toán là cái thứ vô dụng, mấy anh đi làm nói là có dùng bao giờ đâu.
Bài viết này sẽ giúp các bạn trả lời câu hỏi “Học thuật toán để làm cái vẹo gì?”, cũng như có cái nhìn khách quan hơn về thuật toán.
Học thuật toán để… trả lời phỏng vấn
Những người bênh vực thuật toán thường bảo rằng: Các công ty lớn như Google, Amazon, Facebook rất quan tâm tới thuật toán khi phỏng vấn. Điều này là hoàn toàn có thật nhé! Bạn sẽ phải viết code lên bảng, giải thích code và thuật toán khi PV ở các công ty này.
Mình từng đọc qua 2 cuốn sách Cracking the Coding Interview và Elements of Programming Interview. Hai cuốn này có đề cập tới quá trình phỏng vấn của các công ty này, cũng như toàn bộ các câu hỏi/lời giải về thuật toán mà lập trình viên nên chuẩn bị.
Tuy vậy, không phải công ty lập trình nào cũng như Google, Amazon, Facebook. Theo kinh nghiệm của mình và bạn bè, các công ty Việt Nam chỉ hỏi một số thuật toán cơ bản khi tuyển dụng (Bạn mình PV Ansadara bị hỏi thuật toán dầu loang và DFS).
Các công ty này cũng cần tuyển người làm việc được ngay, biết cách sử dụng công nghệ. Do vậy, đừng quá chăm chăm vào thuật toán, mà còn phải bỏ thời gian học hỏi và sử dụng công nghệ nữa nhé.
Cũng đừng quá tự tin là giỏi thuật toán thì học công nghệ nhanh thôi. Cần trải qua một thời gian làm việc lâu dài thì mới nắm hết được được điểm mạnh yếu, kĩ thuật và kinh nghiệm khi dùng ngôn ngữ/công nghệ nhé.
Học thuật toán để giải quyết vấn đề, nâng cao tư duy
Thuật toán ở khắp nơi quanh ta. Bản thân Google mạnh mẽ như vậy là nhờ thuật toán tìm kiếm của nó. Chức năng recommendation của Amazon có được cũng nhờ thuật toán. Đến cả những tin tức hiện hằng ngày trong New Feed trên Facebook của bạn cũng do thuật toán định đoạt.
Một số lĩnh vực trong lập trình cần sử dụng rất nhiều thuật toán như: render đồ hoạ, mã hoá dữ liệu, driver, machine learning, data mining… Mỗi lĩnh vực sẽ cần những thuật toán riêng. Phải nắm vững các thuật toán này thì bạn mới có thể làm việc trong lĩnh vực đó.
Việc giỏi thuật toán cũng giúp bạn tìm ra hướng giải quyết vấn đề nhanh hơn, viết code mạch lạc hơn. Nắm vững thuật toán, cấu trúc dữ liệu, bạn sẽ ước tính được độ phức tạp của code, đánh giá code chạy nhanh hay chậm, có scalable hay không.
Đây đều là những kĩ năng vô cùng cần thiết. Để thành một lập trình viên giỏi, bạn cần phải rành rẽ thuật toán (Cơ bản là được, không cần cao siêu đâu).
Đừng quá thần thánh hoá thuật toán!
Ở Việt Nam, do các kì thi tin học đều chú trọng vào phần thuật toán, giải toán nên chúng ta có xu hướng “thần thánh hoá thuật toán”. Điều này dẫn đến tình trạng Việt Nam được giải tin học này nọ nhưng chẳng có phần mềm nào nổi bật cả.
Để lập trình giỏi, ta cần rành thuật toán. Tuy nhiên, giỏi thuật toán không có nghĩa là bạn sẽ thành lập trình viên giỏi. Trong một số lĩnh vực khác như phần mềm doanh nghiệp, mobile, phần lớn các chức năng chỉ là “thêm bớt xoá sửa”.
Requirement của các phần mềm này thường hay thay đổi, dẫn đến việc thay đổi code. Lúc này, thuật toán hay, code chạy nhanh không quan trọng bằng việc hiểu đúng requirement, tổ chức dữ liệu, thiết kế cấu trúc code, viết code sao cho dễ đọc, dễ bảo trì.
Ngoài ra, bản chất của ngành lập trình là kế thừa để phát triển. Mình từng bảo rằng “Đôi khi cắm đầu vào code là cách ngu nhất để giải quyết vấn đề“. Thay vì implement các thuật toán từ đầu, các bạn có thể sử dụng thư viện có sẵn, hoặc lấy code đã viết và chỉnh sửa lại cho phù hợp.
Ví dụ: Thay vì tự viết Tree, Stack, Linked List, các ngôn ngữ lập trình đều đã implement sẵn, ta chỉ việc sử dụng. Đến cả những thuật toán phức tạp như nhận diện khuôn mặt, nhận diện ngôn ngữ cũng có API cả rồi. Những thư viện/API này đã được sử dụng nhiều, test nhiều, optimize nhiều nên sẽ nhanh và an toàn hơn code bạn tự viết.
Kết
Mới xem qua, thuật toán có vẻ khá khó nhằn và phức tạp. Tuy vậy, những kiến thức cơ bản về thuật toán cũng không nhiều. Quanh đi quẩn lại cũng chỉ có: Cấu trúc dữ liệu Stack, Queue, Binary Tree, Linked List, … và một số thuật toán như: Dynamic Programming, Backtrack, DFS, … Bạn hoàn toàn có thể tự học và dần nắm vững chúng.
Nếu bạn không rành thuật toán, không giải được các câu hỏi hóc búa, bạn vẫn có thể là lập trình viên tốt. Lớp mình ngày xưa có hai đứa vừa học làm freelance, làm web PHP kiêm luôn SEO, thu nhập mỗi tháng cũng khoảng 20-40 triệu.
Code đơn giản, giải quyết yêu cầu kiếm tiền cho người dùng, chẳng cần gì thuật toán. Vì vậy, đừng e ngại thuật toán, nhưng cũng đừng thần thánh hoá nó. Cứ xem nó là một skill, học nhiều luyện nhiều sẽ giỏi thôi.
Để luyện tập, các bạn có thể đú 2 cuốn sách Cracking the Coding Interview và Elements of Programming Interview để vừa học vừa ôn, sau đó lên hackerrank để thử sức thôi!
Nếu năm sau rảnh, mình sẽ bỏ thời gian luyện thêm thuật toán, lúc đấy mình sẽ chia sẻ lại với các bạn nhé.
Techtalk via toidicodedao