Chia sẻ của một nhà phát triển front-end tại Hàn Quốc. (Xem github profile của tác giả)
Tại sao chúng ta lại học thuật toán? Để tích lũy kiến thức cơ bản? Hay để trở thành một nhà phát triển ưu tú hơn? Mặc dù không phải là những lý do hoàn toàn sai, nhưng tôi muốn thành thật một chút. Có lẽ đa số mọi người học thuật toán là để thông qua những vòng kiểm tra lập trình (coding test).
Ngày nay, ngoài quá trình tìm việc và chuyển việc, ngay cả trong những hoạt động ngoại khóa hay bootcamp, người ta cũng tổ chức những vòng kiểm tra lập trình để phân loại ứng viên. Hơn nữa, có nhiều nơi đưa ra các câu hỏi gần giống với nghiệp vụ thực tế thay vì các bài thi triển khai theo hình thức chấm điểm trực tuyến (Online Judge). Dù sao thì, nhiều doanh nghiệp ngày nay vẫn yêu cầu ứng viên vượt qua vòng kiểm tra lập trình thuật toán.
Khoảng 1 năm trước đây, khi chuẩn bị trở lại trường học, tôi đã bắt đầu học thuật toán. Mục đích của việc học hiển nhiên là để chuẩn bị cho bài kiểm tra lập trình. Vì là lần đầu tiên học thuật toán một cách chính thức nên tôi còn nhiều thiếu sót và cũng cảm thấy sợ hãi. Thật ra chính tôi cũng đã tự hỏi Liệu có thật sự cần học thuật toán không? nên tôi thậm chí đã hỏi cả những người xung quanh để xác nhận điều này.
“Việc học thuật toán cũng quan trọng với nhà phát triển front-end sao?”
Cảm giác bất an này sẽ càng lớn đối với những người đang chuẩn bị cho một công việc cụ thể nào đó, hoặc những nhà phát triển đang muốn chuyển hướng sự nghiệp của mình. Tôi cũng đã từng như vậy. Thật ra tôi cũng từng cảm thấy mơ hồ, Là nhà phát triển front-end thì trước tiên phải tạo ra một dịch vụ (service) tốt đã, thời gian nào mà học thuật toán? Thuật toán chẳng những không áp dụng được nhiều trong công việc thực tế mà còn không có gì thú vị. Tuy nhiên vì vòng kiểm tra lập trình nên không còn cách nào khác, tôi đành vừa khóc vừa học trong đau khổ.
Với tư cách là một người cũng từng có những trăn trở như vậy, trong bài viết này, tôi muốn chia sẻ một cách thành thật về tầm quan trọng của việc học thuật toán trên quan điểm của một nhà phát triển front-end. Hy vọng bài viết này sẽ trở nên hữu ích với những độc giả đang băn khoăn giữa việc học thuật toán và phát triển front-end.
- Thật ra tôi nghĩ rằng cho dù không biết thuật toán, bạn cũng sẽ không gặp rào cản lớn nào trong việc phát triển front-end. Tuy nhiên, thay vì đơn giản thực hiện những yêu cầu của phần mềm hay ứng dụng, để có thể suy nghĩ đến cả những vấn đề khác như hiệu suất, tính năng hay thời gian phát triển, bạn sẽ không thể không ứng dụng thuật toán và cấu trúc dữ liệu.
- Vậy nên bạn chỉ cần bắt đầu học thuật toán khi bản thân cảm thấy cần thiết. Hay nói cách khác, việc bắt đầu học thuật toán sau khi bạn đã quen với hệ sinh thái phát triển front-end ở một mức độ nào đó là vẫn chưa muộn.
- Mục đích của việc học thuật toán là chứng minh bản thân có được kiến thức căn bản về thuật toán và cấu trúc dữ liệu. Bạn không cần đào sâu quá mức một cách không cần thiết mà chỉ cần học đến một mức độ thích hợp.
- Theo kinh nghiệm của tôi, một người mới bắt đầu chỉ cần dành ra 1-2 tiếng mỗi ngày và kiên trì học trong vòng 6 tháng đã có thể đạt được thành quả có ý nghĩa rồi. Nếu bạn sắp có một kỳ thi hay một buổi phỏng vấn quan trọng, hãy ghi nhớ điều này và chuẩn bị trước.
- Đừng quá để ý đến chức danh Front-end Developer mà lơ là việc học khoa học máy tính (Computer Science), bắt đầu từ việc học thuật toán. Trước khi là Front-end Developer, chúng ta là Developer.
Trước khi bắt đầu bài viết này, tôi chợt nghĩ rằng không biết mình có đủ tư cách để đưa ra lời khuyên cho người khác hay không, vậy nên tôi xin phép chia sẻ điều này. Ngoài Baekjoon, tôi chưa sử dụng các nền tảng khác nên không biết ở nơi khác thế nào, nhưng ở Baekjoon tôi đã học được đến cấp độ Gold 1.

