Thuật toán có quan trọng hay không? (Dành cho cả sinh viên và người đi làm)

interview
algorithm

(Lê Trần Đạt) #1

Câu trả lời ngắn là có, rất quan trọng nhất là đối với sinh viên và người muốn tìm một công việc tốt hơn trong ngành CNTT.

Tại sao học thuật toán quan trọng?

Trước hết Đạt muốn nói về lý do mình đi học CNTT. Có thể là vì thích, có thể là vì chả có gì để học nhưng mà phần lớn người đi học là để khi tốt nghiệp tìm được một việc làm tốt. Khi đó mới có thu nhập để nuôi bản thân giúp đỡ gia đình.

Học tốt giải thuật là một điểm tựa vững chắc cho các bạn tìm việc làm tốt ở một công ty tốt. Đạt tốt nghiệp ở VN gần 10 năm trước, ở cái giai đoạn VN đang phát triển mạnh outsource nên giải thuật không được coi trọng.

Mình cũng không phải là một người nắm được nhiều thông tin và từng có suy nghĩ sai lầm rằng giải thuật cũng không quan trọng lắm bởi vì khi phỏng vấn vào các công ty outsource chả ai hỏi về giải thuật. Khi đi làm cũng không thấy có ứng dụng gì cả thế nên mình hiểu lầm giải thuật không quan trọng lắm, học thì tốt mà không học thì cũng không sao.

Thế nhưng hiện giờ các công ty công nghệ lớn ở nước ngoài rất hay dùng giải thuật để phỏng vấn. Ví dụ dễ thấy nhất là Google, Facebook có tới 2 vòng onsite chỉ hỏi giải thuật, trước đó cũng có phone inteview hỏi về giải thuật. Ngoài các công ty lớn như Google hay Facebook, Microsoft, Amazon … thì các công ty khác cũng hỏi về giải thuật. Thậm chí nhiều công ty công nghệ ở VN cũng đã và đang hỏi về giải thuật (hôm trước mình có đọc một bài về tiki mà không nhớ link, ai có share giúp mình nhé)

Vậy cái lợi lớn nhất của học giải thuật ở đây là giúp mình pass phỏng vấn ở các công ty công nghệ lớn và có khả năng nhảy việc bất cứ lúc nào. Đó là một kỹ năng không thể thiếu trong phỏng vấn. Phỏng vấn cần nhiều kỹ năng hơn chỉ là giải thuật, nhưng giải thuật rất quan trọng.

Để làm rõ hơn về lợi ích của giải thuật, Đạt xin kể về kinh nghiệm của bản thân. Trước đây khi đi phỏng vấn ở VN thì Đạt thấy các công ty sẽ hỏi về kinh nghiệm làm việc, kinh nghiệm về framework cụ thể mà công ty tuyển mình đang làm, kiến thức về ngôn ngữ mà công ty đang tuyển mình đang dùng. Vì vậy Đạt không tập trung vào giải thuật, thế nhưng từ khi chuyển sang làm web backend. Đạt đi phỏng vấn vào Garena cũng được hỏi về giải thuật, lúc đó mình khá ngạc nhiên nhưng cũng may mắn qua được vòng phỏng vấn.

Sau một thời gian vào công ty thì Đạt gặp rất nhiều bạn trẻ từ VN sang hoặc học bên Singapore, các bạn này có một điểm chung là rất giỏi giải thuật và đã từng đi thi ACM (một cuộc thi về giải thuật dành cho sinh viên). Nhờ biết những bạn này thì Đạt bắt đầu học từ họ, trong đó có bạn cực tốt hướng dẫn mình cách học giải thuật như thế nào cho hiệu quả. Các bạn này làm ở Garena một thời gian rồi cũng đi Google/Facebook/Amazon.

Làm ở Garena một thời gian Đạt cảm thấy rằng việc vào được những công ty lớn như Google/Facebook hoặc Amazon là chuyện có thể nếu mình chịu khó luyện giải thuật thật tốt. *

Đạt đã dành khá nhiều thời gian ôn lại giải thuật và thử đi phỏng vấn ở một vài công ty lớn ở Singapore thì khá bất ngờ là mình nhận được nhiều offers hơn tưởng tượng và mức lương cũng tốt không tưởng so với Garena (tạm thời không chia sẻ được thông tin về các công ty Đạt đã trúng tuyển). Thế nhưng cuối cùng Đạt vẫn quyết định ở lại Garena vì lý do cá nhân.

