Home Blog Page 37

Lại bàn về cách commit code trong dự án

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Hàng ngày chúng ta thường xuyên phải code và fix bug liên tục cùng với những thành viên khác trong team. Bỗng một ngày đẹp trời tester hô lên cái lỗi mà bạn đã sửa từ mấy tuần trước bỗng dưng quay trở lại. Bạn liền lên tiếng phân bua rõ ràng đã sửa rồi và phải chứng minh cho tester thấy. Bạn mở lịch sử commit lên và bùm… commit, fix bug, fix some bug… là những thứ đập vào mắt bạn. Không ai khác đó là chính là những message mà bạn commit!

Rồi giờ thì làm sao để tìm lại commit đó? Bạn tự dằn vặt tại sao lúc đó mình không commit rõ ràng hơn. Không sao cả, ai cũng có lúc mắc sai lầm và sai lầm là để sửa chữa nhưng quan trọng hơn là bạn phải nhận ra là bạn đã sai đã rồi để mình bày cách cho!

Hãy commit rõ ràng

Đúng thế trước tiên là hãy cố gắng đặt ra được những message thật rõ ràng và mang tính hành động hướng đến đối tượng.

Ví dụ:

  • Sửa lỗi lấy danh sách tỉnh/thành bị thiếu tên
  • Thêm tính năng cập nhật tỉnh/thành
  • Thêm mục Tài liệu tham khảo vào README.MD

Mình đang lấy ví dụ là Tiếng Việt, tùy vào từng quy tắc dự án của bạn có thể commit bằng Tiếng Anh nhưng cơ bản nội dung vẫn theo tinh thần như trên.

  Hãy commit code có tâm như Senior Developer

  Tôi vừa lỡ commit sai, làm sao để sửa lại ngay lập tức?

Hãy thêm prefix vào trước message

Đây là cách mà nhiều Dev đã và đang áp dụng trong nhiều dự án trên “mạng xã hội” Github. Dựa vào prefix để phân loại các loại commit thường thấy của bạn trong dự án, từ đó dễ dàng phân biệt và tìm kiếm hơn.

Chung quy là sẽ có một số prefix mà các Dev sẽ tự quy ước, nhưng không nhất thiết phải làm theo.

Một số hay dùng như:

  • feat: thêm một tính năng
  • fix: sửa một lỗi
  • refactor: tối ưu một tính năng nào đó đã có từ trước
  • style: những sửa đổi không làm thay đổi ý nghĩa của mã trước đó. Thường liên quan đến định dạng mã như thiếu dấu chấm phẩy (;), xóa khoảng trắng (space)…

Còn nhiều những prefix khác nữa, bạn có thể tham khảo ở bài viết này How to Write Better Git Commit Messages – A Step-By-Step Guide.

Ví dụ:

  • fix: Sửa lỗi lấy danh sách tỉnh/thành bị thiếu tên
  • feat: Thêm tính năng cập nhật tỉnh/thành
  • docs: Thêm mục Tài liệu tham khảo vào README.MD

Xem thêm Việc làm Developer hấp dẫn trên TopDev

Cố gắng tách biệt ý nghĩa của các commit

Mình biết có nhiều bạn (kể cả mình) sẽ hay gặp trường hợp trong khi đang thêm tính năng hay sửa một lỗi này bỗng nhiên phát hiện ra một lỗi khác và tiện tay sửa luôn. Rồi đến lúc commit thì chỉ viết message chung chung là “sửa một số lỗi”. Điều này rất là tiện tuy nhiên lại gây khó khăn trong truy vết, thế nên hãy cố gắng sửa chúng một cách lần lượt. Đừng sợ tốn commit mà hãy commit thật rõ ràng.

Hãy áp dụng Git Flow

Git flow là thuật ngữ để chỉ “quy ước” làm việc của team trong dự án. Ví dụ dự án phải có 3 nhánh là master để lưu lại code mới nhất, nhánh release để xác định tính năng sẵn sàng cho production và nhánh develop để phát triển tính năng cho release.

Ngoài ra Git Flow cũng quy định luồng phân chia và hợp nhất nhánh trong khi đang phát triển tính năng. Có một Git Flow rất nổi tiếng đó là Tóm tắt Git-Flow, các Dev có thể tham khảo.

Cuối cùng, hãy dùng tools có giao diện để quản lý.

Nếu bạn đã quen với giao diện dòng lệnh thì không sao nhưng với mình có nhiều lúc phải dùng những tools để quản lý Git. Mình thấy nó khá là tiện và cũng dễ dàng theo dõi Flow của dự án luôn.

Bây giờ hầu hết các trình viết code đều tích hợp hoặc có plugin giúp cho việc quản lý git bằng giao diện dễ dàng và tiện dụng, các Dev có thể tìm hiểu thêm tuỳ theo công cụ mà mình đang sử dụng.

Tóm lại là

Những chia sẻ bên trên của mình đều xuất phát từ kinh nghiệm trong công việc, việc áp dụng nó trong dự án của các Dev phải tuỳ thuộc vào Team Work và Flow của dự án. Nếu các Dev thấy chưa hợp lý hoặc có còn cách nào hay hơn thì hãy để lại bình luận cho mình và mọi người biết nhé!

Bài viết gốc được đăng tải tại 2coffee.dev

Có thể bạn quan tâm:

Ngành trí tuệ nhân tạo từ A – Z: Tiềm năng và cơ hội nghề nghiệp

Hiện nay, trí tuệ nhân tạo (AI) được xem là một trong những công nghệ quan trọng hàng đầu không chỉ ở Việt Nam mà trên toàn thế giới. Sự đầu tư vào trí tuệ nhân tạo của các doanh nghiệp, tập đoàn lớn đã cho thấy tiềm năng phát triển của lĩnh vực này trong tương lai. Cùng TopDev khám phá lĩnh vực trí tuệ nhân tạo tạo Việt Nam và những cơ hội thách thức khi theo đuổi ngành này bạn nhé!

Ngành trí tuệ nhân tạo (AI) là gì?

Trí tuệ nhân tạo (Artificial Intelligence – AI) là lĩnh vực trong khoa học máy tính nhằm tạo ra các hệ thống và chương trình máy tính có khả năng tự học, tự hiểu, và tự đưa ra quyết định dựa trên dữ liệu. Mục đích của AI là tạo ra các hệ thống thông minh giúp cho con người giải quyết các vấn đề phức tạp trong nhiều lĩnh vực, từ y tế, giao thông, kinh tế, giáo dục đến công nghiệp, nông nghiệp và quân sự.

Ngành trí tuệ nhân tạo là gì?

Ngành trí tuệ nhân tạo (AI) hiện đang được ứng dụng rất nhiều trong cuộc sống hằng ngày, trong nhiều lĩnh vực. Một số ứng dụng nổi bật có thể kể đến như:

  • Trợ lý ảo: Các trợ lý ảo như Amazon Alexa, Google Assistant, Siri,… đều được xây dựng dựa trên AI. Những trợ lý ảo này sẽ giúp nâng cao trải nghiệm cho người dùng, giải quyết các vấn đề của người dùng tốt hơn.
  • Digital Marketing: Công nghệ AI giúp việc thu thập dữ liệu và đưa ra các quyết định dựa trên dữ liệu hiệu quả và chính xác hơn.
  • Tài chính: AI có thể được sử dụng để dự đoán xu hướng thị trường tài chính, tối ưu hóa các quy trình giao dịch và giảm thiểu rủi ro.
  • Y tế: AI có thể giúp trong việc chẩn đoán bệnh và thiết kế kế hoạch điều trị. Hệ thống AI có thể phân tích dữ liệu y tế để dự đoán nguy cơ mắc bệnh và tối ưu hóa chẩn đoán và điều trị.
  • Giao thông: AI có thể được sử dụng để giảm thiểu tai nạn giao thông bằng cách dự đoán nguy cơ tai nạn và đưa ra cảnh báo kịp thời cho người lái xe.

Những ứng dụng này chỉ là một phần nhỏ trong những ứng dụng của AI. Có rất nhiều lĩnh vực khác mà AI có thể được sử dụng để giải quyết các vấn đề phức tạp trong cuộc sống hàng ngày của con người.

Tham khảo việc làm trí tuệ nhân tạo hấp dẫn trên TopDev!

Tiềm năng và cơ hội việc làm ngành trí tuệ nhân tạo ở Việt Nam

Theo Forber.com (ngày 22.02.2023), chỉ số sẵn sàng cho trí tuệ nhân tạo của Việt Nam đã đạt mức 51,82/100, tăng 14 bậc so với năm ngoái và vượt qua mức trung bình toàn cầu là 47,72. Điều này cho thấy dấu hiệu tích cực về khả năng tiếp cận trí tuệ nhân tạo ở Việt Nam, đồng thời cũng là thách thức khi nguồn nhân lực AI vẫn còn thiếu rất nhiều.

Các công ty hàng đầu trên thế giới như Google, Facebook. Amazon,… đang đầu tư rất nhiều kinh phí để phát triển hệ thống trí tuệ nhân tạo. Các startup AI cũng tăng theo cấp số nhân. Tại Việt Nam, việc đầu tư vào AI đang tăng lên, với sự xuất hiện của các công ty và tổ chức nghiên cứu như FPT AI, VinAI Research, Viettel AI và Vingroup AI Institute. Các doanh nghiệp khác cũng đang tìm kiếm nhân lực có kỹ năng AI để cải thiện hiệu quả kinh doanh của mình.

Với sự phát triển của AI, các cơ hội việc làm trong ngành này sẽ tiếp tục tăng lên trong tương lai, đặc biệt là trong các lĩnh vực như y tế, tài chính, sản xuất và bán lẻ. Đây là cơ hội tuyệt vời để bạn gia nhập vào.

  Hiểu sâu về trí tuệ nhân tạo & Machine Learning tại Apple

Ngành trí tuệ nhân tạo học những gì?

Hiện nay, ngành Trí tuệ nhân tạo tập trung chủ yếu vào hai chuyên ngành Machine learning và Deep learning. Tuy nhiên, để tiếp cận và bắt đầu học hai chuyên ngành này, người học cần phải có nền tảng về Khoa học máy tính, bao gồm kiến thức về Toán, ngôn ngữ lập trình, quản trị hệ cơ sở dữ liệu, lập trình và phát triển phần mềm, thuật toán,…

Machine learning và Deep learning

Sau khi nắm vững cơ bản, người học có thể theo đuổi các kiến thức chuyên sâu về xử lý ngôn ngữ tự nhiên, xử lý dữ liệu hình ảnh/dữ liệu giọng nói, tạo lập phần mềm hệ thống, và nhiều môn học khác như Robot học, Mạng thần kinh nhân tạo, Kỹ thuật phần mềm, v.v. Bên cạnh đó, sinh viên học ngành Trí tuệ nhân tạo cần phải có các kỹ năng lập trình, ngoại ngữ và nghiên cứu để trở thành chuyên gia trong lĩnh vực này.

Lưu ý rằng còn tùy thuộc vào mỗi trường mà chương trình đào tạo ngành AI có thể sẽ khác nhau. Bạn nên xem xét kỹ về danh sách các môn học và chương trình giảng dạy trước khi quyết định đăng ký vào trường nào đó.

Một số môn học ngành AI bạn có thể sẽ phải học:

  • Nguyên tắc cơ bản của Trí tuệ nhân tạo
  • Nguyên lý lập trình và tính toán
  • Kỹ thuật phần mềm
  • Mạng thần kinh nhân tạo
  • Xử lý ngôn ngữ tự nhiên
  • Thị giác máy tính
  • Robot học
  • Machine Learning
  • Trí tuệ nhân tạo trong lĩnh vực cụ thể

  Trí tuệ nhân tạo (Artificial Intelligence) và cơn đau tim (Heart Attack)

Tố chất cần thiết để học trí tuệ nhân tạo

Để học và thành công trong lĩnh vực Trí tuệ nhân tạo, cần phải có những tố chất sau:

  • Sự tò mò và sáng tạo: Để giải quyết các vấn đề phức tạp và phát triển các giải pháp mới, cần phải có sự tò mò và sáng tạo trong tư duy.
  • Khả năng tư duy logic và phân tích: Khả năng phân tích và giải quyết vấn đề là một yếu tố quan trọng trong lĩnh vực Trí tuệ nhân tạo.
  • Khả năng làm việc độc lập và làm việc nhóm: Trí tuệ nhân tạo thường là công việc đòi hỏi sự độc lập và cộng tác với những người khác trong cùng một dự án.
  • Sự đam mê: Cần có sự đam mê với lĩnh vực Trí tuệ nhân tạo để có thể học tập và phát triển thành chuyên gia trong lĩnh vực này.
  • Ngoại ngữ: Trong một số trường hợp, sự thành công trong lĩnh vực Trí tuệ nhân tạo đòi hỏi khả năng giao tiếp bằng một hoặc nhiều ngoại ngữ.

Làm gì sau khi tốt nghiệp trí tuệ nhân tạo?

Software Engineer

Sau khi tốt nghiệp ngành Trí tuệ nhân tạo (AI), bạn có thể đi vào nhiều lĩnh vực khác nhau, tùy thuộc vào sở thích, năng lực và mục tiêu của bạn. Dưới đây là một số lựa chọn phổ biến sau khi tốt nghiệp:

  • Kỹ sư phần mềm (Software Engineer): Tập trung vào việc thiết kế cũng như chịu trách nhiệm phát triển các chương trình và hệ thống kỹ thuật số. Công việc của họ có thể bao gồm thu thập dữ liệu, xử lý dữ liệu, xây dựng mô hình máy học và đánh giá hiệu quả của các mô hình đó.
  • Kỹ sư học máy (Machine Learning Engineer): Để trở thành một kỹ sư học máy giỏi, bạn cần sử dụng các mô hình dự đoán và có khả năng xử lý ngôn ngữ tự nhiên khi làm việc với các bộ dữ liệu lớn. Kỹ năng lập trình, kiến thức toán học và am hiểu sâu về các phương pháp phát triển agile sẽ là những yếu tố quan trọng khi ứng tuyển vào các vị trí học máy.
  • Kỹ sư siêu dữ liệu (Big Data Engineer): Big Data Engineer là người chịu trách nhiệm thiết kế, xây dựng và duy trì các hệ thống lưu trữ và xử lý dữ liệu lớn. Để được tuyển dụng, ứng viên cần có kinh nghiệm lập trình với C++, Java, Python hoặc Scala. Ngoài ra, họ cần có kiến thức chuyên sâu và kinh nghiệm về khai thác, trực quan hóa và di chuyển dữ liệu.
  • Lập trình ngôn ngữ tư duy (NLP): Hiện nay, nhiều doanh nghiệp đang tuyển dụng các lập trình viên có khả năng tư duy về lập trình ngôn ngữ, bởi vì sự phổ biến của trí tuệ nhân tạo trong lĩnh vực này đang ngày càng tăng cao. Ví dụ như chatbots, trợ lý ảo trên điện thoại thông minh, và nhiều ứng dụng khác.
  • AI Researcher: Nhà nghiên cứu AI (AI Researcher) là một chuyên gia trong lĩnh vực trí tuệ nhân tạo, chuyên thực hiện các nghiên cứu chuyên sâu trong nhiều lĩnh vực như Machine Learning, Deep Learning, xử lý ngôn ngữ tự nhiên, thị giác máy tính và robot. Công việc của họ bao gồm phát triển các thuật toán mới, tạo ra nguyên mẫu phần mềm, và công bố các phát hiện quan trọng trên các tạp chí khoa học hàng đầu.
  • AI Analyst: AI Analyst là một chuyên gia đóng vai trò quan trọng trong việc khai thác và phân tích dữ liệu liên quan đến trí tuệ nhân tạo. Công việc của họ bao gồm thu thập, xử lý và phân tích dữ liệu để đưa ra cái nhìn sâu sắc về hiệu suất và hiệu quả của các hệ thống và ứng dụng AI. Dựa trên những phân tích này, họ đề xuất các cơ hội cải tiến và giúp tổ chức đưa ra các quyết định dựa trên dữ liệu.

Học ngành Trí tuệ nhân tạo ở đâu?

Việc chọn trường để học ngành Trí tuệ nhân tạo (AI) phụ thuộc vào nhiều yếu tố như chất lượng đào tạo, cơ hội thực hành, và môi trường nghiên cứu. Dưới đây là một số gợi ý về các trường đại học nổi tiếng ở Việt Nam và quốc tế, nơi bạn có thể theo học ngành AI:

Đại học Bách khoa Hà Nội

Đại học Bách khoa Hà Nội

Đây là ngôi trường có chương trình đào tạo kỹ thuật cao, trong đó ngành Khoa học Dữ liệu và Trí tuệ Nhân tạo (Data Science and AI) là một trong những ngành mũi nhọn. Chương trình được thiết kế và giảng dạy bởi các giáo sư hàng đầu trong nước và quốc tế, dạy 100% bằng tiếng Anh.

Đại học Công nghệ Thông tin – Đại học Quốc gia TPHCM

Đại học Công nghệ Thông tin - Đại học Quốc gia TPHCM

UIT là một trong những trường đại học hàng đầu Việt Nam về công nghệ thông tin. Chương trình học ngành AI được xây dựng trên nền tảng về Khoa học máy tính, tăng cường kiến thức chuyên sâu về Trí tuệ nhân tạo và khả năng ứng dụng liên ngành cho sinh viên.

Đại học Khoa học tự nhiên – Đại học Quốc gia TPHCM

Đại học Khoa học tự nhiên - Đại học Quốc gia TPHCM

Đại học Khoa học tự nhiên là trường đầu tiên ở khu vực phía Nam đào tạo ngành Trí tuệ nhân tạo (Artificial Intelligence – AI). Chương trình học của trường cung cấp cho sinh viên những kiến thức về các lĩnh vực cốt lõi của AI như xử lý ngôn ngữ tự nhiên, học máy và thị giác máy tính. Trường đã mạnh dạn đầu tư hơn 70 tỷ đồng cho các phòng thí nghiệm chuyên sâu về AI, các hệ thống thông minh để hỗ trợ cho quá trình học tập của sinh viên.

Điểm chuẩn ngành Trí tuệ nhân tạo của các trường

Dưới đây là tổng hợp điểm chuẩn ngành Trí tuệ nhân tạo năm 2024 của các trường tại Việt Nam (điểm chuẩn theo phương thức xét tuyển điểm thi THPT Quốc gia):

Trường Ngành tuyển sinh Điểm chuẩn
Đại học Công nghệ Thông tin – ĐHQG TPHCM Trí tuệ nhân tạo 28.30
Đại học Bách khoa Hà Nội Khoa học dữ liệu và Trí tuệ nhân tạo (CT tiên tiến) 28.22
Đại học Khoa học tự nhiên – ĐHQG TPHCM Trí tuệ nhân tạo 27.70
Đại học Sư phạm Kỹ thuật TP.HCM Robot và trí tuệ nhân tạo (đào tạo bằng tiếng Việt) 25.66
Đại học Công nghệ – Đại học Quốc gia Hà Nội Trí tuệ nhân tạo 27.12
Đại học Kinh tế Quốc dân Trí tuệ nhân tạo (Toán hệ số 2) 34.05
Đại học Công nghiệp Hà Nội Robot và trí tuệ nhân tạo 25.01

Tổng kết

Tóm lại, trí tuệ nhân tạo (AI) tuy là một ngành khá mới nhưng cơ hội việc làm trong tương lai vô cùng rộng mở. Hy vọng rằng bài viết này sẽ giúp bạn có cái nhìn tổng quan về ngành trí tuệ nhân tạo ở Việt Nam. Đừng quên theo dõi TopDev để cập nhật thêm nhiều tin tức công nghệ mới nhất nhé!

Xem thêm:

Xem thêm tuyển dụng IT mới nhất tại TopDev

Dân IT có thể được ChatGPT hỗ trợ code tự động hóa như thế nào?

ChatGPT đang là một trong những chủ đề được nhiều người quan tâm nhất hiện nay bao gồm cả anh em IT, lập trình viên. Có thể xem ChatGPT là một chatbot tích hợp trí tuệ nhân tạo với khả năng trả lời lại những câu hỏi của người dùng; và đáng chú ý là những câu hỏi không hề giới hạn một lĩnh vực nào kể cả lập trình. Nhiều bài viết, đánh giá cho rằng ChatGPT có thể thay thế lập trình viên trong tương lai, tuy vậy thì ở hiện tại, ChatGPT đang thực sự giúp ích được khá nhiều việc dành cho anh em DEV. Bài viết hôm nay chúng ta cùng nhau tìm hiểu xem dân IT có thể được ChatGPT hỗ trợ viết code tự động hóa như thế nào nhé. 

Khả năng lập trình của ChatGPT

CFTE, một tổ chức uy tín về công nghệ đã thử nghiệm kỹ năng lập trình của ChatGPT bằng cách cho nó tham gia một bài kiểm tra gồm 15 câu hỏi trắc nghiệm cho phép chọn nhiều đáp án, nội dung về lập trình Python (ngôn ngữ lập trình phổ biến nhất hiện nay). Mỗi câu hỏi có giới hạn thời gian trả lời trong vòng 1 phút 30 giây. Và kết quả là ChatGPT đã hoàn thành cả 15 câu hỏi trong thời gian cho phép và đạt điểm cao hơn 85% trong gần 4 triệu lập trình viên từng tham gia thực hiện bài test này.

Khả năng lập trình của ChatGPT

Trước đó, ChatGPT cũng đã vượt qua được bài phỏng vấn xin việc của Google và được ứng tuyển vào vị trí lập trình viên cấp độ 3 tại công ty, tương đương với mức lương 183 nghìn USD/năm. Chỉ 2 ví dụ trên đã cho thấy khả năng lập trình ấn tượng của ChatGPT, điều quan trọng hơn là khả năng học hỏi của nó diễn ra hàng ngày, có nghĩa là ChatGPT hoàn toàn có khả năng thông minh hơn trong việc lập trình trong tương lai.

  ChatGPT liệu có làm lập trình viên mất việc? - Phần 1

Lập trình viên có thể sử dụng ChatGPT như thế nào

Trái với những bài viết cho rằng ChatGPT sẽ thay thế anh em DEV trong tương lai, thì ở thời điểm hiện tại sau hơn nửa năm ra mắt (cuối năm 2022), lập trình viên lại xem ChatGPT như một công cụ hữu ích cho việc lập trình. Công cụ này thường được sử dụng để tạo nhanh các frame, bản code mẫu (template) để dựng ứng dụng tiết kiệm rất nhiều thời gian khởi tạo dự án cho anh em DEV.

Nó cũng có thể là một công cụ debug hữu ích dành cho anh em nhờ việc phân tích các đoạn code mà chúng ta cung cấp. Hay thiết thực hơn là các công việc liên quan đến tạo tài liệu, viết testcase,… những thứ mà dường như lập trình viên lười làm nhất. Chúng ta cùng đi cụ thể vào những ứng dụng mà ChatGPT mang lại cho anh em DEV nhé.

Khả năng lập trình của ChatGPT

1. Tìm tài liệu và hướng dẫn

Hãy sử dụng ChatGPT như một Google cho việc tìm tài liệu lập trình, tạo code mẫu hay đọc document chuẩn. Khi chúng ta đặt câu hỏi càng chi tiết thì ChatGPT sẽ càng cho ra câu trả lời chính xác mà chúng ta cần, bao gồm cả source code kèm theo lời giải thích chính xác.

Khả năng lập trình của ChatGPT

Ví dụ như trên chúng ta muốn nhờ ChatGPT tạo một đoạn code cho việc gọi API bằng thư viện axios trong React. Kết quả nhận được là các bước chi tiết step by step rõ ràng từ việc cài đặt thư viện, import thư viện đến đoạn code mẫu các sử dụng thư viện Axios bằng đúng ngôn ngữ lập trình JavaScript trong React. Nếu so với cách truyền thống, chúng ta cần phải gõ từ khóa vào Google, chọn một vài kết quả đáng tin, xong đó lại xem từng đoạn sample code khá rắc rối thì ChatGPT giúp công việc tiết kiệm được đến 90% thời gian cho bạn đấy.

Việc làm AI lương thưởng hấp dẫn, mới nhất dành cho bạn!

2. Debug code

Để kiểm tra xem đoạn code bạn viết có đúng hay không, hay phức tạp hơn là muốn xem bạn của bạn có thể sai chỗ nào, muốn sửa lại nó thì làm thế nào; đừng ngại hãy copy cả đoạn code đó để ChatGPT xử lý nhé.

Khả năng lập trình của ChatGPT

Ở ví dụ trên khi cung cấp cho ChatGPT 1 đoạn code và hỏi xem nó đúng hay sai thì chúng ta nhận được một câu trả lời không thể chi tiết hơn với 3 lỗi sai được chỉ ra cùng một đoạn code đã chỉnh sửa cho hợp lý. Cụ thể 3 lỗi bạn gặp phải gồm:

  • Sử dụng biến X viết hoa và viết thường
  • Sử dụng toán tử gắn “=” trong câu lệnh If, mà đúng thì phải dùng toán tử “==”
  • 2 dòng code print bạn cần thụt dòng vào thì mới đúng syntax của ngôn ngữ Python

  Fuzzy search là gì? Những điều cần biết về thuật toán fuzzy

3. Refactor code

Không chỉ debug code, ChatGPT còn có khả năng tối ưu source code, cải thiện chính đoạn code mà chúng ta viết ra. Trong nhiều trường hợp nếu bạn cung cấp đủ dữ kiện đầu vào, ChatGPT có khả năng đưa ra các gợi ý giúp bạn refactor lại cả source code dự án của bạn theo đúng các chuẩn gợi ý từ framework, thư viện, ngôn ngữ mà bạn sử dụng. 

Khả năng lập trình của ChatGPT

Trong ví dụ trên, bạn yêu cầu ChatGPT viết lại function trong Python bạn cung cấp theo cách mà ngôn ngữ này đề xuất hay cộng đồng lập trình viên Python cho là tốt (Idiomatic Python). Và kết quả bạn nhận lại không làm bạn thất vọng, thậm chí còn đề xuất việc sử dụng một Set thay vì một List để lưu trữ các thành phố (city).

4. Viết documentation

ChatGPT có thể đọc đoạn code bạn cung cấp đầu vào và viết documentation (hướng dẫn sử dụng) cho đoạn code đó. Đây là tính năng tuyệt vời giúp bạn tiết kiệm rất nhiều thời gian cho một công việc vẫn thường được xem là nhàm chán đối với phần lớn anh em lập trình viên. Dưới đây là một ví dụ là ChatGPT tự động tạo doc cho đoạn code viết bằng Python đầu vào, rất chi tiết và rõ ràng.

Khả năng lập trình của ChatGPT

Kết bài

Trên đây là một số ứng dụng mà ChatGPT mang lại danh cho dân IT nói chung cũng như anh em lập trình viên nói riêng. ChatGPT rất hữu dụng cho chúng ta nếu biết khai thác đúng cách, vì thế hãy tận dụng nó chứ đừng lạm dụng công cụ này; điều quan trọng vẫn là phải tự mình tư duy cũng như giải quyết bài toán gặp phải trong quá trình làm dự án. ChatGPT sẽ giúp bạn tiết kiệm rất nhiều thời gian và trở nên giỏi hơn trong lĩnh vực, nghề nghiệp của bạn. Hy vọng bài viết này mang lại những thông tin hữu ích dành cho bạn, hẹn gặp lại các bạn trong các bài viết tiếp theo của mình. 

Tác giả: Phạm Minh Khoa

Xem thêm:

Tìm kiếm việc làm IT mới nhất tại TopDev!

Top 3 phần mềm giả lập Java trên Android tốt nhất

Vào khoảng thời gian những năm 2010, cách đây hơn 10 năm, khi mà các thiết bị smartphone chạy hệ điều hành Android hay iOS chưa quá phổ biến, thì cũng là thời kỳ vàng son của các game Java trên điện thoại di động còn bàn phím số. Ngày nay với việc smartphone chạy các hệ điều hành chuyên biệt, không hỗ trợ cài đặt, chạy các ứng dụng viết bằng Java; thì để trải nghiệm lại những tựa game được xem là bầu trời tuổi thơ của thế hệ 8x, 9x chúng ta cần đến các ứng dụng giả lập Java trên smartphone. Bài viết hôm nay chúng ta cùng điểm qua một số các ứng dụng giả lập Java trên Android phổ biến hiện nay nhé.

