REVIEW QUÁ TRÌNH ĐẠT ĐƯỢC CERTIFICATE CỦA KHÓA HỌC "JAVASCRIPT ALGORITHMS AND DATA STRUCTURES" TRÊN FREECODECAMP TRONG 5 NGÀY
TL;DR
Đây là khóa học JS miễn phí có chứng chỉ của freeCodeCamp.
Mình thấy khóa này có rất nhiều điểm hay, đặc biệt là rất phù hợp với những bạn mới học, hoặc những bạn chuẩn bị đi thực tập, apply vị trí Fresher Web. Nếu mà biết được từ thời sinh viên thì chắc chắn mình sẽ cày nó, chứ không bỏ cuộc giữa chừng như ngày xưa.
Mặc dù đã có kinh nghiệm code web nhưng mình vẫn lựa chọn làm hết hơn 1200 steps trong khóa này, chủ yếu là để xem nó có thực sự chán như một số bạn chia sẻ không, hay là có những điểm gì hữu ích. Qua đó giúp mình có thể đưa ra gợi ý dựa trên những trải nghiệm thực tế của bản thân, khi các bạn học sinh và sinh viên hỏi mình về những tài liệu học tập bổ ích, chứ không phải dựa trên quan điểm của một người khác mà mình chưa được kiểm chứng.
Bài review này hoàn toàn dựa trên trải nghiệm của cá nhân, nên chắc chắn sẽ không phù hợp với tất cả mọi người. Bạn có thể đọc thêm chia sẻ của những anh chị em khác trong nghề ở dưới phần comment (hi vọng là sẽ có ạ) để có thêm những góc nhìn mới, hoặc đơn giản là không đọc từ ai cả và tự mình trải nghiệm rồi rút ra kinh nghiệm cho chính mình.
Cảm ơn các bạn đã theo dõi!
Trong mấy ngày qua, mình thường đăng bài update tiến độ code các mini project trong khoá "JavaScript Algorithms and Data Structures" của freeCodeCamp.
Nếu bạn nào follow mình được một thời gian rồi thì chắc cũng biết là mình sinh năm 1996 và code web được 5 năm.
Thế nên có một số bạn thắc mắc "Ủa thế sao anh phải học mấy khoá HTML, CSS, JS này chi vậy?"
BÀI REVIEW NÀY CHÍNH LÀ CÂU TRẢ LỜI.
Mình mất công làm mấy khóa này là để viết bài review gửi tới những anh em mới chập chững đến với mảng Web, xem những khóa học miễn phí trên freeCodeCamp nó có đáng để anh em bỏ thời gian ra làm hay không.
Chứng chỉ này thực sự không có tác dụng gì với mình lắm ở thời điểm hiện tại, vì hầu hết kiến thức trong khóa này mình đều làm việc thường xuyên rồi (trừ một số project ngoại lệ về game trong đó).
Nhưng việc mình đã thực sự bắt tay vào làm hết hơn 2200 steps của 2 khoá học vừa qua, đã giúp mình có đủ thông tin để có thể viết 1 bài review chi tiết và sát sườn nhất cho những bạn sinh viên đang cân nhắc: có nên học các khóa học trên freeCodeCamp để chuẩn bị kiến thức đi thực tập, hoặc apply vào vị trí Fresher Web hay không.
Mình không muốn khi có bạn inbox hỏi rằng nên đọc, học tài liệu ở nguồn nào cho uy tín, lại chỉ đưa ra những câu trả lời kiểu "anh nghe nói là...", "anh thấy mọi người bảo là...", bla bla, trong khi bản thân chưa thực sự học qua tài liệu đó bao giờ, hoặc có chăng cũng chỉ là làm qua loa, được nửa chừng rồi bỏ ngang nhưng lại phán như đúng rồi.
Trong bài viết trước, mình đã review về quá trình đạt được chứng chỉ "Responsive Web Design" trên freeCodeCamp. Nghe thì nguy hiểm, những thực ra nó là khóa học HTML + CSS. Sau khi làm hết khóa đó và chia sẻ dự định làm tiếp khóa "JavaScript Algorithms and Data Structures", thì bên dưới phần comment có một số bạn khuyên mình không nên, các bạn chia sẻ rằng đã từng làm và thấy mấy khoá học của freeCodeCamp chán lắm, buồn ngủ lắm, v.v..
Mình nghĩ nó đúng, nhưng là đúng với các bạn ấy. Còn tính mình thì muốn phải thực sự tự làm hết xong mới biết đc mình có thấy chán như họ không, hay có chắt lọc được những gì hay ho trong những khoá học ấy không.
Cùng là 1 vấn đề, những mỗi người sẽ có cách tiếp cận khác nhau, mình nghĩ chuyện này cũng chẳng có ai đúng, ai sai cả. Quan trọng là sự phù hợp. Mỗi người sẽ phù hợp với 1 cách học khác nhau. Miễn sao là bản thân trở nên tiến bộ hơn và áp dụng hiệu quả những gì đã học vào thực tế là được.
Và nếu bạn nào đã đọc hết bài viết đó thì sẽ thấy: mình có đưa ra những ưu nhược điểm của khóa học trên freeCodeCamp, hướng tới các bạn sinh viên chuẩn bị đi thực tập, hoặc apply vị trí Fresher Web.
Trong đó mình cũng chỉ ra những điều cần chú ý để học một cách hiệu quả, có thể áp dụng những kiến thức đó khi làm side project, khi đi phỏng vấn.
Không có khóa học nào là thần thánh hết. Việc học xong rồi áp dụng vào thực tế như thế nào là ở sự lĩnh hội của mỗi người.
Dưới những bài viết như thế này sẽ có thể có rất nhiều comment của các anh chị em có kinh nghiệm trong ngành. Các bạn cũng có thể đọc tham khảo để thấy được nhiều góc nhìn hơn nhé.
Rồi bây giờ đi vào phần chính, review về khóa học "JavaScript Algorithms and Data Structures" của freeCodeCamp:
Khóa học này đếm sơ sơ có khoảng hơn 1200 steps, được chia thành 25 mini projects để các bạn luyện tập.
Ngoài những kiến thức cơ bản về JS mà hầu như khóa học nào cũng có, thì có một số thứ khá hay mà thường các bạn sinh viên thường lướt qua, không để ý đến, nhưng khi đi làm thực tế lại áp dụng rất nhiều, có thể kể đến như:
🔶 1. Naming convention:
-
Đặt tên biến, tên hàm dễ hiểu, mô tả đúng tác dụng của chúng, chứ không đặt tên vô nghĩa như a, b, m, n, ... để rồi vài tuần hoặc vài tháng sau, hoặc đồng đội của mình đọc vào chẳng hiểu ý nghĩa của nó là gì.
-
Quy tắc đặt tên camelCase: Đây là quy tắc đặt tên được sử dụng phổ biến nhất khi code JS ở các dự án (trừ một số trường hợp đặc biệt, ví dụ như tên class thì dùng PascalCase)
-
Các hàm trả về kiểu dữ liệu boolean hoặc tên biến có kiểu dữ liệu boolean thường sẽ được đặt tên bắt đầu bởi các chữ "is", "has", "can", kiểu Yes/No question.
🔶 2. Hard-coded là gì? Lý giải tại sao không nên hard-coded.
🔶 3. Khi nào dùng const
, khi nào dùng let
:
- Nếu bạn đã hiểu rõ về sự khác nhau giữa
const
vàlet
thì quá tốt rồi. Còn nếu chưa hiểu thì có một trick đó là auto sử dụngconst
. Đến khi có chỗ bạn code thay đổi giá trị của biến ấy, thì chương trình sẽ báo lỗi. Và khi ấy thì bạn sẽ biết: nếu thực sự muốn thay đổi giá trị của nó thì mình cần chuyểnconst
thànhlet
.
🔶 4. Toán tử ===
và ==
, !==
" và !=
":
-
Trong những điều kiện so sánh thông thường, bạn nên sử dụng toán tử "pằng pằng pằng" (
===
) để kiểm tra 2 giá trị có bằng nhau và có cùng kiểu dữ liệu hay không. Chỉ khi nào thấy kết quả không như mong muốn và cần phải chuyển qua "==
" mới đáp ứng được yêu cầu, thì lúc đó mới sử dụng "==
". -
Tương tự với "
!==
" và "!=
".
🔶 5. Xóa bỏ những biến được khai báo từ trước, nhưng giờ không còn sử dụng nữa.
-
Và cũng nhớ update comment khi hàm có thay đổi, hoặc xóa bỏ những đoạn code đã bị comment và không còn sử dụng nữa.
-
Cần lấy lại thì đã có Git lo cho rồi mà.
🔶 6. Thực hành kỹ năng debug và fix bug DO NGƯỜI KHÁC TẠO RA:
-
Có riêng 1 mini project giúp các bạn luyện tập kỹ năng debug và fix bug (Learn Basic Debugging by Building a Random Background Color Changer).
-
Thực ra mấy bug trong đó cũng dễ thôi. Nhưng qua đó các bạn cũng được tiếp cận với BUG MÀ NGƯỜI KHÁC TẠO RA 😅
-
Sau này đi làm thì "người khác" đó sẽ chính là đồng đội của bạn, hoặc một ông dev nào đó đã rời khỏi dự án 😌
🔶 7. Break 1 hàm lớn thành những hàm nhỏ, mỗi hàm phục vụ 1 mục đích cụ thể.
-
Nếu để ý các bạn sẽ thấy, xuyên suốt khóa học này, freeCodeCamp họ đều hướng dẫn các bạn code hoàn thiện dần dần từng hàm nhỏ trong một bài toán lớn, giúp cho việc đọc hiểu code của các hàm sẽ dễ hiểu hơn so với việc viết 1 hàm ôm đồm nhiều thứ xử lý dài hàng cả trăm dòng code.
-
Nếu các bạn chỉ code lèo lèo để mau chóng đạt được certificate, mà không nhận ra những điểm hay này thì thật lãng phí.
🔶 8. DRY - Don't Repeat Yourself:
- Tái sử dụng code, tránh việc duplicate code.
🔶 9. Xử lý input có type="number":
-
Cái này rất ít bạn fresher để ý, nghĩ đơn giản sử dụng input
type="number"
để cho người dùng nhập dữ liệu dạng số. -
Thế nhưng thực tế ngoài các số, thì người dùng cũng có thể nhập một số ký tự khác như '
.
', '+
', hay chữ 'e
'. -
Ví dụ '
1e9
' trong số học có nghĩa là10^9
, thế nhưng khi BA phân tích nghiệp vụ của ứng dụng tính lượng calories chẳng hạn, thì họ lại yêu cầu rằng: không được sử dụng định dạng số kiểu1e9
đó, và cũng không cho phép nhận số âm. Đó chính là một số case các bạn cần lưu ý để xử lý trong code JS. Nhưng nếu bạn là người mới, chưa được làm dự án thực tế có BA bao giờ, thì cũng nên cố gắng đặt mình vào vị trí của người dùng ứng dụng để suy nghĩ đến những case này nhé. Đây cũng là một trong số những điểm có thể giúp bạn đóng góp được nhiều giá trị cho các dự án thực tế mà bạn làm trong tương lai.
🔶 10. Xử lý sự kiện cho các phím tắt trên ứng dụng
-
Việc này giúp cho người dùng có thể thao tác nhanh chóng các chức năng chính mà không cần dùng đến chuột.
-
Các bạn sinh viên thường ít để ý đến việc này khi code ứng dụng. Nhưng thử nhớ lại khi các bạn sử dụng các bạn phổ biến, chắc hẳn các bạn cũng nhận ra mình thường xuyên sử dụng phím tắt để tăng tốc độ làm việc như thế nào đúng không?
🔶 11. Asynchronous:
-
Có 1 project khá hay trong khóa học này đó là "Learn Recursion by Building a Decimal to Binary Converter", khi nó sử dụng hàm
setTimeout()
để mô tả về asynchronous, từ đó xử lý animation minh họa cho luồng hoạt động của đệ quy. -
Việc lồng ghép các kiến thức với nhau, giải thích và hướng dẫn chi tiết trong 1 project của freeCodeCamp thực sự rất hợp lý và đúng chỗ, mình nghĩ đây chính là một trong những điểm mạnh của freeCodeCamp so vớin hững khóa học khác.
🔶 12. Project hướng dẫn sử dụng regex để lọc tin nhắn spam cơ bản
-
Regex không phải là thứ quá xa lạ đối với anh em.
-
Nhưng trong khóa học này có 1 project cá nhân mình thấy khá hay đó là "Learn Regular Expressions by Building a Spam Filter"
-
Trước giờ mình cũng tệ trong khoản viết regex, mình toàn kiếm regex valid email, phone number các thứ trên mấy trang như regex101, regexr, ... Sau khóa này thì cũng cải thiện được một chút, hi vọng sắp tới sẽ có nhiều cơ hội để ứng dụng vào dự án thực tế hơn.
🔶 13. Hiểu đúng về hàm sort() trong JS:
-
Các bạn khi được yêu cầu làm chức năng sắp xếp các số trong 1 mảng đều sẽ nghĩ đơn giản rằng dùng hàm
sort()
là xong. -
Thế nhưng, nếu bạn thử sort mảng
[1, 2, 10, 8, 4]
sẽ thấy kết quả hiển thị ra là[1, 10, 2, 4, 8]
, số10
không nằm ở vị trí mà chúng ta mong muốn. Lý do là vì hàmsort()
mặc định trong JS sẽ convert các phần tử trong mảng thành string, sau đó sort chúng theo thứ tự alphabet. -
Trong khóa học này cũng có bài hướng dẫn các bạn sử dụng callback function để xử lý vấn đề đó.
-
Ngoài ra, hàm
sort()
sẽ làm thay đổi trực tiếp tới thứ tự các phần trong array gốc (mutate). Để tránh việc này, các bạn có thể sử dụng hàmslice()
(không truyền tham số gì cả) trước khi gọi hàmsort()
. -
Ví dụ:
array.slice().sort()
. Vì hàmslice()
không truyền tham số sẽ tạo ra 1 shallow copy của array.
🔶 14. Xử lý undefined
và NaN
:
-
Trong rất nhiều project của khóa học này, freeCodeCamp có chỉ ra cho các bạn thấy những trường hợp có thể dẫn đến giá trị của một biến bị
undefined
hoặcNaN
. -
Nếu chúng ta không lường trước được những trường hợp như vậy, ví dụ khi làm đến project "Learn Basic OOP by Building a Shopping Cart", bạn sẽ gặp trường hợp: ban đầu có 1 object rỗng tên là
totalCountPerProduct
, sau đó chạy 1 vòng lặpthis.items.forEach((dessert) => { totalCountPerProduct[dessert.id] = totalCountPerProduct[dessert.id] + 1; })
. -
Nếu bạn hiểu về trường hợp mình đang nói, thì bạn sẽ thấy phép tính
totalCountPerProduct[dessert.id] + 1
sẽ cho ra kết quảNaN
. VìtotalCountPerProduct = {}
nêntotalCountPerProduct[dessert.id] = undefined
. Suy ra,totalCountPerProduct[dessert.id] + 1 = undefined + 1 = NaN
. -
Để xử lý trường hợp này thì rất đơn giản thôi. Bạn chỉ cần xử dụng toán tử
||
,totalCountPerProduct[dessert.id] = (totalCountPerProduct[dessert.id] || 0) + 1;
, tức là nếutotalCountPerProduct[dessert.id]
là falsy thì ta sẽ lấy giá trị0 + 1 = 1
. -
Nhớ nha! Bug này mình thấy những bạn intern, fresher và kể cả junior rất hay mắc phải. Thậm chí là anh em dev có kinh nghiệm đôi khi cũng để xót 1 vài lần ấy chứ.
🔶 15. Render nhiều phần tử lên UI trong một lúc:
-
Trong project "Learn Fetch and Promises by Building an fCC Authors Page", có một trường hợp khá phổ biến mà mình cũng thấy nhiều bạn fresher gặp phải, đó là khi gọi API GET một danh sách gồm 28 authors, nếu bạn render tất cả số authors đó lên các card ở trên UI, thì có thể dẫn đến việc hiển thị được hết các card diễn ra khá chậm (poor performance).
-
Thay vào đó, bạn có thể xử lý chỉ render 8 authors trong một lần, sau đó bổ sung thêm 1 button "Load More Authors".
-
Hoặc bạn cũng có thể xử lý lazy loading theo sự kiện scroll của người dùng.
-
Ngoài ra bạn cũng nhớ kiểm tra trường hợp nếu
arr.length <= endingIndex
thì ẩn nút "Load More" đi, hoặc hiển thị là "No more data to load" để người dùng biết là đã load hết dữ liệu rồi nhé.
🔶 16. Handling exceptions:
-
Cái này thì gần như 100% các bạn fresher mình từng phỏng vấn đều trả lời rằng sử dụng try catch, nếu có exception xảy ra thì log lỗi đó vào console.
-
Nhưng mà các bạn ơi, đó mới chỉ là bước giúp cho anh em Dev chúng ta có thể bật console lên và check xem lỗi đó là gì. Thế nhưng còn người dùng của chúng ta thì sao ạ?
-
Ví dụ khi gọi API load danh sách user để render lên table trên UI. Nếu gặp exception mà bạn chỉ log lỗi thôi, không hiển thị thông báo gì lên giao diện cả, thì đồng nghĩa với việc table đó trên UI sẽ trắng tinh khôi, và user cũng không hiểu mô tê gì hết.
-
Vậy nên hãy lưu ý chỗ này nhé. Trong rất nhiều trường hợp, ở trong khối lệnh catch, ngoài việc log lỗi ra thì chúng ta phải xử lý để hiển thị thông báo lỗi lên cho người dùng biết (có trường hợp nào mà chỉ cần log lỗi chứ không cần hiển thị thông báo không nhỉ? mình chưa nhớ ra case nào được. anh em nào đọc bài này mà nghĩ ra ví dụ thì comment góp ý giúp mình nhé).
-
Cơ mà cũng đừng lười đến mức hiển thị nguyên cái exception catch được lên màn hình cho người dùng xem nhé 🙄 Người dùng chứ đâu phải là Dev, họ đọc exception cũng đâu hiểu ý nghĩa của nó là gì (không tính mấy ông user biết code nhé 😌)
-
Hãy custom lại đoạn text để thông báo cho phù hợp. Trong các dự án thường thì BA sẽ là người mô tả những đoạn text đó là gì. Nếu BA lỡ có quên thì cũng đừng giận họ. Bạn phát hiện ra chỗ nào cần text thông báo khi có lỗi, thì chỉ cần hỏi BA xem nên viết nội dung thông báo như thế nào là phù hợp thôi. Nhẹ nhàng tình cảm chứ việc chi mà phải cáu gắt với nhau đúng không nào? 🌷
🔶 17. Chú ý đến một số UX nhỏ nhưng có võ, phổ biến khi làm phần mềm.
-
Ví dụ như nếu trong form người dùng đã nhập dữ liệu vào một số ô input rồi, thì khi có sự kiện đóng form xảy ra, sẽ hiển thị thông báo để người dùng confirm xem có chắc chắn muốn thoát khỏi form hiện tại không, hay chỉ là bị nhấn nhầm.
-
Còn trường hợp người dùng chưa nhập gì vào form cả, thì khi thoát khỏi form sẽ không cần confirm gì hết.
-
Khi làm đến chỗ này mình mới thấy phía freeCodeCamp họ làm khóa học cho người mới như này là rất kỹ lưỡng và hữu ích. Rất nhiều bạn fresher khi mới join vào công ty mình hoàn toàn không để ý đến những việc này.
-
Sau này làm dự án thực tế, có thể bạn sẽ được BA hoặc Designer mô tả rõ ràng. Nhưng khi còn là fresher thì chưa chắc công ty đã cung cấp cho bạn những yêu cầu kỹ lưỡng như vậy ở các project demo.
-
Từ khi đi làm, mình cũng dần có thói quen chú ý đến những luồng thao tác trên các ứng dụng phổ biến, nhiều khi sẽ phát hiện ra những UX mà hầu như ứng dụng nào cũng có, mà nếu không làm lập trình viên thì có lẽ mình sẽ không quan tâm đến.
-
Vậy nên, nếu học khóa freeCodeCamp này mà bạn chỉ chăm chăm vào code theo hướng dẫn sao cho hoàn thành thật nhanh, mà không nhìn thấy những điều hữu ích này, thì khả năng các bạn cảm thấy chán và buồn ngủ cũng là điều dễ hiểu.
Trên đây là những điểm mình thấy hữu ích nhất trong khóa học này, đặc biệt là dành cho những bạn mới học, hoặc những bạn chuẩn bị đi thực tập, apply vị trí Fresher Web. Nếu mà biết được từ thời sinh viên thì chắc chắn mình sẽ cày nó, chứ không bỏ cuộc giữa chừng như ngày xưa.
Đặc điểm của các bài tập trên freeCodeCamp là chúng được break thành nhiều bước nhỏ. Vậy nên đừng cầm đèn chạy trước ô tô, mà hãy đọc kỹ xem đề bài yêu cầu việc gì để thực hiện cho đúng và đủ, submit phát ăn ngay để tiết kiệm thời gian nhé anh em. Ví dụ có step chỉ yêu cầu xóa 1 dòng code đi mà thôi.
Nghe thì đơn giản như vậy, nhưng đây là một lỗi mình thấy rất phổ biến ở các bạn fresher trong những ngày đầu mới đến công ty. Vì quen với việc tự do sáng tạo thời sinh viên rồi, nên nhiều khi có những UI mà designer đã vẽ ra và mô tả chi tiết, thế nhưng các bạn cảm thấy khó không làm được, mà cũng ngại hỏi các anh (hoặc là sợ làm phiền các anh, hoặc là sợ bị cách anh đánh giá là mình gà 🐔).
Vậy là nhiều bạn lựa chọn cách tệ nhất, đó là: TỰ THAY ĐỔI UI THEO Ý MUỐN CỦA MÌNH.
Nếu ông Dev Lead hoặc ông Advisor nào mà sát sao, review code của anh em hàng ngày thì sẽ nhanh chóng phát hiện và có góp ý phù hợp cho anh em.
Nhưng ngược lại, sau này anh em cũng có thể rơi vào team mà ông Dev Lead không quan tâm nhiều đến các thành viên trong team cũng như chất lượng của dự án (không hiểu bằng cách nào ông này lại lên làm Dev Lead được 🙈), đến gần lúc bàn giao tính năng mới tới review, thì tá hỏa phát hiện ra là code của fresher không follow theo UI đã được thiết kế ban đầu.
Kết quả của việc này thì có nhiều kiểu lắm: có người thì sẽ tìm cách khắc phục và cùng nhau rút kinh nghiệm, có người thì cứ chí chóe đổ lỗi cho nhau, ... muôn hình vạn trạng.
Vậy nên, để tránh đưa bản thân và đồng đội vào những tình huống như vậy, các bạn hãy nhớ "LUÔN ĐỌC KỸ YÊU CẦU ĐƯA RA". Nếu thấy điểm nào không phù hợp thì có thể trao đổi và góp ý với các thành viên trong team để xem có thể thay đổi được không, chứ không nên tự ý sửa theo ý mình như khi làm project cá nhân. Vì chức năng mà các bạn đang làm, nó còn liên quan đến rất nhiều bộ phận khác như Designer, BA, Tester, ... nữa.
Tôn trọng công việc của người khác, người khác cũng sẽ tôn trọng và sẵn sàng giúp đỡ bạn tiến bộ.
Một số nhược điểm của khóa học này theo ý kiến cá nhân của mình:
❌ 1. Lúc đầu nhìn danh sách tên các project cần phải làm trong khóa này thì mình thấy freeCodeCamp đặt tên câu khóa học hơi câu view, khi nhắc đến "Data structures" và "Algorithms" - Cấu trúc dữ liệu & Giải thuật. Thế nhưng khi làm hết các project thì mới thấy đúng là trong các project có các hướng dẫn và giải thích về những kiến thức đó nha. Đương nhiên nó sẽ không nhiều như môn CTDL> mà chúng ta thường học trên trường. Nhưng cách lồng ghép chúng vào trong các project của freeCodeCamp lại rất phù hợp và dễ hiểu cho những bạn mới học. Ví dụ như:
-
Để lưu tất cả thông tin về một đội bóng, bao gồm: Tên, Môn thể thao, tên HLV trưởng, số trận dẫn dắt, thông tin chi tiết về từng cầu thủ trong đội, ... thì cần tạo ra đối tượng với cấu trúc như thế nào.
-
Callstack có ý nghĩa gì, hoạt động như thế nào. Đây là một trong những ứng dụng thực tế của stack mà khi đi làm chúng ta sẽ thường xuyên gặp phải, thế nhưng khi mình phỏng vấn Fresher thì có khá ít anh em sinh viên biết đến.
-
Áp dụng đệ quy để làm mini project "Learn Recursion by Building a Decimal to Binary Converter"
-
Build 1 project riêng để thực hành 1 số thuật toán sắp xếp cơ bản như bubble sort, selection sort, and insertion sort (Learn Basic Algorithmic Thinking by Building a Number Sorter)
❌ 2. Chỉ phù hợp với những bạn mới học hoặc chưa vững kiến thức cơ bản về JS. Tuy nhiên thực ra nếu để ý thì cũng có khá nhiều thứ hữu ích như mình liệt kê ở phía trên. Nếu các bạn thấy bản thân lần đầu tiên biết đến những kiến thức đó, thì cũng có thể thử sức với khóa học này.
❌ 3. Có nhiều chỗ bị chia thành step nhỏ quá, không cần thiết. Ví dụ như có 3 dòng document.getElementById() để get được 3 phần tử trên trang thì nó chia làm 3 steps. Thà là gom chung thành 1 step đi có phải nhanh hơn không. Nhưng phải mãi đến mấy project cuối họ mới làm việc này @@
❌ 4. BUG BUG BUG: Cái gì khiến ta khó chịu thì phải nhắc 3 lần 😡 Trong khóa học này có 3 steps bị lỗi trong project "Learn Fetch and Promises by Building an fCC Authors Page", đó là Step 18, Step 19 và Step 26. Bug là điều khó tránh khỏi khi làm ứng dụng. Nhưng vấn đề ở đây là trên forum của freeCodeCamp đã có nhiều người report bug này từ tháng 5 rồi, nhưng đến bây giờ là tháng 7 mà anh em Dev của freeCodeCamp vẫn chưa sửa 🫠 Vậy cách xử lý tạm thời là gì để pass được các step này? Mình đọc các comment trên forum thì có người bảo là họ dùng trình duyệt khác thì submit ok (nhưng không nói rõ là dùng trình duyệt nào 😀 Thề). Thế là mình thử dùng Safari. Ơ được nha!!! Vấn đề code tương thích với các trình duyệt khác nhau đúng là vấn đề muôn thuở đối với anh em Dev dù là tây hay ta mà 😮💨 Trước đây mình từng làm dự án liên quan đến gửi email marketing. Mình và anh em trong team cũng lên bờ xuống ruộng vì người nhận mail sử dụng rất nhiều loại ứng dụng quản lý email khác nhau. Từ các loại trình duyệt, đến app Gmail trên điện thoại, rồi app Mozilla Thunderbird, Outlook mobile, Outlook Destop, hầm bà lằng các thứ. Mỗi ứng dụng lại có những hạn chế về các thuộc tính CSS khác nhau được sử dụng. Ối dồi ôi luôn. Đến giờ nghĩ lại vẫn còn cay 🥲
Ấy thế nhưng mọi chuyện vẫn chưa dừng lại ở đó. Chuyển sang Safari chỉ có Step 18 và Step 26 là pass thôi. Step 19 vẫn lỗi 🤬 Không submit được step này đời không nể. Thế là mình thử tiếp với Microsoft Edge, vẫn không được. Rồi Cốc Cốc cũng không được luôn. Oải quãi chưởng 😣 Sau đó mình có đọc hết các post report về step này trên forum, thì có 1 comment chỉ ra là thử thêm bớt dòng trắng, khoảng trắng xung quanh html tag mà step đó yêu cầu xem sao. Và n lần chửi thề, thì mình đã thành công. Rất chi là khó chịu. Vì những step khác dù có thừa những dòng trắng ở trên hay dưới thì cũng không vấn đề gì cả. Chỉ riêng step này bị lỗi như thế. Vậy nên các bạn nào định làm các project trong khóa học này thì nhớ case này nha!
Có thể thấy thực ra khóa học này không khó, vì họ gợi ý cho các bạn đến tận răng những bước cần làm rồi. Nên việc vượt qua hàng nghìn step mà freeCodeCamp đặt ra hay đạt được chứng chỉ này cũng không có gì là cao siêu cả.
Đó cũng không phải là mục tiêu mà mình đặt ra khi làm khóa này và viết review gửi tới các bạn.
Theo mình, điều quan trọng là khi mình đã bỏ thời gian ra để học (dù là bằng bất cứ phương pháp nào, không chỉ riêng học cái chứng chỉ này) thì điều mà mình chắt lọc được để áp dụng vào thường xuyên cho công việc thực tế là gì.
Học ít mà rút ra nhiều điều bổ ích thì quá tuyệt vời. Nhưng học nhiều mà rút ra được 1 số ít những điều bổ ích thì cũng không phải là tệ. Bản thân cảm thấy phù hợp là được.
Sợ nhất là kinh qua hàng chục tutorial, nhưng không đọng lại được thứ gì, chỉ biết làm theo những gì người ta hướng dẫn như một cái máy, chuyển qua tutorial khác tương tự như vậy, hay bảo tự làm 1 chức năng nhỏ áp dụng những gì đã học, hay xa hơn là join vào dự án thực tế, tự nhiên thấy mình như một trang giấy trắng, không biết phải bắt đầu như thế nào dù đã bỏ ra rất nhiều thời gian để "học".
Phewwww! Cũng khá dài rồi nhỉ? Mình xin tạm thời dừng bút ở đây, không biết sau có nhớ ra thêm điều gì không nhưng hiện tại là vậy đã. Hi vọng những review trên của mình sẽ hữu ích với các bạn. Hẹn gặp lại 👋
LỜI NHẮN
Follow mình trên Facebook "CLB Lập trình - THPT Ngọc Tảo" hoặc kênh Youtube "Tờ Mờ Sáng học Lập trình" để cùng nhau học tập, chia sẻ những kiến thức công nghệ và lập trình hoàn toàn miễn phí nhé!
Facebook CLB Lập trình - THPT Ngọc Tảo: https://www.facebook.com/clb.it.ngoctao/
Youtube Tờ Mờ Sáng học Lập trình: https://www.youtube.com/@tmsangdev
Hẹn gặp lại 👋
All rights reserved