Ở VN thì có cần phải luyện giải thuật hay không?

Câu trả lời vẫn là có. Nếu bạn không muốn đi nước ngoài, ở VN cũng có nhiều công ty công nghệ hỏi rất sâu về giải thuật như Garena ,Shopee ,Grab, Go-Viet, Tiki, Lazada, … ngoài ra còn nhiều công ty khác nữa. Trong thời gian sắp tới ở VN sẽ có nhiều và càng nhiều công ty làm sản phẩm(startup) thay vì chỉ đi làm outsource. Đạt hi vọng sẽ có thêm nhiều công ty công nghệ lớn về VN để làm sản phẩm hơn. Thông thường các công ty này trả lương cao hơn hẳn mặt bằng chung ở VN. Thế nên việc luyện giải thuật là quan trọng.

Thêm nữa, mình không cần phải phỏng vấn vào những công ty này thì mới học giải thuật. Học giải thuật giúp mình tư duy tốt hơn, code tốt hơn. Trong quá trình làm việc Đạt mặc dù không dùng toàn bộ kiến thức có được sau khi luyện giải thuật để áp dụng vào code. Nhưng Đạt áp dụng được tư duy giải quyết vấn đề và áp dụng được một số pattern hay dùng trong khi làm bài vào công việc.

Có một ví dụ nhỏ thế này, trước khi học giải thuật thì Đạt không biết Tries, nhưng khi biết rồi thì cảm giác nó cũng không khó và khá hữu ích khi cần so sánh prefix. Đạt đã áp dụng một phần nhỏ của cách implementation của Tries vào việc so sánh prefix của 2 patterns. Nếu không có kiến thức về Tries thì Đạt sẽ code rất dài, nhưng khi đã biết rồi code nhanh rất gọn.

Hơn nữa, việc học giải thuật cũng giúp mình có thêm nhiều bạn cùng học trong ngành :slightly_smiling_face:

Bài học rút ra

Sinh viên nên tham gia ACM hoặc chuẩn bị cho ACM(các bạn google thêm), người đi làm nên luyện algorithms, có thể bắt đầu từ leetcode rồi tham gia competitive programming(mình chưa tham gia)

Trong tương lai mình sẽ tranh thủ làm video hướng dẫn giải bài algorithms sao cho đơn giản, dễ hiểu, dễ tiếp cận cho các bạn có thể học thật nhanh.

Note: Đạt cũng đã pass được interview ở Facebook Singapore. Nhưng chưa xác định sẽ đi làm được không vì nhiều lý do :slight_smile:


Chúc mừng Tết Nguyên Đán 2019 Dạy Nhau Học
(Hieu Nguyen Van) #2

Em cảm ơn chia sẻ của anh Đạt ạ. Em có 2 câu hỏi muốn hỏi anh ạ

  1. Làm sao để tiếp cận các thông tin tuyển dụng của các công ty lớn(Garena, Tiki, …) của Việt Nam ạ. Em thử tìm trên google thông tin khá mờ nhạt.

  2. Anh có thể cho em hỏi con đường nào để mình có thể tiếp cận với các công ty nước ngoài(VD. Ở bên Singapo như anh) ạ?

Hiện tại em đang làm cho một công ty trong nước và cảm thấy chả có cơ hội nào để bay xa.


(Lê Trần Đạt) #3
  1. Em lên linkedin làm cái profile rồi bắt đầu connect với bạn bè, đồng nghiệp, hr, headhunt, update profile tốt và skills tốt. Từ từ sẽ có người contact em.
  2. Tương tự như 1, profile em phải tốt, kinh nghiệm phải phù hợp. Ngoài ra còn một con đường đơn giản hơn là tìm người refer, tìm ai làm trong mấy công ty đấy rồi nhờ họ giới thiệu.

Hiện giờ anh đang bận công việc linh tinh nên không refer được nhưng tầm 3-4 tháng nữa chắc là OK.

À sẵn đây công ty cũ của Đạt đang cần tuyển 1 embedded software engineer tầm 2-3 năm kinh nghiệm. Gửi CV tới [email protected] hoặc [email protected] mình sẽ refer giúp nhé.