Giả lập Java là gì?

Java là 1 ngôn ngữ lập trình bậc cao được phát triển bởi Sun Microsystems (hiện tại thuộc sở hữu của Oracle) từ những năm 1995. Java với sự đa năng của nó có thể được sử dụng để viết được các phần mềm dành cho môi trường Desktop, Web và cả các hệ thống nhúng, thiết bị mobile.

Trong đó 3 phiên bản Java khác nhau được xây dựng để phục vụ cho từng mục đích chuyên biệt:

Giả lập Java trên Android

Thời điểm smartphone chạy hệ điều hành Android hay iOS chưa phổ biến thì để viết một ứng dụng trên thiết bị di động, Java là một lựa chọn phổ biến với phiên bản J2ME (Java Platform Micro Edition). Những ứng dụng được viết ra với file có đuôi .jar, .jad chạy trên các hệ điều hành mobile phổ biến trước đây như Symbian.

Giả lập Java trên Android

Android mặc dù được viết bằng Java, nhưng nó không hỗ trợ J2ME hay J2SE, vì vậy nó không thể chạy trực tiếp các file .jar hay .jad. Để giải quyết vấn đề này chúng ta sẽ có 2 cách là:

  • Chuyển đổi tệp .jar hay .jad sang thành .apk – 1 loại file có thể được cài đặt và sử dụng trên hệ điều hành Android
  • Tạo 1 môi trường để chạy ứng dụng java trên hệ điều hành Android => hay chúng ta gọi là giả lập Java trên Android

Có khá nhiều phần mềm giả lập Java trên Android hiện nay, mỗi phần mềm có những ưu điểm và nhược điểm khác nhau do sự tương thích khi chạy ứng dụng Java tùy theo thư viện mà giả lập đó sử dụng. Chúng ta cùng điểm qua một số ứng dụng phổ biến nhé.

  Các phần mềm giả lập Java dành cho máy tính tốt nhất

Những phần mềm giả lập Java trên Android phổ biến

J2ME

J2ME có thể xem là trình giả lập Java phổ biến nhất hiện nay với những tính năng cực kỳ tiện lợi và dễ sử dụng. Ưu điểm đầu tiên của nó là việc được phát hành trên chợ ứng dụng Google Play hoàn toàn miễn phí và bạn không cần root(một thủ thuật để lấy quyền sử dụng cao nhất trên thiết bị Android) thiết bị để sử dụng. 

Giả lập Java trên Android

J2ME có 2 phiên bản là J2ME Loader và J2ME Runner trong đó phiên bản Runner có chức năng chuyển đổi file java thành file APK để chạy và cài đặt lên hệ điều hành Android. Phiên bản Loader thì sẽ trực tiếp chạy ứng dụng Java trên giả lập của nó, vì thế cũng được ưa chuộng hơn. Ưu điểm nổi bật của J2ME là:

  • Tương thích với hầu hết các phiên bản Android hiện nay
  • UI/UX thân thiện với người dùng
  • Hỗ trợ hầu hết các game, ứng dụng Java phổ biến
  • Hỗ trợ thiết bị đã root hoặc chưa root
  • Có những phiên bản cập nhật thường xuyên
  • Dung lượng ứng dụng nhẹ

Tham khảo việc làm Java hấp dẫn trên TopDev

JBed

Nếu như J2ME phổ biến với hầu hết người dùng nhờ sự đơn giản thì Jbed lại là ứng dụng giả lập Java cho Android được những người dùng yêu thích công nghệ, thích tìm tòi đề cao yêu thích. Điểm khác biệt lớn nhất của Jbed với J2ME là nó bắt buộc thiết bị phải root trước khi cài đặt, điều này mang lại cho giả lập khả năng can thiệp sâu vào hệ thống nhằm dễ dàng lấy được quyền và thực thi các ứng dụng Java trên thiết bị Android. 

Giả lập Java trên Android

Cũng vì bắt buộc phải root nên Jbed không được phát hành chính thức qua Google Play mà các bạn phải download và cài đặt thông qua file APK từ các nguồn không chính thống. Đây có thể là một điểm bất tiện của Jbed, mặc dù vậy đối với những người thích sự tùy chỉnh, đam mê tìm hiểu thì Jbed có nhiều ưu điểm:

  • Tốc độ cài đặt, chạy ứng dụng Java rất nhanh và mượt
  • Khả năng tương thích với nhiều tựa game nặng, cả 2D và 3D
  • Cộng đồng hỗ trợ của JBed cũng đông đảo và sôi nổi hơn so với các ứng dụng giả lập khác

  Cách Thiết Lập Máy Ảo, Máy Thật & Khởi Chạy Ứng Dụng Trong Android

PhoneMe

Nếu như J2ME và JBed không giúp chạy được ứng dụng Java mà bạn mong muốn trên Android thì PhoneMe sẽ được xem là hy vọng cuối cùng. Đây là phần mềm giả lập lâu đời nhất và vì thế nó không tương thích với các bản Android mới hiện nay. Dù vậy đấy cũng chính là ưu điểm của nó khi nó có khả năng chạy các ứng dụng, tựa game cũ, lâu đời của Java, những ứng dụng mà khả năng cao không thể chạy được trên J2ME hay JBed. 

Giả lập Java trên Android

PhoneMe cũng không phát hành chính thức qua Google Play, việc cài đặt cũng sẽ khá khó khăn, cần mất thời gian tìm hiểu. Tuy nhiên như đã nói ở trên, điểm mạnh của nó sẽ được phát huy giúp bạn hài lòng với nhiều ứng dụng Java cũ mà bạn khó cài đặt thành công trên các giả lập khác.

Kết bài

Như vậy chúng ta đã cùng điểm qua được các ứng dụng giả lập Java trên Android phổ biến hiện nay. Với sự phát triển của smartphone cùng sức mạnh của các hệ điều hành hiện nay thì các ứng dụng, game trở nên phong phú, đẹp mắt và lôi cuốn hơn trước rất nhiều. Tuy vậy để có thể trải nghiệm lại tuổi thơ thì việc lựa chọn giả lập Java trên smartphone của bạn là một lựa chọn không tồi. Hy vọng bài viết hữu ích dành cho bạn và hẹn gặp lại trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Xem thêm:

Tìm việc làm IT mọi cấp độ tại TopDev

Lộ trình học công nghệ thông tin hiệu quả cho người mới bắt đầu

Trong cách mạng công nghiệp 4.0, ngành Công nghệ thông tin đã trở thành động lực chính thúc đẩy sự phát triển vượt bậc của thế giới hiện đại. Những ứng dụng tiên tiến và những cải tiến không ngừng đã thay đổi cách chúng ta sống, làm việc và giao tiếp.

Nếu bạn là một người mới bước chân vào thế giới đầy hứa hẹn này, thì có rất nhiều điều phải làm. Vì vậy, trong bài viết này, chúng ta sẽ cùng nhau điểm qua những bước khởi đầu quan trọng, từ việc xây dựng nền tảng kiến thức cơ bản, lựa chọn ngôn ngữ lập trình phù hợp, đến cách thúc đẩy tư duy sáng tạo trong việc giải quyết các thách thức công nghệ.

Bắt đầu thôi nào!

Công nghệ thông tin là gì? Tại sao nhiều người chọn học CNTT?

Công nghệ thông tin là gì?

Công nghệ thông tin

Ngành Công nghệ thông tin (CNTT) là lĩnh vực chuyên môn liên quan đến việc sử dụng máy tính và phần mềm máy tính để thu thập, lưu trữ, xử lý và quản lý thông tin. Ngành này tập trung vào việc nghiên cứu, phát triển và duy trì các hệ thống thông tin; ứng dụng công nghệ để giải quyết nhiều vấn đề của xã hội, kinh doanh, giáo dục, y tế, khoa học và các lĩnh vực khác.

Tại sao nhiều người chọn học CNTT?

Ngành CNTT đang trở thành một lĩnh vực ngày càng quan trọng trong cuộc cách mạng công nghiệp 4.0. Sự phát triển của công nghệ và cuộc sống số đã tạo ra nhu cầu rất lớn về nguồn nhân lực CNTT, đặc biệt là trong việc phát triển, quản lý các ứng dụng, phần mềm và hệ thống thông tin phức tạp.

báo cáo thị trường IT năm 2022
Báo cáo thị trường IT Việt Nam năm 2022 của TopDev

Bên cạnh đó, ngành CNTT cung cấp nhiều cơ hội việc làm và tiềm năng tăng trưởng nghề nghiệp trong tương lai. Theo báo cáo thị trường IT năm 2022 của TopDev, đến năm 2024 Việt Nam vẫn thiếu hụt khoảng 195.000 lập trình viên/kỹ sư hằng năm. Cùng với đó, làn sóng đầu tư nước ngoài đã mang đến nhiều cơ hội cho các lập trình viên, thúc đẩy hoạt động tuyển dụng nhân sự CNTT trở nên sôi động hơn bao giờ hết.

Vậy nên, ngành CNTT vẫn sẽ giữ vững sức hút của mình trong nhiều năm nữa. Đây sẽ là một sự lựa chọn tuyệt vời cho những ai theo đuổi đam mê công nghệ.

  Top 10 Trường đào tạo ngành Công nghệ thông tin tốt nhất

  Con gái học Công nghệ thông tin được không? Các chuyên ngành IT nữ giới nên học

Người mới học CNTT nên bắt đầu từ đâu?

Tìm hiểu các thông tin cơ bản về ngành

Trước khi bắt đầu học sâu vào một ngành cụ thể, việc hiểu rõ các thông tin cơ bản là điều vô cùng quan trọng. Điều này sẽ giúp bạn có cái nhìn tổng quan về ngành học, phát hiện mảng nào hấp dẫn và tạo lộ trình học tập hiệu quả nhất cho bản thân.

Xác định lĩnh vực bạn muốn học

học CNTT

Ngành công nghệ thông tin rất lớn, bạn cần xác định được đâu là thứ bản thân mình muốn theo học. Dưới đây là một số gợi ý nhóm ngành CNTT bạn có thể tham khảo:

  • Khoa học máy tính (Computer Science): Đây là là một ngành học nền tảng, cho phép bạn thấu hiểu mọi khía cạnh của máy tính, từ thiết kế, chế tạo, vận hành cho đến sửa chữa các yếu tố như phần cứng, phần mềm, hệ thống, nhằm đáp ứng nhu cầu của khách hàng hoặc người dùng. Đây là lĩnh vực dành riêng cho những người đam mê máy tính, và muốn tìm hiểu sâu về nền tảng của công nghệ này.
  • Mạng máy tính và truyền thông dữ liệu (Data Communication and Computer Network): Đây là là một trong những lĩnh vực chuyên sâu của Công nghệ thông tin, tập trung vào việc nghiên cứu, triển khai, và quản lý các hệ thống mạng máy tính và truyền thông dữ liệu. Ngành này chịu trách nhiệm xây dựng và duy trì các mạng máy tính, hệ thống viễn thông, và cơ sở dữ liệu để đảm bảo việc truyền tải dữ liệu thông tin diễn ra một cách hiệu quả và bảo mật.
  • Kỹ thuật máy tính (Computer Engineering): Đây là một ngành học kết hợp giữa kiến thức về Điện tử và Công nghệ thông tin, tập trung nghiên cứu cách xây dựng và phát triển thiết bị cùng với các phần mềm hỗ trợ hoạt động của các thiết bị phần cứng. Ngành này có sự liên quan chặt chẽ đến vật lý, kỹ thuật điện và khoa học máy tính.
  • Công nghệ Phần mềm (Software Engineering): Đây là một chuyên ngành tập trung vào nghiên cứu về hệ thống kỹ thuật và phần mềm máy tính. Mục tiêu của ngành là xây dựng các ứng dụng nhằm tăng cường hiệu quả hoạt động của doanh nghiệp và cải thiện chất lượng cuộc sống của con người.
  • Big Data & Machine Learning: Ngành học này tập trung vào việc nghiên cứu và ứng dụng các phương pháp, công cụ để xử lý và phân tích dữ liệu lớn (Big Data) thông qua trí tuệ nhân tạo và học máy (Machine Learning).

Việc làm IT Fresher dành cho bạn

Học viết code – Lựa chọn ngôn ngữ lập trình

ngôn ngữ lập trình
Nguồn: https://www.statista.com/chart/16567/popular-programming-languages/

Sau khi đã xác định được chuyên ngành, bước tiếp theo là lựa chọn ngôn ngữ lập trình để theo học. Một số ngôn ngữ lập trình phổ biến bạn có thể tham khảo như: Python, Java, JavaScript, C++, C#, PHP, Swift, Ruby,… Bạn có thể bắt đầu với một ngôn ngữ dễ học như Python để làm quen với lập trình, sau đó mở rộng kiến thức sang các ngôn ngữ khác khi bạn trở nên thành thạo hơn.  

Nâng cao kiến thức qua các nguồn tài liệu chất lượng

Để nâng cao kiến thức và khả năng lập trình bạn cần tham khảo nhiều nguồn tài liệu khác nhau, có thể là sách, video hướng dẫn, khóa học online, blog công nghệ hay các bài báo khoa học. Quan trọng nhất, hãy chọn những nguồn tài liệu phù hợp với mục tiêu học tập của bạn và luôn kiểm tra tính đáng tin cậy của nguồn thông tin trước khi sử dụng.

Nắm bắt cơ hội thực hành

Nếu chỉ họ kiến thức mà không thực hành thì bạn sẽ rất khó tiến bộ trong ngành này. Thực hành giúp bạn áp dụng những kiến thức đã học vào thực tế, rèn luyện khả năng giải quyết vấn đề và tăng cường kỹ năng thực tiễn. Bạn có thể rèn luyện kỹ năng của mình qua các dự án cá nhân, dự án nhóm, tham gia thực tập hoặc làm freelancer. Hãy luôn tận dụng mọi cơ hội để rèn luyện và phát triển bản thân trong lĩnh vực Công nghệ thông tin.

Một số lời khuyên cho các bạn mới bắt đầu học lập trình

Dành cho các bạn mới bắt đầu học lập trình, dưới đây là một số lời khuyên hữu ích giúp bạn bước vào hành trình học tập một cách hiệu quả:

Đừng vội, chậm mà chắc

Nhiều bạn khi bắt đầu học lập trình được 1 – 2 tuần sẽ nắm bắt rất nhanh, dẫn đến chủ quan nghĩ rằng lập trình khá dễ. Các bạn lao vào học các kiến thức chuyên sâu mà bỏ qua những điều nền tảng. Nhưng về sau càng gặp các vấn đề phức tạp hơn bạn lại lúng túng không biết giải quyết như thế nào.

Vậy nên, bạn hãy bắt đầu học từ những điều cơ bản nhất, hình thành thói quen tốt về tư duy giải quyết vấn đề, phải thật sự hiểu rõ vấn đề trước khi bắt tay vào giải quyết nó.

Học từ những ví dụ có sẵn

học code

Tìm hiểu và nghiên cứu các ví dụ code có sẵn trong sách, trang web và các dự án mã nguồn mở. Điều này giúp bạn hiểu cách các lập trình viên thực tế làm việc và học được cách tiếp cận và giải quyết vấn đề.

Không sợ thất bại và kiên nhẫn: Học lập trình là một quá trình không ngừng nghỉ và đôi khi có thể gặp khó khăn. Không sợ thất bại và kiên nhẫn vượt qua những khó khăn để tiến bộ.

Đặt ra những thách thức mới cho bản thân

Trong quá trình học lập trình, tự thách thức bản thân là một cách cần thiết để phát triển và tiến bộ. Điều này bao gồm việc đối diện với các vấn đề dự án phức tạp hơn, thử sức với những khái niệm mới và kiên nhẫn vượt qua các thách thức.

Liên tục cập nhật kiến thức mới

Trong ngành Công nghệ thông tin, sự thay đổi và tiến bộ diễn ra với tốc độ nhanh chóng. Do đó, việc liên tục cập nhật kiến thức mới là điều cần thiết để theo kịp xu hướng công nghệ và phát triển bản thân. Công nghệ, ngôn ngữ lập trình, framework và các công cụ trong lĩnh vực này đều có thể thay đổi và cải tiến theo thời gian.

Kết luận

Học Công nghệ thông tin là một hành trình thú vị và đầy thách thức cho người mới bắt đầu. Hy vọng bài viết này đã giúp bạn hiểu hơn về ngành CNTT và xác định được lộ trình học phù hợp với bản thân. Chúc bạn thành công với đam mê của mình.

Có thể bạn quan tâm:

Xem thêm việc làm IT hấp dẫn tại TopDev

MIME Sniffing là gì? Cách để bảo vệ website khỏi cuộc tấn công “dò tìm” MIME

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Có thể bạn đã biết, song song với việc bảo mật website ở máy chủ để đảm bảo không ai có thể truy cập được để thực hiện hành vi trái phép, thì bảo mật phía máy khách (client) cũng không hề được xem nhẹ. Mỗi năm, các trình duyệt web phổ biến luôn được cập nhật thêm các bản vá lỗ hổng bảo mật kèm với việc bổ sung các đặc tả kĩ thuật nhằm tăng tính bảo mật hơn cho trình duyệt của họ. Một trình duyệt có thể bảo vệ người dùng tối đa thì ai mà chẳng muốn sử dụng.

MIME types là một trong những đặc tả cho biết bản chất và định dạng của tài liệu, tệp hoặc phân loại byte. Lấy một ví dụ đơn giản cho dễ hình dung là một endpoint API nếu trong headers trả về có chứa thuộc tính Content-Type: application/json thì ngay lập tức client sẽ biết dữ liệu trả về là ở định dạng JSON, từ đó có phương án xử lý phù hợp thay vì phải cố “đoán” xem dữ liệu trả về là text, image hay video…

MIME Sniffing

Nếu không có Content-Type hoặc ở một số trình duyệt không “thích” kiểm tra Content-Type thì nó sẽ tiến hành một cuộc “dò tìm” xem dữ liệu trả về ở dạng nào. Điều này vô tình tạo ra một cuộc tấn công gọi là “MIME Sniffing”.

  Một số lệnh console hữu ích khi debug website

  Cách tích hợp ReactJS vào dự án website bất kỳ

MIME Sniffing là gì?

MIME Sniffing đã và đang là một kỹ thuật được một số trình duyệt web (chủ yếu là Internet Explorer) sử dụng để kiểm tra nội dung của một nội dung cụ thể. Việc này được thực hiện nhằm mục đích xác định định dạng tệp của nội dung phản hồi. Kỹ thuật này hữu ích trong trường hợp không có đủ thông tin như Content-Type cho một nội dung cụ thể, do đó có khả năng trình duyệt diễn giải nội dung không chính xác.

Mặc dù việc dò tìm MIME có thể hữu ích để xác định định dạng tệp chính xác của nội dung nhưng nó cũng có thể gây ra lỗ hổng bảo mật. Lỗ hổng này có thể khá nguy hiểm cho cả chủ sở hữu cũng như khách truy cập trang web. Điều này là do kẻ tấn công có thể tận dụng khả năng “dò tìm” MIME để thực hiện một cuộc tấn công XSS (Cross Site Scripting).

Mô tả quá trình MIME Sniffing khá đơn giản. Bao gồm các bước chính sau:

  • Trình duyệt web yêu cầu một nội dung cụ thể phản hồi không có loại nội dung hoặc loại nội dung được đặt trước đó tại máy chủ gốc.
  • Trình duyệt web “dò tìm” nội dung để phân tích nội dung cụ thể đó là định dạng tệp nào.
  • Khi trình duyệt đã hoàn thành phân tích, nó sẽ so sánh những gì nó tìm thấy với những gì máy chủ web cung cấp trong Content-Type tiêu đề (nếu có). Nếu có sự không khớp, trình duyệt sẽ sử dụng loại MIME mà nó xác định là được liên kết với nội dung.

Giả sử trang web của bạn cho phép người dùng upload tệp tin lên máy chủ. Bạn chỉ chấp nhận định dạng ảnh cụ thể là JPG. Kẻ tấn công nhanh trí đổi đuôi một tệp HTML thành .jpg rồi tải tệp lên. Khi đó nếu trình duyệt thực hiện “dò tìm” MIME khi cố gắng hiển thị hình ảnh, khả năng cao đoạn mã HTML sẽ được thực thi ở trình duyệt.

Tham khảo việc làm HTML & CSS hấp dẫn trên TopDev

Cách thiết lập ngăn trình duyệt dò tìm MIME

Hầu hết các trình duyệt hiện nay đều tôn trọng tiêu đề này, bao gồm Chrome/Chromium, Edge, IE >= 8.0, Firefox >= 50 và Safari >= 11.

MIME Sniffing

Để thiết lập, bạn chỉ cần đặt X-Content-Type-Options: nosniff trong phản hồi của headers HTTP của máy chủ.

Ví dụ, nếu bạn đang dùng nginx làm máy chủ.