(Baekjoon là một trang web lập trình và thuật toán, người dùng có thể lựa chọn một trong số các đề bài trên trang web, giải quyết vấn đề bằng mã nguồn trên một ngôn ngữ lập trình nào đó, sau đó đăng tải và sẽ được trang web chấm điểm trực tuyến qua các testcase. Các đề bài trên Baekjoon được phân loại theo 6 cấp độ lớn: Bronze < Silver < Gold < Platinum < Diamond < Ruby, trong mỗi cấp lại có 5 cấp độ nhỏ: 5 < 4 < 3 < 2 < 1. Ở Việt Nam, nếu muốn học và thực hành thuật toán theo cách này, bạn có thể tham khảo trang web VNOI.)
Cấp độ Gold 1 là tiêu chuẩn một người mới bắt đầu có thể đạt được nếu kiên trì giải 1-2 đề bài mỗi ngày trong vòng 6 tháng. Nếu bạn có thể giải các đề bài ở cấp độ Golden 4, 5 trong khoảng 30 phút thì bạn hoàn toàn có thể dễ dàng vượt qua vòng kiểm tra lập trình thông thường ở các doanh nghiệp. Nhờ vậy mà năm ngoái tôi đã vượt qua vòng kiểm tra lập trình (lần 1) của Naver và Kakao.
Trong phần dưới đây, bằng hình thức tự vấn tự đáp, tôi sẽ tóm tắt quan điểm cá nhân dựa trên kinh nghiệm của mình, về lý do tại sao nhà phát triển front-end cần học thuật toán. Lưu ý rằng loại hình kiểm tra lập trình được nhắc đến dưới đây có hình thức và độ khó tương đương các đề thi truyền thống trong quá trình tuyển dụng nhà phát triển.
Thuật toán có quan trọng đối với nhà phát triển không?
“Có, đúng là như vậy.”
Trước tiên, ta hãy thử bỏ từ front-end ra và suy nghĩ. Thuật toán có ý nghĩa như thế nào với nhà phát triển? Hiển nhiên là mối quan hệ không thể tách rời được. Thuật toán chính là phương pháp giải quyết một vấn đề theo cách hiệu quả nhất trong giới hạn thời gian và không gian bộ nhớ.
Có thể có nhiều phương pháp để giải quyết một vấn đề, nhưng không phải tất cả mọi phương pháp đều hữu dụng. Một phương pháp cho dù có thể giải quyết vấn đề nhưng nếu quá trình thực hiện kéo dài thì ta cũng khó có thể áp dụng trong thực tế. Bởi vì thời gian, nguồn lực và cả… sự kiên nhẫn của ta là có hạn.
Vậy nên cho dù có gặp phải cùng một tình huống với những vấn đề như nhau, thì thuật toán vẫn hữu ích và hiệu quả hơn nhờ việc sử dụng thời gian và không gian tối thiểu. Thêm vào đó, thuật toán sẽ càng trở nên hiệu quả khi được kết hợp cùng cấu trúc dữ liệu phù hợp với mục đích. Nhờ đó, lý thuyết máy tính đã vượt khỏi Khoa học (Science) và đạt được cả giá trị Kỹ thuật (Engineering).
Nhà phát triển front-end có cần phải học thuật toán?
“Không phải lúc nào cũng vậy.”
Tuy nhiên việc gắn từ front-end vào có vẻ hơi mơ hồ. Phủ định của câu hỏi sẽ là Nếu không học thuật toán thì không thể trở thành nhà phát triển front-end sao? Câu trả lời của tôi dựa trên kinh nghiệm của bản thân là Không phải lúc nào cũng đúng. Bởi vì tôi đã chứng kiến rất nhiều ví dụ thực tế, bản thân tôi cũng đã từng là một trong những ví dụ ấy.
Có rất nhiều thứ cần nhớ khi làm việc với HTML và CSS, nhưng chúng ta chỉ cần biết cách sử dụng chúng mà không cần hiểu thuật toán bên trong. Ta có thể áp dụng thuật toán cho một vài logic trong JavaScript để tối ưu hóa, nhưng những thuật toán cơ bản như sắp xếp hay tìm kiếm đều đã có API sẵn. Nếu không có thì dùng thư viện hay framework là được. Hệ sinh thái Node.js đang làm việc rất tốt rồi. Có nghĩa là, thay vì nắm được bản chất của thuật toán, chúng ta chỉ cần hiểu tính năng của nó và áp dụng đúng lúc đúng chỗ là đã có thể giải quyết được đa số các vấn đề rồi.
Tôi cũng từng làm việc mà không hiểu rõ chút nào về những kiến thức thuật toán cơ bản trong 3 năm, và tôi thấy rằng gần như không có vấn đề nào phát sinh vì tôi không biết thuật toán cả. Trái lại tôi còn viết được nhiều dòng mã ưu tiên tính dễ đọc và rõ ràng, thay vì tính năng và hiệu suất. Đương nhiên cũng có trường hợp đạt được kết quả tốt khi tối ưu hóa ở cấp độ logic nghiệp vụ (business logic), chẳng hạn như sử dụng hàm đệ quy để thể hiện layout có cấu trúc cây hay áp dụng kỹ thuật memoization khi tính toán (memoization là kỹ thuật được sử dụng trong trường hợp cần tính toán lặp đi lặp lại, giảm thiểu việc lặp bằng cách ghi kết quả phép tính trước đó vào bộ nhớ để sử dụng lại).
Ý kiến của nhiều nhà phát triển xung quanh tôi cũng vậy. Đa số các nhà phát triển front-end đều cho rằng “Nếu biết thì tốt, nhưng so với những công việc khác thì thuật toán (đối với tôi) không phải là điều quan trọng lắm.” Nhiều người cũng chia sẻ, ban đầu họ nghĩ rằng sẽ không dùng được nhiều kiến thức thuật toán trong công việc thực tế nói chung, chưa bàn đến chức danh công việc.
Tại sao thuật toán thường bị xem là không quan trọng trong việc phát triển front-end?
“Có lẽ có bốn lý do chính.”
- Gần như không có tình huống phát sinh vấn đề cần tối ưu hóa bằng thuật toán.
- Vì là cấu trúc server-client nên phần lớn logic phức tạp đều nằm ở server.
- Gần như không có trường hợp cần xử lý lượng dữ liệu cực lớn ở trình duyệt.
- Việc sử dụng API trừu tượng hóa thuật toán là rất hiệu quả.
Vậy thì tại sao người ta thường cho rằng thuật toán không quan trọng trong việc phát triển front-end? Tôi nghĩ là có bốn lý do chính.
Trước tiên, vì gần như không có tình huống phát sinh vấn đề cần tối ưu hóa bằng thuật toán. Việc xuất bản trang web (publishing) với HTML và CSS – hai thành phần đóng vai trò chủ chốt trên front-end, thể hiện UI tương tác với dữ liệu hay trao đổi HTTP với backend không đòi hỏi kiến thức và hiểu biết sâu sắc về thuật toán. Nói cách khác, nếu front-end không cần xử lý những logic cực kỳ phức tạp thì tình huống cần phải áp dụng thuật toán để tối ưu hóa vấn đề không thường xuyên xảy ra. Ngược lại, có nhiều trường hợp người ta từ bỏ tính tối ưu để ưu tiên tính dễ đọc và dễ tái sử dụng của mã nguồn nhằm phục vụ cho công việc bảo trì.
Cho dù có trường hợp cần xử lý logic phức tạp đi chăng nữa thì cấu trúc của web là server-client, do đó phần lớn logic nghiệp vụ phức tạp nằm ở phía server. Server (backend) được tối ưu hóa không chỉ để lưu trữ lượng dữ liệu lớn một cách an toàn và che giấu cách thức hoạt động bên trong mà còn để xử lý đồng thời nhiều yêu cầu khác nhau. Do đó client (trình duyệt) chỉ cần yêu cầu những tính năng cần thiết từ server và nhận kết quả server trả về.
Vì những lý do trên, không có nhiều trường hợp cần xử lý lượng dữ liệu lớn trên trình duyệt. Ngay từ đầu, trình duyệt cũng không phải thứ được tạo ra để xử lý lượng dữ liệu lớn. Vai trò của trình duyệt là điều khiển giao diện front-end thay mặt người dùng tương tác với backend. Hiệu quả của backend sẽ càng được phát huy khi quy mô dữ liệu càng lớn, còn tính năng của trình duyệt thì có giới hạn nên người ta không đặt nhiều kỳ vọng vào việc sử dụng thuật toán trên trình duyệt để tối ưu hóa.
Giả sử có trường hợp cần đến một phương pháp tiếp cận sử dụng thuật toán thì trình duyệt hay thư viện, framework đều đã có sẵn những API trừu tượng hóa thuật toán, và việc sử dụng những API này là vô cùng hiệu quả. Đã được trừu tượng hóa có nghĩa là chúng ta không cần biết cấu trúc bên trong vẫn có thể sử dụng được. Chẳng hạn như, ta không cần biết việc hàm getElementById
hoạt động bằng cách duyệt DFS trên cấu trúc cây DOM. Việc chỉ cần hiểu rằng đầu vào của API là thuộc tính ID
, đầu ra là DOM element
và sử dụng nó có tính kinh tế hơn nhiều.
Tóm lại, lý do chính là vì những công việc hằng ngày chúng ta cần giải quyết trên front-end đều có thể được giải quyết bằng sự kết hợp của các thuật toán đã được trừu tượng hóa, và điều này rất hiệu quả. Vậy nên ta chỉ cần biết đầu vào và đầu ra của các thuật toán đã được trừu tượng hóa là sẽ không gặp rào cản lớn nào trong công việc thực tế và có thể trở thành nhà phát triển front-end rồi.
Thuật toán không áp dụng được trong công việc thực tế thì có nhất thiết phải học?
“Phải học, để trở thành một nhà phát triển không chỉ đơn giản thực hiện những yêu cầu được giao mà còn để tâm đến cả tính năng và tính hiệu quả.”
Đây là câu hỏi đánh vào trọng tâm bài viết này. Cá nhân tôi nghĩ rằng mặc dù không cần biết thuật toán vẫn có thể trở thành nhà phát triển front-end, nhưng để trở thành một nhà phát triển có tầm nhìn rộng lớn hơn thì việc học thuật toán là cần thiết. Nếu bạn mở rộng quy mô suy nghĩ thêm một chút nữa, bạn sẽ thấy câu trả lời tại sao chúng ta phải học khoa học máy tính cũng tương tự như vậy.
Lý do đầu tiên khiến tôi suy nghĩ như vậy chính là, nếu hiểu được sự kết hợp thuật toán và cấu trúc dữ liệu thì khi gặp phải một vấn đề cần giải quyết trong thực tế, ta có thể dễ dàng nghĩ đến một cấu trúc tối ưu và thiết kế, cài đặt được nó. Đây chính là Computational Thinking (Tư duy tính toán) mà người ta hay nhắc đến.
- Khi cần tìm kiếm một phần tử đặc biệt trong một mảng vô cùng lớn, bạn có thể sử dụng hàm
Array.find()
, nhưng nếu mảng đã được sắp xếp thì việc áp dụng tìm kiếm nhị phân sẽ cho kết quả nhanh hơn nhiều. - Khi phát triển một ứng dụng web mạng xã hội, bạn có thể áp dụng lý thuyết đồ thị và các thuật toán tìm kiếm trên đồ thị để trừu tượng hóa mối quan hệ giữa các hồ sơ người dùng.
- Khi cần cấu trúc một giao diện có tính phân cấp như một hệ thống tìm kiếm tập tin, bạn có thể áp dụng cấu trúc dữ liệu cây và thuật toán chia để trị để thiết kế các thành phần.
- Bạn có thể áp dụng phương pháp quy hoạch động để xử lý memoization trên lượng dữ liệu server gửi về.
Nếu áp dụng thuật toán một cách hợp lý, bạn có thể tiết kiệm thời gian phát triển, đồng thời nâng cao tính năng và tính hiệu quả của sản phẩm. Tiêu chuẩn ngày càng nâng cao sẽ mang đến sự phát triển cho cả công việc kinh doanh của bạn.
Lý do thứ hai là bạn có thể trở thành nhà phát triển không bị ảnh hưởng bởi sự biến đổi của hoàn cảnh hay nền tảng. Chúng ta sử dụng rất nhiều API và các thư viện trừu tượng hóa thuật toán, tuy nhiên, liệu bạn có thể nói rằng Tôi đã hiểu về thuật toán chỉ với việc sử dụng được chúng hay không? Nói một cách chính xác thì chúng ta chỉ sử dụng những API hoạt động dựa trên nền tảng được các nhà phát triển khác tạo ra mà thôi.
Những nhà phát triển như vậy có thể rơi vào cảnh bị lệ thuộc chặt chẽ vào một hoàn cảnh cụ thể và một nền tảng cụ thể. Bởi vì họ không hiểu được nguyên lý mà chỉ sử dụng tính năng, do đó sẽ gặp khó khăn khi thích ứng với hoàn cảnh thay đổi hoặc một nền tảng chưa quen thuộc.
Hãy thử tưởng tượng nếu bạn phải tái hiện hàm getElementById
cơ bản được hỗ trợ sẵn với JavaScript Web API bằng Python thì sẽ thế nào? Hoặc nếu bạn phải tái hiện cấu trúc dữ liệu Heap (đống) hay Priority Queue (hàng đợi ưu tiên) được hỗ trợ sẵn trong Python bằng JavaScript? Hơn nữa, nếu hoàn cảnh không cho phép bạn sử dụng thư viện có tính năng cần thiết thì sẽ ra sao?
Bạn có thể sai ngữ pháp khi chưa quen thuộc với một ngôn ngữ, đó không phải là vấn đề lớn. Vì bạn chỉ cần học ngữ pháp là được. Do đó nếu bạn có kiến thức về thuật toán và cấu trúc dữ liệu, bạn hoàn toàn có thể tìm ra một phương pháp hiệu quả để giải quyết vấn đề mà không bị lệ thuộc vào hoàn cảnh hay nền tảng.
Lý do cuối cùng là tất cả những kỹ thuật ứng dụng đều được tạo ra từ nền tảng là các kỹ thuật căn bản. Rốt cuộc thì điều tôi muốn nói chính là, Hãy trung thành với nền tảng căn bản một ở một mức độ nào đó. Không chỉ dừng lại ở việc hiểu về kỹ thuật bản thân đang sử dụng, tất cả các nhà phát triển đều cần nỗ lực để hiểu được kỹ thuật đang hỗ trợ đằng sau đó. Phải như vậy thì bạn mới có thể sử dụng những kỹ thuật của mình một cách hiệu quả.
Logic nghiệp vụ được trừu tượng hóa bằng thuật toán và cấu trúc dữ liệu như thế nào, những dòng mã React và TypeScript bạn viết được biên dịch (compile) bằng JavaScript ra sao, JavaScript này hoạt động với HTML và CSS trên trình duyệt bằng cách nào, trình duyệt đó được hệ điều hành quản lý như thế nào, làm thế nào hệ điều hành thực hiện các kết nối mạng đa dạng với các host – đó cũng là những vấn đề bạn cần suy nghĩ.
Những quá trình này có vẻ như không cần thiết sao? Chúng ta không thể đạt được những kỹ thuật mình sử dụng một cách dễ dàng mà không tốn công sức gì. Ta không cần phải hiểu hết tất cả những kỹ thuật căn bản làm nền tảng, những hãy trở thành người nắm được những kiến thức tối thiểu.
Tại sao các doanh nghiệp lại tổ chức vòng kiểm tra lập trình?
“Vì trên lập trường của doanh nghiệp, đây là phương pháp tiết kiệm nhất để kiểm chứng kỹ năng cơ bản của một lượng lớn các ứng viên.”
Mặc dù ở trên tôi đã đưa ra ý kiến có vẻ lớn lao, nhưng thật ra khi suy nghĩ theo quan điểm của doanh nghiệp, tôi không cho rằng họ đưa ra các bài kiểm tra lập trình trên tinh thần đầy trách nhiệm(?) như thế. Lý do chỉ là, kiểm tra lập trình là phương pháp đánh giá ứng viên vô cùng tiết kiệm trên lập trường của doanh nghiệp.
Hiển nhiên việc kiểm tra kỹ năng lập trình bao gồm cả mục đích đánh giá kỹ năng cơ bản, nhưng khi đưa vòng kiểm tra lập trình vào quy trình tuyển dụng, doanh nghiệp có thể thu được điểm số khách quan về các ứng viên. Nhờ đó, họ có thể xếp hạng các ứng viên theo thứ tự và loại các ứng viên có năng lực kém ý nghĩa. Thêm nữa, việc đánh giá thường kết thúc nhanh chóng trong 1-2 tiếng đồng hồ, giúp doanh nghiệp tiết kiệm tài nguyên hơn so với phương thức đánh giá truyền thống cần đến sự tham gia của nhân viên kỳ cựu. Đặc biệt, công ty càng có quy mô lớn thì càng có nhiều ứng viên ứng tuyển và càng cần phải tuyển chọn kỹ lưỡng hơn, do đó việc cắt giảm dựa trên điểm số trước vòng phỏng vấn cũng nằm trong mục đích của vòng kiểm tra lập trình.
Đối với bài kiểm tra lập trình, tính đúng sai của câu trả lời sẽ được thể hiện rõ bởi việc mã nguồn có thông qua các bộ testcase hay không, và đây là phương thức kiểm tra đánh giá hiệu quả trong việc cụ thể hóa năng lực. Thực tế, trên lập trường của doanh nghiệp, họ không có nghĩa vụ phải quan tâm đến tất cả các ứng viên và đọc hết tất cả các mã nguồn được nộp về.
Mã nguồn thực tế và mã nguồn để giải quyết vấn đề thuật toán không khác nhau sao?
“Đúng vậy, vì trong đó có cả mục đích đánh giá phương pháp tiếp cận vấn đề.”
Bản thân mục đích của hai việc này là khác nhau. Mã nguồn dùng một lần, chỉ để tìm ra câu trả lời đúng và mã nguồn được viết khi cân nhắc đến cả quá trình bảo trì và việc tái sử dụng chắc chắn phải có sự khác biệt.
Có lẽ vì vậy nên gần đây cũng có nhiều doanh nghiệp chú trọng việc xem portfolio của ứng viên hơn bài kiểm tra lập trình. Tuy nhiên, cách thức triển khai quá trình tuyển dụng hoàn toàn là lựa chọn của doanh nghiệp nên ta không thể khẳng định đâu là đáp án chính xác. Ở Google hiện nay vẫn còn triển khai vòng kiểm tra lập trình. Về phía doanh nghiệp, kiểm tra lập trình thuật toán giúp họ không chỉ đánh giá được năng lực mà còn cả phương pháp tiếp cận vấn đề của ứng viên.
Cũng có nhiều trường hợp trong vòng phỏng vấn, doanh nghiệp sẽ đánh giá (review) mã nguồn ứng viên đã nộp. Thêm nữa, trong trường hợp kiểm tra khả năng lập trình một cách trực tiếp, người phỏng vấn có thể cố tình đưa ra một vấn đề có các yêu cầu mơ hồ. Ứng viên sẽ đặt các câu hỏi cho người phỏng vấn để làm rõ vấn đề, khi đó người phỏng vấn sẽ đánh giá được phương pháp tiếp cận vấn đề của ứng viên qua quá trình giao tiếp này.
Nên bắt đầu học thuật toán khi nào?
“Khi bản thân bạn cảm thấy cần thiết.”
Bạn có thể chuẩn bị trước cho những dự định học tập hay những hình thức tuyển dụng khác nhau giống như tôi, hoặc chỉ đơn giản là vì muốn bản thân trở thành một nhà phát triển ưu tú hơn. Bạn cũng có thể tranh thủ những khoảng thời gian rảnh rỗi ngắn ngủi trong ngày để học từng chút một.
Cá nhân tôi với xuất phát điểm hoàn toàn không biết gì, tôi nghĩ rằng chỉ cần dành ra 1-2 tiếng mỗi ngày và kiên trì trong khoảng 6 tháng là bạn sẽ hoàn toàn có khả năng vượt qua một bài kiểm tra lập trình. Nếu bạn có kỳ thi hay buổi phỏng vấn quan trọng, hãy ghi nhớ điều này và chuẩn bị từ trước.
Tôi cần phải học đến đâu?
“Tùy vào mục tiêu của bạn, nhưng nếu để ứng tuyển cho công việc thì chỉ cần nắm rõ kiến thức căn bản.”
Dưới đây là những chủ đề chính tôi đã học.
- Số học, Toán học tổ hợp, Hình học
- Brute-force, Greedy
- Chia để trị, Đệ quy
- Two Pointers
- Cấu trúc dữ liệu (stack, queue, priority queue, heap, hash, tree, Union-Find…)
- Tìm kiếm nhị phân
- Lập trình động
- Lý thuyết đồ thị, Tìm kiếm trên đồ thị (BFS, DFS, backtracking, Dijkstra, Floyd-Warshall…)
- BitMask
- Mô phỏng và thể hiện thuật toán bằng các ngôn ngữ lập trình
Cá nhân tôi nghĩ rằng thuật toán khiến cho việc thiết kế và cài đặt trở nên dễ dàng và hiệu quả hơn, là sức mạnh nền tảng của một nhà phát triển. Đương nhiên biết càng nhiều sẽ càng tốt, nhưng nếu bạn không tham dự kỳ thi Olympiad thì tôi nghĩ rằng việc chỉ chăm chăm vào thuật toán cũng không phải là ý hay. Tiêu chuẩn cho cái gọi là căn bản thường là mức độ mà doanh nghiệp yêu cầu qua vòng kiểm tra lập trình, còn sau đó thì tôi nghĩ rằng bạn nên tập trung tìm hiểu những vấn đề cần thiết cho chuyên môn công việc của mình hơn.
Vì vậy, nếu bạn muốn trở thành một nhà phát triển front-end nhưng còn thiếu kiến thức về front-end, tôi đề xuất bạn nên học về front-end trước, thay vì học thuật toán. Việc học song song thuật toán sau khi bạn đã quen thuộc với hệ sinh thái phát triển front-end ở một mức nào đó sẽ tốt hơn trong trường hợp này.
Kết
Thay vì nói một cách khô khan rằng Việc học thuật toán đương nhiên là quan trọng, tôi muốn chia sẻ quan điểm trên lập trường thực tế hơn và từ góc nhìn của một nhà phát triển front-end qua bài viết này. Trước khi kết thúc, tôi muốn nhấn mạnh một lần nữa, rằng: Đừng quá để ý đến chức danh Front-end Developer mà lơ là việc học khoa học máy tính, bắt đầu từ việc học thuật toán. Trước khi là Front-end Developer, chúng ta là Developer.
The original article: 프론트엔드 개발자에게도 알고리즘 공부가 중요할까?
The translated article above belongs to yozmIT (요즘IT) and Metacoders commits not to use this content for any commercial purpose.
1 thought on “Việc học thuật toán liệu có quan trọng đối với nhà phát triển front-end?”
Comments are closed.