Link cũ ở đây: Looking for a software engineer with 2-3 years of experience, able to communicate well in English to work in Singapore


(Phạm Vinh) #4

Chào anh Đạt,
Cảm ơn anh vì đã chia sẻ. Trước giờ em cứ nghĩ giải thuật là biết cách sử dụng các thuật toán có sẵn để giải quyết bài toán. Tức là có dạng bài sẵn chỉ cần rắp công thức vào. Nhưng khi anh chia sẻ thì thuật toán còn rèn luyện cách suy nghĩ giải quyết vấn đề. Em tự hỏi nó là như thế nào?

Bây giờ em cũng nghe nói đến cạm bẫy giải thuật, tức là một vấn đề đơn giản nhưng cũng phải sử dụng phương pháp phức tạp lên. Cho em được hỏi là học như thế nào mới có thể thoát khỏi cạm bẫy này vậy?

Cảm ơn anh


(Vu Van Chung) #5

Anh Đạt có thể dành riêng 1 topic chuyên về algorithms được không ạ? Em vẫn chưa biết nên follow theo path như thế nào để học tốt giải thuật, ngoài việc code đi code lại mấy giải thuật trong sách thầy Nguyễn Đức Nghĩa và làm trên leetcode ra thì vẫn chưa biết gì nhiều!


(sike) #6
  1. học thuật toán anh nói có phải đang nói đến là học các thuật toán mà đã được các lập trình viên đi trước tìm ra không , hay là học cách nghĩ ra thuật toán ??
  2. nếu nắm được các thuật toán có sẳn hiện tại ( học qua các sách giải thuật dạy ở trường đại học ) , thì có đủ để làm việc không ?

(Lê Trần Đạt) #7

Em nghĩ vậy cũng đúng.

Em nghĩ thế này lại sai. Công thức là có, nhưng áp dụng thế nào lại là vấn đề khác hẳn.

Là bởi vì mỗi một vấn đề sẽ có cách giải quyết khác nhau, về bản chất nó là giống nhau. Giống như khi em đi học phổ thống, toán, lý, hóa đều có công thức. Liệu em chỉ cần ráp công thức vào là làm được ngay hay không?

Em phải suy nghĩ để xem thử công thức nào phù hợp, kết hơp nhiều công thức với nhau và sửa lại công thức làm sao cho phù hợp với bài toán của em nữa chứ.

Quá trình đấy là quá trình giải quyết vấn đề.


(Lê Trần Đạt) #8

Anh nghĩ không cần thiết đến mức đó, cả diễn đàn này em chỉ cần thêm cái tag #algorithm vào là được.

Em đã làm được khoảng bao nhiêu bài trên leetcode rồi? Anh nghĩ em làm được tầm 300 bài trên đấy là ngon lắm rồi :slight_smile:


(Lê Trần Đạt) #9

Cả hai. Nhưng để làm được cái đầu tiên cũng không dễ rồi.

Đủ, quá đủ. Nhưng mà cái câu nếu nắm được các thuật toán có sẵn hiện tại nói dễ, làm khó.


(Phạm Vinh) #10

Em hiểu rồi.
Cảm ơn anh đã giải thích cặn kẽ và những lời khuyên của anh.


(Hieu Nguyen Van) #11

Nhân tiện ở post này, em xin phép anh Đạt được chia sẻ hướng học CTDL & GT cho bạn nào quan tâm.

Cấu trúc dữ liệu

  • Beginner: Linked List, Stack, Queue, Binary Search Tree.

  • Intermediate: Heap, Priority Queue, Huffman Tree, Union Find, Tries, Hash Table, Tree Map.

  • Proficient: Segment Tree, Binary Indexed Tree, Suffix Array, Sparse Table, Lowest Common Ancestor, Range Tree.

  • Expert: Suffix Automaton, Suffix Tree, Heavy-Light Decomposition, Treap, Aho-Corasick, K-d tree, Link-Cut Tree, Splay Tree, Palindromic Tree, Rope, Dancing Links, Radix Tree, Dynamic Suffix Array.