server {
    listen 443 ssl;

    ...

    add_header X-Content-Type-Options nosniff;
    ...

Tổng kết

Mặc dù ngày nay cơ chế bảo mật này có thể là thiết lập mặc định hoặc là cấu hình “không thể thiếu” của máy chủ web. Tuy nhiên tôi hy vọng qua bài viết này cung cấp cho bạn đọc thêm một góc nhìn về tầm quan trọng của các đặc tả kỹ thuật, cũng như các hành vi có thể bị khai thác để sử dụng trong mục đích xấu bất kì lúc nào.

Bài viết gốc được đăng tải tại 2coffee.dev

Có thể bạn quan tâm:

Tại sao trên Linux hay dùng những định dạng file nén như *.gz, *.xz thay vì *.zip, *.7z?

Bài viết được sự cho phép của tác giả Nguyễn Hồng Quân

Những bạn đang dùng Windows mà tìm hiểu về Linux sẽ thấy trên Linux, những định dạng file nén quen thuộc như *.zip*.7z lại không được ưa chuộng, mà lại thấy người ta hay sử dụng *.gz*.tar.gz*.zz*.tar.xz, mặc dù cả định dạng và thuật toán của zip, 7zip đều là mã nguồn mở. Thế thì tại sao?

Đầu tiên, hãy nói về một định dạng file nén khác cực kì được ưa chuộng trên Windows là *.rar. Lý do định dạng này vắng mặt trên Linux thì dễ hiểu hơn, đó là nó không phải là phần mềm nguồn mở.

Quay lại *.zip và *.7z. Lý do chúng không được ưa chuộng là vì chúng không hỗ trợ nén và giải nén theo kiểu “cuốn chiếu”. Theo kiểu “cuốn chiếu” nghĩa là, ví dụ như bạn đang download một file nén lớn và bạn muốn download tới đâu, giải nén tới đó, không phải chờ download xong xuôi rồi mới giải nén. Tính năng “cuốn chiếu” này quan trọng đối với người dùng Linux vì trên Linux, môi trường dòng lệnh rất mạnh, có một tính năng gọi là “pipe” và tính “cuốn chiếu” kết hợp với “pipe” thì giúp công việc hiệu quả gấp nhiều lần.

Ví dụ, tôi hay sử dụng “pipe” (truyền dữ liệu đầu ra của chương trình này vào đầu vào của chương trình khác) khi tôi muốn copy cơ sở dữ liệu từ server về máy cá nhân:

$ ssh my-server 'pg_dump -O database_name' | psql database_name

Câu lệnh trên có nghĩa là:

  • SSH vào server my-server, chạy lệnh pg_dump trên đó để dump dữ liệu PostgreSQL. Tuy nhiên kết quả dump không lưu vào file mà đẩy ra standard output (stdout). Khi bạn chạy lệnh pg_dump trong ssh thì stdout của pg_dump sẽ được ngầm download về, nhả ra qua stdout của ssh luôn.
  • Cùng lúc đó, chạy lệnh psql trên máy cá nhân để khôi phục dữ liệu đã dump.
  • Toán tử pipe (|) giúp kết nối stdout của ssh với standard input (stdin) của psql. Như vậy kết quả dump của pg_dump sẽ đi thẳng vào psql mà không cần ra một file trung gian.

  Cài đặt Rust trên Arch Linux

Trong trường hợp dữ liệu hơi lớn mà đường truyền Internet không quá nhanh thì tôi sẽ nén kết quả dump trước rồi mới gửi về máy cá nhân, bằng cách chèn thêm gzip vào:

$ ssh my-server 'pg_dump -O database_name | gzip' | gunzip | psql database_name

Câu lệnh trên có nghĩa là:

  • SSH vào server my-server, chạy lệnh pg_dump trên đó để dump dữ liệu PostgreSQL. Kết quả dump không lưu vào file mà đẩy ngay sang cho gzip để nén. Đầu ra đã nén sẽ được download và đi ra stdout của lệnh ssh.
  • Kết quả nén download được tới đâu, sẽ truyền ngay qua gunzip tới đó để giải nén.
  • Kết quả giải nén lại được truyền ngay vào psql để khôi phục dữ liệu mà không cần qua file trung gian.

Tại sao trên Linux hay dùng những định dạng file nén như *.gz, *.xz thay vì *.zip, *.7z?

Xem thêm tuyển dụng Linux lương cao trên TopDev

Nếu bạn muốn độ nén mạnh như 7zip thì bạn thay gzip bằng xz:

$ ssh my-server 'pg_dump -O database_name | xz' | unxz | psql database_name

Tất cả các ứng dụng trên, từ ssh đến psql đều xử lý dữ liệu theo kiểu “cuốn chiếu” nên kết hợp với “pipe” là tuyệt vời.

Nếu bạn thắc mắc tại sao có thể dùng lệnh pg_dump và psql một cách ngắn gọn, không cần cung cấp host, username, password, thì đọc thêm bài này.

Vì mục tiêu hỗ trợ nén & giải nén cả stream (luồng dữ liệu đang chảy) nên gzipxz chỉ có thể làm việc với file đơn lẻ, không thể làm việc với cả thư mục như zip, 7zip. Để nén & giải nén thư mục thì người ta kết hợp với tar, một lệnh để đóng gói thư mục thành một file. Điều thú vị là tar cũng đóng gói và mở gói thư mục theo kiểu “cuốn chiếu”.

  Hướng dẫn cài đặt SSH KEY cho server Linux

Sau đây là một ví dụ khi tôi mua laptop mới và cần sao chép dữ liệu công việc từ laptop cũ sang laptop mới. Do dữ liệu rất lớn (hàng chục GiB), gồm hàng trăm ngàn file nhỏ nên không thể copy bằng phím Ctrl+C/Ctrl+V trong ứng dụng giao diện đồ họa được, do khi copy bằng cách này thì ứng dụng sẽ copy từng file một, sẽ cực kỳ lâu. Nén cả thư mục trước khi copy thì sẽ nhanh hơn, nhưng nếu dùng zip7zip thì sẽ gặp trở ngại là nó phải tạo ra file trung gian, trong khi ổ cứng không đủ để lưu file này, chưa kể sẽ phải chờ đợi file sinh ra trọn vẹn rồi mới copy và giải nén được. Trong trường hợp này, tôi kết hợp sshtar để không phải sinh ra file trung gian:

$ ssh old-laptop "tar -cO -C ~/Works folder-to-copy" | tar -xf-

Giải thích:

  • Cờ -c trong lệnh tar để yêu cầu tar thi hành đóng gói, -x là để mở gói.
  • -O để yêu cầu tar đẩy kết quả đóng gói ra stdout.
  • -C để yêu cầu tar nhảy đến thư mục cha nào đó trước khi đóng gói thư mục con.
  • -f - (trong lệnh tar thứ hai) để hướng dẫn lấy file đã đóng gói (đầu vào) từ standard input.

Ở đây, tôi dùng mạng dây nội bộ nên tốc độ truyền đủ nhanh để không cần nén, tuy nhiên nếu muốn nén thì có thể kết hợp với gzip:

$ ssh old-laptop "tar -cO -C ~/Works folder-to-copy | gzip" | gunzip | tar -xf-

hay ngắn gọn hơn:

$ ssh old-laptop "tar -czO -C ~/Works folder-to-copy" | tar -xzf-

Thêm một mẹo nhỏ, nếu bạn muốn theo dõi tiến độ của việc chuyển dữ liệu trên, bạn có thể kết hợp với pv:

$ ssh old-laptop "tar -cO -C ~/Works folder-to-copy" | pv | tar -xf-

Tại sao trên Linux hay dùng những định dạng file nén như *.gz, *.xz thay vì *.zip, *.7z?

(Trong hình trên, tôi đang minh họa copy dữ liệu ở nơi có mạng chậm nên tốc độ hơi chậm).

Như vậy, trong bài này, không những bạn hiểu được lý do tại sao gzipxz lại được ưa dùng hơn zip7zip mà còn được thấy sức mạnh của môi trường dòng lệnh trên Linux, ích lợi của môi trường dòng lệnh đối với năng suất công việc.

Bài viết gốc được đăng tải tại quan.hoabinh.vn

Xem thêm:

Xem thêm các việc làm công nghệ hấp dẫn trên TopDev

Githooks là gì? Tìm hiểu cách sử dụng Githooks để ngăn chặn commit ẩu

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Làm việc với git đã lâu nhưng có thể bạn chưa biết rằng trong git cũng có khái niệm hooks và họ gọi là githooks. Githooks được kích hoạt thông qua các sự kiện, từ đó giúp bạn có thể chèn thêm những công việc cần xử lý trước hoặc sau khi thực hiện hành động đó.

Githooks là gì?

Githooks là các script mà Git thực thi trước hoặc sau các sự kiện như: commit, push và receive. Githooks là một tính năng được tích hợp sẵn trong git nên chúng ta không cần tải xuống thêm bất cứ thứ gì.

Git cung cấp rất nhiều hooks, một số hooks phổ biến có thể kể đến là:

  • pre-commit: Được gọi khi dùng lệnh git commit và nó được chạy trước git commit
  • pre-receive: Đây là một hook được thực hiện ở phía server, được gọi trước khi git push.
  • post-commit: Được gọi sau khi dùng lệnh git commit. Hành vi trong post-commit không ảnh hưởng đến kết quả của commit vì nó được kích hoạt sau khi commit thành công.
  • post-receive: Đây là một hook được thực hiện ở phía server, được gọi sau khi dùng lệnh git push. Hành vi trong post-receive không ảnh hưởng đến kết quả của lệnh push vì nó được kích hoạt sau khi push thành công.

Để xem danh sách đầy đủ và mô tả của hooks bạn tham khảo thêm ở trang tài liệu git.

Mỗi kho lưu trữ Git đều có một thư mục .git/hooks có chứa các file tương ứng cho mỗi hook mà bạn muốn sử dụng. Bạn có thể thay đổi nội dung các file này và Git sẽ thực thi chúng khi những sự kiện đó xảy ra.

Các hooks trong git có thể được chia ra thành hai loại: Loại chạy phía máy khách (client-side) và loại chạy phía máy chủ (server-side). Các hooks phía máy khách được chạy trước hoặc sau hành động trên máy khách (local repository) còn các hooks máy chủ được chạy trước hoặc sau khi được đẩy tới server (remote repository).

Các hooks phía máy chủ được sử dụng để thực thi mạnh mẽ hơn các chính sách (policies) mà chúng ta muốn vì nó được được remote kiểm tra, bởi vì các hooks phía máy khách có thể dễ dàng bỏ qua bởi nhiều thủ thuật. Để biết những hook nào chạy ở phía máy khách hay chủ bạn có thể xem chi tiết trong tài liệu git.

  Git Submodules và ứng dụng trong việc chia sẻ tài nguyên dùng chung

Cách sử dụng Githooks

Khi dùng git init để khởi tạo git repository cho project thì git cũng tạo những tệp example của các hook trong thư mục .git/hooks các bạn có thể vào xem. Thực chất đây là những tập lệnh bash.

thư mục .git/hooks

Ví dụ đây là nội dung của file pre-commit.sample:

#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".

if git rev-parse --verify HEAD >/dev/null 2>&1
then
  against=HEAD
else
  # Initial commit: diff against an empty tree object
  against=$(git hash-object -t tree /dev/null)
fi

# If you want to allow non-ASCII filenames set this variable to true.
allownonascii=$(git config --type=bool hooks.allownonascii)

# Redirect output to stderr.
exec 1>&2

# Cross platform projects tend to avoid non-ASCII filenames; prevent
# them from being added to the repository. We exploit the fact that the
# printable range starts at the space character and ends with tilde.
if [ "$allownonascii" != "true" ] &&
  # Note that the use of brackets around a tr range is ok here, (it's
  # even required, for portability to Solaris 10's /usr/bin/tr), since
  # the square bracket bytes happen to fall in the designated range.
  test $(git diff --cached --name-only --diff-filter=A -z $against |
    LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
then
  cat <<\EOF
Error: Attempt to add a non-ASCII file name.

This can cause problems if you want to work with people on other platforms.

To be portable it is advisable to rename the file.

If you know what you are doing you can disable this check using:

  git config hooks.allownonascii true
EOF
  exit 1
fi

# If there are whitespace errors, print the offending file names and fail.
exec git diff-index --check --cached $against --

Đối với hooks pre-commit, nếu bạn return một exit status khác 0 thì ngay lập tức commit sẽ bị huỷ bỏ và trả về lỗi. Để cấu hình sử dụng hook nào rất đơn giản chỉ cần đặt tên file là tên hooks trong thư mục .git/hooks (xoá đuôi .sample).

Tham khảo Job FrontEnd HOT trên TopDev!

Sử dụng pre-commit để ngăn chặn commit ẩu

Commit ẩu có thể là những commit chưa chịu chạy qua ESLint để kiểm tra cú pháp hay chưa chạy Unit test trước đó. Tuỳ vào trường hợp của bạn mà sẽ có những lúc bạn muốn ngăn chặn những commit mà vi phạm một lỗi nào đó được quy định từ trước. Những lúc như thế thì áp dụng hooks pre-commit là quá chuẩn.

  Tôi vừa lỡ commit sai, làm sao để sửa lại ngay lập tức?

Ví dụ tôi muốn mỗi khi commit phải chạy qua Unit test, nếu thành công thì mới tiến hành commit còn không thì báo lỗi thì làm như sau.

Tạo file .git/hooks/pre-commit với nội dung:

#!/bin/sh
git stash -q --keep-index
npm run test
status=$?
git stash pop -q
exit $status

Trước khi run test tôi tiến hành stash các file trước đó vì những file đó không nằm trong commit, rồi sau đó unstash và trả về exit với status là exit status của lệnh npm run test. Cú pháp $? trong bash là lấy exit code của task cuối cùng. Trong trường hợp sử dụng khác bạn có thể thay đổi npm run test thành bất kì lệnh nào mà bạn muốn kiểm tra trước khi commit.

Tổng kết

Bên trên chỉ là một ví dụ nhỏ của việc sử dụng githook, ngoài pre-commit còn rất nhiều hook khác. Bằng cách kết hợp các hook sẽ giúp bạn giải quyết được điều vấn đề hơn nữa.

Bài viết gốc được đăng tải tại 2coffee.dev

Có thể bạn quan tâm:

Học IT có khó không? 6 khó khăn khi theo học ngành CNTT

Bài viết được sự cho phép của tác giả Kiên Nguyễn

Lại là mình đây, trong bài viết này mình sẽ kể khổ cho các bạn khi bạn quyết định theo học ngành Công nghệ thông tin (IT) ha.

Mình hiện là sinh viên năm cuối ngành IT, tuy chưa có nhiều năm kinh nghiệm thực tế nhưng những gì mình chia sẻ là những gì mình đã lĩnh hội được trong quá trình học tập và làm việc tại các công ty IT.

Hi vọng với những gì mình chia sẻ sẽ ngày hôm nay sẽ giúp các bạn phần nào hiểu rõ hơn về những áp lực khi quyết tâm theo học ngành học này (đặc biệt là các bạn học sinh đang nung nấu ý định thi vào các trường về IT). Ok bắt đầu thôi !

#1. Có quá nhiều sự lựa chọn

Có thể nhiều bạn còn chưa hiểu tại sao lại là “nhiều sự lựa chọn”. Thực ra công nghệ thông tin là một khái niệm rất rộng, nó bao hàm nhiều lĩnh vực nhỏ bên trong.

6 khó khăn có thể bạn sẽ gặp khi theo học ngành CNTT

Mình tin chắc phần đa các bạn khi đỗ vào các trường đại học vẫn chưa được định hướng rõ ràng sẽ đi theo mảng nào của ngành học này.

Mình đã có một bài viết nói về các lĩnh vực nhỏ trong ngành IT, các bạn có thể tham khảo tại đây nhé !

Việc lựa chọn một hướng đi cụ thể sẽ là khó khăn ban đầu khi bạn học xong các chương trình cơ bản. Ví dụ bạn không biết phải đi theo hướng nghiên cứu hay thực hành, không biết nên đi theo các công nghệ mới (AI, Machine Learning…) hay các hướng cũ như lập trình web app, mobile app…

Vậy giải pháp là gì? Mình khuyên là đầu tiên các bạn nên giành thời gian tìm hiểu, sau đó nếu thấy hay thì cứ học hết đi. Nhưng đến một lúc (khoảng vào cuối năm 2 – đầu năm 3) hãy chọn cho mình một lĩnh vực bạn thích rồi đi sâu vào nó.

#2. Kiến thức cập nhật thường xuyên.

Không phải mình dọa các bạn đâu nhưng công nghệ trên thế giới thay đổi hàng tuần chứ không muốn nói là hàng giờ.

6 khó khăn có thể bạn sẽ gặp khi theo học ngành CNTT

Có thể khi bạn đang chật vật học công nghệ này, công nghệ kia thì ở đâu đó họ đã cho ra công nghệ mới “ngon” hơn rồi.

Nói vậy không có nghĩa là bạn bỏ cái cũ mà chạy theo cái mới. Chúng ta phải học có chọn lọc và thường thì khi công nghệ nào đó được sử dụng nhiều nó sẽ có vòng đời không quá ngắn.

Đủ để chúng ta học, tạo ra sản phẩm và cải thiện nó. Điều mà bạn nên chú tâm đó là theo dõi công nghệ bạn đang sử dụng cập nhật như thế nào.

Mình lấy ví dụ các bạn làm việc với ngôn ngữ lập trình Java, chắc không nhiều bạn biết rằng hiện tại Java hiện đã ra mắt phiên bản SE 15 vào tháng 9 năm 2020. Nhưng chúng ta vẫn cứ dùng Java 8 được phát hành từ tháng 3 năm 2014.

Đơn giản vì nhiêu đó tính năng của Java 8 đủ dùng rồi, các tính năng mới để cải thiện hiệu năng và dùng cho các mục đích đặc biệt.

Tóm lại việc cập nhật kiến thức công nghệ là không thể tránh khỏi nếu bạn theo học ngành IT này, nhưng hãy học và dùng công nghệ một cách chọn lọc nha các bạn.

#3. Tiếp xúc nhiều với máy tính

Nhiều bạn nghe lại bảo rằng tiếp xúc nhiều với máy tính thì sao, làm sao nhiều bằng mấy ông chơi game được.

6 khó khăn có thể bạn sẽ gặp khi theo học ngành CNTT

Đúng, cái này mình công nhận nhưng khoan hãy so sánh với bạn chơi game. Học IT dù là lĩnh vực gì bạn cũng phải giành thời gian để lập trình hoặc các công việc khác mà buộc phải có máy tính.

Dẫn đến thứ nhất là mắt bạn phải làm việc nhiều trước máy tính, về lâu về dài có thể gây ra các bệnh như cận thị (đặc biệt là khi dùng trong bóng tối) hoặc đơn giản là mỏi mắt, nhức đầu.

Hai nữa là khi làm việc nhiều với máy tính bạn còn đâu thời gian dành cho các việc khác, như là thể thao, yêu đương, vui chơi, học những kiến thức, kỹ năng mềm khác.

Đó mới chính là hệ lụy của việc tiếp xúc với máy tính. Nó khiến cho bạn thu nhỏ không gian sống, thu nhỏ sở thích cũng như thu nhỏ thế giới quan của các bạn.

Vì vậy hãy làm sao cân bằng khi học tập, làm việc và vui chơi để vừa đảm bảo công việc, sức khỏe cũng như các mối quan hệ khác.

#4. Gặp các vấn đề khó

Tôi nói đến đây chắc nhiều ông dev đọc được lại vỗ tay bảo “chuẩn luôn!”. Vì học IT mà không gặp vấn đề khó, không gặp bug thì như tấm chiếu chưa trải vậy.

6 khó khăn có thể bạn sẽ gặp khi theo học ngành CNTT

Đôi khi một lập trình viên giỏi được đánh giá dựa trên kinh nghiệm giải quyết vấn đề của anh ta. Các bài toán khó khi học IT là không thể tránh khỏi. Đó có thể là một logic khó, có thể là một chức năng khó hoặc đôi khi chỉ đơn giản là một lỗi mà bạn chưa gặp bao giờ.

Gặp nhiều vấn đề khó mà không giải quyết được thì bạn sẽ mau nản và cảm thấy học công nghệ thông tin khó. Đây là tình trạng chung mà hầu như ai cũng từng trải qua.

Để khắc phục được điều này thì cách duy nhất đó là kiên trì rèn luyện, bạn cứ tưởng tượng số lượng vấn đề khó mà bạn giải quyết được tỉ lệ với kinh nghiệm của bạn mà cố gắng vượt qua thôi.

Tham khảo thêm:

#5. Ngày càng có nhiều người học

Đây là sự thật phũ phàng mà bạn phải nhận ra thật sớm để lao vào cuộc chiến này với tinh thần quyết liệt nhất.

6 khó khăn có thể bạn sẽ gặp khi theo học ngành CNTT

Nhiều bạn vẫn nghĩ học IT ra kiểu gì chả có việc. Nhưng không, các bạn nhầm to rồi, việc thì không thiếu nhưng không phải cứ tốt nghiệp là có việc TỐT đâu.

Giờ bạn không làm được việc thì ai dám thuê bạn về làm, rồi tiền đâu trả cho bạn. Nếu bạn không tự cố gắng, nâng cao chuyên môn thì ra trường cũng chỉ là một cậu học sinh già không hơn không kém.

Ngày càng có nhiều người học thì đồng nghĩa với việc nguồn nhân lực ngày càng nhiều. Nếu tính theo tỷ lệ, rõ ràng số người cạnh tranh với bạn cũng sẽ tăng lên.

Đây thực sự là áp lực nếu như bạn không sớm nhận ra trong những năm tháng còn ngồi trên ghế giảng đường.

Vì vậy hãy luôn trau dồi kiến thức, kỹ năng để mình có được sự ưu tiên cao hơn nha các bạn.

#6. Đôi khi phải đánh đổi

Ở đây mình dùng từ “đôi khi” vì không phải ai cũng đánh đổi và chấp nhận đánh đối.

6 khó khăn có thể bạn sẽ gặp khi theo học ngành CNTT

Thứ nhất là về sức khỏe, mình từng thức tới 3-4 giờ sáng để học và ôn thi rồi hôm sau thì mệt nhoài, người gầy gò ốm yếu.

Thứ hai là các mối quan hệ, thời gian giành cho mọi người xung sẽ giảm đi, đặc biệt là khi bạn tập trung vào công việc. Dẫn đến đôi khi bạn cảm giác mình bị trầm cảm, mặc cảm với thế giới rồi dần thu mình lại bên chiếc máy tính.

Và còn rất nhiều hệ lụy khác nữa, để khắc phục và không chấp nhận đánh đổi bạn phải luôn biết cân bằng giữa công việc, học tập và cuộc sống.

Điều này không phải dễ nhưng không phải là không làm được. Chỉ cần bạn lên kế hoạch và quyết tâm thực hiện rồi bạn cũng sẽ tạo ra các thói quen tốt thôi.

#7. Kết luận

Vâng, trên đây là những khó khăn mà hầu hết những anh em theo học ngành IT sẽ phải đối mặt.

Những gì mình chưa sẽ mình biết chưa phải là tất cả, song nó cũng là những khó khăn rõ ràng nhận thấy nhất mà bạn sẽ phải chấp nhận đối diện khi học IT.

Ông nào đang trong nghề thì chia sẻ tiếp những khó khăn mà các ông đang gặp phải để anh em cùng thảo luận thêm nhé ◔◡◔

Hi vọng các bạn sẽ vượt qua được hết và trở thành một kỹ sư công nghệ thông tin giỏi. Hẹn gặp các bạn trong bài viết tiếp theo nha.

Bài viết gốc được đăng tải tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm Tuyển dụng it hấp dẫn trên TopDev

Hướng nghiệp CNTT – Định hướng nghề nghiệp cho các bạn trẻ

Hướng nghiệp CNTT là một trong những vấn đề quan trọng giúp các bạn trẻ cho niềm đam mê với CNTT có thể đưa ra lựa chọn chính xác để theo nghề.

Hướng nghiệp CNTT

Thời đại công nghệ 4.0 lên ngôi, kéo theo phát triển bùng nổ của Công nghệ Thông tin. Nhiều ngành nghề, dịch vụ, thị trường cũng được công nghệ hóa để phù hợp với nhu cầu sử dụng của xã hội ví dụ như ngành giáo dục – giáo dục điện tử, tài chính – tài chính điện tử,  ngân hàng – ngân hàng điện tử… tất tần tật đều được lồng ghép công nghệ, hiện đại hóa để trở nên ngày một tiện dụng.

Như một kết quả hiển nhiên, bên cạnh sự bùng nổ công nghệ ấy thì định hướng nghề nghiệp của các bạn trẻ hiện nay cũng có xu hướng công nghệ hóa theo. Giới trẻ hiện nay chính là tầng lớp có tỷ lệ tiếp cận và học hỏi công nghệ nhanh nhất, hầu như các bạn trẻ từ lứa tuổi 15 – 35 tuổi đều sử dụng thành thạo các thiết bị công nghệ.

  "Ngành IT này học rất dễ, tài liệu ko bao giờ thiếu. Quan trọng là phải có đam mê và chịu cày"

Chính vì thế Công nghệ Thông tin chắc hẳn sẽ là một ngành thu hút nhiều bạn trẻ, tuy nhiên ngành Công nghệ Thông tin không phải là một ngành dễ dàng, ngành này đòi hỏi người học phải có tư duy, logic tốt và cả niềm đam mê với ngành nghề thì mới thật sự phát triển được về lâu dài chính vì thế các bạn trẻ đừng quên tham khảo về các bài viết về hướng nghiệp CNTT.

Để có thể có cái nhìn tổng quan hơn về ngành, bài viết dưới đây TopDev sẽ chia sẻ với bạn đọc một số thông tin cơ bản về ngành Công nghệ Thông tin, hướng nghiệp CNTT, định hướng nghề nghiệp và các bằng cấp quan trọng, có giá trị trong ngành.

Ngành học Công nghệ Thông tin là gì?

Hướng nghiệp CNTT

Công nghệ Thông tin là gì?

Để có thể hiểu được Công nghệ Thông tin là gì thì bạn cần nắm rõ 2 khái niệm thông tin là gì và công nghệ là gì trước!

Thông tin sẽ phản ánh sự vật, sự việc, hiện tượng của thế giới xung quanh và các hoạt động con người trong đời sống xã hội. Thông tin còn là tất cả những gì đem lại sự hiểu biết cho con người về thế giới. 

Ví dụ như khi bạn nhìn thấy một con mèo màu đen thì đấy gọi là thông tin, hoặc các bạn nhìn thấy một người bị vấp ngã thì đấy cũng gọi là thông tin được phản ánh vào bộ não của bạn để bạn biết được là người đó đang bị ngã. 

Lấy thêm một ví dụ khác về ngành nghề đặc thù như ngành tài chính, ngành này chủ yếu phân tích và chuyên làm việc với các con số, các con số cũng là 1 nhánh nhỏ của thông tin. Ngành nhân sự, chuyên làm việc với con người, quản trị con người và con người cũng là một phần của thông tin.

Công nghệ Thông tin học những gì?

Đơn giản và dễ hiểu, học Công nghệ Thông tin là học các phương pháp để xử lý thông tin, bao gồm tất cả các thông tin vừa được nêu ở ví dụ trên.

Ngành Công nghệ Thông tin được xem là một nhánh của kỹ thuật sử dụng máy tính và phần mềm máy tính để xử lý thông tin, các phương pháp xử lý thông tin như chuyển đổi, lưu trữ, bảo vệ, khai phá thông tin, truyền tải, thu thập… Có thể hiểu theo cách đơn giản hơn ngành Công nghệ Thông tin là sử dụng công nghệ để xử lý thông tin.

Sau các khóa học Công nghệ Thông tin – Hướng nghiệp CNTT bạn sẽ được trang bị đầy đủ các kỹ năng để xử lý thông tin, chế tạo, sử dụng công nghệ máy tính, phần cứng, phần mềm, công cụ… để truyền thông tin (sự kiện, nội dung, hình ảnh, âm thanh…) để vận chuyển, truyền đạt thông tin đến User một cách tối ưu nhất.

Có thể nói hành vi lướt web, xem youtube, sử dụng mạng xã hội của bạn là minh chứng cho sự thành công của nền công nghệ thông tin trong 10 năm trở lại đây. Việc đăng tải thông tin lên web, youtube, mạng xã hội tuy đơn giản đối với người dùng nhưng để có thể làm được những điều đó các lập trình viên đã phải hoạt động và nâng cấp rất nhiều các nền tảng đó.

  Các vị trí tuyển dụng ngành IT khiến nhà tuyển dụng đau đầu

Hướng nghiệp CNTT

Đó là mình chứng cho các thành quả của Công nghệ Thông tin và quá trình để tạo nên được thành quả đó là đến từ những người học Công nghệ Thông tin. Họ sẽ phải xây dựng hệ thống Bigdata, hệ thống vận hành, Sever. Web…để có thể đem đến cho người dùng các sản phẩm công nghệ tiên tiến hơn.

Ngành Công nghệ Thông tin rất đa dạng các ngành nghề, kỹ năng và cấp bậc học, tùy theo nhu cầu công việc hoặc nhu cầu trao dồi thêm kiến thức mà các bạn có thể chọn học ở cấp độ khác nhau. 

Tại Việt Nam, hướng nghiệp CNTT của các bạn trẻ thường hướng đến các cấp độ từ thấp đến cao như Cử nhân, Thạc sĩ, Tiến sĩ.

Tốt nghiệp Công nghệ Thông tin ra làm gì?

Sau khi tốt nghiệp ngành Công nghệ Thông tin, còn tùy vào chuyên ngành mà bạn theo mà có thể làm các nghề như:

IT security – An ninh mạng/ Bảo mật Công nghệ Thông tin

An ninh mạng có vai trò bảo vệ các thông tin trên mạng, nền tảng hệ thống, fix bug để tránh bị rò rỉ thông tin. Đối với nhánh ngành này, bạn sẽ được đào tạo bài bản cho việc phòng chống tội phạm mạng, các xác định bug, sửa bug và truy tìm dấu vết….

Các cơ quan trực thuộc Chính phủ, Quân đội hoặc các tổ chức/ doanh nghiệp lớn sử hữu lượng data khủng hoặc đơn giản là các doanh nghiệp có nhu cầu bảo mật thông tin thì đều cần đến các nhân viên IT security.

Các vị trí tuyển dụng IT Security

System Administrator – Quản trị hệ thống

Quản trị hệ thống là quá trình quản lý, duy trì và giám sát hệ thống máy tính và mạng trong một tổ chức hoặc doanh nghiệp. Những người làm công việc này được gọi là quản trị viên hệ thống. Vai trò của họ là đảm bảo rằng hệ thống hoạt động ổn định, an toàn và hiệu quả.

Game Development – Phát triển Game

Ngành này là một nhánh nhỏ của ngành phát triển phần mềm. Vai trò của một nhà phát triển Game là sử dụng các ngôn ngữ lập trình theo yêu cầu để hoàn thành các thành phẩm game 2D, 3D, máy chủ của Game. Các nhà phát triển Game sẽ phải kiêm luôn hầu hết các công việc như tiếp nhận ý tưởng từ team thiết kế hoặc team sự kiện trong Game, sau đó apply tất cả các ý tưởng đó vào Game.

Ví dụ như kết hợp giữa đồ họa và âm thanh, tạo sự kiện trong game, xử lý các tương tác giữa các người chơi trong game, thiết lập logic…

Tìm việc làm cho lập trình Game

Website Applications – Ứng dụng website

Để có thể đảm nhiệm vị trí của một nhà phát triển web, người học cần có hiểu biết về các loại ngôn ngữ, kỹ năng để có thể cho ra một sản phẩm Web phù hợp với yêu cầu của công ty/ khách hàng.

Artificial Intelligence – Trí tuệ nhân tạo

Nghề Trí tuệ nhân tạo (Artificial Intelligence – AI) là một lĩnh vực trong ngành Công nghệ thông tin tập trung vào nghiên cứu, phát triển và triển khai các giải pháp thông minh nhân tạo. Các chuyên gia và nhà nghiên cứu trong lĩnh vực này dành thời gian tìm hiểu và phát triển các thuật toán, mô hình máy học và deep learning, xử lý ngôn ngữ tự nhiên, robot học, và các ứng dụng AI khác.

Apps Developers – Phát triển ứng dụng

Thời đại phát triển, tỷ lệ người dùng điện thoại thông minh ngày càng cao thế nên ngành này cũng là một ngành đang hot tại Việt Nam. Vai trò khi đảm nhiệm vị trí của các Apps Developers là tạo ra các ứng dụng trên điện thoại di động ví dụ như game hoặc bất kỳ các ứng dụng nào được sử dụng trên điện thoại.

Software Engineer – Kỹ sư phần mềm

Kỹ sư phần mềm là một người chuyên về phát triển và xây dựng các phần mềm có chất lượng cao. Đây là một trong những vai trò quan trọng nhất trong lĩnh vực Công nghệ thông tin (CNTT). Software Engineer thường tham gia vào quá trình phát triển phần mềm từ giai đoạn thiết kế, triển khai, kiểm thử đến bảo trì và cải tiến.

topdev

Tham khảo các vị trí tuyển dụng cho lập trình Software tại Topdev

Cơ hội nghề nghiệp

Mức lương

Đối với ngành Công nghệ Thông tin, sau khi ra trường bạn sẽ có rất nhiều cơ hội việc làm trong nhiều lĩnh vực khác nhau từ kinh doanh, tài chính, giáo dục, du lịch, viễn thông đến các ngành như y tế, ngân hàng… Tùy theo lĩnh vực mà bạn yêu thích mà có thể tập trung phát triển thế mạnh về nó.

Ngoài ra, mức lương của IT cũng khá cao so với mặt bằng chung, cụ thể là ở vị trí Fresher, Junior, Senior,… đều có mức lương nhỉnh hơn so với các ngành khác dù là cùng level. Cơ hội làm việc ở nước ngoài lớn vì nhu cầu tuyển dụng ngành IT không chỉ gói gọn ở Việt Nam, các nước như Hàn, Nhật cũng mở rộng cơ hội, tìm kiếm nguồn lực ở nước ta với mức lương cao.

Nếu bạn là một người không thích sự trói buộc ở các công ty, thì ngành IT cũng có thể hoàn toàn đáp ứng được sở thích của bạn vì với ngành này bạn có thể làm việc Freelancer – có nghĩa là bạn sẽ nhận dự án, hoàn thiện dự án, sau đó nộp lại bên phía khách hàng.

Các bằng cấp có giá trị của Công nghệ Thông tin

Trong ngành này, bằng cấp thật sự không quan trọng bằng kỹ năng, định hướng, hướng nghiệp CNTT của bạn. Tuy nhiên nếu bạn có một hoặc nhiều những bằng cấp được liệt kê dưới đây có lẽ các nhà tuyển dụng sẽ đánh giá bạn khá cao đấy.

Dưới đây là list các bằng cấp có giá trị cao, để đạt được những chứng nhận này chứng tỏ bạn là một người có tư duy và kỹ năng tốt trong ngành.

  • Chứng nhận trong quản trị doanh nghiệp Công nghệ Thông tin (Certified in the Governance of Enterprise IT – CGEIT)
  • Chứng nhận AWS cho kiến trúc sư giải pháp (AWS Certified Solutions Architect – Associate)
  • Chứng chỉ Project Management Professional (PMP)
  • Bằng AWS Certified Developer – Associate
  • Chứng nhận chuyên gia bảo mật hệ thống thông tin (Certified Information Systems Security Professional – CISSP)
  • Chứng nhận trong kiểm soát hệ thống thông tin và rủi ro ( Certified in Risk and Information Systems Control – CRISC)
  • Chứng nhận quản lí bảo mật thông tin (Certified Information Security Manager – CISM)
  • Chứng nhận ScrumMaster
  • Chứng nhận Hacker (Certified Ethical Hacker – CEH)
  • Bằng đai xanh Six Sigma
  • Chứng chỉ Citrix Certified Professional – Virtualization (CCP-V)
  • Chứng chỉ Microsoft Certified Solutions Expert (MCSE) – Cơ sở hạ tầng máy chủ
  • Chứng chỉ kiểm toán viên hệ thống thông tin (CISA)
  • Chứng nhận Cisco Certified Network Professional (CCNP) Routing và Switching
  • Chứng chỉ Citrix Certified Associate – Networking (CCA-N)

Vai trò của Công nghệ Thông tin đối với cộng đồng, xã hội

Trong thời kỳ hiện đại hóa công nghiệp hóa như hiện nay, hướng nghiệp CNTT – Công nghệ Thông tin là một ngành không thể thiếu và nắm giữ vai trò quan trọng trong việc phát triển, nâng cao chất lượng công việc, gia tăng năng suất làm việc, giúp quản lý tốt các vấn đề của doanh nghiệp, hỗ trợ vận hành trong nhiều ngành nghề, nâng cao trải nghiệm sống của con người… và rất nhiều vai trò khác nữa.

  Sinh viên CNTT làm thế nào để học tốt ở trường đại học?

  Chín thói quen xấu cần bỏ nếu muốn theo ngành CNTT

Vai trò của Công nghệ Thông tin trong đời sống

Nhờ sự phát triển nhanh chóng của Công nghệ Thông tin mà các bạn có thể dễ dàng tìm kiếm, lựa chọn các kênh giải trí như mạng xã hội, youtube, chơi game, nghe nhạc… để giải tri.

Ngoài ra bạn cũng có thể kết nối, trò chuyện, chia sẻ hình ảnh, âm thanh, video call với bạn bè người thân hoặc làm quen bạn mới thông qua các sản phẩm Công nghệ Thông tin như các mạng xã hội, các phương tiện kết nối khác như viber, skype, telegram, zalo… dù bạn đang ở bất cứ đâu.

Vai trò của Công nghệ Thông tin trong ngành Giáo dục

Không thể nào chối bỏ những hiệu quả mà Công nghệ Thông tin đã đem lại cho ngành giáo dục, rất nhiều sản phẩm Edtech đã ra đời để hỗ trợ và phần nào nâng cấp, thay thế 1 số chức năng lạc hậu của nền giáo dục truyền thống.

Ứng dụng công nghệ vào việc giảng dạy giúp học sinh nhanh chóng nắm rõ được kiến thức, tiếp cận với các thông tin giáo dục, kiến thức sâu hơn, tốt hơn, tiết kiệm thời gian hơn.

Ví dụ như đối với phương pháp giảng dạy cũ, các giáo viên sẽ mất khá nhiều thời gian cho việc viết bảng thì hiện nay có thể thay thế điều đó bằng cái slide trình chiếu vừa giúp tiết kiệm thời gian viết bảng vừa có thể chèn thêm vào các hình ảnh, video minh họa sinh động hơn.

Hướng nghiệp CNTT

Bên cạnh đó các nền tảng hỗ trợ quản lý nhà trường, nền tảng giáo dục thông qua Internet cũng rất hữu ích như các khóa học online, người dùng có thể tự nâng cao kiến thức ngay tại nhà.

Vai trò của Công nghệ Thông tin trong ngành Y tế

Công nghệ Thông tin còn ứng dụng được trong cả ngành y tế, giúp tự động hóa các quá trình xét nghiệm, khám chữa bệnh. Hệ thống y tế còn hỗ trợ bệnh nhân rà soát các vết thương nội mà khó có thể xác định bằng phương pháp khám thông thường, đo lường tỷ lệ, chuẩn đoán tình trạng bệnh tật của bệnh nhân… Đối với các ứng dụng công nghệ cao cấp hơn thì còn giúp con người trong việc giải phẫu bằng máy móc giúp giảm tỷ lệ tử vong.

Ngoài ra, Công nghệ Thông tin còn giúp nâng cấp nền tảng quản lý hồ sơ bệnh nhân, giúp dễ dàng nhanh chóng tìm kiếm hồ sơ bệnh nhân. Các sản phẩm ứng dụng Healtech cũng được cho ra đời với đa dạng các chức năng khác nhau dùng để cải thiện, phục vụ cho đời sống sức khỏe của người dùng.

Vai trò của Công nghệ Thông tin trong ngành Tài chính

Vai trò của Công nghệ Thông tin trong ngành tài chính là sản xuất ra các sản phẩm liên quan đến việc quản lý thông tin trong ngành tài chính, ví dụ hệ thống quản lý thông tin khách hàng, nhân viên, số liệu, phần mềm tính toán số liệu…

Các ứng dụng công nghệ từ các ngân hàng giúp việc kiểm tra số dư trong tài khoản, lịch sử giao dịch, chuyển khoản, nhận lương, trả góp nợ ngân hàng trở nên dễ dàng hơn. Ngoài ra bạn còn có thể thanh toán online…

Ngoài những ngành được nêu trên, Công nghệ Thông tin còn có vai trò rất quan trọng và được ứng dụng trong hầu hết các ngành nghề đang có hiện nay.

Có thể bạn muốn xem thêm:

Xem thêm các việc làm về CNTT hấp dẫn tại TopDev

Sinh viên CNTT làm thế nào để học tốt ở trường đại học?

Tôi vẫn còn nhớ rõ thời điểm này cách đây đúng bốn năm. Khi ấy, tôi và các bạn cùng khoá vừa bước vào giảng đường đại học. Nỗi băn khoăn lớn nhất của tôi vào lúc ấy là câu hỏi trên. Tôi đã từng thấy rất nhiều người tài giỏi xuất thân ngành CNNT, nhưng cũng nghe rất nhiều anh chị than thở về việc học ở đây, học CNTT như thế nào cho đúng. Phải có điều gì tạo nên sự khác biệt, và tôi luôn thôi thúc bản thân mình tìm ra câu trả lời chính xác nhất.

Trong suốt thời gian học CNTT, tôi quan sát những người học trên mình vài khoá, học hỏi từ các bạn bè, và tự rút tỉa từ các kinh nghiệm bản thân. Qua những điều đã học, tôi nhận ra rằng hoàn toàn có thể học tốt ngành CNTT, và điều tạo nên sự khác biệt chính là phương pháp.

Vài hôm trước, có bạn sinh viên khoá dưới hỏi tôi rằng:

“Làm sao để học tốt CNTT?”

Thật thú vị. Bốn năm đã qua, giờ đây tôi gặp lại câu hỏi trên. Đó chính là động lực khiến tôi phác thảo ra bài viết này.

Bài viết này phục vụ cho ai?

Thứ nhất, tôi muốn truyền đạt những kinh nghiệm của mình cho các bạn sinh viên chuẩn bị vào trường. Kể cả các bạn sang năm hai cũng có thể tìm thấy những điều bổ ích ở đây. Các bạn còn rất nhiều cơ hội phía trước.

Ngoài ra, các bạn sinh viên năm ba, bốn vẫn có thể cùng tôi chia sẻ những phương pháp được giới thiệu ở đây. Bởi vì, không có gì là quá muộn để bắt đầu. Hy vọng bài viết này có thể giải đáp phần nào những thắc mắc của các bạn.

Cuối cùng, tôi mong rằng bất kỳ ai đang học tập và làm việc trong lĩnh vực CNTT cũng có thể tham khảo rồi đóng góp ý kiến cho bài viết. Đây là câu hỏi của mọi người, nên tốt nhất là để mọi người cùng tham gia trả lời. Một điều rất thú vị trong ngành CNTT là ứng với mỗi thắc mắc của một người, luôn tồn tại ít nhất một ai đó có thể giải đáp, thế nhưng vấn đề là hai người có thể tìm thấy được nhau hay không.

Tuyển dụng Fresher IT mới nhất cho bạn

Nhưng thật ra, khái niệm học tốt nghĩa là gì?

Chúng ta hãy xét hai sinh viên A và B vừa mới tốt nghiệp. Anh A tốt nghiệp với điểm số tuyệt vời, nhận được rất nhiều bằng khen. Dĩ nhiên, có người sẽ cho rằng anh ta học gạo, rằng anh ta sống chết vì điểm số trong suốt bốn năm rưỡi qua. Trong khi đó, anh B có điểm số không mấy ấn tượng. Anh ấy lý giải rằng thời gian được anh ấy dùng để trui rèn kiến thức chuyên ngành, kể cả những kiến thức bên ngoài phạm vi giảng dạy ở trường, nên anh ấy không quan tâm nhiều đến các kỳ kiểm tra. Dĩ nhiên, cũng có người cho rằng điểm số ấy sẽ khiến anh mất nhiều thời gian hơn đối với nhà tuyển dụng. Thật ra, bạn chỉ cần đạt được thành tích như một trong hai người trên đã là học tốt rồi. Nếu đạt được cả hai, bạn có thể tự hào rằng mình đã học rất tốt.

Ngược lại, vì không có được cả hai điều, bạn trông đợi vào tấm bằng đại học sẽ giúp mình đạt được một mục tiêu nào đó. Thế thì bạn đã học bình thường. Cuối cùng, nếu bạn không có được bất kỳ điều nào trong ba điều kể trên, thì lẽ ra bạn cần suy nghĩ về chúng sớm hơn, và đã phải có một hành động nào đó để xoay chuyển tình thế. Bạn đang ở tình trạng báo động!

Tóm lại, nếu không được như anh A hay anh B, bạn đã không học tốt ngành CNTT.

3 nguyên tắc quan trọng cần nhớ

Nếu phải đúc kết toàn bộ kinh nghiệm để thành công khi học CNTT bằng một từ duy nhất, nhiều người sẽ không ngần ngại trả lời: “học nhóm”. Hoàn toàn chính xác. Ngoài ra, bạn cũng cần biết thêm hai nguyên tắc nữa, đó là “tự đánh giá” và “tự học”.

Nguyên tắc #1: Những ích lợi của học nhóm 

Học nhóm (group-study) được đề cập rất nhiều ngay từ thời chúng ta còn học phổ thông. Nhưng vào thời điểm đó, học nhóm hay không học nhóm, điều đó không mấy khác biệt. Có khác biệt chăng là ta có nhiều cơ hội để chơi đùa với bạn bè hơn 😎 Nhưng ở môi trường đại học, đây là yếu tốt vô cùng quan trọng.

Hầu hết mọi sinh viên chúng ta đều chơi trong ít nhất một nhóm bạn nào đó. Hiểu một cách đơn giản, bạn bè là những người có chung một sở thích, suy nghĩ nào đó khiến họ kết hợp lại với nhau. Chúng ta có thể nhận ra có những hình thức kết bạn như sau:

Xét về quê quán, có nhóm Quảng Nam, nhóm Tiền Giang, nhóm Sài Gòn…
Xét về nơi ở, có nhóm Ký Túc Xá, nhóm ở chung phòng trọ,…
Xét về trường phổ thông, có nhóm Lê Hồng Phong, nhóm Năng Khiếu,…
Xét về giới tính, có nhóm các bạn nữ, nhóm các bạn nam.
Xét về giải trí, có nhóm đá banh FIFA, nhóm đánh War Craft, nhóm bắn Half Life…
Xét về ăn uống, có nhóm Lẩu dê, nhóm Lẩu Cá kèo, nhóm Bia hơi…
Xét về tình cảm, có nhóm những bạn đang yêu nhau, nhóm những bạn đang tìm hiểu
nhau…
Xét về sinh hoạt xã hội, có nhóm Mùa hè xanh, nhóm làm web, nhóm Cán bộ Đoàn…
Ngoài ra, có nhóm những người quen nhau lúc vừa vào đại học, nhóm cầu lông, nhóm văn nghệ, nhóm Linux, nhóm xe Su xì po và điện thoại Nó kìa, vân vân và vân vân.

Tất cả các nhóm trên, nhóm nào cũng có cái hay của riêng nó. Đời sinh viên của bạn cũng nên “nếm trải” qua mùi vị của vài nhóm. Nếu bạn đang ở trong một nhóm nào đó, thì sẽ thật tuyệt vời nếu bạn có thể đưa nhóm mình từ hình thức hiện tại trở thành nhóm những người bạn cùng học tốt CNTT (gọi tắt là nhóm học tốt).

  Đừng lãng phí khoảng thời gian học đại học của bạn!!

  Những cái “khó” khi mới học lập trình

Đạt được điểm số cao không phải là một nhiệm vụ bất khả thi!

Hỗ trợ nhau học tập sẽ đem lại những lợi ích lớn lao cho mỗi thành viên. Thứ nhất, đây là cách thức hiệu quả nhất để bạn có được điểm số cao trong học tập. Có một số người rất thông minh (theo đánh giá của bản thân họ và của những xung quanh), nhưng thi cử lại rất lận đận. Có một số người rất chăm chỉ, nhưng điểm số cũng không được như ý. Bởi vì họ chưa biết cách học và thi cho thật tốt.

Bí quyết đơn giản nhất để có được điểm cao trong các kỳ thi là phải “luyện” thật nhiều. Luyện gì ư? Hãy luyện các đề thi. Bạn có thể tìm thấy đề thi các năm trước ở các tiệm photo trong trường. Xem qua chúng và giải các bài trong đó, với phương châm: nhiều hơn, nhanh hơn và chính xác hơn. Nghe qua thì có vẻ dễ dàng và đơn giản quá, nhưng thật ra không có nhiều người có thể làm được.

Nhiều người hăm hở đi tìm các đề thi cũ ngay từ những tuần đầu tiên của học kỳ. Thế rồi, lòng kiên nhẫn của họ sớm bị thử thách vì có quá nhiều đề thi trong đó. Một bộ đề có từ 5 đến 15 đề. Mỗi đề có từ 4 câu hỏi trở lên, nếu là đề thi trắc nghiệm thì còn nhiều hơn nữa. Nên nhớ rằng một học kỳ lý tưởng (nghĩa là không phải trở nợ môn nào) cũng có ít nhất 7 môn học. Bỏ đi những môn lý thuyết thuần tuý, rồi làm một phép nhân đơn giản, cũng dễ thấy rằng một cá nhân không thể nào giải được phân nửa số lượng đề thi đó. Hơn nữa, làm sao người đó chắc chắn rằng những gì mình giải là đúng. Các bộ đề thi đều không có đáp án (nếu có thì cũng không nên tin tưởng hoàn toàn vào chúng). Và bởi vì phải làm ngày làm đêm mà vẫn chưa hết, họ sẽ không có thời gian để hệ thống hoá, rút ra những kỹ thuật giúp làm bài nhanh hơn. Thế đấy, họ đã làm không nhiều, không nhanh và cũng không chính xác. Rồi đến ngày thi, họ có thể bị sốc vì gặp phải một vấn đề hoàn toàn mới lạ, không làm kịp bài vì không “quen tay”, hay làm rồi mà không biết mình sai hay đúng. Đây cũng là một trong những lý do vì sao điểm số của sinh viên khoa CNTT thường rất thấp. Nếu bạn chỉ trông cậy vào sự thông minh của mình và trông cậy vào sự rộng lượng của giáo viên chấm thi, tức là bạn đã phó thác kết quả học tập của mình cho sự may rủi.

Thay vì vậy, hãy tập hợp thành những nhóm nhỏ và cùng nhau học thi. Từng người trong nhóm sẽ đảm nhận 2,3 môn. Đối với từng môn, người đó sẽ chịu trách nhiệm hệ thống lại kiến thức của toàn môn học, nhấn mạnh những điểm quan trọng. Ngoài ra, cũng cần phải giải hết các đề thi, sau đó chọn lựa những bài tinh hoa nhất rồi đề nghị những người còn
lại giải qua. Như vậy, bất kỳ người nào trong nhóm cũng có cơ hội giải qua tất cả các dạng bài tập. Hiển nhiên, điều quan trọng là làm quen được càng nhiều dạng bài tập càng tốt, chứ không phải số lượng bài tập đơn thuần. Nhưng điều này khó có thể được thực hiện nếu chỉ có một cá nhân duy nhất, bởi vì không thể phân loại được các dạng bài tập
nếu chưa từng giải qua tất cả các bài tập hiện có. Sau đó, những người trong nhóm sẽ trao đổi kết quả với nhau. Điều này sẽ giúp các thành viên biết được mình đã làm đúng hay chưa. Dĩ nhiên, kết quả cuối cùng của nhóm không hẳn đã là kết quả đúng. Nhưng đó chắc chắn là kết quả tốt hơn rất nhiều so với một người. Ngoài ra, cũng phải xét đến yếu tố xác suất. Kết quả của một nhóm 3,4 người thường cũng là kết quả tốt nhất của 200 người cùng một khoá. Vì vậy, bạn sẽ không sợ rằng điểm thi của mình thấp hơn bất kỳ ai.

Hình thức học thi tốt nhất là mỗi người tự giải đề thi ở nhà rồi gặp nhau ở một số buổi. Trong những buổi này, ngoài việc trao đổi kết quả, các thành viên còn chỉ bảo cho nhau những kỹ thuật đặc biệt giúp tăng tốc, hoặc giảm thiểu sai sót khi làm bài. Tôi và các bạn của tôi thường ghi lại các vấn đề này thành các tài liệu rồi trao đổi với nhau. Một lợi ích không thể không nhắc đến của việc cùng học thi là nó sẽ thúc đẩy các thành viên chăm chỉ hơn. Sự ganh đua, hợp tác sẽ giúp mọi người cảm thấy việc giải một số lượng lớn các bài tập trong một thời gian ngắn đỡ nhàm chán hơn so với khi làm một mình.

Nhiều người hay than thở về điểm số của mình, cho rằng do mình còn lười biếng, do khối lượng kiến thức nhiều quá, do đề thi ở đâu đâu… Có lẽ họ đã quên bài học từ thời phổ thông. Làm sao họ đã thi đậu vào ngành CNTT, nếu không phải vì đã chăm chỉ giải các đề thi đại học đến mức thuần thục? Việc thi cử ở đại học cũng không khác mấy, thế mà họ đã sớm ngủ quên trên chiến thắng. Hãy làm các bài tập trong sách, do giảng viên cho, trong các bộ đề. Và hãy cùng làm với những người bạn của mình. Đó là bí quyết đơn giản để có điểm số cao.

Nhóm học tốt giúp tiếp thu kiến thức hiệu quả hơn

Nếu học CNTT hơn bốn năm trời mà chỉ có luyện giải bài tập thì thật còn khổ hơn sống dưới địa ngục. Nhưng bạn đừng quá thật vọng. Theo quan sát của tôi, ngay cả những sinh viên đạt được điểm số cao nhất ở khoa CNTT cũng chỉ dành tổng cộng tối đa là 6 tuần trong một học kỳ để tập trung học thi. Mà một học kỳ có đến 15 tuần, cộng thêm 3 đến 4 tuần dành cho thi cử. Ngoài ra còn chưa kể đến khoảng thời gian nghỉ hè và nghỉ Tết. Như vậy, dù cho thi cử có là sự đối phó đối với bạn, thì bạn vẫn còn rất nhiều thời gian để học và làm những gì mà bạn cho rằng thật sự cần thiết.

Ngoài điểm số, ranh giới giữa một sinh viên học tốt và một sinh viên học chưa tốt còn nằm ở chỗ ai biết tận dụng khoảng thời gian rộng rãi này. Một nhóm học tập hoạt động hiệu quả sẽ giúp các thành viên biết làm đúng việc vào đúng thời điểm.

Chẳng hạn, câu hỏi “Tôi nên học ngôn ngữ lập trình nào đây?” là thắc mắc thường thấy nhất của sinh viên năm một, năm hai. Nếu chỉ có một mình, bạn có thể sẽ loay hoay mãi với câu hỏi này, hoặc sự lựa chọn của bạn là không chính xác, hoặc bạn đã học được đúng ngôn ngữ cần thiết những chưa đạt được đến độ sâu kiến thức. Giáo viên hay những sinh viên khoá trên cũng có thể giúp đỡ, nhưng sẽ không hiệu quả bằng bạn bè cùng giúp đỡ lẫn nhau. Bởi vì người hiểu khả năng của bạn nhất chính là bản thân bạn, người thứ hai là người thường xuyên làm việc với bạn. Người giỏi cách mấy nhưng không hiểu về bạn thì khó có thể đưa ra một lời khuyên phù hợp được.

Thực sự thì rất khó để đưa ra một phương pháp cụ thể để hướng dẫn một nhóm đi đến thành công. Có lẽ cách tốt hơn là tôi nêu ra những kinh nghiệm và những nguyên tắc cơ bản. Thứ nhất, mọi hoạt động phải có mục tiêu rõ ràng.

“Chúng ta sẽ học Java trong học kỳ này” là một mục tiêu. Nhưng chưa rõ ràng. Học Java để làm gì? Làm sao chắc rằng chỉ cần một học kỳ là xong? Học xong rồi thì làm gì tiếp? Học như thế nào đây? Nhiều nhóm bắt đầu với một mục tiêu như trên, nhưng rồi không xác định được những việc làm cụ thể để ràng buộc các thành viên. Thế rồi học kỳ này trôi qua một cách nhanh chóng. Sang học kỳ mới, mục tiêu đổi thành: “Chúng ta sẽ cố gắng học Java trong học kỳ này”. Lại một học kỳ trôi qua. Đến học kỳ kế tiếp, mục tiêu mới sẽ là “Chúng ta sẽ học C# trong học kỳ này”. Repeat … Until 3>5.

“Chúng ta sẽ viết một chương trình tương tự như Address Book của Windows, viết bằng Java”. Đây là một mục tiêu rõ ràng hơn. Do đó, nó có khả năng đưa nhóm đến thành công cao hơn. Nhưng chưa đủ. Cần làm rõ hơn nữa. Cho đến khi nào các thành viên cảm thấy rằng việc học Java cũng thúc ép như việc thi học kỳ, tức là nhóm đã tạo ra được một môi trường hiệu quả cho các thành viên cùng học tập.

Thứ hai, phải kiên trì. Bất kỳ nhóm học tập nào cũng gặp khó khăn, không sớm thì muộn. Có thể là do khó khăn của riêng một cá nhân, chẳng hạn không đủ thời gian, chưa đủ trình độ, không hợp tính,… Cũng có thể cách tổ chức nhóm chưa hiệu quả. Cho dù hoàn cảnh có thật vọng thế nào đi nữa, hãy cố gắng tiến lên. Vì nếu bỏ cuộc, bạn chỉ còn lại hai lựa chọn. Hoặc là tập trung hoàn toàn vào việc học vì điểm số, nó không thú vị lắm đâu. Hoặc là buông xuôi tất cả, nghĩa là cuộc đời sinh viên của bạn đã chấm hết.

Nguyên tắc cuối cùng, nếu một người trong nhóm nản chí, bạn hãy truyền sự kiên nhẫn của mình cho người đó
. Đây là lợi ích lớn nhất và cũng là duy nhất mà việc học một mình không thể có được. Edison từng nói: “Nhiều người bỏ cuộc ngay khi họ ở cách sự thành công một khoảng rất ngắn”. Sự động viên, giúp đỡ, ganh đua lẫn nhau trong nhóm tạo nên động lực mạnh mẽ cho các thành viên. Theo kinh nghiệm của riêng tôi, một nhóm học tập xuất phát từ nhóm những người bạn thân thường dễ xây dựng được những giá trị này hơn.

Hãy liên kết lại

Nếu bạn đang lẻ loi và cảm thấy mình học chưa tốt. Hãy tìm những người bạn. Nếu bạn đang lẻ loi nhưng tin rằng mình đang học tốt, bạn vẫn nên tìm những người bạn để có thể học tốt hơn. Hầu như những nhân vật thành công trong ngành CNTT đều có những người bạn cũng thành công không kém, họ đã từng cùng học tập và làm việc với nhau suốt thời tuổi trẻ: Bill Gates và Paul Allen ở Microsoft, Jerry Yang và David Filo ở Yahoo!,…

Một nhóm học tập hiệu quả được đánh giá qua một tiêu chuẩn duy nhất: nhóm ấy có giúp các thành viên hài hoà cả đối nội (học các môn trong trường và có điểm số tốt) lẫn đối ngoại (học những kiến thức vốn rất rộng lớn trong ngành CNTT). Nói cách khác, nhóm ấy có giúp thành viên học tốt hơn hay không.

Nên nhớ rằng, tập hợp những người học tốt lại với nhau không phải là cách để thành lập nhóm học tốt. Ngược lại, nhóm học tốt là nhóm mà nhờ chơi với nhau, những người bạn trong đó trở thành những người học tốt.

Người đời thường nói: chọn bạn mà chơi. Tương tự, hãy nói cho tôi biết bạn đang chơi với ai, tôi sẽ cho biết bạn có đang học tốt CNTT hay không 🙂 .

  Top 7 phương pháp tự học lập trình tốt nhất dành cho Developer

Nguyên tắc #2: Phải biết tự đánh giá mình

Không ai trong chúng ta lại muốn rằng sau bốn năm rưỡi học đại học, trình độ của mình so với lúc mới vào cũng chẳng khác là bao. Những viễn cảnh đen tối ấy hoàn toàn có thể xảy ra nếu bạn không có khả năng tự đánh giá bản thân mình.

Tự đánh giá có nghĩa là biết mình đang ở đâu. Ngay học kỳ đầu tiên, có thể bạn sẽ cảm thấy thua thiệt so với một số bạn bè. Nhưng đừng than thở rằng trước kia (hồi phổ thông), bạn chưa được chuẩn bị về kiến thức tin học cơ bản, chưa từng học qua lập trình, chưa quen đọc sách tiếng Anh. Cũng đừng nản chí nếu bạn chưa có máy vi tính, chưa tiếp xúc với Internet. Đó là những suy nghĩa tiêu cực và sẽ làm giảm sức phấn đấu của bạn. Mọi sinh viên trúng tuyển vào ngành CNTT đều dựa trên năng lực của họ, hoàn toàn không căn cứ vào điều kiện hay kiến thức chuyên ngành sẵn có. Tất cả được giả định là bắt đầu từ con số 0. Mọi người cùng có một chương trình học, cùng có một lượng thời gian, hoàn toàn bình đẳng như nhau. Nếu bạn chưa có gì, tức là bạn giống như phần đông sinh viên ở đây. Còn nếu bạn đã có sẵn nền tảng về tin học, đấy là một thuận lợi nhất định, nhưng không bảo đảm bạn sẽ học tốt hơn những người không có sự thuận lợi ấy. Xin nhắc lại, hoàn toàn không có sự bất lợi giữa những sinh viên khi mới vào đại học. Dĩ nhiên, ở đây tôi không xét đến những trường hợp đặc biệt khó khăn về tài chính, những bạn sinh viên này thật sự cần sự trợ giúp từ nhiều nguồn khác nhau.

Tự đánh giá còn có nghĩa là biết được bản thân mình cần gì và không cần gì. Một năm học đại cương có thể làm bạn lo lắng không biết mình cần chuẩn bị gì để bước vào chuyên ngành. Đúng là chương trình đại cương không có những môn học mang tính chuẩn bị hoặc định hướng cho sinh viên. Như đã nói, đây là lúc bạn nên cùng với những người xung quanh để hỗ trợ nhau tìm ra hướng đi cho chính mình. Bạn nên tìm hiểu từ sách báo, từ giảng viên, từ những sinh viên khóa trước. Nhưng quan trọng là bạn phải dám đưa ra một quyết định chính xác mình sẽ chọn lựa hướng đi nào. Sau đó hãy cố gắng thực hiện nó, nếu cùng với những người bạn khác thì càng tốt. Có thể vài lần thất bại mới có thể giúp bạn tìm ra được điều mà mình thực sự cần. Trong phạm vi hiểu biết của tôi, đó là cách tốt nhất để thực hiện.

Nhưng quan trọng hơn là biết nhận diện những gì thực sự không cần thiết và gạt hẳn chúng sang một bên. Ngành CNTT có rất nhiều lĩnh vực, muốn chuyên sâu vào một lĩnh vực đòi hỏi rất nhiều thời gian và công sức. Không chỉ riêng sinh viên CNTT, mà hầu như rất nhiều bạn trẻ Việt Nam có khuynh hướng ôm đồm mọi thứ, kết cuộc là không tinh thông được thứ nào. Tinh thông ở đây có nghĩa là làm được việc trong lĩnh vực đó, hoặc có thể thích ứng nhanh với lĩnh vực ấy khi cần thiết. Biết nhiều mà chỉ hời hợt thì cũng giống như là không biết gì cả.

Một ví dụ khác, nhiều bạn sinh viên băn khoăn khi nghe nói rằng các trung tập đào tạo lập trình viên quốc tế như Aptech, Informatics, NIIT,… có chương trình đào tạo hiện đại và thực tế hơn rất nhiều so với trường đại học. Trong trường không dạy C/C++/C#, Java, SQL Server, ASP, JSP,… thì làm sao mai mốt đi làm được. Nếu suy nghĩ như vậy tức là bạn đã chưa tự đánh giá đúng trình độ của mình. Bạn đang được đào tạo để trở thành kỹ sư, trong khi những nơi kia đào tạo các kỹ thuật viên. Không có cấp bậc nào là “cao cấp” hơn, bởi vì chúng phục vụ cho những mục đích hoàn toàn khác nhau. Các trung tâm đào tạo bạn cách sử dụng công cụ, còn trường đại học đào tạo bạn suy nghĩ về công cụ và tạo ra công cụ. Dĩ nhiên, bạn phải biết cách sử dụng công cụ trước. Nhưng những kiến thức này được giả định là bạn phải biết và không có môn học cụ thể nào về chúng. Nếu bây giờ bạn chưa biết thì phải tự học để mà biết. Trong trường hợp bạn không thể tự học, mà nhất định phải đi học ở các trung tâm, có thể bạn đã ôm đồm nhiều thứ một lúc. Đó là tình trạng mà báo chí thường than phiền: thầy không ra thầy, thợ không ra thợ.

Ngoài ra, tự đánh giá cũng có nghĩa là biết nhìn nhận mọi sự việc theo đúng bản chất của nó. Bởi vì kiến thức trong ngành CNTT thật rộng lớn mà trình độ của mọi sinh viên khi mới vào trường thì đều chưa cao, nên các sinh viên thường hay bị dao động bởi cái gọi là “nghe nói rằng”. Chẳng hạn:

– Nghe nói rằng C++ rất khó nên chưa dám học. Nghe nói rằng Java chạy rất chậm nên chưa muốn học.
– Nghe nói rằng phần cứng rất “chua”, lại không bảo đảm việc làm trong tương lai nên không muốn quan tâm. Nếu buộc phải học thì học một cách hời hợt.
– Thậm chí, nghe nói rằng đề thi cuối kỳ sẽ lấy từ sách này nên đổ xô đi mua cuốn sách ấy.
Thật hài hước phải không. Bạn đang học ngành công nghệ thông tin. Thông tin là những gì có thể tăng sự chắc chắn về một vấn đề nào đó. Nhìn sâu xuống dưới, thông tin được thể hiện bằng hai con số: 0 và 1 (không và có). “Nghe nói rằng” là những gì hoàn toàn không chắc chắn. Đừng để chúng điều khiển bạn.
Một biểu hiện quan trọng của tự đánh giá là phải biết lắng nghe và đưa ra ý kiến của mình. Biểu hiện của người thiếu tự tin là không dám nghe người thực sự am hiểu nói (mà chỉ quan tâm đến những cái “nghe nói rằng”), trong khi biểu hiện của người tự mãn là luôn nhận định đúng hoặc sai ngay khi người khác chưa trình bày xong vấn đề. Ví dụ mẩu đối thoại sau:
A : đoạn mã này có thể được viết bằng Java…
B : không thể nào, bởi vì một chương trình viết bằng Java chạy chậm hơn viết bằng C++ đến 10 lần, phải viết bằng C++.
A (chưa kịp nói) : bởi vì thời gian để thực hiện đoạn mã này chỉ chiếm 10% tổng thời gian thực hiện chương trình nên nó không nhất thiết là nơi cần phải tối ưu hóa tốc độ. Hơn nữa, nó được chạy trên máy chủ có tốc độ nhanh gấp 10 lần so với máy thường. Cuối cùng, đối với đoạn mã này thì dùng Java có thể rút ngắn thời gian viết code và debug hơn so dùng C++ xuống còn phân nửa.

Trong cả hai trường hợp, không biết lắng nghe sẽ làm cho bạn không tiếp thu được kiến thức từ những người khác. Ngược lại, khi đã lắng nghe xong, bạn phải có ý kiến của riêng mình. Một phong cách đáng chán của sinh viên khoa CNTT (tôi phải thừa nhận là mình cũng nằm trong số này) là không bao giờ phát biểu, dù chỉ là đúng hoặc sai, khi giảng viên hỏi. Tôi còn nhớ một lần thầy giáo hỏi: “Ai cho rằng cách này đúng?”. Có khoảng 5% giơ tay. “Ai cho rằng cách này sai?”. Cũng có khoảng 5% giơ tay, trong đó 2,3% là những người đã giơ tay lần đầu ;-0 Hơn 90% còn lại là cả một sự bí hiểm!
Có thể bạn không biết gì cả, hoặc đã biết những không thèm giơ tay vì chúng quá tầm thường. Khi đó, nên nghĩ lại xem bạn có mặt ở lớp học làm gì, bởi vì kiến thức quá cao siêu hoặc quá tầm thường đều cho thấy bạn đã không thích hợp với chúng. Ngược lại, nếu chỉ vì bạn đã đánh giá sai về chúng, thì hãy tự đánh giá lại cho chính xác.

Cuối cùng, tự đánh giá có nghĩa là biết nhận lấy thất bại. Khó có ai học suốt 4 năm trời mà chưa bao giờ bị điểm dưới trung bình, cũng có khi bạn thua kém bạn bè ở chính sở trường của mình, hoặc liên tiếp nhận các thất bại khiến bạn nghi ngờ khả năng của mình. Tôi đã từng học môn lý A1 đến 3 lần mới qua được. Tôi vẫn có nhớ cảm giác chua xót khi bạn bè tung tăng chuẩn bị vào chuyên ngành thì tôi vẫn phải lầm lũi làm luận án “tiến sĩ” về Lý A1. Hay như người bạn của tôi đã từng rớt môn Giáo dục quốc phòng, môn học mà ai-cũng-cho-rằng-không-thể-rớt. Nhưng chúng tôi đều có điểm chung là cảm thấy mạnh mẽ hơn sau những cú ngã tê tái đó.

Khả năng của một người là khái niệm vô hình, chỉ có thể đánh giá qua các kết quả cụ thể. Điều gì quyết định đến kết quả? Đó là phong độ và đẳng cấp của bạn. Chẳng hạn, phong độ trong một ngày thi sẽ ảnh hưởng phần nào đến kết quả bài thi hôm đó. Nhưng phần lớn là do đẳng cấp của bạn trong môn đó. Phong độ có thể thay đổi theo từng ngày, có thể do thời tiết, do người yêu của bạn, do ngày hôm trước có trực tiếp bóng đá,… Nhưng đẳng cấp thì chỉ tiến hoặc lùi sau một thời gian tương đối dài. Trở lại ví dụ trên, có thể trong một ngày xui xẻo, phong độ làm bài thi tệ hại đã xóa sạch đẳng cấp cao vốn có của bạn. Bạn phải nhận điểm thấp. Bạn cũng phải biết đánh giá đúng bản chất của thất bại, bởi vì:

Phong độ là nhất thời, đẳng cấp mới là mãi mãi .

Sau đó hãy nhận lấy thất bại, từ đó bạn sẽ biết cần cải thiện phong độ hay đẳng cấp của mình. Còn nếu bạn vẫn ủ rũ chẳng biết làm gì, hoặc ngược lại, bạn cố nghĩ ra những lý do khách quan để không phải nhìn vào thực chất vấn đề, có thể bạn sẽ nhận thêm một kết quả tồi tệ hơn thế nữa.

Tóm lại, bạn cần phải biết mình đang đứng ở đâu và nên đi về hướng nào. Có như vậy bạn mới xác định được mình vừa tiến bộ hay thụt lùi. Tất cả những điều trên hoàn toàn là do bạn tự đánh giá lấy.

Nguyên tắc #3: Tự học để đi tiếp con đường phía trước 

Nếu chỉ xét khoảng thời gian bốn năm rưỡi (hay nhiều hơn?) học CNTT, tự học chưa hẳn là yếu quan trọng nhất. Nhưng nếu xét đến cả một sự nghiệp trong thời gian dài, đây là điều phải nêu đầu tiên.

Đặc thù của ngành CNTT là kiến thức thay đổi rất nhanh. Phần cứng, cụ thể là vi xử lý, phát triển theo định luật Moore, cứ mỗi 18 tháng thì tốc độ CPU tăng gấp đôi. Đây là sự phát triển cực nhanh nếu so với những ngành nghề khác. Nhưng đó cũng chưa phải là lĩnh vực có tốc độ phát triển nhanh nhất. Phần mềm còn phát triển nhanh hơn, bởi vì bạn luân thấy phần cứng ra đời là để đáp ứng nhu cầu của phần mềm ;-> Internet cũng là một môi trường phát triển chóng mặt.

Bạn làm gì để theo kịp tốc độ đó? Chỉ có thể là tự học.

Nhà trường chỉ có thể hỗ trợ cho bạn phần nền tảng (mặc dù hiện tại nhà trường cũng phải cải cách nhiều mới có thể thực hiện được đầy đủ nhiệm vụ này), còn bạn phải tự hướng dẫn mình đi trên con đường riêng.

Trở lại vấn đề thắc mắc muôn thuở của sinh viên, những kiến thức như C++, Java, ASP, JSP, PHP, Access, SQL Server… là phải tự học.

Ngoài ra, kỹ năng làm việc nhóm, kỹ năng giao tiếp, anh văn chuyên ngành,… cũng phải tự học là chính. Nhà trường chỉ có thể hỗ trợ phần nào.

Nhìn chung, có hai nhóm kiến thức bạn cần phải tự học. Thứ nhất, đó là những kiến thức được giả định là bạn phải biết. Những điều tôi vừa liệt kê ở trên nằm trong nhóm này. Thứ hai, đó là những kiến thức mà không một ai có thể dạy bạn. Không ai khác có thể chỉ rõ từng bước để bạn có thể nghiên cứu ra một công trình khoa học hoàn toàn mới, không ai khác có thể rèn luyện cho bạn kỹ năng lập trình thuần thục, không ai khác có thể giúp bạn mọi việc để dựng nên một công ty tin học,… Người đó chỉ có thể là bạn.
Ở giữa hai nhóm trên, đó là những kiến thức mà nhà trường sẽ trang bị cho bạn.

Nhưng phải tự học thế nào? Bạn là người thầy giáo tốt nhất, và sách (cùng với Internet, CD, thư viện…) là phương tiện để người thầy đó truyền đạt kiến thức cho bạn.

Một số người nhìn vào các giáo trình tin học dày cộm và lắc đầu: “Tôi không đọc nổi!”. Đúng vậy, không một ai có thể đọc nổi những cuốn sách đó theo cách mà họ nghĩ: đọc toàn bộ từ đầu đến cuối trong một thời gian ngắn rồi thôi. Trong số lượng nhỏ nhoi những cuốn sách tin học mà tôi đã từng đọc, phải thành thật thừa nhận rằng chưa có cuốn nào mà tôi đọc trọn vẹn cả, tức là đọc không sót đoạn nào, giống như đọc tiểu thuyết vậy. Tôi chỉ đọc những phần mà tôi cảm thấy cần thiết vào thời điểm đó, và ít khi nào tôi đọc ngấu nghiến một cuốn sách. Ngoài ra, tôi cũng thường xuyên phải xem lại những sách mà mình đã đọc qua bởi vì có thể ở những lần đọc sau này, tôi mới hiểu ra được vấn đề mà sách muốn trình bày.

Dĩ nhiên, việc tự học sẽ chỉ hiệu quả nếu tìm được những cuốn sách tốt. Cách đọc sách và tìm sách để đọc là một vấn đề không đơn giản, tôi sẽ tổng hợp lại trong một tài liệu khác, đi kèm với tài liệu này. Chỉ lưu ý rằng bạn đừng theo quán tính của một số người, luôn than thở rằng thiếu thốn tài liệu, thiếu tiền bạc để mua tài liệu nên không thể tự học được. Không, hoàn toàn không phải như vậy, cái mà họ thiếu chính là tinh thần ham học hỏi và một lòng dũng cảm để thừa nhận sự thiếu thốn đó.

Nhớ rõ 3 nguyên tắc trên: Ngay từ bây giờ, bạn hãy tìm những người bạn có cùng suy nghĩ với mình về nguyên tắc:

Group-study – Học nhóm
Self-assessment – Tự đánh giá
Self-study – Tự học

Rồi hãy cùng nhau thực hiện.

5 căn bệnh phổ biến ở khoa CNTT

Học CNTT không phải là việc dễ dàng. Nếu không cẩn thận, bạn dễ mắc phải các căn bệnh sau đây.

Bệnh than

Đây không phải là căn bệnh từng gieo rắc kinh hoàng cho nước Mỹ, mà là bệnh than thở. Hầu như mọi sinh viên học CNTT đều mắc bệnh này. Hãy nghe họ than thở những gì:

– Than rằng học ở đây chán quá, khó quá, không thiết thực quá. Nhưng họ lại không trả lời được giảng dạy thế nào để họ không chán, không khó, thiết thực hơn. Họ lại thường so sánh với các trường ngoài, trung tâm bên ngoài, và cả nước ngoài. Vậy thì tại sao họ lại ở đây nhỉ?
– Than rằng học mấy năm rồi mà thấy chẳng tiến bộ.
– Than rằng không biết làm gì khi ra trường. Thế thì họ đã làm những gì khi ở trong trường?
– Họ than thở những điều trên từ học kỳ này sang học kỳ khác. Thế hệ sinh viên này đến thế hệ sinh viên khác cũng than thở như vậy.

Bệnh nhát

Thường thì sinh viên than thở về một môn học nào đó thì cũng sẽ gặp ngay môn đó. Chẳng hạn, than rằng phần cứng rất “oải” thì y như rằng sẽ gặp đồ án phần cứng. Lúc này thì bệnh than biến chứng trở thành bệnh nhát.

Mắc bệnh nhát thì không dám làm điều gì đang ở ngay trước mắt. Không làm nghĩa là chết, những vẫn không dám làm. Có thể nói, họ thà chết chứ không chịu hy sinh. Chẳng hạn, vừa nghe nói môn học X này là môn “sát thủ” , họ đã buông súng ngay từ tuần lễ đầu tiên của học kỳ. Thế là rớt, họ lại truyền đạt điều trên cho các đàn em yếu bóng vía, và thật tội nghiệp những em này. Bệnh này lây rất nhanh.

Hoặc, có quá nhiều lựa chọn nên cũng không dám chọn và làm một cái nào. Cuối cùng thì loay hoay mãi không biết mình nên chuyên phần cứng hay phần mềm, nên học C++ hay Java. Nếu họ chịu làm điều gì đó thì dù chưa chọn được đúng ý mình, trong trường hợp xấu nhất họ cũng biết được rằng mình không phù hợp với phần cứng, cũng không phù hợp với C++. Bây giờ thì còn Java để thử tiếp.

Bệnh hời hợt 

Nhưng nếu bị buộc phải chọn lựa do hoàn cảnh thúc ép, họ sẽ làm một cách hời hợt. Chẳng hạn, nhận phải một đồ án xương xẩu, họ nghĩ thôi thì làm qua loa cho xong rồi học kỳ sau sẽ tìm được cái ngon hơn. Ai chắc rằng sẽ có cái ngon hơn, hay lại phải gặp cái mà họ cứ cho rằng là xương xẩu? Làm qua loa thì mãi sẽ không bao giờ thoát được cái vòng luẩn quẩn đó, nó còn tước mất cơ hội để mình thấy được điều đó thật ra cũng không xưởng xẩu như đã nghĩ.

Bệnh hời hợt ngăn cản ta đạt đến đỉnh cao trong một môn học nào đó. Nếu học một môn học mà việc kết quả cao, thấp, đậu, rớt, chương trình học, bài tập lớn không làm bạn có bất kỳ cảm xúc nào, chỉ đơn giản là đã qua được nó, thì bạn đã đánh mất một cơ hội của mình. Cần nhớ rằng, giáo trình học, giảng viên môn học đó có thể chưa làm bạn hài lòng, nhưng bản thân môn học đó là thực sự cần thiết. Học hời hợt chỉ vì không hợp với giảng viên, điều đó có nên hay không?

Bệnh la lối

Bệnh này thường xuất phát từ bệnh hời hợt, nó cũng tương tự như bệnh than nhưng sự bộc phát rất dữ dội. Sau khi loay hoay mãi trong cái vòng luẩn quẩn trên, họ kết tội cái đồ án đã làm hại họ, bộ môn này đã kìm hãm họ, nhà trường đã không tạo môi trường thuận lợi cho họ. Thế mà, họ không nhìn xem những người khác đã làm gì để không rơi vào tình trạng như họ, hoặc những người khác đã làm gì để vượt qua tình trạng đó.

Bệnh la lối là nguy hiểm nhất. Nó hủy hoại người bệnh một cách tàn khốc. Bệnh này cũng khó chữa nhất, nhất là khi nó đã vào thời kỳ cuối.

Bệnh lười

Bệnh này là nguồn gốc gây ra 4 căn bệnh đã kể trên. Lười biếng tức là đã tự đặt mình vào tình thế bị động.
Không thường xuyên làm bài tập sẽ làm cho kết quả thi thấp, thậm chí bị rớt.
Không chịu đọc sách, không chịu mày mò sẽ làm cho kiến thức nghèo nàn đi.
Và thế là mắc phải bệnh than. Cũng vì lười biếng mà bệnh than chuyển thành bệnh nhát, rồi bệnh hời hợt, rồi bệnh la lối. Bệnh lười lại dễ lây nhất. Mình lười biếng sẽ làm cho bạn của mình bị ảnh hưởng theo. Bạn mình siêng năng thì mình cũng siêng năng hơn.

  • Tránh xa những căn bệnh trên
  • Thường xuyên tự chuẩn đoán để biết mình đang mắc phải bệnh gì, rồi tìm cách chữa trị chúng. Nhưng nguyên tắc quan trọng là: phòng bệnh hơn chữa bệnh. Để phòng bệnh, hãy làm như sau:

– Luôn suy nghĩ tích cực, đồng thời chuẩn bị những điều bất lợi sắp tới.
– Khi chúng đến, đánh giá chúng.
–  Chấp nhận chúng.
– Suy nghĩ tích cực để có thể “hưởng thụ” chúng.
– Và tiếp tục như vậy.

Bạn cần có một kế hoạch ngay từ đầu

Việc học tập được hoạch định và tổ chức tốt sẽ giúp ích cho bạn rất nhiều trong suốt thời gian học CNTT. Cụ thể, bạn cần xây dựng cho mình một kế hoạch học tập, trong đó trình bày những mục tiêu mà bạn phấn đấu đạt được, khả năng của bạn, những việc mà bạn cần làm và thời gian dành cho chúng.

Bản kế hoạch này sẽ giúp bạn có phương hướng rõ ràng trong học tập. Nó chỉ cho bạn biết những thứ bạn cần học ở thời điểm hiện tại, điều gì chưa cần quan tâm ngay vào lúc này, nó còn đưa bạn vào một khuôn khổ để bạn chuyên cần hơn. Thiếu bản kế hoạch, bạn dễ bị rơi vào tình trạng hoang mang, chẳng biết học gì, làm gì khi học CNTT.

Đối với những sinh viên có tổ chức, học kỳ bắt đầu từ thời điểm trước đó khoảng hai tuần. Đây là thời điểm họ xây dựng kế hoạch cho học kỳ sắp tới. Ngược lại, đối với những sinh viên chưa có tổ chức, học kỳ mới bắt đầu từ tuần thứ hai hay thứ ba trở đi, thậm chí là tuần thứ bảy (tức là tuần trước khi thi giữa kỳ). Họ không có kế hoạch cho từng môn, để rồi hằng tuần cứ đến lớp rồi về nhà mà không ôn luyện gì cả. Đến lúc gần thi thì mới vắt giò lên cổ mà chạy. Thường thì lúc đó đã quá trễ, kể cả với những người vốn được đánh giá là thông minh nhất, nhưng một người không có tổ chức thì làm sao có thể gọi là thông minh nhỉ?

Kế hoạch và tiến trình công việc phải song hành

Nguyên tắc cơ bản để lập kế hoạch học tập là các bản kế hoạch của bạn phải phản ánh đúng với hoàn cảnh của bạn, có như thế thì chúng mới mang tính khả thi. Một bản kế hoạch đầy đủ chi tiết, cố định ngay từ đầu, rồi bạn phải theo đó mà làm cho đến hết là không phù hợp với hoàn cảnh học tập của sinh viên. Chúng ta chưa đủ khả năng và kinh nghiệm để làm điều này.

Thay vì vậy, bản kế hoạch chỉ nên bắt đầu với những việc chắc chắn, mà theo đó bạn có thể thực hiện ngay và thực hiện một cách trọn vẹn. Sau đó, dựa vào những gì bạn đã làm, bạn sẽ điều chỉnh và bổ sung lại bản kế hoạch. Tóm lại, có Kế hoạch cũng cần được ghi lại trên giấy, hoặc soạn thảo bằng máy vi tính. Thậm chí, nếu bạn biết dùng Microsoft Project thì càng tốt. Nếu chỉ xác định trong đầu, bạn sẽ quên kế hoạch của mình vào một lúc nào đó, và sẽ không có cơ sở để đánh giá lại những gì mình đã làm. Ngoài ra, việc ngồi xuống, phác thảo ra bản kế hoạch của mình sẽ mang lại cho bạn niềm hưng phấn để bắt đầu với công việc mới.hai quá trình song song ở đây.

Nhưng cẩn thận, đừng dành quá nhiều thời gian chỉ để viết kế hoạch mà không làm gì cả. Phần lớn thời gian của bạn là để thực hiện những gì bạn đã hoạch địch. Đừng làm ngược lại.

“Too much scheduling will kill you, if you can’t make up your mind.”

Bạn cần nhiều thông tin cụ thể hơn?

Dự định ban đầu của tôi là viết một tài liệu duy nhất để hướng dẫn các sinh viên khóa sau của mình về những kinh nghiệm học tập mà tôi biết được. Nhưng vấn đề ở chỗ nếu tôi đưa vào quá nhiều chi tiết, tài liệu này trở nên rất dài và rất khó quản lý mỗi khi cần cập nhật. Do đó, tôi quyết định chia ra làm hai tài liệu liên quan đến nhau. Đây là tài liệu thứ nhất, trong đó chỉ nêu những nguyên tắc cơ bản nhất mà mọi sinh viên đều nên biết khi học  CNTT.

Tài liệu thứ hai sẽ thú vị hơn. Nó sẽ chứa đựng những câu hỏi mà các sinh viên thường thắc mắc, kèm theo đó là những câu trả lời xác đáng nhất. Mọi sinh viên đều có thể tham gia đóng góp câu hỏi, câu trả lời vào đây. Tôi cũng mong các giảng viên cũng sẽ tham gia vào đây. Như vậy, sinh viên sẽ tìm được nơi có thể giải đáp những thắc mắc của mình, mà giảng viên cũng không phải mất thời gian trả lời một câu hỏi nhiều lần.

Trong tài liệu thứ hai, tôi cũng sẽ tham gia vào việc trình bày những kinh nghiệm cụ thể. Chẳng hạn, bài viết này chỉ nói đến những nguyên tắc chung của việc học nhóm, tự học, lập kế hoạch, còn những cách làm cụ thể sẽ đưa tôi giới thiệu trong tài liệu thứ hai. Tạm thời, tôi đặt tên tài liệu đó là: DIT – FAQs (hay Những câu hỏi thường gặp khi học CNTT).

Một điều nữa mà tôi cần nói rõ là tài liệu này được viết dưới góc nhìn của một sinh viên. Tất cả những khó khăn, suy nghĩ, cách giải quyết ở đây đều mang ảnh hưởng trên. Có thể bạn sẽ nghĩ: “Vậy khoa CNTT làm gì trong trường hợp này?” khi đọc qua tài liệu này. Nhưng, điều đó hoàn toàn nằm ngoài phạm vi của một sinh viên, tức là nằm ngoài phạm vi bài viết này. Chúng ta cần phải kiến nghị lên trên khi có một vấn đề bức xúc, nhưng giải quyết những kiến nghị đó không phải là trách nhiệm của chúng ta. Thay vào đó, chúng ta nên tập trung vào những gì mà một sinh viên cần làm.

Lời kết

Tôi hy vọng bạn sẽ tìm được điều gì đó bổ ích từ tài liệu này. Dĩ nhiên, việc nén bốn năm rưỡi các kinh nghiệm của nhiều thế hệ sinh viên vào trong 20 trang giấy không phải là điều dễ dàng. Hơn nữa, không phải mọi điều tôi trình bày ở đây đều hoàn toàn chính xác, và thậm chí còn rất nhiều điều chính xác đã bị tôi bỏ sót không đưa vào đây.

Do đó, tôi hy vọng rằng bạn, miễn là bạn đã, đang, và sinh học tập hay làm việc trong lĩnh vực CNTT, bạn có thể đóng góp vào bài viết này. Các góp ý, tranh luận, bổ sung đều được hoan nghênh . Chắc chắn, tôi sẽ thường xuyên cập nhật tài liệu này theo thời gian. Bởi vì, việc học CNTT sẽ rất khác đi qua các thế hệ sinh viên. Nhưng, tôi sẽ chỉ có thể làm điều này nếu nhận được sự ủng hộ từ các bạn.

Các bạn sinh viên có thể tham khảo thêm các việc làm ngành CNTT như fresher python, fresher android, fresher devops từ các công ty HOT nhất nhé!

Bài viết gốc được đăng tải tại Kenhsinhvien

Có thể bạn quan tâm:

Xem thêm việc làm it hàng đầu hot nhất trên TopDev

ĐỐI THOẠI VỚI DOANH NGHIỆP HÀN QUỐC VỀ PHÁT TRIỂN NHÂN LỰC CHẤT LƯỢNG CAO

Chiều 18/7, tại Nhà Điều hành ĐHQG-HCM đã diễn ra tọa đàm “Hợp tác phát triển nguồn nhân lực chất lượng cao: Đối thoại với doanh nghiệp Hàn Quốc” do ĐHQG-HCM tổ chức. PGS.TS Vũ Hải Quân – Giám đốc ĐHQG-HCM, đã đến dự.

Hiệu trưởng ĐHQG Seoul cho rằng các đại học và chính quyền có trách nhiệm quan trọng trong việc trao đổi nhân tài giữa Hàn Quốc và Việt Nam. Ảnh: Thiện Thông

Tạo điều kiện trao đổi nhân tài

Tọa đàm quy tụ lãnh đạo các địa phương TP.HCM, Bình Dương, Bình Phước, Tây Ninh; lãnh đạo các tập đoàn Hàn Quốc lớn hiện đang đầu tư tại Việt Nam như CJ Group Vietnam, Mirae Asset Vietnam, Shinhan Bank, TopDev, LG Vina Cosmetics, Samsung Electronics… Sự kiện còn có sự tham dự của lãnh đạo ĐHQG-HCM, ĐHQG Hà Nội, và đại diện đến từ ĐHQG Seoul (Hàn Quốc) với vai trò là cầu nối, thúc đẩy sự hợp tác giữa các doanh nghiệp Hàn Quốc và các trường đại học tại Việt Nam.

Đây là cơ hội để các bên thảo luận về việc tăng cường hợp tác giữa “ba nhà” (nhà nước, nhà trường, doanh nghiệp) trong phát triển nguồn nhân lực chất lượng cao; xác định giải pháp và các lĩnh vực hợp tác giữa nhà trường và doanh nghiệp Hàn Quốc để thu hẹp khoảng cách giữa đào tạo và nhu cầu thị trường, giải quyết thách thức về hiện trạng thiếu hụt lực lượng lao động tay nghề cao của các tập đoàn Hàn Quốc đang đầu tư tại Việt Nam. Ngoài ra, tọa đàm còn thảo luận về cơ hội hợp tác nghiên cứu, thành lập đơn vị Nghiên cứu và Phát triển (R&D) của các doanh nghiệp Hàn Quốc tại ĐHQG-HCM.

Phát biểu tại tọa đàm, GS Ryu Hong-lim – Hiệu trưởng ĐHQG Seoul, cho biết hạ tuần tháng 6 vừa qua, Tổng thống Hàn Quốc Yoon Suk-yeol đã có chuyến thăm Việt Nam để thảo luận phương hướng hợp tác giữa hai quốc gia về nhiều vấn đề như kinh doanh, văn hóa, cân bằng carbon và chuyển đổi số.

Kể từ thời điểm thiết lập quan hệ ngoại giao vào năm 1992, thương mại song phương giữa hai nước đã chứng kiến bước tăng trưởng kinh ngạc lên gấp 175 lần. Hàn Quốc đã trở thành nhà đầu tư lớn nhất của Việt Nam, và năm nay đánh dấu 31 năm quan hệ ngoại giao giữa đôi bên” – ông Ryu Hong-lim chia sẻ.

Ông cho biết thêm, sinh viên Việt Nam xếp thứ 2 về số lượng sinh viên quốc tế theo học tại Hàn Quốc, điều này cho thấy mối gắn bó chặt chẽ về giáo dục giữa hai quốc gia. Ngược lại, số lượng người Hàn Quốc đến Việt Nam để làm việc và đầu tư không ngừng tăng lên trong một thập kỷ qua, hiện nay có khoảng 170.000 người Hàn Quốc và hơn 8.800 doanh nghiệp Hàn Quốc chuyển hướng đến Việt Nam. Theo đó, ông nhận định việc tạo điều kiện thuận lợi để trao đổi nhân tài giữa hai nước là trách nhiệm quan trọng của các đại học và chính quyền.

PGS.TS Vũ Hải Quân – Giám đốc ĐHQG-HCM, nhấn mạnh sứ mệnh đào tạo nguồn nhân lực chất lượng cao của ĐHQG-HCM. Ảnh: Thiện Thông

Hợp tác doanh nghiệp – đại học

Đại diện ĐHQG Seoul – GS Chae Su-hong cho biết năm 2023, Việt Nam là đối tác thương mại lớn thứ 3 của Hàn Quốc chỉ sau Trung Quốc và Hoa Kỳ. Nói về tính cấp thiết trong hợp tác doanh nghiệp – đại học giữa Hàn Quốc và Việt Nam, ông nhận xét nền kinh tế Việt Nam tập trung vào các ngành sử dụng lao động giá rẻ, nhưng bối cảnh hiện nay yêu cầu chuyển dịch sang các ngành công nghệ. Theo đó, hai quốc gia cần nỗ lực vì tăng trưởng chung, thông qua các hoạt động: chia sẻ và chuyển giao công nghệ, bồi dưỡng nguồn nhân lực chất lượng cao, hợp tác doanh nghiệp – đại học và hợp tác giáo dục.

Tại tọa đàm, các doanh nghiệp Hàn Quốc đã trình bày tổng quan về nhu cầu nhân lực và nêu đề xuất giúp các trường đại học Việt Nam phát triển nguồn nhân lực chất lượng cao. Lãnh đạo chính quyền các địa phương đã có cơ hội đối thoại với các doanh nghiệp và các đại học xoay quanh vấn đề hợp tác phát triển nhân lực đáp ứng nhu cầu của doanh nghiệp Hàn Quốc.

PGS.TS Vũ Hải Quân – Giám đốc ĐHQG-HCM, nhấn mạnh chiến lược phát triển của ĐHQG-HCM, trong đó có sứ mệnh đào tạo nguồn nhân lực chất lượng cao, bồi dưỡng nhân tài, có năng lực dẫn dắt, thúc đẩy sự phát triển kinh tế – xã hội. Điều này cho thấy ĐHQG-HCM đang cố gắng từng bước làm giảm khoảng cách giữa nhu cầu thực tế và công tác đào tạo tại các cơ sở giáo dục đại học hàng đầu quốc gia.

Toàn cảnh tọa đàm. Ảnh: Lê Hoài

Bài viết gốc tại vnuhcm.edu.vn

5 điều gây rò rỉ bộ nhớ (memory leak) trong Node.js và cách khắc phục

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Rò rỉ bộ nhớ là hiện tượng ứng dụng không thể giải phóng bộ nhớ không cần dùng đến nữa trong quá trình hoạt động. Có thể ban đầu ứng dụng chạy rất mượt mà nhưng sau một thời gian lại trở nên chậm chạm, thậm chí giật lác khiến chúng bị “crash” và thứ bạn nhìn thấy lúc này rất có thể là thông báo JavaScript heap out of memory ở đâu đó trong console.

V8 trong Node.js được cung cấp mặc định 4GB cho dữ liệu cấp phát động hay còn gọi là Heap. Giới hạn này có thể tăng thêm nhưng đổi lại là hiệu năng của ứng dụng sẽ giảm sút. Các kiểu dữ liệu tham chiếu như Object, Function, Array sẽ được lưu trữ trong Heap. Chính vì thế nếu như quá nhiều đối tượng kể trên được cấp phát trong thời gian chạy (runtime) của ứng dụng sẽ gây ra hiện tượng tràn bộ nhớ.

Nếu đã biết được nguyên nhân sâu xa gây ra hiện tượng tràn bộ nhớ thì dưới đây là 5 điều phổ biến dẫn đến việc rò rỉ bộ nhớ cho đến khi không còn để mà rò rỉ nữa.

5 điều gây rò rỉ bộ nhớ

Khai báo biến toàn cục (Global Variables)

Biến toàn cục là các biến được khai báo với var hoặc this hoặc với cả các biến không được khai báo bằng từ khoá nào cả. Khi không được khai báo với từ khoá mặc định nó sẽ được gán vào window đối với trình duyệt.

function variables() {
  this.a = "Variable one";
  var b = "Variable two";
  c = "Variable three";
}

Những biến này sẽ không được trình thu gom rác của V8 giải phóng cho đến khi chúng được đặt thành null. Hãy đảm bảo rằng bạn kiểm soát được các biến mà bạn tạo ra khi khai báo toàn cục. Thận trọng hơn hãy sử dụng use strict để trình biên dịch cảnh báo bạn mỗi khi khai báo biến toàn cục.

Cần lưu ý khi sử dụng biến toàn cục để lưu trữ Object hay Array. Chúng sẽ không được giải phóng cho đến khi bạn đặt thành null, hay có thể dữ liệu lưu trữ bên trong nhiều lên đến mức mất kiểm soát, do đó chiếm một phần lớn bộ nhớ Heap.

  Mọi thứ bạn nên biết về Memory Leaks trong IOS (phần 1)

  Bạn có suy nghĩ như thế nào khi tôi nói rằng Node.js rất nhanh?

Chia quá trình xử lý dữ liệu lớn thành các quá trình chunks và spawn

Điều gì sẽ xảy ra khi bạn cố gắng lấy ra hết vài triệu bản ghi trong cơ sở dữ liệu vào một đối tượng. Hay là đọc hết 1 triệu hàng trong file excel rồi xử lý chúng qua 77 49 bước nữa? Tin tôi đi khả năng cao bạn sẽ nhận được thông báo “Heap out of memory” trước khi mà có thể tiếp tục xử lý được đấy. Vì lúc này dữ liệu được nạp vào quá lớn sẽ khiến Heap nhanh chóng bị lấp đầy đến khi không còn chỗ chứa. Chưa kể đến việc xử lý dữ liệu trên một đối tượng lớn như thế sẽ khiến ứng dụng của bạn trở nên chậm chạm và gây ra nhiều vấn đề khác.

Có nhiều cách để giải quyết trường hợp này, nhưng phổ biến là các trường hợp chia nhỏ (chunks) từng phần dữ liệu ra để xử lý. Còn để tăng tốc xử lý thì hãy tạo thêm (spawn) một số tiến trình con trong Node như trong bài viết Worker threads là gì? Bạn đã biết khi nào thì sử dụng Worker threads trong node.js chưa? mà tôi đã đề cập trước đó.

Cẩn thận với setInterval

Cẩn thận với setInterval

setInterval là một hàm cho phép chúng ta lặp lại một tác vụ sau mỗi một thời gian nhất định. Sẽ không có gì khi bạn kiểm soát được số lượng các hàm setInterval. Nhưng việc không kiểm soát được cộng thêm nhiệm vụ nặng nề mà chúng phải gánh vác thì khả năng cao lượng bộ nhớ được phân bổ mất kiểm soát càng nhiều. Vì thế hãy đảm bảo clearTimeout được gọi khi setInterval không còn cần thiết nữa.

const arr = [];

const interval = setInterval(() => {
  arr.push(new Date());
}, 1000);

clearInterval(interval);

Xem thêm việc làm Node.js developer hấp dẫn nhất tại TopDev

Loại bỏ các biến không dùng nữa khỏi Closure

Mặc dù Closure gây ra nhiều tranh cãi về việc nó gây ra rò rỉ bộ nhớ hay không tuy nhiên nhìn vào cách nó vẫn lưu giữ được giá trị của các biến ngay cả khi hàm đã return thể hiện rằng Heap vẫn phải chịu một phần chi phí lưu trữ này.

Ví dụ một hàm Closure sau:

const fn = () => {
  let Person1 = { name: "2coffee", age: 19 };
  let Person2 = { name: "hoaitx", age: 20 };

  return () => Person2;
};

Sau khi fn() được gọi và thực thi xong Person1 sẽ được giải phóng nhưng Person2 thì không bởi vì nó vẫn bị tham chiếu đến trong hàm trả về (return).

Unsubscribe khỏi Observers và Event Emiter

Observers và Event Emiter cũng có vấn đề tương tự như setInterval ở trên. Giữ các Observers trong thời gian dài có thể gây ra rò rỉ bộ nhớ. Hãy huỷ theo dõi các Observers bất cứ khi nào bạn không còn cần đến chúng.

Ví dụ:

const EventEmitter = require("events").EventEmitter;
const emitter = new EventEmitter();

const bigObject = {};
const listener = () => {
  doSomethingWith(bigObject);
};

emitter.on("event1", listener);

bigObject sẽ bị giữ lại cho đến khi listener được huỷ theo dõi.

emitter.removeEventListener("event1", listener);

Ngay cả Node.js cũng cảnh báo việc rò rỉ bộ nhớ nếu có hơn 10 trình lắng nghe sự kiện được gắn vào 1 bộ phát sự kiện.

emitter.on("event1", listener);
emitter.on("event2", listener2);
...
emitter.on("eventN", listenerN);

// sẽ nhận được cảnh báo giống như
// "(node) warning: possible EventEmitter memory leak detected. N listeners added. Use emitter.setMaxListeners() to increase limit."

Tổng kết

Phần lớn hiện tượng rò rỉ bộ nhớ khó phát hiện sớm cho đến khi bạn ứng dụng của bạn đột ngột lăn ra chết. Lúc này việc của bạn là phải tìm ra nguyên nhân và khắc phục sớm nhất có thể. Dựa vào 5 điều trên hy vọng sẽ giúp ích được cho bạn trong quá trình sửa chữa những sai lầm đó.

Nếu bạn còn phát hiện thêm những trường hợp nào có thể gây ra hiện tượng rò rỉ bộ nhớ cũng như cách để khắc phục thì hãy bình luận phía dưới cho mọi người cùng biết nhé!

Bài viết gốc được đăng tải tại 2coffee.dev

Có thể bạn quan tâm:

Xem thêm tuyển IT lương cao hấp dẫn tại TopDev

Tuyển sinh ngành Công nghệ Thông tin, bạn đã biết?

Ngành Công nghệ Thông tin hiện vẫn đang là một ngành hot và nằm trong top những nhóm ngành tiềm năng. Với xu thế hội nhập cùng tốc độ tăng trưởng vượt bậc về công nghệ, nhu cầu tuyển dụng nhân lực cho ngành CNTT ngày càng lớn. Vì thế, việc nắm bắt chính xác, cụ thể những thông tin về ngành là điều rất quan trọng. Đó được xem là một lợi thế lớn trong bước tiếp đầu tiếp cận với ngành học. Cùng TopDev điểm qua những điểm đáng lưu ý xung quanh ngành học thú vị này.

Những hiểu biết cơ bản về ngành CNTT

Theo lối hiểu xưa cũ, Công nghệ Thông tin được xem là ngành làm việc với máy tính. Đồng thời đưa ra các giải pháp quản lý, thực hiện truyền tải thông tin. Biểu hiện cụ thể là thông qua việc tạo ra các phần mềm ứng dụng, truy xuất dữ liệu,…

Thế nhưng, khác xa với lối mô tả trước đó, CNTT hiện tại đã trở thành một ngành công nghệ phát triển nhanh nhất thế giới. Nhiều sản phẩm công nghệ ra đời là minh chứng cho sự lột xác của ngành CNTT như: các thiết bị di động thông minh, laptop, tivi,… Tất nhiên, việc tạo ra sự thay thế hoàn toàn con người là điều có thể thực hiện được. Đó cũng là đích đến không xa của giới chuyên môn.  

Nếu hiểu theo tên gọi thuật ngữ quốc tế thì “Computer Science” – Khoa học máy tính là tên gọi mô tả đầy đủ và chính xác nhất. Tuy nhiên, tại thị trường Việt Nam, chúng ta vẫn hay gọi là “Công nghệ thông tin”.

Theo đuổi ngành Công nghệ Thông tin – Bạn cần có gì?

Mỗi ngành nghề đều có những tính chất riêng. Đó là cái làm nên đặc thù ngành. Và để tiến xa, bạn cần quan tâm đến việc khai thác tố chất; rèn luyện những kỹ năng cần thiết để thích ứng phù hợp với ngành học. 

Am hiểu chuyên môn là một chuyện. Những yếu tố về kỹ năng, tiềm năng phát triển mới là thứ quyết định bạn có thể thành công và phát triển lâu dài với ngành được hay không.

Sự đam mê

Có thể nói, sự đam mê là tính chất quan trọng mà bạn cần có khi bắt đầu theo đuổi ngành CNTT.

Công nghệ Thông tin

Đam mê có cần phải rèn luyện? Khó có thể lý giải được câu hỏi này. Tuy nhiên, bạn hãy trả lời những câu hỏi sau:

– Bạn có tò mò về ngành học CNTT hay không? Sao trang web này thu hút và có giao diện tuyệt vời đến vậy? Những tính năng thông mình này được lập trình như thế nào? Bạn đã từng có suy nghĩ như vậy chưa?

– Bạn có yêu thích và muốn mình sẽ tự tạo ra các sản phẩm công nghệ? Hay trực tiếp tham gia vào quá trình đưa ra các giải pháp hay chưa? 

Nếu đáp án của bạn là tức bạn thật sự có sự đam mê với ngành học này. Đam mê không cần xuất phát từ những thứ lớn lao. Nó đơn giản được hình thành từ sự tò mò, thích khám phá cái mới. Hơn thế nữa, khi bạn yêu thích và khao khát thực hiện, chính đam mê trong bạn sẽ được hun đúc và nuôi dưỡng từng ngày.

Hãy nhớ rằng, sự đam mê chỉ thật sự hình thành khi bạn có sự trải nghiệm. Vì thế, đừng ngần ngại tạo ra cho bản thân mình những cơ hội thử sức. Các trang web học lập trình có thể là nguồn dữ liệu để bạn kiếm tra xem bản thân có phù hợp với ngành học hay không.

Các kỹ năng về công nghệ và tư duy lập trình

Để xem xét mức độ phù hợp thì kỹ năng IT là thước đo chuẩn nhất. Tuy nhiên, nếu kỹ năng chưa của bạn chưa hoàn thiện, đừng lo lắng nhé! Bạn có thể rèn luyện nó theo thời gian. 

  Đừng chỉ cứ code! Hãy dành thời gian khai phá tư duy lập trình

Công nghệ Thông tin

Kỹ năng IT chính là vũ khí đắc lực giúp bạn phát huy tối đa năng lực chuyên môn của mình. Dù có hay chưa có kỹ năng, bạn vẫn phải trau đồi các kỹ năng về IT.

Những kỹ năng IT bạn cần phải quan tâm bao gồm tìm kiếm, tra cứu thông tin; hiểu biết từ cơ bản đến nâng cao các phần mềm thông dụng (Word, Excel, Powerpoint,…); hiệu chỉnh, quản lý thông tin dữ liệu,… Rất nhiều kỹ năng IT để bạn trau dồi. Bạn cần tìm hiểu sâu hơn về chuyên ngành học để sàng lọc những kỹ năng cần thiết cũng như kỹ năng bỗ trợ để bản thân hoàn thiện hơn.

Bên cạnh các kỹ năng, bạn cần quan tâm đến tư duy lập trình.

Tư duy lập trình tức là cách một cá nhân tri nhận về đường hướng giải quyết vấn đề theo một trình tự logic. Nói một cách khác, bạn cần có tư duy khoa học, hệ thống về các vấn đề một cách cơ bản trước khi tiếp xúc với thế giới IT.

Khả năng ngoại ngữ 

Ngoại ngữ là yếu tố rất quan trọng để tạo ra lợi thế cạnh trạnh. Thực tế cho thấy, chính sự phát triển về mặt bằng chung tri thức đã khiến cho việc tiếp cận tư duy có nhiều thay đổi. Tiếng Anh không còn là một ngoại ngữ cần có mà nó là yếu tố bắt buộc phải có. Dù vậy, việc trau dồi tiếng Anh vẫn là mối quan tâm hàng đầu.

Ví dụ thực tế:

Nếu bạn đang cạnh tranh với nhiều ứng viên cùng 1 vị trí, nhà tuyển dụng sẽ cân nhắc về năng lực ngoại ngữ để lựa chọn. Việc sở hữu ngoại ngữ tốt giúp bạn dễ dàng trúng tuyển hơn.

Ngoại ngữ thật sự quan trọng và bạn cần dành thời gian để đầu tư cho nó. Trau dồi ngoại ngữ là cách bạn đang tự tạo cho bản thân những cơ hội nghề nghiệp cũng như sự thăng tiến lâu dài trên hành trình nghề nghiệp của mình.

Những đặc thù nổi bật của ngành Công nghệ Thông tin

Đòi hỏi tính tự học cao

Đây là một đặc điểm quan trọng. Nó cũng chính là yếu tố chi phối đến khả năng phát triển nghề nghiệp của bạn.

Kiến thức từ bài giảng chỉ chiếm 10% dù bạn phải trải qua ít nhất 4 năm đèn sách. 90% còn lại là do khả năng tự tìm tòi, nghiên cứu, trải nghiệm của bạn. Bạn có thể trau dồi nhiều kiến thức từ các khóa học online; các buổi hội thảo, chương trình đào tạo, sự kiện, hoạt động ngoại khóa. Tham gia những chương trình với nhiều cách tổ chức truyền tải nội dung kiến thức khác nhau sẽ giúp bạn có vốn hiểu biết sắc hơn về kiến thức đa ngành.  

Tự học giúp bạn tự vạch ra những chiến lược cụ thể. Và chỉ có những ai đam có sự đam mê lớn với ngành hoc, họ mới có sự quyết tâm lớn như vậy. Nếu sở hữu chuyên môn tốt, việc tự học sẽ thúc đẩy bạn phát triển nhanh hơn đến mức không ngờ.

Lương cao nhưng không thể tránh những áp lực

Môi trường làm việc của ngành CNTT rất đa dạng và là ngành đòi hỏi nhiều chuyên môn, kinh nghiệm. Chính vì vậy mà hầu như chế độ lương của ngành cũng cao hơn so với các nhóm ngành trong thị trường. 

Công nghệ Thông tin

Thế nhưng, để có mức lương cao, bạn sẽ phải đối mặt với nhiều thách thức, áp lực bủa vây. Đừng bao giờ chạy theo định hướng của ngôn luận báo chí. Bạn nên hiểu rằng, cái gì cũng có cái giá của nó. Ngành CNTT không chỉ đơn giản như những mô tả. Sự phóng đại bởi những hào nhoáng bên ngoài chỉ là bề nổi mà thôi. Khi có cơ hội tự trải nghiệm, bạn sẽ biết được nhiều góc khuất khác nhau của ngành CNTT. 

  Bài học về kỹ năng giải quyết vấn đề - Hãy tư duy như một Lập trình viên!
  Đừng lãng phí khoảng thời gian học đại học của bạn!!

Những áp lực ấy có thể tác động xấu đến sức khỏe của bạn. Bạn nên biết rằng, theo thống kê từ thực tế, tuổi thọ trung bình của nghề CNTT không cao. Do đó, nếu bạn thật sự yêu thích ngành học, bạn hãy quan tâm đến vấn đề sức khỏe của mình. Chạy deadline khiến bạn phải OT liên tục dẫn đến stress về tâm lý. Cuộc đua nghề nghiệp không hề dễ dàng như bạn nghĩ. Và nó chỉ phù hợp với những người chịu được áp lực công việc cao. 

Lựa chọn môi trường học tập phù hợp

Đâu là những môi trường đào tạo tốt về ngành CNTT? TopDev sẽ liệt kê một số trường được giới chuyên môn đánh giá cao về vấn đề đào tạo, phát triển kỹ năng chuyên môn.

Khu vực phía Nam

Nếu bạn đến từ TP. Hồ Chí Minh, bạn có thể lựa chọn những ngôi trường lý tưởng sau:

  • Đại học Bách Khoa – ĐH Quốc gia TP. HCM
  • Đại học Khoa học Tự nhiên – ĐH Quốc gia TP. HCM
  • Đại học Công nghệ Thông tin – ĐH Quốc gia TP. HCM

Đây là 3 ngôi trường được giới chuyên môn đánh giá cao bởi chất lương đào tạo, những chương trình phát triển kỹ năng sinh viên cũng như những giá trị mà trường đóng góp vào sự phát triển chung của ngành CNTT. 

Nếu trường Đại học Bách Khoa nổi trội với 2 ngành “Khoa học máy tính” và  “Kỹ thuật máy tính” thì Đại học Khoa học Tự nhiên cũng có những ngành chuyên sâu về CNTT như: Công nghệ phần mềm, Mạng máy tính, Thị giác máy tính & robot, Công nghệ tri thức,… Người bạn còn lại của khu vực đào tạo CNTT phia Nam gọi tên Đại học Công nghệ Thông tin TP.HCM. Đây là ngôi trường mạnh về đào tạo Mạng máy tính và bảo mật.

Bạn có thể tham khảo Những trường Đại học đào tạo Công nghệ thông tin chất lượng hiện nay!

Khu vực phía Bắc

Nếu bạn ở khu vực phía Bắc, đừng lo lắng, bạn có thêm tham khảo những ngôi trường sau:

  • Đại học Bách Khoa Hà Nội
  • Đại học Công nghệ – ĐH Quốc gia Hà Nội
  • Học viện công nghệ Bưu chính viễn thông

Đại học Bách Khoa Hà Nội được đánh giá là đơn vị đào tạo tốt nhất ở miền Bắc. Không kém cạnh, cả hai trường Đại học Công nghệ và Học viện công nghệ Bữu chính Viễn thông cũng nổi tiếng về chất lương giảng dạy.

Nhìn chung, đây đều là những ngôi trường đáng để học. Cá nhân mỗi sinh viên của từng trường họ đều là những người có tiềm năng công nghệ. Họ có khả năng và ý thức tự học cao. Với đội ngũ giảng viên giàu kinh nghiệm cùng môi trường học tập tốt, chắc chắn sẽ là những điểm đến phù hợp dành cho các bạn.

Nếu còn những lo ngại về việc điểm đầu vào quá cao thì trường Đại học FPT là sự lựa chọn phù hợp. Trường có cả hai cơ sở tại TP.HCM và Hà Nội. Trường cũng là đơn vị đào tạo kiến thức chuyên ngành theo chuẩn quốc tế đảm bảo cho việc tiếp cận các nguồn tri thức mới. 

Có rất nhiều sự lựa chọn dành cho bạn. Hãy cân nhắc về các yếu tố khác nhau để tìm được cho mình một ngôi trường ưng ý nhé!

Những thắc mắc thực tế cần quan tâm

Định hướng học tập theo hướng nào, cơ hội việc làm sẽ cao hơn? 

CNTT luôn là một ngành hot và có nhiều “đất” để bạn làm việc. Mấu chốt là kiến thức, kỹ năng của bạn có đáp ứng được vị trí bạn yêu thích hay không?

Hãy tự trau dồi và vạch ra các định hướng cụ thể. Khi đó, bạn sẽ biết được bạn thiếu gì, cần bổ sung thêm điều gì để bạn thân phù hợp với công. Hãy nhớ rằng nền tảng là gốc rễ của nhiều kiến thức. Một số kiến thức nền tảng bạn có thể lưu tâm đó là: tư duy lập trình, lập trình hướng đối tượng, cấu trúc dữ liệu & giải thuật,…

Rèn luyện chính là sự chuẩn bị tốt nhất cho hành trình nghề nghiệp của bản thân. 

Khi bắt đầu học, mình nên học gì đầu tiên?

Đầu tiên, bạn nên học làm quen với việc sử dụng thành thạo máy tính. Về việc bắt đầu học kiến thức, bạn nên tìm hiểu kỹ. Nếu mong muốn có lối tư duy tốt, bạn có thể học ngôn ngữ C/C++ hoặc Python trước. Nếu muốn học chuyên sâu và đi vào nền tảng, bạn có thể học các ngôn ngữ như Java, PHP,…  

Trường nghề có phải là giải pháp phù hợp nếu không lựa chọn học Đại học?

Công nghệ Thông tin

Một sự thật khá chua chát, Đại học ngoài đào tạo chuyên môn (thường sẽ từ năm thứ hai) thì nhiều môn học mang tính hàn lâm rất cao. Tất nhiên, Đại học cũng là môi trường bị chi phối bởi nhiều yếu tố như: chất lượng giảng dạy, điểm số, các mối quan hệ, các chương trình hoạt động kỹ năng,.. Dù xem xét dưới góc độ nào, Đại học vẫn là cơ sở đào tạo tốt. Nếu được, bạn nên đồng hành cùng nó.,

Tuy nhiên, không có giới hạn nào cho sự thành công. Nếu đủ đam mê, sự nỗ lực, dù bạn học tập ở môi trường nào, bạn vẫn có thể là một nhân tố xuất sắc. Nếu bạn thật sự muốn trải nghiệm trường nghề về CNTT, hãy lựa chọn một cơ sở uy tín và chất lượng.

Lời kết

Ngành Công nghệ Thông tin đang nhân được sự quan tâm lớn. Điều đó đồng nghĩa với sức ép cạnh tranh lớn dần hơn. Tuy tạo ra những thách thức cho các bạn đang theo đuổi ngành học này song chúng ta vẫn mong đợi nhiều nhân tố sáng giá cho ngành học. Mỗi cá nhân lựa chọn đồng hành và quyết tâm trải nghiệm nó dù là trên giảng đường hay bất cứ nơi đâu đều góp phần khẳng định vị thế và sức ảnh hưởng lớn từ ngành học này.

Có thể bạn quan tâm:

Xem thêm Top IT Jobs Developer trên TopDev

So sánh WordPress và Drupal: Lựa chọn CMS nào sẽ tốt hơn?

Nhắc đến Hệ quản trị nội dung thì WordPress và Drupal là 2 cái tên phổ biến, luôn có mặt trong top những phần mềm CMS tốt nhất hiện nay. Cả 2 đều được viết bằng ngôn ngữ lập trình PHP, ra mắt đầu những năm 2000 và trở thành nền tảng được yêu thích sử dụng trong các website hàng đầu hiện nay. Hôm nay chúng ta cùng nhau so sánh WordPress và Drupal để xem 2 nền tảng này có sự giống và khác nhau gì, để trả lời cho câu hỏi nên lựa chọn CMS nào cho website của bạn nhé.

Tìm hiểu về WordPress và Drupal

1. WordPress là gì? Điểm mạnh của WordPress

WordPress là một hệ quản trị nội dung (CMS) mã nguồn mở được viết bằng PHP và sử dụng hệ quản trị cơ sở dữ liệu MySQL. Với giao diện thân thiện và dễ sử dụng, WordPress cho phép người dùng tạo và chỉnh sửa nội dung một cách dễ dàng, mà không yêu cầu kiến thức lập trình.

Nó cung cấp hàng ngàn theme (giao diện) và plugin (tiện ích) mở rộng, cho phép người dùng tùy chỉnh trang web theo ý muốn. WordPress cũng hỗ trợ cộng đồng lớn và đa dạng, với tài liệu phong phú và sự hỗ trợ từ cộng đồng người dùng trên toàn thế giới.

Wordpress là gì?

Ưu điểm của WordPress:

  • Dễ sử dụng: Giao diện người dùng thân thiện và trực quan của WordPress làm cho việc tạo và quản lý nội dung trở nên dễ dàng cho cả người mới bắt đầu và người không có kỹ năng lập trình.
  • Tính linh hoạt: WordPress cung cấp hàng ngàn theme và plugin, cho phép người dùng tùy chỉnh giao diện và mở rộng chức năng của trang web theo nhu cầu riêng.
  • Cộng đồng lớn: WordPress có một cộng đồng người dùng rộng lớn, với tài liệu phong phú và sự hỗ trợ từ cộng đồng. Người dùng có thể tìm kiếm câu trả lời và giải pháp cho các vấn đề thông qua diễn đàn và nhóm thảo luận.
  • Tối ưu hóa SEO: WordPress được xây dựng với cấu trúc tốt cho việc tối ưu hóa công cụ tìm kiếm (SEO). Nó cung cấp các plugin và công cụ hỗ trợ để cải thiện hiệu suất SEO của trang web.
  • Khả năng mở rộng: WordPress cho phép người dùng mở rộng trang web của mình một cách dễ dàng bằng cách thêm các tính năng mới thông qua việc cài đặt các plugin và widget.

  26 đoạn code hay dùng trong lập trình theme WordPress

  Top 5 câu hỏi phỏng vấn Drupal Developer không phải ai cũng biết

2. Drupal là gì? Điểm mạnh của Drupal

Drupal là một hệ quản trị nội dung (CMS) mã nguồn mở PHP mạnh mẽ và linh hoạt. Nó được sử dụng để xây dựng và quản lý các trang web phức tạp. Với Drupal, người dùng có khả năng tùy chỉnh cao và kiểm soát đầy đủ về cấu trúc và nội dung trang web.

Nó cung cấp một hệ thống module mạnh mẽ, cho phép người dùng mở rộng chức năng và tính năng của trang web theo ý muốn. Drupal cũng không ngừng được cải tiến và tích hợp thêm nhiều tính năng mới hỗ trợ người dùng.

Drupal là gì?

Ưu điểm của Drupal

  • Linh hoạt và mở rộng: Drupal cho phép người dùng tùy chỉnh cao và kiểm soát đầy đủ về cấu trúc và nội dung trang web.
  • Đa chức năng: Drupal hỗ trợ xây dựng các trang web phức tạp và đa dạng, bao gồm trang web doanh nghiệp, trang web chính phủ, cộng đồng trực tuyến, trang web thương mại điện tử, và nhiều hơn nữa.
  • Hiệu suất tốt: Drupal được tối ưu hóa để xử lý lưu lượng truy cập lớn và dữ liệu phức tạp. Nó có khả năng xử lý nội dung lớn mà không ảnh hưởng đến hiệu suất trang web.
  • Cộng đồng hỗ trợ: Drupal có một cộng đồng người dùng lớn và nhiều kinh nghiệm. Người dùng có thể tìm kiếm và chia sẻ kiến thức, tài liệu, và giải pháp thông qua các diễn đàn, trang web và sự kiện Drupal.

Tham khảo việc làm WordPress hấp dẫn trên TopDev!

So sánh WordPress và Drupal: Nên chọn cái nào?

Wordpress và Drupal

Tính khả dụng

Tính khả dụng đề cập đến việc một CMS có dễ dàng cài đặt và sử dụng ngay cả đối với những người không có nhiều kiến thức về lập trình. Ở khía cạnh này thì WordPress tỏ ra vượt trội hơn vì tính đơn giản, dễ hiểu và dễ sử dụng. Cụ thể:

  • Drupal: Để cài đặt Drupal và sử dụng, trung bình cần hơn 10 phút với những thao tác thủ công và có đòi hỏi kiến thức về lập trình Web. Mã nguồn của Drupal cũng có nhiều bản cài khác nhau gọi là các bản distributions giúp bạn lựa chọn phù hợp với yêu cầu, loại website bạn cần.
  • WordPress: Thời gian cài đặt thủ công trung bình của WP mất khoảng 5 phút với những thiết lập khá đơn giản. Hầu hết các nhà cung cấp hosting hiện nay đều tích hợp WordPress giúp việc cài đặt và sử dụng đơn giản hơn chỉ bằng một cú nhấp chuột. 

Có một điểm chung cả 2 CMS này đều là mã nguồn mở và hoàn toàn miễn phí, và không chỉ WP thì một số nhà cung cấp hosting hiện nay cũng đã tích hợp Drupal để hỗ trợ cài đặt trực tiếp (không cần thao tác download về và upload lên server).

So sánh WordPress và Drupal

Khả năng tối ưu hóa SEO

SEO (Search Engine Optimization) hay tối ưu hóa công cụ tìm kiếm giúp website của bạn chất lượng và lưu lượng truy cập, thu hút người dùng.

  • Drupal: với Drupal, để giữ cho website của bạn luôn được cập nhật các phiên bản mới nhất là một điều tương đối khó khăn và thường chỉ là công việc của các lập trình viên. Drupal hỗ trợ tốt cho SEO với nhiều công cụ giúp bạn hoàn thiện SEO Website như Yoast SEO, đặc biệt là nó được đi kèm sẵn trong mã nguồn của Drupal.
  • WordPress: WP có rất nhiều plugin tuyệt vời dành cho SEO như All in One SEO Pack hay Yoast SEO. Một yếu tố nữa là nhờ sự phổ biến của cộng đồng WordPress mà việc SEO các site WP cũng trở nên hiệu quả hơn.

So sánh WordPress và Drupal

Tốc độ và hiệu năng

Tốc độ và hiệu năng của một website bị tác động chủ yếu nhờ các kỹ thuật lập trình áp dụng trong source code cộng thêm một số các kỹ thuật tăng tốc độ tải và xử lý đến từ server, hosting. Về điểm này thì Drupal thường được cộng đồng lập trình viên đánh giá cao hơn, cụ thể:

  • Drupal: Về mặt kỹ thuật thì Drupal là tiên tiến hơn so với WP, nhờ vậy nó luôn được đánh giá cao về tốc độ và hiệu năng. Nó tiêu tốn ít tài nguyên máy chủ, không yêu cầu lưu trữ hay thiết lập nhiều vì đó site làm bằng Drupal thường tải nhanh hơn, thời gian đáp ứng cũng tốt hơn WP.
  • WordPress: tốc độ là một trong những vấn đề lớn nhất của WP, nếu không phải là một người có kinh nghiệm lập trình và làm việc với WordPress thì việc tối ưu tốc độ cho CMS này là một bài toán khó. Bù lại thì WP cũng có sẵn một số plugins hỗ trợ tăng tốc site, hơn nữa một số hosting còn có những tính năng để tối ưu hóa hiệu năng các site chạy bằng WP; điều đó giúp site của bạn được cải thiện rõ rệt hơn.

Tính bảo mật

Tính bảo mật và độ an toàn của một CMS phụ thuộc nhiều vào khả năng quản trị server cũng như kiểm soát tốt source code ứng dụng, mặc dù vậy cũng có những điểm đặc trưng giữa 2 CMS trên.

  • Drupal: Drupal xây dựng được danh tiếng là hệ quản trị nội dung an toàn nhất với việc từng được dùng làm website của nhà Trắng và những website thuộc chính phủ nhờ việc áp dụng chuẩn bảo mật cao cấp. Drupal không có nhiều theme và plugin, cũng nhờ vậy mà hạn chế được lỗi bảo mật không mong muốn xảy ra.
  • WordPress: bản thân mã nguồn gốc của WP rất an toàn, mặc dù vậy do sự mở rộng plugin và themes vô cùng lớn cũng kèm theo là việc tạo ra nhiều lỗ hổng bảo mật hơn. Thực tế cho thấy WordPress là CMS bị hack nhiều nhất, chủ yếu với những site lỗi thời hay sử dụng plugins lỗi. Mặc dù vậy nếu bạn kiểm soát tốt được các plugins, themes cài đặt và hiểu biết một chút về bảo mật thì có thể giảm thiểu khả năng bị tấn công xuống mức thấp nhất. 

So sánh WordPress và Drupal

Tính linh hoạt

Tính linh hoạt thể hiện ở việc CMS có khả năng tùy chỉnh từ giao diện đến tính năng. Ở tiêu chí này, nhờ cộng đồng hỗ trợ rất lớn của mình, WordPress có số lượng plugin và themes vô cùng phong phú giúp người dùng có thể dễ dàng thay đổi, bổ sung, nâng cấp cho CMS của mình. Mặc dù vậy thì Drupal không phải không có ưu điểm của nó, cụ thể:

  • Drupal: người dùng có thể tùy chỉnh bằng modules và extensions tương tự cách dùng plugins hay themes đối với WordPress. Drupal hỗ trợ chỉnh sửa rất sâu bên trong sourcecode, tác động toàn bộ đến site CMS; mặc dù vậy bạn cần kiến thức về lập trình vì các chỉnh sửa là hoàn toàn thủ công, không hỗ trợ cài đặt giao diện như WP.
  • WordPress: lý do lớn nhất cho việc WP trở thành CMS số 1 hiện nay là nhờ kho plugins và themes đồ sộ, bao gồm cả miễn phí và trả phí. Bạn dễ dàng cài đặt thông qua giao diện trên CMS với vài thao tác cơ bản.

Tóm lại

Drupal là một CMS có rất nhiều tính năng nổi trội được tích hợp, tối ưu cho tốc độ và bảo mật ngay từ ban đầu, tuy nhiên nó đòi hỏi một kiến thức lập trình nhất định để có thể tận dụng được khả năng của Drupal. Nếu là một lập trình viên hay có kiến thức nhất định về lập trình Web, về hosting, domain, server,… hãy tự tin lựa chọn Drupal cho CMS của mình. WordPress dễ cài đặt, dễ dùng, mức độ phổ biến cao và vì thế nó phù hợp với phần đông đối tượng người dùng hơn. WordPress cũng hoàn toàn có thể sử dụng để xây dựng các website lớn với các tùy chỉnh chuyên sâu, tuy vậy thì nhìn chung WordPress phù hợp hơn với những người mới bắt đầu.

Hy vọng bài viết hữu ích dành cho bạn trong việc lựa chọn CMS cho website sắp tới, hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

Bạn có thể xem thêm:

Dev đừng bỏ lỡ Top tin tuyển dụng IT tại TopDev nhé!

Làm IT Ngân Hàng Có Gì Khác “Bọt”

Các ngân hàng Việt Nam đang thực hiện chuyển đổi số từ quy trình đến các sản phẩm, dịch vụ tài chính. Vai trò của công nghệ thông tin càng thực sự trọng yếu trong hoạt động ngân hàng, góp phần mang đến sự thành công cho một tổ chức. Có thể nói công nghệ thông tin ngân hàng là một trong những ngành được đầu tư nhiều nhất.

Và ACB – ngân hàng thuộc Top các NHTMCP lớn nhất hiện nay – đang tích cực thực hiện chiến lược số hóa toàn bộ từ nay đến năm 2024.  Chính vì vậy, ACB chủ động thực hiện hàng loạt hoạt động tuyển dụng, networking thường xuyên để gửi lời mời đến các nhân tài trong lĩnh vực công nghệ thông tin có mong muốn trở thành “đối tác sự nghiệp” của ACB. 

So với các công ty công nghệ thì IT ngân hàng có gì khác “bọt”? Và “IT is a business” là định hướng gì mà mỗi nhân sự CNTT của ACB đều đóng vai trò quan trọng cho sự phát triển của toàn ngân hàng?

IT ngân hàng không chỉ sử dụng các công nghệ mã nguồn mở, đám mây, công nghệ di động mà còn áp dụng các công nghệ tiên tiến như trí tuệ nhân tạo, học máy, blockchain, v.v. để cung cấp các giải pháp tài chính sáng tạo, tập trung vào khách hàng nhất. Tại ACB, Công nghệ thông tin gắn liền với phát triển kinh doanh khi trực tiếp xây dựng và thực hiện các dự án lớn để gia tăng khách hàng, góp phần mang về lợi nhuận cho ngân hàng thông qua nhiều sản phẩm và dịch vụ mới mẻ như ngân hàng số và ví điện tử, kiosk tự động. 

Qua những thông tin ngắn gọn trên, bạn đã thấy những gì bạn muốn biết về công nghệ thông tin trong ngân hàng đã đầy đủ chưa? Bạn có cảm hứng khi đạt những thành công qua việc chinh phục các thử thách? Bạn có tham vọng xây dựng một sự nghiệp với từng bước tiến vững vàng, thành quả được ghi nhận trong lĩnh vực công nghệ thông tin tại ACB không?

Nếu có, đừng bỏ qua sự kiện “Giải pháp CNTT trong chuyển đổi số toàn diện” do ACB tổ chức vào ngày 27/07/2023 sắp tới đây. Đây là sự kiện thường niên quan trọng của ACB dành cho đội ngũ nhân sự công nghệ thông tin cả bên trong và bên ngoài ngân hàng. Sự kiện mang đến những nội dung giúp hiểu thêm về vai trò của CNTT trong ngân hàng và một không gian freestyle thoải mái, vui vẻ cho giới IT “build” networking. Đặc biệt hơn, sự kiện mở ra nhiều cơ hội cho các chuyên viên công nghệ thông tin được “tuyển thẳng” vào “tim” (team) ACB và có thể “deal” trực tiếp về các phúc lợi mà bạn mong muốn.  

Đăng ký tham gia sự kiện tại đây: TECH 2023 | ACB Experience & Networking day (office.com)

ACB sẵn sàng đồng hành với bạn chinh phục khát vọng thành công xuất sắc trong lĩnh vực công nghệ thông tin ngân hàng.

Thông tin cụ thể về sự kiện:

Sự kiện “Giải pháp CNTT trong chuyển đổi số toàn diện”

Thời gian: 18h30 – 21h00 ngày 27/07/2023

Địa điểm: ACB – 442 Nguyễn Thị Minh Khai, Phường 5, Quận 3, TP.HCM

Nội dung: 

  1. Phiên thảo luận: Chuyển đổi số trong ngân hàng
  • Công nghệ thông tin trong ngân hàng
  • Xu hướng phát triển công nghệ Tài chính và Ngân hàng
  • Những dự án công nghệ nổi bật: Cloud, End to end Security, Data Platform
  • Tư duy & Năng lực quản lý dự án Công nghệ thông tin  

2. Giao lưu trực tiếp cùng cộng đồng chuyên gia ACB trong lĩnh vực công nghệ Cloud Engineering, Data, Security, Software Engineering, Project Management

3. Cơ hội nhận lời mời tham gia vào các dự án Công nghệ thông tin chiến lược của ACB

4. Rút thăm may mắn với các phần quà công nghệ có tổng giá trị lên đến hơn 50 triệu đồng

lam it ngan hang

Xây dựng Car Location Tracking cho Android với Firebase

Bài viết được sự cho phép của tác giả Sơn Dương

Trong bài hướng dẫn này, chúng ta sẽ tạo một ứng dụng theo dõi vị trí xe (Car Location Tracking) giống như Grab và Uber. Bài viết này mình sẽ sử dụng Firebase Real-time Database. Tài xế chỉ cần gửi vị trí hiện tại về firebase và khách hàng sẽ cập nhật được vị trí của lái xe trên Google Map.

>>> Xem thêm: Firebase là gì

Mặc dù chúng ta sẽ không phát triển một ứng dụng hoàn thiện như Grab hay Uber. Nhưng mình sẽ hướng dẫn các bạn tự xây dựng một tính năng rất quan trọng đó là cập nhật thời gian thực, hiển thị thông tin tài xế trên ứng dụng khách hàng.

Bài viết sẽ chia làm 2 phần:

  • Phần 1: Xây dựng tính năng gửi location theo thời gian thực cho tài xế (dành cho tài xế).
  • Phần 2: Xây dựng tính năng hiển thị vị trí tài xế theo thời gian thực (dành cho khách hàng).

Kết quả của bài viết này sẽ là ứng dụng Car Location Tracking như bên dưới:

Từng bước xây dựng ứng dụng Car Location Tracking trên Android

#1. Yêu cầu trước khi bắt đầu xây dựng Car Location Tracking

  1. Bạn phải có Google Map API để hiển thị bản đồ. Xem đường link này để lấy API Key
  2. Cần có một Firebase project để sử dụng real-time database. Bạn có thể tạo Firebase project tại đây.

Sau khi bạn đã hoàn thành 2 bước trên thì chuyển tiếp sang bước bên dưới nhé.

#2. Lập trình ứng dụng cho tài xế(Driver App)

Như mình đã nói ở trên, tổng thể ứng dụng Car Location Tracking  sẽ chia làm 2 ứng dụng độc lập. Một ứng dụng dành riêng cho tài xế và một dành riêng cho khách hàng.

Vì vậy, phần 1 của bài viết này, chúng ta sẽ bắt đầu với ứng dụng dành cho tài xế, gọi là Driver App.

  AsyncTask trong Android – công cụ xử lý đa luồng hữu hiệu

  Sử dụng Intelligent constants trong lập trình Android

Cài đặt thư viện cần thiết

Đầu tiên, hãy thêm thư viện vào build.gradle

implementation 'com.google.android.gms:play-services-location:15.0.1'
implementation 'com.google.android.gms:play-services-maps:15.0.1'
implementation 'com.google.firebase:firebase-database:16.0.1'

Sau đó thêm những permission cần thiết cho ứng dụng. Trong 3 permissions này thì permission về quyền location là bạn cần phải được sự đồng ý của người dùng.

Bạn có thể tham khảo thêm bài viết của mình về cách xin cấp permission trong Android.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Ngoài ra, để hiển thị Google Maps trong ứng dụng Car Location Tracking  chúng ta cần thêm các thẻ meta vào trong Manifest file.

<meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="@string/map_api_key" /> // Change it with your Google Maps API key.

Tất cả những khâu chuẩn bị đã sẵn sàng cho việc hiển thị Google Maps và đọc vị trí của người dùng.

Xây dựng giao diện ứng dụng Car Location Tracking 

Ok, không chần chừ thêm nữa chúng ta hãy cùng bắt tay vào việc lập trình nào. Dưới đây là giao diện người dùng của DriverApp mà chúng ta sẽ tạo.

ung-dung-car-location-tracking-cho-android-1

Giao diện rất cơ bản, chúng ta có SwitchCompat dành cho cả tài xế trực tuyến và ngoại tuyến, bên dưới là Google Map.

Để tạo giao diện như trên, các bạn code như bên dưới đây (các bạn code vào file layout là activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/driverStatusLayout"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/colorPrimary"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/driverStatusTextView"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginStart="15dp"
            android:gravity="center"
            android:text="@string/offline"
            android:textColor="@color/colorIcons"
            android:textSize="22sp" />

       <android.support.v7.widget.SwitchCompat
           android:id="@+id/driverStatusSwitch"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_gravity="end"
           android:layout_marginEnd="15dp"
           android:checked="false"
           android:theme="@style/SCBSwitch" />

      </FrameLayout>

      <fragment
          android:id="@+id/supportMap"
          android:name="com.google.android.gms.maps.SupportMapFragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_below="@+id/driverStatusLayout"
tools:context="spartons.com.frisbeeGo.fragments.MapFragment" />

</RelativeLayout>

MainActivity

Sau khi đã có layout, chúng ta sẽ code để hiển thị map và lấy location. Dưới đây là code cho Activity chính

class MainActivity : AppCompatActivity() {

    companion object {
        private const val MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 2200
    }

    private lateinit var googleMap: GoogleMap
    private lateinit var locationProviderClient: FusedLocationProviderClient
    private lateinit var locationRequest: LocationRequest
    private lateinit var locationCallback: LocationCallback
    private var locationFlag = true
    private var driverOnlineFlag = false
    private var currentPositionMarker: Marker? = null
    private val googleMapHelper = GoogleMapHelper()
    private val firebaseHelper = FirebaseHelper("0000")
    private val markerAnimationHelper = MarkerAnimationHelper()
    private val uiHelper = UiHelper()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val mapFragment: SupportMapFragment = supportFragmentManager.findFragmentById(R.id.supportMap) as SupportMapFragment
        mapFragment.getMapAsync { googleMap = it }
        createLocationCallback()
        locationProviderClient = LocationServices.getFusedLocationProviderClient(this)
        locationRequest = uiHelper.getLocationRequest()
        if (!uiHelper.isPlayServicesAvailable(this)) {
            Toast.makeText(this, "Play Services did not installed!", Toast.LENGTH_SHORT).show()
            finish()
        } else requestLocationUpdate()
        val driverStatusTextView = findViewById<TextView>(R.id.driverStatusTextView)
        findViewById<SwitchCompat>(R.id.driverStatusSwitch).setOnCheckedChangeListener { _, b ->
            driverOnlineFlag = b
            if (driverOnlineFlag) driverStatusTextView.text = resources.getString(R.string.online_driver)
            else {
                driverStatusTextView.text = resources.getString(R.string.offline)
                firebaseHelper.deleteDriver()
            }
        }
    }

    @SuppressLint("MissingPermission")
    private fun requestLocationUpdate() {
        if (!uiHelper.isHaveLocationPermission(this)) {
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION)
            return
        }
        if (uiHelper.isLocationProviderEnabled(this))
            uiHelper.showPositiveDialogWithListener(this, resources.getString(R.string.need_location), resources.getString(R.string.location_content), object : IPositiveNegativeListener {
                override fun onPositive() {
startActivity(Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS))
                }
            }, "Turn On", false)
locationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper())
    }

    private fun createLocationCallback() {
        locationCallback = object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult?) {
               super.onLocationResult(locationResult)
               if (locationResult!!.lastLocation == null) return
               val latLng = LatLng(locationResult.lastLocation.latitude, locationResult.lastLocation.longitude)
               Log.e("Location", latLng.latitude.toString() + " , " + latLng.longitude)
               if (locationFlag) {
                   locationFlag = false
                   animateCamera(latLng)
               }
               if (driverOnlineFlag) firebaseHelper.updateDriver(Driver(lat = latLng.latitude, lng = latLng.longitude))
               showOrAnimateMarker(latLng)
           }
       }
   }

   private fun showOrAnimateMarker(latLng: LatLng) {
       if (currentPositionMarker == null)
           currentPositionMarker = googleMap.addMarker(googleMapHelper.getDriverMarkerOptions(latLng))
       else markerAnimationHelper.animateMarkerToGB(currentPositionMarker!!, latLng, LatLngInterpolator.Spherical())
   }

   private fun animateCamera(latLng: LatLng) {
       val cameraUpdate = googleMapHelper.buildCameraUpdate(latLng)
       googleMap.animateCamera(cameraUpdate, 10, null)
   }

   override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
       super.onRequestPermissionsResult(requestCode, permissions, grantResults)
       if (requestCode == MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION) {
           val value = grantResults[0]
           if (value == PERMISSION_DENIED) {
               Toast.makeText(this, "Location Permission denied", Toast.LENGTH_SHORT).show()
               finish()
           } else if (value == PERMISSION_GRANTED) requestLocationUpdate()
       }
    }
}