Giải thuật/ thuật toán

  • Searching(Linear search, Binary search, Ternary search)
  • Sorting (Bubble sort, Insertion sort, Merge sort, Quick sort, Radix sort, …)
  • Các giải thuật tham lam
  • Giải thuật đồ thị(BFS, DFS, Luồng cực đại, Cây khung nhỏ nhất, Đường đi ngắn nhất,…)
  • Giải thuật string(KMP, Z, String search, …)
  • Quy hoạch động

Các bạn có thể tham khảo nguồn hướng dẫn + thực hành luôn ở đây
DS: https://www.hackerearth.com/practice/data-structures
Algo: https://www.hackerearth.com/practice/algorithms

DS & Algo: https://www.geeksforgeeks.org/

Lộ trình học CTDL & GT phục vụ ôn thi ACM/ICPC, nhưng ai cũng có thể follow: https://github.com/Hieunv1996/ACM-ICPC-Preparation

Nếu bạn muốn đọc tiếng Việt thì có thể tham khảo 2 series của mình, mình vẫn đang viết tiếp :smiley: :
DS: https://nguyenvanhieu.vn/cau-truc-du-lieu/
Algo: https://nguyenvanhieu.vn/thuat-toan/

Các tài liệu bổ sung:


(Hieu Nguyen Van) #12

Em cảm ơn anh ạ. Hóa ra LinkdIn hay ho vậy mà em chả bao giờ dùng


(Vu Van Chung) #13

Dạ, em mới làm được có hơn 30 bài thôi ạ!


(Lê Trần Đạt) #14

vậy thêm tầm 270 bài nữa là tuyệt vời!


(Xuân Tâm) #15

Đạt nói đúng rồi,
Cách đây hơn 2 tháng rất ngạc nhiên là mình được Recruiter của Google APAC ( Asian Pacific ) gọi mời phỏng vấn cũng thông qua Linkedin họ bảo tìm và thấy Skill là cái họ đang cần cho chi nhánh ở Đài Bắc.
Thú thật mình là người làm our source lâu nay nên về thuật toán hết sức mai một. Nên khi được mời phỏng vấn minh vui nhưng hết sức không tự tin mặc dù là người mê lập trình. Và cungx thực hành nhiều về thuật toán khi còn là sinh viên. Nhưng 5 6 năm rồi không có đụng tới.
Mình bỏ ra 2 tuần (có lẽ không đủ) để ôn lại và làm thêm về thuật toán cộng với Practice Interview trên https://www.pramp.com/#/
Mình failed ở vòng thứ 2 với 1 bài toán khá đơn giản về cây nhị phân nhưng cũng rất vui vì ít ra profile của mình cũng được họ chú ý tới bằng cách nào đấy.
Về thuật toán đặc biệt các bạn là học sinh giỏi Tin hoặc chuyên tin từ lớp 12 thì mình có lời khuyên là hãy tiếp tục duy trì và phát huy nó rèn luyện từng ngày đừng để mai một như mình.
Theo mình không phải ai cũng có tốt chất giỏi thuật toán… nên không phải cứ học là giỏi. Nhưng cần cù bù thông minh tuy không giỏi nhưng sẽ giúp bạn rất nhiều đặc biệt nếu bạn muốn xuất ngoại làm cho những công ty tốt.
Chúc các bạn thành công


(Pham Hoang) #16

Anh Đạt ôn và luyện Algorithm theo nguồn nào vậy anh? :smiley:


(Lê Trần Đạt) #17

Anh ôn cơ bản từ nhiều nguồn

  • Từ bạn bè
  • Từ document online

Nhưng chủ yếu nhất vẫn là Leetcode + một nhóm bạn cùng tiến :smiley:


(Văn Dương) #18

Thuật toán nó là phương pháp giải quyết vấn đề.
Không có thuật toán tốt thì:
Không giải quyết được vấn đề->không viết được chương trình.
Giải quyết được nhưng không tối ưu-> chương trình chạy chậm, viết mất nhiều code, tốn nhiều thời gian…


(sike) #19

my idol khi nào ra vlog về thuật toán anh ơi …:smiley:


(Quang.Andrei) #20

Để có thể học tốt thuật toán thì mình cần phải chuẩn bị những gì ạ? Muốn nắm vững thuật toán phải có kiến thức về Toán và Đại số tốt đúng không ạ? Em vẫn chưa được học môn này, mong các anh giải đáp ạ


83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?