Mình sẽ giải thích cụ thể tác dụng của các hàm quan trọng:

1.createLocationCallback(): Chúng ta gọi hàm này từ hàm onCreate của MainActivity. Trong hàm LocationCallback, chúng ta sẽ lấy vị trí hiện tại của tài xế,và cập nhật trên Firebase Real-time Database nếu tài xế đang trực tuyến

2.requestLocationUpdates(): Gọi hàm này từ hàm onCreate của MainActivity nếu người dùng đã cài đặt GooglePlayService.

Trong hàm này, chúng ta sẽ cần đoạn mã để yêu cầu người dùng cấp quyền cho Location permission. Sau đó chúng tôi kiểm tra Location provider đã được bật lên hay chưa. Cuối cùng là bắt đầu cập nhật vị trí.

3. showOrAnimateMarker(): chúng ta sẽ kiểm tra xem thử Marker của xe tài xế đã có rồi hay chưa, nếu chưa thì tạo mới  một Marker vào Google Maps. Nếu đã có rồi thì tạo hiệu ứng chuyển động cho Marker đến vị trí mới.

4. animteCamera(): Mục đích chính của hàm này là tạo hiệu ứng và chuyển map về vị trí hiện tại

UiHelper

Class này mình tạo riêng với mục đích sẽ viết những hàm mà mình có thể tái sử dụng nhiều lần. Như tên của class, các hàm liên quan đến UI sẽ được mình để vào đây

class UiHelper {

    fun isPlayServicesAvailable(context: Context): Boolean {
        val googleApiAvailability = GoogleApiAvailability.getInstance()
        val status = googleApiAvailability.isGooglePlayServicesAvailable(context)
        return ConnectionResult.SUCCESS == status
    }

    fun isHaveLocationPermission(context: Context): Boolean {
        return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
    }

    fun isLocationProviderEnabled(context: Context): Boolean {
        val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
        return !locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) && !locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
    }

    fun showPositiveDialogWithListener(callingClassContext: Context, title: String, content: String, positiveNegativeListener: IPositiveNegativeListener, positiveText: String, cancelable: Boolean) {
        buildDialog(callingClassContext, title, content)
                .builder
                .positiveText(positiveText)
                .positiveColor(getColor(R.color.colorPrimary, callingClassContext))
                .onPositive { _, _ -> positiveNegativeListener.onPositive() }
                .cancelable(cancelable)
                .show()
    }

    private fun buildDialog(callingClassContext: Context, title: String, content: String): MaterialDialog {
         return MaterialDialog.Builder(callingClassContext)
                 .title(title)
                 .content(content)
                 .build()
    }


    private fun getColor(color: Int, context: Context): Int {
        return ContextCompat.getColor(context, color)
    }

    fun getLocationRequest() : LocationRequest {
        val locationRequest = LocationRequest.create()
        locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        locationRequest.interval = 3000
        return locationRequest
    }
}

Mình sẽ giải thích một số hàm quan trọng:
isPlayServicesAvailable():Hàm này kiểm tra việc người dùng đã cài Google Play Services hay chưa.

isHaveLocationPermission():Kiểm tra xem người dùng có cấp quyền truy cập vị trí (location permission) hay không.

isLocationProviderEnabled(): Kiểm tra xem Location Provider đã được kích hoạt hay chưa. Nếu chưa thì mở Setting và bật Location Provider( Chọn GPS hay Network…)

showPositiveDialogWithListener(): Chức năng tiện ích để hiển thị Dialog khi điện thoại người dùng vì lý do nào đó mà tắt Location Provider

GoogleMapHelper

Class này sẽ gồm những hàm dàng riêng cho map cho Car Location Tracking .

class GoogleMapHelper {

    companion object {
        private const val ZOOM_LEVEL = 18
        private const val TILT_LEVEL = 25
    }

    /**
     * @param latLng in which position to Zoom the camera.
     * @return the [CameraUpdate] with Zoom and Tilt level added with the given position.
     */

    fun buildCameraUpdate(latLng: LatLng): CameraUpdate {
        val cameraPosition = CameraPosition.Builder()
                .target(latLng)
                .tilt(TILT_LEVEL.toFloat())
                .zoom(ZOOM_LEVEL.toFloat())
                .build()
        return CameraUpdateFactory.newCameraPosition(cameraPosition)
    }

    /**
     * @param position where to draw the [com.google.android.gms.maps.model.Marker]
     * @return the [MarkerOptions] with given properties added to it.
     */

    fun getDriverMarkerOptions(position: LatLng): MarkerOptions {
        val options = getMarkerOptions(R.drawable.car_icon, position)
        options.flat(true)
        return options
    }

    private fun getMarkerOptions(resource: Int, position: LatLng): MarkerOptions {
        return MarkerOptions()

 .icon(BitmapDescriptorFactory.fromResource(resource))
                 .position(position)
    }
}

MarkerAnimationHelper

Lớp MarkerAnimationHelper tạo hiệu ứng cho marker khi xe tài xế di chuyển từ vị trí cũ tới vị trí mới.

class MarkerAnimationHelper {

    fun animateMarkerToGB(marker: Marker, finalPosition: LatLng, latLngInterpolator: LatLngInterpolator) {
        val startPosition = marker.position
        val handler = Handler()
        val start = SystemClock.uptimeMillis()
        val interpolator = AccelerateDecelerateInterpolator()
        val durationInMs = 2000f
        handler.post(object : Runnable {
            var elapsed: Long = 0
            var t: Float = 0.toFloat()
            var v: Float = 0.toFloat()
            override fun run() {
                // Calculate progress using interpolator
                elapsed = SystemClock.uptimeMillis() - start
                t = elapsed / durationInMs
                v = interpolator.getInterpolation(t)
                marker.position = latLngInterpolator.interpolate(v, startPosition, finalPosition)
                // Repeat till progress is complete.
                if (t < 1) {
                    // Post again 16ms later.
                    handler.postDelayed(this, 16)
                }
            }
        })
    }
}

FirebaseHelper

Mình sẽ viết những hàm liên quan đến kết nôi Firebase tại class này:

class FirebaseHelper constructor(driverId: String) {

    companion object {
        private const val ONLINE_DRIVERS = "online_drivers"
    }

    private val onlineDriverDatabaseReference: DatabaseReference = FirebaseDatabase
            .getInstance()
            .reference
            .child(ONLINE_DRIVERS)
            .child(driverId)

    init {
        onlineDriverDatabaseReference
                .onDisconnect()
                .removeValue()
    }

    fun updateDriver(driver: Driver) {
        onlineDriverDatabaseReference
                .setValue(driver)
        Log.e("Driver Info", " Updated")
    }

    fun deleteDriver() {
        onlineDriverDatabaseReference
               .removeValue()
    }
}

Trước khi bắt đầu giải thích về class FirebaseHelper, mình muốn cho bạn thấy cấu trúc của Firebase Real-time Database.

ung-dung-car-location-tracking-cho-android-2

Mình sẽ giải thích một số hàm quan trọng trong FirebaseHelper.
onlineDriverDatabaseReference(): Khi tạo DatabaseReference, chúng ta cần thêm hai thư mục: một cho các điểm mà các drivers đang online khác, một cho bản thân driver đó.

Chúng ta cần thông báo firebase real-time database để cập nhật thông tin vị trí Driver. Đó chính là lý do tại sao mình lại thiết lập driverId như là top node và là một đối tượng Driver. Lưu ý driverId phải unique

updateDriver(): Cập nhật vị trí mới của Driver firebase real-time database.

deleteDriver(): Loại bỏ driver node khỏi firebase real-time database.

Driver Object

Class này đơn giản là model để mình định nghĩa object driver với các thuộc tính: driverId, lat, lng

data class Driver(val lat: Double, val lng: Double, val driverId: String = "0000")

Bạn có thể thay đổi driverId bằng mã khóa chính của người dùng hoặc bất kỳ thứ gì mà bạn cho là unique

Giải thích thêm: Cách tiếp cận mà mình sử dụng cho 2 mode của tài xế: online và offline tương tự cách mà các ứng dụng Social Media đang làm. Tức là hiển thị trạng thái online cuối cùng, kiểm tra xem người dùng có online hay không, v.v.

Tổng kết

Như vậy là chúng ta đã hoàn thành ứng dụng Car location Tracking phần danh cho tài xế. Toàn bộ source code, các bạn có thể download bên dưới.

Bài viết sau, mình sẽ tiếp tục hướng dẫn các bạn xây dựng phần hiển thị vị trí của tài xế, phần dành cho khách hàng.

Bài viết gốc được đăng tải tại vntalking.com

Xem thêm:

Tìm việc làm IT mọi cấp độ tại TopDev

Lại nói về cách làm thế nào để gọi được API các dịch vụ của Google

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Việc tích hợp với API của bên thứ ba có lẽ không còn xa lạ gì với nhiều người. Tùy vào hệ thống sắp sửa phải liên kết mà có cách triển khai và gọi khác nhau, như phương thức HTTP, xác thực client, quyền hạn được truy cập vào những endpoint nào… Mỗi bên, họ đều có những quy tắc và yêu cầu mà chúng ta cần tuân thủ nếu muốn có các cuộc gọi thành công.

Không biết trong đây có bạn đọc nào đã từng tích hợp API của Google chưa chứ tôi thì có vài lần rồi. Lần đầu tiên là gọi API của Google Sheets, cần ghi được dữ liệu vào Sheets riêng tư của người dùng. Thời gian đầu, phải bỏ ra một vài ngày để nghiên cứu cách làm, đọc tài liệu của Google thì bị “loạn xì ngầu” vì cách họ trình bày có phần hơi khó hiểu, hoặc có thể là dễ hiểu cho người đã từng có kinh nghiệm làm rồi. Rất may là cuối cùng việc tích hợp cũng ổn thỏa, tôi đã có thể ghi được dữ liệu bằng cách yêu cầu họ thêm tài khoản Google của mình với quyền ghi vào file Sheets ấy.

Bẵng đi một thời gian sau đó, khi cần phải tích hợp API của Google Analytics thì là một lần… phải nghiên cứu lại. Có lẽ lâu rồi không đụng đến nên tôi quên mất cách làm năm xưa. Nhưng may mắn lần này mất ít thời gian hơn vì dần dần nhớ ra được luồng xử lý trước đó.

Nghĩ rằng sẽ có những người gặp phải trường hợp như tôi, nên trong bài viết này vừa là ghi chép lại cách làm, vừa là hướng dẫn cho người mới trong vấn đề này, hy vọng nó sẽ có ích cho bạn đọc.

  Tìm hiểu về xác thực và phân quyền trong ứng dụng

  Google Cloud hướng tới hỗ trợ tất cả dữ liệu phi cấu trúc

Xác thực và ủy quyền

Trước tiên để mà nói, có một vài điểm cần làm sáng tỏ. Sau khi hiểu được một số khái niệm và luồng tích hợp thì vấn đề trở nên dễ hiểu hơn. Google cung cấp hai khái niệm Xác thực và Ủy quyền để cho phép chúng ta thay mặt người dùng tương tác với API của hệ thống. Sau khi xác thực và ủy quyền thành công, có thể thoải mái gọi API để tương tác với dữ liệu của họ.

Vậy thì thế nào là xác thực và ủy quyền?

Hiểu đơn giản, hành vi xác thực để chứng minh bạn sở hữu quyền truy cập vào tài khoản thông qua việc đăng nhập vào tài khoản Google. Nhập thông tin tài khoản và mật khẩu để đăng nhập, bạn đã xác thực thành công. Còn ủy quyền là hình thức chúng ta tạo ra một OAuth 2 Credentials để xin quyền đọc/ghi dữ liệu của người dùng. Sau khi họ ủy quyền cho ứng dụng của chúng ta được phép truy cập, ngay lập tức sẽ có được quyền gọi API.

Xác thực và ủy quyền

Vậy thì việc xin được quyền thể hiện ở chỗ nào?

Đó chính là bạn lấy được mã Access Token của người dùng đã ủy quyền cho ứng dụng. Từ mã token đó gọi lên API sẽ lấy được thông tin. Hầu hết các dịch vụ của Google đều yêu cầu Access Token đã được ủy quyền để có thể lấy được dữ liệu.

Xác thực và ủy quyền

Hãy tóm tắt lại, quá trình để có thể gọi được API diễn ra như sau: Tạo OAuth 2 Credentials -> Dùng Credentials đó đi xin quyền truy cập vào một dịch vụ nào đó của người dùng -> Lấy được mã Access Token -> Dùng mã đó gọi API.

Rất ngắn gọn phải không!

Tham khảo việc làm Back-end hấp dẫn trên TopDev

Ngoài cách xác thực và ủy quyền thông qua OAuth 2 Credentials ở trên, chúng ta còn có một cách nữa để có được mã Access Token. Nhưng mã token này không phải là của người dùng, mà nó là token của Google Service Account.

Nếu để ý, bạn có thể biết nhiều dịch vụ của Google cho phép chúng ta thêm các tài khoản Google khác vào quản lý với các đặc quyền như chỉ đọc/ghi, hoặc toàn quyền (admin). Google Service Account có thể coi như là một tài khoản Google đặc biệt và có thể được thêm vào làm quản trị. Khi đó tài khoản này cũng có quyền được truy cập vào dữ liệu người dùng nên có thể thông qua nó để lấy được dữ liệu người dùng thông qua API.

Hai cách xin quyền truy cập dịch vụ (ủy quyền)

Vì để cho ngắn gọn và đỡ lan man, bài viết này tôi chỉ trình bày các ý chính của hai cách xin quyền, mã ví dụ sẽ có trong các bài viết tiếp theo.

Scope

Trước khi nói về hai cách, hãy dành thời gian tìm hiểu về scope vì nó khá là quan trọng.

Scope trong Oauth 2 rất quan trọng, nó thể hiện cho việc bạn đang muốn xin quyền gì ở người dùng. Ví dụ như quyền đọc được thông tin tài khoản như họ tên, avatar, địa chỉ email… cho đến các quyền thêm/sửa/xóa dữ liệu của người dùng. Vì thế hãy sử dụng scope để xin những quyền mà bạn thực sự muốn, tránh việc xin các quyền vô lý khác dẫn đến rủi ro cho tài khoản của người dùng, hoặc có thể người dùng sẽ không đồng ý cấp quyền cho bạn.

Về danh sách scope, bạn có thể xem tại OAuth 2.0 Scopes for Google APIs.

Scope luôn xuất hiện ở trong mã, nơi có bất kì yêu cầu xác thực và ủy quyền nào cho người dùng, hãy lưu ý điều đó cho việc viết mã sau này.

Sử dụng chính tài khoản người dùng có quyền truy cập

Rõ rồi, tài khoản người dùng có quyền truy cập vào dịch vụ, nếu lấy được Access Token được ủy quyền từ nó, chúng ta sẽ gọi được API. Đây cũng là cách đầu tiên tôi nghĩ ra để lấy được quyền truy cập vào dữ liệu người dùng.

Cách làm này cũng khá đơn giản, bao gồm các bước chính như sau:

  • Tạo một OAuth 2 Credentials bằng cách truy cập vào Credentials.
  • Sử dụng Client ID & Client secret được tạo ra để xác thực và ủy quyền tài khoản người dùng
  • Lấy được Access Token & Refresh Token, lưu lại chúng vào đâu đó để phục vụ cho việc gọi API sau này.

Client ID sau khi tạo ra, nhúng nó vào trong web thông qua bộ SDK của google, người dùng bấm vào nút “Đăng nhập” một popup mở ra xin quyền truy cập, nếu người dùng đồng ý bạn sẽ lấy được token và ngược lại.

Tuy nhiên cách làm này có một số hạn chế như phải xin quyền trực tiếp từ tài khoản Google của người dùng, rủi ro lộ thông tin cá nhân… Vì lẽ đó, chúng ta có thêm một cách thứ hai dưới đây.

Sử dụng Google Service Accounts

Google Service Accounts (GSA) là một tính năng của Google Cloud Platform (GCP) cho phép các ứng dụng và dịch vụ truy cập các tài nguyên trong môi trường GCP mà không cần sử dụng thông tin đăng nhập của người dùng. Service Accounts cung cấp một cách để xác thực và ủy quyền các ứng dụng và dịch vụ để tương tác với các tài nguyên và API của GCP.

Hiểu đơn giản GSA là một tài khoản Google đặc biệt, được tạo ra và thêm vào các dịch vụ để nó có quyền được truy cập vào dữ liệu. GSA có cơ chế xác thực đơn giản hơn so với tài khoản người dùng, chỉ cần sử dụng một tệp cấu hình của GSA là đã có thể gọi các API của Google.

Các bước sử dụng GSA được tóm tắt như sau:

  • Tạo một tài khoản GSA và tải về tệp cấu hình có định dạng JSON
  • Thêm tài khoản GSA vừa tạo vào dịch vụ của Google với quyền đọc/ghi tùy mục đích sử dụng.
  • Sử dụng thư viện do Google cung cấp tương ứng cho dịch vụ cần tương tác, thêm tệp cấu hình vào để khởi tạo client và thực hiện các cuộc gọi API như bình thường.

Bằng cách làm này, chúng ta có thể bảo vệ được thông tin người dùng, không cần xin phép từ tài khoản của họ. Tất cả những gì cần làm là thêm GSA vào nhóm quản trị với quyền hạn tùy mục đích sử dụng.

Tuy nhiên, một số dịch vụ không chấp nhận thêm tài khoản GSA. Thế nên tùy dịch vụ mà chúng ta cần lựa chọn cách xác thực và ủy quyền sao cho hợp lệ.

Cách gọi API sau khi đã có được mã Access Token

Có nhiều cách để bạn gọi được API, đơn giản và thuận tiện nhất chính là sử dụng các thư viện mà họ cấp.

Ví dụ nếu đang dùng Node.js và muốn gọi API của Google Sheets, bạn có thể sử dụng gói googleapis. Đây là thư viện đóng gói hầu hết các dịch vụ của Google như Oauth 2 đến Google Sheets, Google Driver, Google Analytics…

Một điểm cộng cho việc dùng thư viện nữa là nó sẽ đảm nhận luôn việc xử lý Access Token hết hạn, nghĩa là tự động làm mới mã truy cập thông qua Refresh Token. Tất cả những gì bạn cần làm là tải file cấu hình vào lúc khởi tạo client, sau đó thư viện sẽ cung cấp các hàm kiểm tra, làm mới mã thông báo.

Ngoài ra, chúng ta còn có cách gọi trực tiếp API bằng các Endpoints mà Google cung cấp, tuy nhiên cách này có đôi phần rời rạc và phức tạp hơn do phải xử lý và lưu trữ một lượng endpoint lớn.

Tổng kết

Có thể việc tích hợp API các dịch vụ của Google lần đầu có phần hơi mất thời gian. Nhưng sau khi hiểu được nguyên lý xác thực và ủy quyền đồng thời biết cách sử dụng các thư viện hỗ trợ do chính họ cung cấp thì chúng ta có thể đẩy nhanh quá trình tích hợp sau này.

Bài viết gốc được đăng tải tại 2coffee.dev

Xem thêm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

AsyncTask trong Android – công cụ xử lý đa luồng hữu hiệu

Bài viết được sự cho phép của tác giả Sơn Dương

Bài viết này mình sẽ hướng dẫn chi tiết các sử dụng AsyncTask trong Android, một cách làm rất được khuyến khích khi xử lý đa luồng trong Android.

Mỗi ứng dụng Android khi sử dụng đều được hệ điều hành cấp cho một process, và trên đó có một thread mặc định. Đó là main UI thread. Android xử lý tất cả các sự kiện/tác vụ trên một thread duy nhất gọi là main UI thread. Main UI thread không xử lý các hoạt động đồng thời vì nó chỉ xử lý một sự kiện/task tại một thời điểm.

Do vậy, nếu bạn thực hiện một tác vụ gì đó mà tốn nhiều thời gian trên main UI thread sẽ gây ra hiện tượng treo ứng dụng hay còn gọi là ANR (Application Not Responding).

Để xử lý các tác vụ cần nhiều thời gian như: Tải file từ internet, nén hoặc giải nén… thì chúng ta phải tách tác vụ đó khỏi main UI thread( gọi là xử lý đa nhiệm). Android cung cấp một số công cụ để bạn có thể làm được điều đó như:

  • Sử dụng Service – IntentService
  • Sử dụng Thread – một khái niệm của Java
  • Loader trong Android
  • Hoặc sử dụng AsyncTask trong Android…

Nhưng trước hết, chúng ta cùng nhau tìm hiểu xử lý đa nhiệm trong Android là gì? Và khi nào cần phải xử lý đa nhiệm thay vì thực hiện ngay trên UI thread?

Xử lý đa nhiệm trong Android

Nếu các sự kiện hoặc một task nào đó không được xử lý đồng thời. Thì toàn bộ mã của ứng dụng Android sẽ chạy trên luồng chính và code sẽ được thực hiện tuần tự từng dòng một.

Giả sử nếu bạn thực hiện một công việc/ tác vụ cần thời gian xử lý như tải nhạc từ Internet, ứng dụng sẽ hiển thị trạng thái treo cho đến khi tải xong.

Để mang lại trải nghiệm người dùng tốt, tất cả tác vụ có khả năng chạy chậm đều phải chạy không đồng bộ.

Xử lý đa nhiệm trong Android

Mình có thể tạm liệt kê một số tác vụ cần thời gian xử lý như:

  • Truy cập tài nguyên (như MP3, JSON, Hình ảnh) từ Internet.
  • Thao tác với cơ sở dữ liệu.
  • Tương tác với webService như RESTful, SOAP…
  • Các Logic phức tạp mất khá nhiều thời gian như: Nén/giải nén file, sao chép/di chuyển file trong bộ nhớ…

Và còn rất nhiều các trường hợp khác cần phải xử lý bất đồng bộ, đa nhiệm khác nữa. Tùy vào ứng dụng của bạn như thế nào mà ứng biến cho phù hợp.

Bài viết này mình sẽ tập trung giới thiệu cho các bạn các sử dụng AsyncTask trong Android, một khái niệm của Android và cũng được khuyên dùng khi cần xử lý tác vụ nặng, cần thời gian.

  Sử dụng Intelligent constants trong lập trình Android

  Interface trong Java – Bạn đã hiểu đúng? Nếu chưa, mời đọc ngay

AsyncTask trong Android là gì?

AsyncTask là một abstract Android class, giúp ứng dụng Android xử lý main UI thread hiệu quả hơn. AsyncTask trong Android cho phép chúng ta thực hiện những tác vụ dài mà không ảnh hưởng đến main thread.

Khi nào thì sử dụng AsyncTask?

Để dễ hình dung, mình giả sử bạn tạo một ứng dụng Android để tải xuống tệp MP3 từ Internet.

Sơ đồ trạng thái dưới đây cho thấy một loạt các hoạt động sẽ diễn ra khi bạn chạy ứng dụng

 da-luong-multi-threading-voi-asynctask-trong-android

Trong khi chờ nhận file MP3 từ máy chủ, ứng dụng sẽ bị treo vì main thread vẫn đang chờ tác vụ tải xuống hoàn tất.

Để khắc phục điều này, chúng ta có thể tạo thread mới và thực hiện các tác vụ trên thread mới đó. Do đó giao diện người dùng sẽ không bị ảnh hưởng và treo nữa

Nhưng việc xử lý với thread riêng biệt có thể tạo ra một số vấn đề như việc cập nhật giao diện người dùng. Bạn sẽ cần phải cập nhập trạng thái download được bao nhiêu % file đó, và khi kết thúc tải thì cũng phải cập nhập cho người dùng biết. Nếu bạn sử dụng Thread đơn giản của java thì việc cập nhập này sẽ khá phức tạp.

Android đã xem xét tất cả các vấn đề này và tạo một lớp chuyên dụng có tên là AsyncTask.

Tham khảo việc làm Java mới nhất trên TopDev

Cách triển khai AsyncTask trong Android?

Tạo một class mới bên trong Activity và kế thừa từ AsyncTask như dưới đây

private class DownloadMp3Task extends AsyncTask<URL, Integer, Long> {
 protected Long doInBackground(URL... urls) {
      //Yet to code
      }
 protected void onProgressUpdate(Integer... progress) {
     //Yet to code
     }
 protected void onPostExecute(Long result) {
     //Yet to code
     }
}

Để thực thi tác vụ, đơn giản bằng cách gọi phương thức execute

new DownloadMp3Task().execute(mp3URL);

Bản chất Asynctask gồm có 4 bước:

 da-luong-multi-threading-voi-asynctask-trong-android

Bước 1: onPreExecute()

Được thực hiện trước khi bắt đầu thực hiện tác vụ. Hàm được gọi trước phương thức doInBackground() và được gọi trên UI thread.

Thông thường, hàm này được dùng để hiển thị thanh progressbar thông báo cho người dùng biết tác vụ bắt đầu thực hiện

Bước 2doInBackground()

Tất cả code mà cần thời gian thực hiện sẽ được đặt trong hàm này.  Vì hàm này được thực hiện ở một thread hoàn toàn riêng biệt với UI thread nên bạn không được phép cập nhật giao diện ở đây.

Để có thể cập nhập giao diện khi tác vụ đang thực hiện. Ví dụ như cập nhập trạng thái % file đã download được, chúng ta sẽ phải sử dụng đến hàm bên dưới onProgressUpdate()

Bước 3: onProgressUpdate()

Hàm này được gọi khi trong hàm doInBackground() gọi đến hàm publishProgress()

Bước 4onPostExecute()

Hàm này được gọi khi doInBackground hàm thành công việc. Kết quả của doInBackground() sẽ được trả cho hàm này để hiển thị lên giao diện người dùng.

Trong quá trình Asynctask thực hiện tác vụ, bạn hoàn toàn có thể tạm dừng bất kể lúc nào mà không cần phải đợi AsyncTask làm xong. Đơn giản là bạn gọi hàm cancel(boolean)

Một số lưu ý về các sử dụng AsynctTask

  • Lớp AsyncTask phải được thực hiện trên UI Thread
  • Hàm execute(Params…) phải được gọi trên UI Thread
  • Không nên gọi onPreExecute ()onPostExecute()doInBackground (Params…)onProgressUpdate (Progress…) theo cách thủ công.
  • Task chỉ được thực thi một lần tại một thời điểm (Exception sẽ được throw nếu thực hiện lần thứ hai).

Như vậy là mình đã hướng dẫn các bạn kiến thức cơ bản về cách sử dụng AsyncTask trong Android. Khi bạn đã nắm được bản chất thì việc sử dụng và ứng biến trong từng trường hợp cụ thể sẽ rất dễ dàng.

Đừng quên chia sẻ bài viết cho các bạn khác cùng tìm hiểu nữa nhé.

Bài viết gốc được đăng tải tại vntalking.com

Tìm việc làm IT mọi cấp độ tại TopDev

Đôi điều về Object Reference trong Javascript. Nhiều lúc quên thật phiền toái!

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Object Reference là một khái niệm thể hiện một biến tham chiếu, tức là thay vì lưu trữ giá trị thực nó lưu lại địa chỉ ô nhớ & thao tác với dữ liệu dựa trên địa chỉ đó. Điều này giúp tiết kiệm bộ nhớ cho các ứng dụng. Tuy nhiên cũng không ít điều phiền toái từ nó mà ra.

Kiểu dữ liệu nguyên thuỷ

Trong Javascript, chúng ta có những kiểu dữ liệu “nguyên thuỷ” (Primitive Types) bao gồm: undefinednullstringnumberboolean và symbol.

Các biến khi được khởi tạo với các giá trị này sẽ được cấp pháp một ô nhớ nhất định không có liên quan đến nhau. Ví dụ:

let name = "estacks";
let name2 = name; // estacks
name = "estacks.icu";
console.log(name); // estacks.icu
console.log(name2); //estacks

Bất kì khi nào thay đổi biến name thì những biến trước được gán bằng name vẫn giữ nguyên giá trị. Điều này cũng tương tự với kiểu dữ liệu numberboolean

Tham khảo tuyển dụng javascript lương cao trên TopDev

Object & Array

Không giống với Primitive Types, Object & Array, khi có nhiều hơn một biến được tạo để lưu trữ một objectarrayfunction. Những biến đó được trỏ đến địa chỉ đã được phân bổ tương tự trong bộ nhớ.

const arr1 = ['e', 's', 't', 'a', 'c', 'k', 's'];
const arr2 = arr1;
arr1[0] = 'a';
console.log(arr2); // ['a, 's', 't', 'a', 'c', 'k', 's']

Nhìn vào ví dụ trên, khi phần tử thứ nhất trong arr1 bị thay đổi, kéo theo đó thì arr2 cũng bị thay đổi theo. Tại sao vậy?

Khi arr1 được khai báo, bộ nhớ sẽ được cấp phát và một địa chỉ được lưu lại bởi nó. Sau đó arr2 được gán bằng arr1. Vì arr1 là một mảng thay vì tạo mới một bản sao của mảng đó, arr2 chỉ đơn giản là trỏ đến địa chỉ lưu arr1. Bằng cách đó, bất kỳ thay đổi nào được thực hiện trên arr1 cũng sẽ được thay đổi trên arr2 hoặc ngược lại bởi vì chúng trỏ đến cùng một vị trí. Điều này cũng tương tự với object & function.

  Top 10 điều hay ho khi làm việc Javascript Array

  Deep Clone Objects trong Javascript – Giới thiệu một biện pháp cực mạnh

Những phiền toái

“Quên” mất việc biến đang tham chiếu

Đây cũng là trường hợp mình thấy phổ biến nhất. Khai báo một biến dựa trên một biến khác mà quên mất biến đó có tính chất reference. Những bạn mới vào nghề sẽ rất dễ bị mắc lỗi này, vì thế khi biết được tính chất này thì hãy tránh khai báo một biến dựa trên một biến khác nhé, thay vào đó hãy sao chép nó ra.

const person1 = {
  name: 'Nguyễn Văn A',
  age: 20,
  address: {
    city: 'Hà Nội',
    district: 'Cầu Giấy',
  }
};
const person2 = { ...person1 };

Ở ví dụ trên mình vừa copy person1 sang person2. Hãy thử thay đổi giá trị của name hoặc age ở person1 thì person2 vẫn không bị thay đổi. Nhưng nếu thay đổi city hoặc district thì person2 vẫn bị thay đổi theo. Lý do là bởi address được khai báo với giá trị là object nên address vẫn có tính chất reference.

Tham khảo việc làm JavaScript tại Hồ Chí Minh trên TopDev

Cách copy object bằng cú pháp spread (…) ở trên hay nhiều cách copy khác như dùng Object.assign chỉ có thể sao chép “nông” (shallow) được đối tượng, để có thể sao chép được toàn bộ đối tượng lồng nhau như vậy mà tránh reference có thể dùng một trong ba cách sau:

Thứ nhất là dùng tổ hợp cú pháp JSON.parse & JSON.stringify. Đây là cách đơn giản & nhanh chóng nhất.

const person1 = {
  name: 'Nguyễn Văn A',
  age: 20,
  address: {
    city: 'Hà Nội',
    district: 'Cầu Giấy',
  }
};
const person2 = JSON.parse(JSON.stringify(person1));

Tuy nhiên đây lại là cách tồi nhất, do việc parse một string thành object hoàn toàn không tốt cho hiệu năng, chưa kể nếu như string đó là lớn.

Thứ hai là viết mã để thực hiện việc deep copy:

function deepCopy(obj) {
    if(typeof obj !== 'object' || obj === null) {
        return obj;
    }

    if(obj instanceof Date) {
        return new Date(obj.getTime());
    }

    if(obj instanceof Array) {
        return obj.reduce((arr, item, i) => {
            arr[i] = deepCopy(item);
            return arr;
        }, []);
    }

    if(obj instanceof Object) {
        return Object.keys(obj).reduce((newObj, key) => {
            newObj[key] = deepCopy(obj[key]);
            return newObj;
        }, {})
    }
}

Và cuối cùng, sử dụng thư viện có sẵn các hàm deepCopy như lodash, ramda… hoặc dùng package clone có sẵn trên npm.

Đặt một đối tượng dùng chung

Hình dung như bạn có một config để sử dụng làm mặc định nếu không tìm thấy những config riêng của chúng, bạn sẽ export ra một object chứa những config đó & thật tai hại nếu như trong quá trình sử dụng chúng, bạn vô tình thay đổi giá trị ở một nơi nào đó.

// file config.js
module.export = {
  appName: "estacks",
  connection: {
    host: "0.0.0.0",
    port: 80,
}
// file app.js
const conf = require('./config.js');

let config = findConfig(); // null
if (!config) config = conf;
...
// vô tình thay đổi conf
config.connection.port = 443;

Thì lúc này ở những file khác đang có import config.js thì connection.port đều bị chuyển thành 443 hết.

Giải pháp cho vấn đề này là hãy deep clone config ra trước khi sử dụng. Để tránh việc thay đổi chúng sẽ dẫn đến những lỗi ngớ ngẩn mà có thể mất cả tuần để debug :D.

Kết luận

Kiến thức về Object Reference chỉ đơn giản là chỉ một biến tham chiếu. Khi làm việc với biến tham chiếu bạn phải hết sức cẩn thận để không phải mắc những sai lầm như tôi ở trên nhé!

Bài viết gốc được đăng tải tại 2coffee.dev

Có thể bạn quan tâm:

Xem thêm các việc làm công nghệ hấp dẫn trên TopDev