Home Blog Page 29

Tại sao hồ sơ của bạn chưa được gọi đi phỏng vấn?

Tại sao hồ sơ của bạn chưa được gọi đi phỏng vấn?

Bài viết được sự cho phép của tác giả Lê Tuấn Anh

Bạn cảm thấy kĩ năng và kinh nghiệm mình rất phù hợp với vị trí đó, nhưng cuối cùng hồ sơ vẫn không được gọi đi phỏng vấn. Những lúc như vậy có thể khiến bạn cảm thấy nghi ngờ bản thân một tí, hay là mình chưa đủ tốt, chưa đủ giỏi, mình đang làm sai chỗ nào mà ứng tuyển mấy nơi đều chưa thành công.

Bài viết này mình chia sẻ đến các bạn những lý do vì sao bạn có thể bị loại khi ứng tuyển để từ đó bạn hiểu rõ vấn đề hơn, nhìn nhận việc ứng tuyển chưa thành công ở một góc nhìn tích cực hơn để tiếp tục ứng tuyển cho những vị trí tiếp theo.

Những lý do khách quan

(1) Job Description quá chung chung nên nhà tuyển dụng chưa có tiêu chí đánh giá rõ ràng

Thật ra có những Job Description viết quá chung chung, không làm rõ được kinh nghiệm, kỹ năng hay bằng cấp mà họ đang cần là gì. Với những Job Description kiểu thế này, khó mà biết được lý do vì sao mà bạn không trúng tuyển vì làm gì có tiêu chí gì đâu để đánh giá. Chính vì tiêu chính đánh giá không rõ ràng, nên việc chọn hay không chọn một cá nhân hoàn toàn có thể dựa theo cảm tính, chính vì vậy bạn bị loại chưa chắc đã là vì bạn không giỏi bằng ứng viên được chọn.

Thực tế không phải nhân sự của công ty nào cũng biết cách viết Job Description đúng chuẩn để tìm ra ứng viên phù hợp. Chính vì vậy, ứng viên học cách viết CV thì nhà tuyển dụng cũng phải học qua những khoá học về cách viết Job Description chuẩn.

(2) Tin tuyển dụng đó chỉ đăng cho có và đủ quy trình, thực tế đã tuyển được người nội bộ mất rồi

Đây là trường hợp mình cũng thường gặp ở nhiều công ty lớn trong quá trình làm việc. Với một số tin tuyển dụng, công ty ưu tiên cho ứng viên nội bộ nộp đơn trước – chính vì vậy đôi khi bạn thấy một tin tuyển dụng được đăng lên và sau đó nộp đơn nhưng không thấy phản hồi, rất có thể vì công ty đã tuyển thành công một ứng viên nội bộ rồi.

(3) Bộ phận tuyển dụng bỏ sót mất CV của bạn

Trường hợp này thì mình thường hay gặp ở các công ty nhỏ, hoặc những phòng ban tuyển dụng có nhiều cá nhân cùng sử dụng một email chung. Rất có thể ai đó đã mở email ứng tuyển của bạn nhưng sau đó quên mất, khiến cho hồ sơ của bạn bị thất lạc. Chính vì vậy, nếu sau deadline ứng tuyển 1-2 tuần mà chưa thấy phản hồi, bạn đừng ngại mà email hỏi, biết đâu bị rơi vào trường hợp này.

(4) Hồ sơ của bạn hay, nhưng của người khác lại còn hay hơn

Đây là lý do mà bạn hoàn toàn không thể kiểm soát được và ở mỗi thời điểm bạn ứng tuyển thì tình huống có thể khác nhau. Có những thời điểm không nhiều ứng viên thì hồ sơ của bạn sẽ là một hồ sơ nổi bật. Ngược lại, có những giai đoạn có nhiều người đi tìm việc thì có thể có những ứng viên giỏi hơn bạn cũng đang nộp đơn vào vị trí đó.

  5 mẹo viết CV IT giúp đánh bại hệ thống sàng lọc tự động ATS

Những lý do chủ quan

(5) Hồ sơ của bạn có thể hiện được động lực và sự phù hợp với công việc đó hay không?

Hãy thử trả lời một số câu hỏi dưới đây để tìm ra câu trả lời:

  • Mục tiêu nghề nghiệp trong CV hoặc Cover Letter của bạn có nói rõ được lý do vì sao bạn quan tâm đến vị trí đó, công ty đó hay không? Hay bạn chỉ đang nói chung chung là “tìm kiếm môi trường phù hợp”, “đóng góp cho sự phát triển của công ty”?
  • Nếu bạn đang ứng tuyển cho vị trí quản lý, bạn đã có thể hiện những kỹ năng quản lý ở trong CV hay chưa – hay chỉ đang đưa vào những kỹ năng như “làm việc nhóm”, “giao tiếp”.
  • Khi viết kinh nghiệm làm việc, bạn đã đưa vào những kết quả công việc bạn làm được hay chưa? Hay bạn mới chỉ liệt kê các đầu việc.
  • Bạn nói rằng mình là người chỉn chu, cẩn thận, thái độ tốt – liệu bạn có đang gặp phải các lỗi sai chính tả hay lỗi trình bày trong CV hay không?

  Góp ý khi viết CV cho sinh viên mới ra trường

(6) Bạn đã viết email đúng hay chưa?

Trường hợp này thường gặp ở các bạn sinh viên nhiều hơn. Nhiều bạn hồ sơ rất hay nhưng cách viết email tệ làm cho nhà tuyển dụng có ấn tượng xấu. Trong bài viết này mình đã hướng dẫn rất kỹ từng bước cách viết email gửi đơn ứng tuyển, bạn tham khảo nhé.

(7) Bạn đã mở rộng cách tìm việc chưa?

Nếu chỉ đơn thuần ứng tuyển công việc trên các trang tuyển dụng như TopDev, TopCV, CareerBuilder mà chưa thành công, bạn cần mở rộng thêm cách thức ứng tuyển của bản thân. Ví dụ bạn ứng tuyển qua LinkedIn, tìm thông tin nhân sự đang làm việc trong công ty đó và gửi thư tự giới thiệu, tìm đến các buổi hội thảo có nhân sự công ty đó tham gia để làm quen. Hoặc có những công ty bạn đang thích nhưng chưa đăng tuyển, mình đã từng chia sẻ về cách nộp đơn vào các công ty kiểu này.

Trải nghiệm công cụ Convert CV online ngay tại đây!

Nói chung là

Một vài điều mình muốn tóm gọn lại cho bài viết này:

  • Bạn có thể ứng tuyển chưa thành công vì nhiều lý do chủ quan và khách quan; tuy nhiên đừng bao giờ tự cho rằng mình kém cỏi hay không đủ năng lực. Chỉ đơn giản là bạn chưa phù hợp, bạn sẽ thử lại cho đến khi tìm được lựa chọn phù hợp.
  • Bên cạnh việc bị động nộp đơn, bạn cần chủ động thêm trong việc xây dựng thương hiệu cá nhân, xây dựng mạng lưới quan hệ chuyên nghiệp và chủ động giới thiệu bản thân với công ty.

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

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

Top 6 khóa học Google miễn phí siêu chất lượng dành cho lập trình viên

khóa học Google miễn phí

Trong thời đại công nghệ, việc nắm bắt kiến thức mới và cập nhật kỹ năng là chìa khóa để thành công trong lĩnh vực lập trình. Một cách tuyệt vời để nâng cấp kiến thức nhanh chóng chính là học qua các khóa học lập trình từ Google. Một loạt các bài học chất lượng cao, có cả chứng chỉ và đặc biệt là hoàn toàn miễn phí đang chờ đợi bạn.

Hãy cùng TopDev khám phá ngay top 10 khóa học Google miễn phí siêu hay dành cho lập trình viên dưới bài viết này nhé!

Khóa học Google miễn phí: IT Support Professional Certificate

Level: Beginner

Thời gian học: 6 tháng

Khóa học “Google IT Support Professional Certificate” là một khóa học Google miễn phí được cung cấp qua hệ thống đào tạo trực tuyến Coursera. Được thiết kế để đáp ứng nhu cầu ngày càng tăng về chuyên gia hỗ trợ IT chất lượng, chứng chỉ này mang lại cho học viên những kiến thức và kỹ năng cần thiết để bắt đầu sự nghiệp trong lĩnh vực IT Support.

Chương trình bao gồm một loạt các mô-đun chuyên sâu, từ cơ bản đến nâng cao, bao quát nhiều khía cạnh của hệ thống và mạng máy tính. Học viên sẽ được hướng dẫn từ các chuyên gia hàng đầu, học cách xử lý sự cố, triển khai và bảo trì hệ thống, đồng thời có cơ hội thực hành qua các bài lab và dự án thực tế.

khóa học Google miễn phí

Link khóa học: https://www.coursera.org/professional-certificates/google-it-support

Khóa học Google Data Analytics Professional

Level: Beginner

Thời gian học: 6 tháng

Khóa học Google Data Analytics Professional Certificate là một khóa học khá “hot” trong thời đại big data hiện nay, mang lại nhiều lợi ích và cơ hội việc làm hấp dẫn. Khóa học được phát triển bởi Google và giảng dạy trên nền tảng Coursera. Khóa học giúp bạn trang bị kiến thức và kỹ năng thực tế để làm việc với dữ liệu, từ thu thập, xử lý đến phân tích và trực quan hóa.

Bạn sẽ được học các nền tảng và công cụ phân tích dữ liệu phổ biến (PythonSQL, Excel, Tableau). Hiểu cách làm sạch và tổ chức dữ liệu để phân tích, tính toán bằng cách sử dụng bảng tính, SQL và lập trình R. Học cách trực quan hóa và trình bày kết quả phân tích dữ liệu thông qua các bảng điều khiển, và các nền tảng trực quan hóa phổ biến.

khóa học Google miễn phí

Link khóa học: https://www.coursera.org/professional-certificates/google-data-analytics

Khóa học Google Professional Machine Learning Engineer

Level: Intermediate

Thời gian học: 3 tháng

Chứng chỉ Google Professional Machine Learning Engineer là khóa học Google miễn phí uy tín trong lĩnh vực Machine Learning, do Google phát triển và cung cấp qua nền tảng Coursera. Đây là một chương trình chuyên sâu dành cho những ai đã có nền tảng vững chắc về khoa học máy tính và mong muốn nâng cao năng lực để xây dựng, triển khai và quản lý các mô hình học máy hiệu quả trong môi trường thực tế.

Khóa học này dành cho các lập trình viên có kinh nghiệm tối thiểu 1 năm, với kiến thức nền tảng về lập trình, thống kê và học máy cơ bản. Yêu cầu phải có năng lực thực hành trong việc thiết kế, xây dựng, triển khai và vận hành các mô hình học máy trong Google Cloud Platform (GCP).

Link khóa học: https://www.coursera.org/professional-certificates/preparing-for-google-cloud-machine-learning-engineer-professional-certificate

  Các chứng chỉ Tester nên có để theo đuổi sự nghiệp

Khóa học Generative AI Learning Path

Khóa học này do Google Cloud quản lý với nội dung liên quan đến các sản phẩm và công nghệ AI tạo sinh. Khi học khóa học này bạn sẽ hiểu về các nguyên tắc cơ bản của trí tuệ nhân tạo, mô hình ngôn ngữ lớn (LLMs), các kiến trúc trí tuệ nhân tạo và tham gia vào các bài tập thực hành.

khóa học Google miễn phí

Link khóa học: https://www.cloudskillsboost.google/paths/118

Khóa học Google Cloud Computing Foundations: Data, ML, and AI in Google Cloud

Khóa học Google miễn phí này dành cho những cá nhân có ít hoặc không có kiến ​​thức nền tảng hoặc kinh nghiệm về điện toán đám mây. Chúng cung cấp thông tin tổng quan về các khái niệm cơ bản về đám mây, Big Data và ML.

Khi tham gia khóa học này bạn sẽ được học về các nguyên tắc cơ bản về điện toán đám mây, cơ sở hạ tầng trong Google Cloud, mạng và bảo mật trong Google Cloud, Data ML và AI trong Google Cloud.

Link khóa học: https://www.cloudskillsboost.google/course_templates/156

  Những chứng chỉ cần có của một quản lý công nghệ thông tin

Khóa học Google IT Automation with Python Professional Certificate

Level: Beginner

Thời gian học: 6 tháng

Google IT Automation with Python Professional Certificate” là một khóa học chuyên sâu được phát triển bởi Google để giúp học viên trang bị kiến thức và kỹ năng thực hành để tự động hóa các tác vụ IT lặp đi lặp lại, quản lý hệ thống và dữ liệu hiệu quả.

khóa học Google miễn phí

Chương trình học bao gồm các phần:

  • Crash Course on Python
  • Using Python to Interact with the Operating System
  • Introduction to Git and GitHub
  • Troubleshooting and Debugging Techniques
  • Configuration Management and the Cloud
  • Automating Real-World Tasks with Python

Link khóa học: https://www.coursera.org/professional-certificates/google-it-automation

Trên đây là top 10 khóa học Google miễn phí siêu chất lượng dành cho lập trình viên. Hy vọng bài viết này sẽ giúp bạn tìm được khóa học phù hợp với nhu cầu và mục tiêu của mình.

Xem thêm:

Xem thêm tuyển dụng việc làm IT hấp dẫn trên TopDev

Nên gửi CV vào thời gian nào? Định dạng file nào chuẩn nhất?

Nên gửi CV vào thời gian nào?

Sau khi bạn đã chuẩn bị một CV tốt, việc quan trọng là khi nào nên gửi CV và gửi ở định dạng file nào. Bài viết này sẽ chỉ ra thời điểm lý tưởng để gửi CV và quy tắc cơ bản về định dạng file để đảm bảo hiệu quả khi nộp đơn.

Vì sao cần xác định thời gian gửi CV xin việc?

Xác định thời gian gửi CV xin việc là một bước quan trọng trong quá trình ứng tuyển. Thời điểm gửi CV ảnh hưởng trực tiếp đến việc CV của bạn có được nhà tuyển dụng chú ý hay không.

cần xác định thời gian gửi CV xin việc

Có một số lý do chính khiến bạn cần xác định thời gian gửi CV xin việc:

  • Tăng cơ hội được xem xét: Nhà tuyển dụng thường nhận được rất nhiều CV cho mỗi vị trí tuyển dụng. Do đó, họ sẽ có xu hướng ưu tiên xem xét những CV được gửi sớm hơn.
  • Tránh gửi vào thời điểm nhà tuyển dụng bận rộn: Nhà tuyển dụng thường bận rộn nhất vào đầu tuần và cuối tuần. Nếu bạn gửi CV vào thời điểm này, khả năng CV của bạn bị bỏ qua là rất cao.
  • Đối với công ty đa quốc gia: Nếu bạn đang xin việc ở một công ty có chi nhánh hoặc văn phòng trên nhiều quốc gia, cân nhắc múi giờ làm việc của họ để đảm bảo rằng CV của bạn sẽ được xem xét trong thời gian làm việc hành chính.

Nên gửi CV vào thời gian nào là phù hợp nhất?

Trước khi gửi CV bạn có thể tham khảo các thời điểm gửi CV lý tưởng dưới đây để tăng hiệu quả xin việc:

Các ngày phù hợp để gửi CV

Dựa vào kinh nghiệm của các chuyên gia tuyển dụng, thì thứ Ba, thứ Tư và thứ Năm được xem là những ngày lý tưởng để gửi CV. Trong khoảng thời gian này, nhà tuyển dụng thường có nhiều thời gian hơn để xem xét và đọc các hồ sơ ứng viên.

  • Thứ Ba, thứ Tư được coi là thời điểm tốt nhất để nộp CV, bởi đây là lúc mà nhà tuyển dụng đã xử lý và đọc hết các email tồn đọng từ cuối tuần trước. Khi hòm thư tuyển dụng đã được xử lý, việc gửi CV vào thời điểm này có thể thu hút sự chú ý của nhà tuyển dụng.
  • Thứ Năm cũng được coi là một ngày thuận lợi để gửi CV, vì nhà tuyển dụng thường đã có thời gian để kiểm tra email, hòm thư, và có thể dành thời gian đọc CV của bạn.
  • Trong khi đó, bạn nên hạn chế gửi CV vào ba ngày cuối tuần (T6. T7 và Chủ Nhật), do đây là ngày mà nhà tuyển dụng thường giải quyết các công việc cuối cùng trong tuần và chuẩn bị cho tuần tiếp theo.

  Cách viết CV xin việc IT "bao đậu" dành cho người chưa có kinh nghiệm

Thời gian “vàng” để gửi CV trong ngày

Thời điểm hợp lý để gửi CV trong ngày là vào buổi sáng sớm, từ 6:00 đến 10:00. Đây là thời điểm mà các nhà tuyển dụng thường có nhiều thời gian để kiểm tra và đọc CV của ứng viên. Theo một nghiên cứu, tỷ lệ nhận được phản hồi từ nhà tuyển dụng cao hơn 42% nếu ứng viên gửi CV vào buổi sáng sớm.

Nếu bạn gửi CV sau 10:00 sáng, tỷ lệ khả năng tuyển dụng giảm 10% sau mỗi 30 phút. Trong khoảng thời gian 12:00 đến 12:30 trưa, khả năng để CV của bạn được xem xét và mời phỏng vấn là khoảng 11%. Sau thời điểm này, tỷ lệ này tiếp tục giảm đi.

Ngoài ra, hãy tránh gửi CV vào thời điểm lúc 19:30 tối. Đây là khoảng thời gian mà mọi người thường nghỉ ngơi sau một ngày làm việc, và việc gửi email vào thời điểm này có thể ảnh hưởng đến cuộc sống cá nhân của nhà tuyển dụng, tạo ra tâm lý không thoải mái và có thể làm mất cảm giác tích cực đối với CV của bạn.

  Tối ưu hóa CV bằng ChatGPT: Gây ấn tượng nhà tuyển dụng ngay từ lần đầu

Định dạng file nào chuẩn nhất khi gửi CV?

Ứng viên có thể lựa chọn nhiều định dạng file khác nhau để gửi CV cho nhà tuyển dụng. Tuy nhiên, định dạng file phổ biến nhất vẫn là PDF, bởi nó sẽ không thay đổi định dạng ban đầu khi nhà tuyển dụng mở file ra xem.

Định dạng file nào chuẩn nhất khi gửi CV?

Định dạng file PDF sẽ rất phù hợp với các vị trí ứng tuyển yêu cầu cao về tính sáng tạo như Designer, Marketing, PR,… Với những ngành nghề chỉ yêu cầu CV đơn giản, không có số liệu, biểu đồ phức tạp thì chọn định dạng file Word là điều cần thiết. Vì nhà tuyển dụng có thể mở file nhanh chóng, có thể copy, edit nếu cần thiết.

Hơn thế nữa, nhiều doanh nghiệp đã bắt đầu ứng dụng hệ thống sàng lọc CV tự động (gọi tắt là ATS) để tối ưu hóa quá trình tuyển dụng. Hệ thống này chủ yếu chỉ quét được các CV dạng .doc, tuy nhiên theo thời gian công nghệ đã được nâng cấp, một vài hệ thống đã có thể nhận diện được thông tin dạng PDF. Do đó, để chắc chắn hơn, ở những nơi dùng hệ thống ATS để sàng lọc CV bạn nên gửi ở định dạng .doc và trình bài CV chuẩn ATS.

Tạo CV IT chuẩn ATS miễn phí trên TopDev

Bí kíp tạo CV chuẩn ATS, tăng tỉ lệ đậu ngay từ lần gửi đầu tiên!

Thời điểm gửi CV và định dạng file rất quan trọng, tuy nhiên nếu nội dung CV không đáp ứng được yêu cầu của nhà tuyển dụng cũng như hệ thống sàng lọc CV thì bạn vẫn sẽ bị loại. Do đó, một cách đơn giản và nhanh chóng nhất để có được chiếc CV IT chuyên nghiệp, chuẩn ATS chính là sử dụng công cụ Chuẩn hóa CV của TopDev.

convert CV

>>> Tham gia minigame “Chuẩn Hóa CV” nhận ngay quà hấp dẫn anh em nhé

Với công cụ hoàn toàn mới này, các developer chỉ cần update CV của mình lên, hệ thống sẽ sử dụng AI để tiến hành quét nội dung và đưa ra một CV mới theo đúng chuẩn ATS hiện nay. Hơn thế nữa, hệ thống sẽ lưu trữ hồ sơ của bạn và cho phép tự do chỉnh sửa, cập nhật nội dung từng phần một cách dễ dàng và nhanh chóng.

Trải nghiệm ngay Công cụ Chuẩn hóa CV online ngay!

Việc có một hồ sơ ứng viên hoàn chỉnh sẽ giúp bạn ghi điểm trong mắt nhà tuyển dụng và hệ thống cũng sẽ tự động đề xuất các công việc IT phù hợp với những kỹ năng, kinh nghiệm của từng developer.

Hy vọng rằng bài viết này sẽ giúp bạn biết cách gửi CV xin việc vào lúc nào là phù hợp nhất. Ngoài ra, bạn cũng nên có cho mình một chiếc CV chuẩn để không bị loại bởi hệ thống sàng lọc CV. Chúc bạn thuận lợi trên con đường tìm kiếm việc làm của mình! Đừng quên theo dõi TopDev để cập nhật các thông tin mới nhất liên quan đến tuyển dụng, nghề nghiệp bạn nhé!

Xem thêm:

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

Lộ trình học React Native từ A – Z hiệu quả nhất!

Lộ trình học React Native từ A - Z hiệu quả nhất!

Lộ trình học React Native như nào là câu hỏi nhiều anh em newbie khi bước chân vào build app với React Native cần biết. Nắm bắt được nhu cầu đó, tui xin mạn phép viết bài viết này giúp anh em từng bước tiếp cận React Native theo cách đơn giản nhất có thể.

Okie, bắt đầu thôi nào!

Lộ trình học React Native

1. Cài đặt môi trường các kiểu

Xin lỗi anh em nếu phần đầu tiên mới chỉ đề cập tới môi trường, cài đặt, ngôn ngữ các kiểu. Nhưng dành cho một số anh em mới, việc thiết lập môi trường, cài đặt hay sử dụng IDE nào cũng khá quan trọng. Nên lướt qua, hoặc nói đúng hơn là liệt kê ra đây cho anh em biết

1.1 Cài đặt môi trường iOS

Dưới đây liệt kê các bài viết hướng dẫn thiết lập môi trường iOS

Nếu bài viết hơi khó khăn thì anh em có thể lướt xem youtube rồi step by step cho dễ nhé

1.2 Cài đặt môi trường Android

Dưới đây liệt kê các bài viết hướng dẫn thiết lập Android trước khi lập trình React Native

>>> Xem thêm: React Native là gì? Tại sao React Native lại phổ biến?

2. Styling với React Native

Tất nhiên ngôn ngữ nào có đụng tới UI cũng đều phải học về styling, React Native cũng không phải là một ngoại lệ. Để build được UI đúng, đẹp và mượt mà với React Native, anh em có thể tham khảo thêm các bài viết khác dưới đây

Lộ trình học React Native
Với đống bài viết phía trên, React Native Flexbox chưa bao giờ dễ hiểu như thế. Nguồn ảnh / Source: draftbit.com

Còn đi sâu vào chi tiết hoặc các ví dụ cụ thể, anh em có thể tham khảo về cách tổ chức code, style, các ví dụ khi code với React Native trên github thêm để bổ sung kiến thức.

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

3. Libraries liên quan tới styling

Dưới đây là một số danh sách thư viện anh em có thể tham khảo. Thư viện ngoài việc giúp code nhanh hơn, cũng là một cách học nhanh các style thường hay sử dụng trong React Native.

Tuy nhiên anh em cần lưu ý muốn sử dụng thư viện thì anh em cần có kiến thức nền của style cơ bản. Tốt hơn hết là cứ đi tuần tự nha anh em, từ một tới hai chứ đừng đi ngược hai về một

    •  react-native-CSS – css styling short, viết CSS với React Native giờ không còn gì là khó

Lộ trình học React Native
Tailwind và React Native, sự kết hợp hoàn hảo. Nguồn ảnh / Source: developerslearnit.com

Nếu anh em thấy một số ông cứ code style cho React Native mà làm CSS thuần thì cũng đừng ngạc nhiên. Tuy nhiên mục đích của thư viện build ra là để quá trình development trở nên nhanh chóng và dễ dàng hơn. Nên luyện libraries là cần thiết nha anh em. Không trật đi đâu được.

  Flutter Vs. React Native - Nên chọn framework nào?

4. Component và Layouts

Sau khi đã thạo mướt mườn mượt styling và syntax cơ bản của React Native thì giờ là lúc anh em bắt tay vào build Component và Layouts

Nếu bài viết hơi khó thì anh em có thể thoe các step build form cho dễ nha

hết đống này chắc anh em khá là thạo build các form trong React Native rồi. Tuy nhiên, nếu muốn tham khảo thêm , anh em có thể lượn lờ youtube hoặc github, xem các form build chuẩn chỉnh từ các ông lớn có public source. Đó cũng là cách học khá là hay.

  ReactJS và React Native: Những điểm giống và khác nhau cơ bản

5. Navigation

Sau khi đã build các form, tất yếu tiếp theo anh em sẽ cần học cách chuyển hướng giữa các màn hình. Lúc này ta sẽ tìm hiểu sâu hơn về Navigation.

Lộ trình học React Native
Flipper là công cụ của React Native cho phép anh em fix bug, ngoài ra còn visulization navigation rất tốt

Qua hết đống này chắc anh em React Native Developer tương lai cũng hiểu cách xây dựng Navigation. Sau khi chuyển chuyển giữa các màn hình rồi thì giờ cũng là lúc tìm hiểu thêm về authentication, build app thật tới nơi rồi anh em. Một bài thôi đi gần hết

6. Authentication

Một loại bài viết trên cung cấp cho anh em ví dụ, hướng dẫn cách làm. Xác thực React Native app thông qua JWT, Firebase

7. Tham khảo

Cảm ơn anh em đã đón đọc – Thank you for your time – Happy coding!

Tác giả: Kiên Nguyễn

>> Xem thêm: Bộ câu hỏi phỏng vấn React Native hàng đầu cho Developer

Đừng bỏ lỡ việc làm IT mới nhất trên TopDev!

Top 9 quyển sách hay về JavaScript – Từ nhập môn đến nâng cao

Top 9 quyển sách hay về JavaScript

Bài viết được sự cho phép của BBT Tạp chí lập trình

JavaScript là một ngôn ngữ lập trình được sử dụng rộng rãi trong phát triển web, mobile và ứng dụng. Để học và thành thạo JavaScript, ngoài các khóa học trực tuyến, tài liệu tham khảo, video hướng dẫn, thì sách JavaScript là một nguồn tài nguyên hữu ích mà bạn không nên bỏ qua.

Sách nhập môn JavaScript

Eloquent JavaScript của Marijn Haverbeke

Eloquent JavaScript
Eloquent JavaScript

Cuốn sách này được coi là một trong những cuốn sách JavaScript hay nhất từng được viết. Nó cung cấp một cách tiếp cận hiện đại và toàn diện cho ngôn ngữ, giải thích những nguyên tắc của việc lập trình, mối quan hệ giữa ngôn ngữ lập trình và máy tính,…

Head First JavaScript Programming của Elisabeth Robson

Head First JavaScript Programming
Head First JavaScript Programming

Cuốn sách này sử dụng một phương pháp tiếp cận “tập trung vào não bộ” để dạy JavaScript. Nó sử dụng phương pháp giảng dạy thực hành, các trò chơi và câu đố nằm trong cuốn sách có thể giúp người đọc nắm bắt JavaScript dễ dàng hơn.

JavaScript & jQuery: Interactive Front-End Web Development của Jon Duckett

JavaScript & jQuery
JavaScript & jQuery

Cuốn sách này cung cấp hướng dẫn về cách sử dụng JavaScript và jQuery để tạo ra các trang web tương tác, chỉ cho bạn cơ bản về lập trình web, làm sao để thiết kế front-end cho một trang web từ việc sử dụng HTML, CSS và JavaScript.

  Lộ trình và cách học Javascript hiệu quả bạn nên biết

Sách nâng cao JavaScript

JavaScript: The Definitive Guide của David Flanagan

JavaScript: The Definitive Guide
JavaScript: The Definitive Guide

JavaScript: The Definitive Guide của David Flanagan là một cuốn sách toàn diện về JavaScript, bao gồm các chủ đề từ cơ bản đến nâng cao. Cuốn sách này là một tài nguyên tuyệt vời cho các nhà phát triển JavaScript ở mọi cấp độ kinh nghiệm.

Secrets of the JavaScript Ninja của John Resig

Secrets of the JavaScript Ninja

Là một cuốn sách nâng cao dành cho các nhà phát triển JavaScript có kinh nghiệm. Cuốn sách này bao gồm các chủ đề như hiệu suất, tối ưu hóa và các kỹ thuật nâng cao khác.

Việc làm JavaScript Hồ Chí Minh dành cho bạn!

You Don’t Know JS của Kyle Simpson

You Don’t Know JS
You Don’t Know JS

Cuốn sách này dạy bạn hiểu cách mà trình duyệt biên dịch và phân tích code của bạn như thế nào. Nếu bạn muốn có một số kiến ​​thức chuyên sâu về JavaScript thì đây là lựa chọn tốt cho bạn. Nó phù hợp đối với các lập trình viên có kinh nghiệm, cũng phù hợp cho mọi người.

  Promise JS là gì? Cách sử dụng Promise trong JavaScript

JavaScript: The Good Parts của Douglas Crockford

JavaScript: The Good Parts
JavaScript: The Good Parts

JavaScript: The Good Parts tập trung vào những kiến thức nền tảng của JavaScript. Đặc biệt, đây cũng là cuốn sách ghi nhận sự phát triển của JavaScript, từ một ngôn ngữ lập trình “nhỏ bé” đến khi trở thành lựa chọn phổ biến trên toàn thế giới.

Sách chuyên đề JavaScript

jQuery in Action

jQuery in Action
jQuery in Action

jQuery in Action là hướng dẫn nhanh và đầy đủ về jQuery, tập trung vào các nhiệm vụ bạn sẽ gặp trong hầu hết mọi dự án phát triển web. Được viết cho những độc giả có ít kinh nghiệm về JavaScript, ấn bản sửa đổi này bổ sung thêm các ví dụ và bài tập mới, cùng với nội dung sâu sắc và thực tế mà bạn mong đợi từ một cuốn sách thực hành.

Node.js in Action

Node.js in Action
Node.js in Action

Node.js in Action, Second Edition là một cuốn sách được sửa đổi kỹ lưỡng dựa trên ấn bản đầu tiên bán chạy nhất. Nó bắt đầu từ đầu và hướng dẫn bạn tất cả các tính năng, kỹ thuật và khái niệm mà bạn cần để xây dựng các ứng dụng Node chất lượng sản xuất.

Bên trên là một số quyển sách JavaScript hay được tổng hợp lại. Với sự đa dạng của các cuốn sách JavaScript trên thị trường, bạn có thể dễ dàng tìm thấy một cuốn sách phù hợp với nhu cầu và trình độ của mình. Hãy dành thời gian nghiên cứu và lựa chọn sách JavaScript một cách kỹ lưỡng để có được kết quả học tập tốt nhất.

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

Xem thêm:

Tìm việc làm IT mới nhất trên TopDev

Tìm hiểu về phong cách Point-Free trong JavaScript

Tìm hiểu về phong cách Point-Free trong JavaScript

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

Vấn đề

Bạn từng nhìn thấy đoạn mã giống như thế này xuất hiện ở đâu chưa?

fetch('https://api.example.com/endpoint')
  .then(toJSON)
  .then(handleResult)
  .catch(handleError);

Lần đầu tiếp xúc với phong cách này, tôi khá là bối rối. toJSONhandleResulthandleError ở đây là gì? Nó là một hàm vậy thì tham số của nó đâu rồi? Tại sao nó có thể chạy được khi mà không cần kết thúc bằng () để có một cuộc gọi hàm chứ? Hay chí ít là, tham số đầu vào của nó đâu?…

Chà, hàng tá câu hỏi hiện ra trong đầu, nhưng lúc đó không có ai để giải thích cho tôi hiểu. Cái gì gặp nhiều ắt sẽ quen, tôi bắt chước theo phong cách đó và ngầm hiểu “À thì ra mình cứ viết theo như vậy, nó sẽ chạy”.

Mãi sau này, tôi hiểu ra phong cách trên người ta gọi là Point-Free. Vậy nếu ngay từ đầu đã khó hiểu như thế tại sao người ta vẫn dùng? Có điều gì mờ ám hoặc thú vị trong cách viết này chăng? Hãy cùng tôi tìm hiểu trong bài viết dưới đây nhé!

  Bỏ túi 6 đoạn code chỉ với một dòng rất hữu ích trong JavaScript

  10 tip tối ưu code trên JavaScript mà web developer nào cũng nên biết

Phong cách Point-Free

Phong cách Point-Free có nghĩa là không cần chỉ định các đối số cho từng ứng dụng hàm. Thuật ngữ “Point” để chỉ một tham số của hàm và Point-Free có nghĩa là không “có chỗ” cho các tham số đó. Mô hình này muốn người đọc tập trung vào chức năng là gì, không quan tâm đến tên cụ thể của các tham số của nó.

Trở lại với một ví dụ đơn giản nhất, chúng ta tạo ra 4 hàm mà nhìn qua thôi cũng đủ biết nó làm gì:

const testOdd = x => x % 2 === 1;
const testUnderFifty = x => x < 50;
const duplicate = x => x + x;
const addThree = x => x + 3;

Sau đó, áp dụng một loạt các thay đổi trên một danh sách dữ liệu số:

const myArray = [22, 9, 60, 24, 11, 63];

const result = myArray
  .filter(testOdd)
  .map(duplicate)
  .filter(testUnderFifty)
  .map(addThree);

Nhìn vào dòng chảy của dữ liệu, theo thứ tự từ trên xuống dưới, lọc ra số lẻ, nhân đôi nó lên, lọc tiếp ra số nhỏ hơn 50 rồi cuối cùng cộng tất cả chúng thêm với 3.

Với phong cách này, tất cả những gì bạn thấy là tên hàm, cả với dòng chảy của dữ liệu. Phong cách này đạt được sự ngắn gọn, nhưng bạn phải cố gắng chọn những tên hàm hay, dễ hiểu.

Trở lại với ví dụ mở đầu, nếu viết theo cách thông thường, mã của bạn có thể trông giống như:

fetch("https://api.example.com/endpoint")
  .then((res) => res.json())
  .then((resJSON) => {
    const { data } = resJSON;
    const dataFiltered = data.filter((item) => item.active === true);
    return dataFiltered;
  })
  .catch((err) => {
    if (err instanceof RangeError) {
      throw new RangeError("The number is outside the range");
    } else if (err instanceof EvalError) {
      throw new EvalError("The code could not be evaluated");
    }
  });

Hơi có nhiều thứ cần phải đọc hiểu nhỉ, hãy “refactor” lại một chút:

const toJSON = res => res.json();
const handleResult = data => data.filter(item => item.active === true);
const handleError = err => {
  if (err instanceof RangeError) {
    throw new RangeError("The number is outside the range");
  } else if (err instanceof EvalError) {
    throw new EvalError("The code could not be evaluated");
  }
};

fetch("https://api.example.com/endpoint")
  .then((res) => toJSON(res))
  .then((resJSON) => handleResult(resJSON))
  .catch((err) => handleError(err));

Ok hơn rồi nhưng vẫn còn mã thừa, chuyển nó thành Point-Free:

fetch('https://api.example.com/endpoint')
  .then(toJSON)
  .then(handleResult)
  .catch(handleError);

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

Ưu và nhược điểm

Ưu điểm dễ nhận thấy nhất của Point-Free là nó tập trung vào hàm thay vì dữ liệu, giúp mã ngắn gọn và dễ đọc hơn nếu đặt tên đủ tốt. Sử dụng kết hợp với các thư viện theo phong cách Point-Free như ramda.jslodash/fp với rất nhiều hàm tiện ích có thể tạo ra sự thống nhất trong dự án của bạn.

Ví dụ thứ 2 sau khi sử dụng hoàn toàn bằng thư viện ramda.js sẽ trông giống như:

const R = require('ramda');

const isOdd = R.pipe(R.modulo(R.__, 2), R.equals(1));
const isUnderFifty = R.lt(R.__, 50);
const double = R.multiply(2);
const addThree = R.add(3);

const handle = R.pipe(
  R.filter(isOdd),
  R.map(double),
  R.filter(isUnderFifty),
  R.map(addThree)
);

const myArray = [22, 9, 60, 24, 11, 63];
handle(myArray);

Tuy nhiên, ưu cũng có thể trở thành nhược điểm cho người mới, người chưa quen với phong cách Point-Free này, nó có thể trở nên khó hiểu hoặc mất nhiều thời gian hơn để tiếp cận.

Tổng kết

Point-Free là một phong cách lập trình tập trung vào tên hàm và bỏ qua tầm quan trọng của đối số. Với cách viết này, chúng ta tập trung nhìn vào luồng xử lý hơn là logic đằng sau chúng. Đối với những người mới bắt đầu, Point-Free có thể gây khó đọc hoặc khó hiểu. Nhưng một khi đã quen, bạn sẽ thấy nó vô cùng hữu ích.

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

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

Cách sắp xếp các phần tử trong mảng Javascript

Cách sắp xếp các phần tử trong mảng Javascript

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

Làm việc với Array – Mảng là một trong những công việc thường xuyên nhất. Mình cũng có nhiều bài viết chuyên sâu hoặc thủ thuật để làm việc với mảng được hiệu quả hơn.

Bài hôm nay, mình sẽ chia sẻ cách sắp xếp các phần tử trong mảng tăng dần hoặc giảm dần.

Nếu để ý kỹ, bạn sẽ nhận ra một vấn đề ở đây. Sắp xếp tăng dần hoặc giảm dần là theo tiêu chí gì? Nếu mảng chỉ gồm các phần tử là số, hoặc string thì đơn giản quá. Nhưng nếu mảng chứa các phần tử là object thì sao?

Chúng ta sẽ cùng nhau tìm hiểu nhé.

Sắp xếp mảng có phần tử là số, String

Chúng ta vào bài toán đơn giản trước nhé. Giả sử, chúng ta có một mảng sau:

const numArray = [9, 5, 3, 2, 8, 6, 1]

Để sắp xếp mảng này, chúng ta có thể sử dụng hàm có sẵn của JS là hàm sort(). Mặc định, hàm sort() chỉ sắp xếp các phần tử theo bảng chữ cái. Do đó, để sắp xếp các số thì cần truyền vào một function so sánh để xác định quy tắc sắp xếp.

const numArray = [9, 5, 3, 2, 8, 6, 1]
// Sắp xếp tăng dần
numArray.sort((a, b) => a - b);
console.log(numArray);
// in ra: [1, 2, 3, 5, 6, 8, 9]

Như ở trên, để sắp xếp tăng dần thì quy tắc là số ở phía sau lớn hơn phía trước, do đó, (a - b) > 0 và trả về true. Ngược lại, để sắp xếp giảm dần, bạn đảo chiều thành (b-a) là được.

Hàm sort() sẽ tác động trực tiếp vào mảng, biến đổi thứ tự của mảng chứ không clone ra mảng mới.

Lưu ý: Mảng cần sắp xếp không nên chứa các phần tử là Infinity hoặc NaN ( Vì Infinity – Infinity là NaN chứ không phài là số 0 – nên không so sánh được).
Tham khảo tuyển dụng javascript lương cao trên TopDev

Sắp xếp mảng có phần tử là Object

Với mảng có phần tử là object, việc sắp xếp sẽ phức tạp hơn chút, không phải vì kỹ thuật phức tạp mà vì cách hiểu của chúng ta: thế nào là lớn hơn, thế nào là kém hơn?

Do đó, trước khi thực hiện so sánh, chúng ta cần xác định tiêu chí cụ thể để sắp xếp là gì?

Ví dụ: Để so sánh giữa hai con người, chúng ta không thể khẳng định chung chung là ông A tốt hơn ông B. Ông A có thể cao,to hơn ông B. Nhưng chắc gì ông A đã đen và hôi hơn ông B.

Tóm lại, để sắp xếp được mảng có phần từ là các objects, bạn cần xác định thuộc tính, tiêu chí cần so sánh trong hàm so sánh.

Giả sử, bạn có mảng cần sắp xếp tăng dần theo độ tuổi: ai lớn tuổi lên trước – ưu tiên người già:

const persons = [
  { name: 'Kiều Phong', age: 30, height: 170},
  { name: 'Lý Quỳ', age: 45, height: 150},
  { name: 'Dương Tiễn', age: 35, height: 180},
];

function compare(a, b) {
  return b.age - a.age;
}

console.log(persons.sort(compare))
// in ra: [{ name: 'Lý Quỳ', age: 45, height: 150},{ name: 'Dương Tiễn', age: 35, height: 180}, { name: 'Kiều Phong', age: 30, height: 170}]

Cũng đơn giản phải không?

  Phân biệt ArrayList và LinkedList

Nếu bạn sử dụng thư viện Lodash thì còn dễ hơn nữa. Bạn chỉ cần phải truyền vào thuộc tính cần so sánh, khỏi cần viết hàm so sánh luôn.

const persons = [
  { name: 'Kiều Phong', age: 30, height: 170},
  { name: 'Lý Quỳ', age: 45, height: 150},
  { name: 'Dương Tiễn', age: 35, height: 180},
];

var sortedPersons = _.orderBy(persons, ['age'], ['desc']);
console.log(sortedPersons);

Cú pháp sắp xếp của Lodash:

_.orderBy(collection, iteratees, orders)

Trên đây là một số cách đơn giản để bạn sắp xếp một mảng. Bạn có cách nào hay hơn thì chia sẻ với mọi người trong phần bình luận nhé.

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

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

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

5 dấu hiệu CV “hết hạn dùng”, cần update ngay!

5 dấu hiệu CV “hết hạn dùng”, cần update ngay!

Đã bao lâu rồi bạn chưa update CV? Làm thế nào để update được một bản CV IT đúng chuẩn hiện tại? Việc thường xuyên update CV là một bước bắt buộc ứng viên nào cũng cần phải làm nếu muốn gây ấn tượng với nhà tuyển dụng. Tuy nhiên, việc làm mới CV không chỉ đơn giản là nhồi nhét những thứ bạn đã làm được trong thời gian qua vào, mà cần có sự chọn lọc và điều chỉnh thông minh.

Vậy nên, bài viết này sẽ gợi ý bạn 5 dấu hiệu nhận biết một bản CV xin việc đã quá cũ, cần update ngay. Bên cạnh đó, bài viết cũng hướng dẫn bạn cách update CV IT đúng chuẩn nhất hiện nay. Bắt đầu thôi nào!

Vì sao cần thường xuyên update CV xin việc?

CV xin việc là một tài liệu quan trọng, giúp bạn giới thiệu bản thân và trình độ chuyên môn của mình với nhà tuyển dụng. Một CV ấn tượng sẽ giúp tăng cơ hội trúng tuyển của ứng viên.

Vì sao cần thường xuyên update CV xin việc?

Việc thường xuyên cập nhật CV xin việc giúp bạn:

  • Đáp ứng xu hướng ngành: Các lĩnh vực liên quan đến công nghệ như ngành lập trình không ngừng phát triển và thay đổi. Bằng cách cập nhật thường xuyên, bạn có thể phản ánh sự theo kịp với xu hướng mới và các công nghệ tiên tiến, giúp nâng cao khả năng cạnh tranh.
  • Tăng cường kỹ năng cá nhân: Công việc mới và các dự án đòi hỏi kỹ năng khác nhau. Cập nhật CV giúp bạn chú ý đến việc phát triển và nâng cao kỹ năng cá nhân, từ đó tăng cường khả năng làm việc hiệu quả trong môi trường mới.
  • Có một CV “chuẩn” hơn, không lỗi thời: Việc thường xuyên cập nhật các cách viết CV mới sẽ giúp CV của bạn trong chuyên nghiệp và dễ đọc hơn. Hơn thế nữa, việc có một CV mới đúng chuẩn còn có thể giúp bạn vượt qua được các hệ thống sàng lọc CV một cách dễ dàng.
  • Thích nghi với thị trường đầy biến động: Làn sóng layoff có thể không chừa một ai, việc cập nhật CV ngay cả khi bạn đang có công việc ổn định là điều cần thiết. Bởi nếu không may bạn bị sa thải thì sẽ có ngay một chiếc CV mới để apply nơi khác.

Theo các chuyên gia nhân sự, bạn nên cập nhật CV ít nhất 6 tháng một lần. Tuy nhiên, nếu bạn có những thay đổi đáng kể trong học tập, làm việc, hoặc CV của bạn đã lỗi thời bạn nên cập nhật CV ngay lập tức.

  5 mẹo viết CV IT giúp đánh bại hệ thống sàng lọc tự động ATS

5 dấu hiệu bạn nên update CV xin việc ngay lập tức

Bạn đã dùng CV này quá lâu

Nếu bạn đã dùng CV này quá lâu, nó có thể trở nên lỗi thời và không còn phù hợp với những yêu cầu của thị trường lao động hiện tại. Bạn có thể cập nhật thêm các kỹ năng mới, những thành tựu mới hoặc thành thạo một ngôn ngữ lập trình mới để làm nổi bật bản thân mình trước nhà tuyển dụng.

Ngoài ra, bạn có thể cập nhật lại mục tiêu công việc nếu có sự thay đổi, điều này giúp nhà tuyển dụng hiểu rõ hơn về bạn.

Bố cục CV chưa hợp lý

Một CV có bố cục rõ ràng, mạch lạc sẽ giúp nhà tuyển dụng dễ dàng nắm bắt được thông tin về bạn và đánh giá năng lực của bạn một cách chính xác. Dưới đây là một số dấu hiệu cho thấy bố cục CV của bạn chưa phù hợp:

  • Thông tin được sắp xếp lộn xộn, không theo thứ tự logic
  • Các phần trong CV không được phân chia rõ ràng
  • Thông tin không được trình bày một cách khoa học, dễ hiểu

Bố cục CV chưa hợp lý

Nếu CV của bạn có một trong những dấu hiệu trên, bạn nên update CV ngay lập tức. Ví dụ, bạn có thể sắp xếp thông tin trong CV theo thứ tự sau: Thông tin cá nhân, Mục tiêu nghề nghiệp, Trình độ học vấn, Kinh nghiệm làm việc, Kỹ năng, Thành tích. Việc cải thiện bố cục CV sẽ giúp bạn tạo ấn tượng tốt với nhà tuyển dụng và tăng cơ hội trúng tuyển.

CV quá dài hoặc quá ngắn

CV quá dài hoặc quá ngắn đều phản tác dụng và khiến nhà tuyển dụng bỏ qua bạn. Nhiều người thường có thói quen bỏ tất cả những thành tựu, kỹ năng mà mình đạt được vào trong CV mặc dù có những thứ không liên quan đến vị trí ứng tuyển. Điều này chỉ làm cho nhà tuyển dụng mất thời gian đọc và khó nắm bắt được thông tin về bạn.

Ngược lại, CV quá ngắn sẽ khiến nhà tuyển dụng không thấy được đầy đủ năng lực của bạn. CV của bạn nên bao gồm tất cả những thông tin quan trọng, chẳng hạn như trình độ học vấn, kinh nghiệm làm việc, kỹ năng, thành tích,… Theo các chuyên gia, chiều dài lý tưởng nhất cho CV là từ 1-2 trang tùy vào kinh nghiệm của bạn.

  Tối ưu hóa CV bằng ChatGPT: Gây ấn tượng nhà tuyển dụng ngay từ lần đầu

CV không phù hợp với vị trí ứng tuyển

CV của bạn không phù hợp với vị trí ứng tuyển, nó có thể khiến nhà tuyển dụng đánh giá thấp năng lực và bỏ qua CV của bạn. Dưới đây là một số dấu hiệu cho thấy CV của bạn không phù hợp với vị trí ứng tuyển:

  • Trình độ học vấn và kinh nghiệm làm việc không đáp ứng yêu cầu của vị trí: Vị trí ứng tuyển có thể yêu cầu một trình độ học vấn hoặc kinh nghiệm làm việc nhất định. Nếu CV của bạn không đáp ứng những yêu cầu này, nhà tuyển dụng sẽ nghĩ rằng bạn không có đủ năng lực để đảm nhận vị trí.
  • Kỹ năng và kinh nghiệm không phù hợp: Nếu CV của bạn không nhấn mạnh những kỹ năng và kinh nghiệm cụ thể, nhà tuyển dụng sẽ không thấy được bạn có thể đáp ứng được yêu cầu của vị trí.
  • Mục tiêu nghề nghiệp không phù hợp: Mục tiêu nghề nghiệp của bạn nên thể hiện sự phù hợp của bạn với vị trí ứng tuyển.

CV không phù hợp với hệ thống sàng lọc ATS

Nếu CV của bạn không phù hợp với các hệ thống sàng lọc, nó có thể bị loại bỏ ngay từ vòng đầu tiên mà bạn không biết. Hệ thống sàng lọc CV ATS sẽ quét qua CV của bạn và đánh giá mức độ phù hợp với JD sau đó mới chuyển CV đến nhà tuyển dụng đánh giá. Do đó, nếu bạn có kinh nghiệm, kỹ năng phù hợp với yêu cầu công việc nhưng trình bày không đúng theo chuẩn ATS cũng sẽ bị loại bỏ.

CV không phù hợp với hệ thống sàng lọc ATS

Vì vậy, việc có một CV chuẩn ATS là điều rất cần thiết, nhất là một ngành mang tính đặc thù như công nghệ thông tin. Bạn hãy tìm hiểu CV chuẩn ATS là gì, cách sắp xếp bố cục, cách dùng từ khóa như thế nào cho đúng. Ngoài ra bạn cũng có thể sử dụng các công cụ để chuẩn hóa CV thông thường sang CV chuẩn nhanh chóng.

Tạo CV IT chuẩn ATS miễn phí trên TopDev

Nâng cấp CV “đúng chuẩn” với công cụ Convert CV

Nếu bạn đang cần một công cụ giúp việc update CV nhanh chóng hơn, chuẩn ATS thì nhất định phải trải nghiệm tính năng Convert CV của TopDev. Với công cụ hoàn toàn mới này, các developer chỉ cần update CV của mình lên, hệ thống sẽ sử dụng AI để tiến hành quét nội dung và đưa ra một CV mới theo đúng chuẩn ATS hiện nay.

chuẩn hóa cv, nhận ngay quà hấp dẫn 2

>>> Tham gia minigame “Chuẩn Hóa CV” nhận ngay quà hấp dẫn anh em nhé!

Hơn thế nữa, hệ thống sẽ lưu trữ hồ sơ của bạn và cho phép tự do chỉnh sửa, cập nhật nội dung từng phần một cách dễ dàng và nhanh chóng. Việc có một hồ sơ ứng viên hoàn chỉnh sẽ giúp bạn ghi điểm trong mắt nhà tuyển dụng và hệ thống cũng sẽ tự động đề xuất các công việc IT phù hợp với những kỹ năng, kinh nghiệm của từng developer.

Trải nghiệm công cụ Chuẩn hóa CV online ngay tại đây!

Hy vọng rằng bài viết này sẽ giúp bạn biết cách làm mới CV của mình chuyên nghiệp và hấp dẫn hơn trong mắt nhà tuyển dụng. Hãy thường xuyên update những điều mới để tiết kiệm thời gian và chủ động hơn trong thị trường việc làm IT đầy biến động này bạn nhé. Đừng quên ghé vào Convert CV để trải nghiệm công cụ tuyệt vời này!

Xem thêm: 

Xem thêm Top tìm việc IT lương cao HOT nhất trên TopDev

Đệ quy là gì? Phương pháp để xây dựng đệ quy

Đệ quy là gì?

Đệ quy là một khái niệm cơ bản nhưng rất quan trọng trong lập trình hay rộng hơn là trong ngành khoa học máy tính. Việc sử dụng đệ quy sẽ giúp chúng ta giải quyết được rất nhiều bài toán trong thực tế lập trình, vì vậy nó được ứng dụng rất nhiều trong cấu trúc dữ liệu và giải thuật. Bài viết hôm nay chúng ta cùng nhau tìm hiểu xem Đệ quy là gì và các phương pháp để xây dựng đệ quy nhé.

Đệ quy là gì?

Trong toán học và khoa học máy tính, đệ quy – Recursion là một phương pháp giải toán mà trong đó lời giải của bài toán phụ thuộc vào một trường hợp nhỏ hơn của cùng một bài toán đó. Trong lập trình, hàm đệ quy được nhận biết đơn giản là việc trong code thực thi hàm có chứa lời gọi đến chính nó (chính hàm đó).

Đệ quy là gì?

Ví dụ đơn giản về đệ quy triển khai code bằng ngôn ngữ lập trình JavaScript, trong code triển khai function recursion có chứa đoạn gọi lại chính nó recursion()

function recursion(count) {
  count++;

  if (count <= 5) {
    console.log("step at", count);
    recursion(count);
  }
}

Một hàm đệ quy bao gồm 2 thành phần:

  • Phần cơ sở: là trường hợp mà bài toán được giải quyết mà không cần phải gọi lại chính nó. Mục đích của phần cơ sở cũng là việc vòng gặp gọi hàm sẽ được dừng lại tại 1 điều kiện xác định, tránh xảy ra vòng lặp vô hạn.
  • Phần đệ quy: là phần xử lý gọi lại hàm, các hành động này sẽ được xử lý gọi liên tiếp cho đến khi lời gọi đến phần cơ sở.

Đệ quy tuyến tính và Đệ quy nhị phân

Trong lập trình nói chung, Đệ quy có thể được chia thành 6 loại, gồm:

  • Đệ quy tuyến tính – Linear Recursion
  • Đệ quy nhị phân – Binary Recursion
  • Đệ quy đuôi – Tail Recursive
  • Đệ quy đa tuyến – Exponential Recursive
  • Đệ quy lồng – Nested Recursion
  • Đệ quy tương hỗ – Mutual Recursion

Các loại đệ quy ở trên đều giống nhau về bản chất đệ quy nhưng có sự khác nhau về số lượng lời gọi đệ quy trong hàm hoặc vị trí của lời gọi. 4 loại đệ quy ở dưới hầu như ít khi được sử dụng trong lập trình mà phần lớn trong nghiên cứu; chúng ta cùng tìm hiểu sâu hơn về đệ quy tuyến tính và nhị phân nhé.

  Stack Overflow Là Gì? Vì Sao Đệ Quy Lại Dễ Gây Tràn Stack?

Đệ quy tuyến tính

Là hàm đệ quy chỉ gọi chính nó một lần trong thân hàm. Ví dụ cơ bản nhất là bài toán tính giai thừa n! trong toán học.

Đệ quy tuyến tính

Đệ quy nhị phân

Là dạng đệ quy gọi 2 lần chính nó, hay hiểu đơn giản là trong code triển khai sẽ có dòng lệnh gọi đến chính hàm đó 2 lần. Bài toán kinh điển trong trường hợp này chính là dãy Fibonacci.

Đệ quy nhị phân

Chúng ta vẫn quen thuộc với công thức tạo ra dãy Fibonacci là: fib(n – 1) + fib(n – 2) từ đó dễ thấy cách triển khai đệ quy nhị phân khi sẽ cần gọi lại 2 lần hàm tính fib. Câu hỏi đặt ra là có thể sử dụng đệ quy tuyến tính cho bài toán Fibonacci này được không? 

Câu trả lời là có, và thậm chí nó sẽ còn tốt hơn về tốc độ so với đệ quy nhị phân. Cách triển khai như dưới đây:

function fib_linearR(a, b, n) {
  if (n <= 2) return b;
  else if (n > 2) return fib_linearR(b, a + b, n - 1);
}

//fib(10) = fib_linearR(1,1,10)

Top việc làm C++ hấp dẫn trên TopDev đang chờ bạn ứng tuyển!

Phương pháp xây dựng đệ quy

Như đã đề cập ở trên, đệ quy bao gồm 2 thành phần là phần cơ sở và phần đệ quy; và để xây dựng đệ quy cũng chính là việc chúng ta đi xác định được logic xử lý và phạm vi của 2 phần này.

Phương pháp xây dựng đệ quy

Xác định Base case

Mục tiêu của Base case là trả về một giá trị cụ thể để có thể kết thúc vòng lặp đệ quy. Thông thường trong hầu hết các bài toán thì Base case được xác định cụ thể với giá trị rõ ràng ngay từ đầu. Ví dụ ở bài toán Fibonacci chúng ta có F(1) = 1 và F(2) = 1; hay với bài toán tính giai thừa của một số thì Factorial(1) = 1. 

Base case sẽ không tạo ra hoặc thay đổi các biến, tham số bên ngoài hàm; nó sẽ luôn trả ra một kết quả khi có cùng một đầu vào. Từ đó chúng ta có thể xây dựng Base case là một Pure function, không tạo ra bất kỳ side effect ngoài bên ngoài phạm vi của nó.

  Khi code bí thì phải làm sao? 5 kinh nghiệm siêu hay để giải quyết vấn đề

Viết logic Đệ quy

Logic đệ quy là việc xác định được khi nào (vị trí) thì gọi lại hàm đệ quy và mỗi lần gọi lại thì vấn đề được thu nhỏ hơn (hay chính là bài toán con). Sau mỗi lần thực hiện gọi lại hàm đệ quy thì bài toán ban đầu sẽ trở nên dễ dàng tính toán hơn và đồng thời đảm bảo được nó sẽ kết thúc vòng lặp vào một trong số các Base case chúng ta đã xây dựng.

Ví dụ như với bài toán Fibonacci, để tính F(5) chúng ta sẽ gọi đến việc tính toán F(4) và F(3) là những bài toán con nhỏ hơn, dễ tính hơn. Và cuối của vòng lặp chúng ta sẽ gọi đến F(2) và F(1) – là những Base case.

Phần đệ quy (Recursion case) rõ ràng sẽ không phải là một Pure Function, nó sẽ sử dụng các tham số ngoài hoặc ít nhất là đọc dữ liệu từ bên ngoài. Hơn nữa, một số bài toán có thể trả về kết quả khác nhau cho cùng một giá trị đầu vào, ví dụ như bài toán tìm đường đi ngắn nhất khi có nhiều lời giải được tìm ra.

Kết bài

Như vậy qua bài viết này chúng ta đã cùng nhau tìm hiểu về Đệ quy, các loại đệ quyphương pháp để xây dựng đệ quy áp dụng trong lập trình. Đệ quy là một kiến thức cơ bản trong cấu trúc dữ liệu và giải thuật và được áp dụng rất nhiều trong lập trình để giải quyết các bài toán thực tế. Vì vậy hãy nắm vững kiến thức này để có thể sử dụng nó một các hiệu quả nhất nhé. Cảm ơn các bạn đã đọc bài 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 những bài viết liên quan dưới đây:

Tham khảo thêm các vị trí tuyển dụng ngành IT tại Topdev

10 thủ thuật tìm kiếm nâng cao trên Google cực hữu ích

10 thủ thuật tìm kiếm nâng cao trên Google cực hữu ích

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

Google hiện là công cụ tìm kiếm tốt nhất hiện nay, tất cả mọi vấn đề bạn đều có thể lên Google để tra cứu. Với lập trình viên, kỹ năng tìm kiếm Google là một kỹ năng không thể thiếu, không những thế, nó còn là kỹ năng quan trọng nhất trong số những kỹ năng quan trọng của một developer chuyên nghiệp

Hầu hết mọi người đều nghĩ, tìm kiếm trên Google dễ ấy mà, cần gì thì gõ ra rồi nhấn enter là xong chứ gì!

Kể ra họ nghĩ vậy cũng đúng, nhưng với developer thì không phải lúc nào cũng tìm ra câu trả lời ngay từ những câu truy vấn tìm kiếm đầu tiên. Bạn cần phải có thủ thuật Google, các mẹo riêng để tìm ra đúng từ khóa, từ đó mới tìm ra câu trả lời cho vấn đề của bạn.

Chúng ta cùng nhau khám phá những thủ thuật Google xem có gì hay ho nhé!

1. Dùng từ khóa trích dẫn “…”

Nếu bạn muốn nhận được kết quả với cụm từ chính xác, hãy đặt từ khóa trong dấu ngoặc kép “”. Sử dụng dấu ngoặc kép, Google sẽ chỉ hiển thị những kết quả chứa chính xác cụm từ bạn tìm kiếm.

Thủ thuật tìm kiếm chuyên sâu trên Google

Ví dụ: “javascript tiếng việt 2021”

2. Sử dụng dấu *

Bạn có thể sử dụng dấu * để Google tự tìm kiếm từ khóa thay thế cho dấu *. Điều này sẽ giúp bạn tìm kiếm dễ dàng trong trường hợp bí ý tưởng không biết từ khóa chính xác là gì.

Thủ thuật tìm kiếm chuyên sâu trên Google

Ví dụ: how to * in javascript

3. Sử dụng câu lệnh khoảng (…)

Với câu lệnh (…) giúp bạn dễ dàng tìm kiếm các chủ đề liên quan tới số, chẳng hạn như năm, phiên bản phần mềm…

Thủ thuật tìm kiếm chuyên sâu trên Google

Ví dụ: javascript version 2011…2022

  Tích hợp Google ReCaptcha vào form trong React

4. Câu lệnh site:

Đôi khi bạn muốn tìm kiếm bất kể thứ gì trong một trang web. Ví dụ bạn muốn tìm câu trả lời mà chỉ muốn kết quả lấy từ trang stackoverflow (cơ bản mình thấy câu trả lời ở đâu nó hay đúng với câu hỏi của mình), bạn dùng  câu lệnh search:<domain> <từ khóa tìm kiếm>

Thủ thuật tìm kiếm chuyên sâu trên Google

Ví dụ: site:vntalking.com javascript

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

5. Câu lệnh AND

Để tìm kết quả mà có chứa kết hợp một số từ trong từ khóa, câu lệnh AND sẽ rất hữu ích trong trường hợp này. Ví dụ, bạn muốn tìm kiếm kết quả mà có cả React và CSS thì bạn gõ lệnh: react AND css

Thủ thuật tìm kiếm chuyên sâu trên Google

Ví dụ: react AND css

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

6. Filetype

Nếu bạn muốn tìm kiếm đường dẫn tải file hoặc tìm trang cho phép tải một file nào đó, bạn có thể thêm đuôi file vào sau từ khóa tìm kiếm. Cái này rất hữu ích cho bạn nào hay tải ebook, tài liệu…

Thủ thuật tìm kiếm chuyên sâu trên Google

Ví dụ: React ebook filetype:pdf

7. Câu lệnh OR

Ngược với câu lệnh AND thì câu lệnh OR cho ra các kết quả thỏa mãn một trong những từ khóa bạn nhập vào

Thủ thuật tìm kiếm chuyên sâu trên Google

Ví dụ: React OR Vue masterclass

8. Câu lệnh Define:

Sử dụng câu lệnh define: để tìm định nghĩa cho một từ. Thay vì bạn phải vào các trang từ điển để tra cứu thì bạn có thể sử dụng ngay Google, mọi việc để Google lo.

Thủ thuật tìm kiếm chuyên sâu trên Google

Ví dụ: define:oops

9. Câu lệnh Related:

Bạn có thể sử dụng câu lệnh related: để tìm những website tương tự với trang bạn thực sự muốn tìm và có nội dung tương tự. Điều này sẽ trở nên hữu ích khi bạn muốn tìm một giải pháp thay thế cho một trang web.

Thủ thuật tìm kiếm chuyên sâu trên Google

Ví dụ: related:w3schools.com

10. Câu lệnh (+)

Phải có thể sử dụng câu lệnh (+) để nhận được kết quả phải chứa hai từ đã cho. Điều này sẽ hữu ích cho người tìm kiếm thứ gì đó mà từ khóa này liên quan tới từ khóa kia.

Thủ thuật tìm kiếm chuyên sâu trên Google

Ví dụ: JavaScript Oops+React

Trên đây là 10 thủ thuật tìm kiếm trên Google, nó sẽ giúp ích cho bạn rất nhiều trong việc tìm kết quả như ý muốn.

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

Xem thêm:

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

Thực hiện “Chuẩn Hóa CV” nhận ngay quà hấp dẫn

chuẩn hóa cv

Trong thời đại số hóa, các công ty lớn thường xuyên nhận hàng trăm đơn ứng tuyển cho mỗi vị trí. Để quản lý hiệu quả lượng lớn hồ sơ này, hệ thống theo dõi ứng viên (ATS) đã trở thành công cụ không thể thiếu. ATS tự động sàng lọc và đánh giá hồ sơ, đòi hỏi mỗi ứng viên phải có một CV đúng chuẩn để không bị loại từ vòng gửi xe. Đây là nơi công cụ “Chuẩn Hóa CV” của TopDev đóng một vai trò quan trọng.

chuẩn hóa cv, nhận ngay quà hấp dẫn 2

1. Giới Thiệu Công Cụ “Chuẩn Hóa CV” của TopDev

TopDev, với sự hiểu biết sâu sắc về thị trường tuyển dụng IT, đã phát triển công cụ “Chuẩn Hóa CV” để giúp các chuyên gia IT tạo ra những hồ sơ xứng tầm. Dựa trên công nghệ tiên tiến từ OpenAI, công cụ này có khả năng tự học hỏi, phân tích và chọn lọc thông tin, sau đó tự động tạo ra một CV hoàn chỉnh theo chuẩn ATS.

Trải nghiệm ngay công cụ Chuẩn hóa CV: Chuẩn hóa CV online

trải nghiệm ngay

2. Thời gian tham gia chương trình và giải thưởng

Theo đó, chương trình trao quà may mắn “SỞ HỮU CV “CHUẨN” – RINH QUÀ TẶNG CỰC MÊ” sẽ được TopDev tổ chức trong 4 tuần, bắt đầu từ ngày 04/12/2023 đến hết ngày 31/12/2023.

Mỗi tuần, TopDev sẽ lựa chọn ngẫu nhiên một người dùng may mắn để trao giải thưởng là

  • 01 giải Nhất: Tai nghe Sony không dây WH-CH520
  • 05 giải Khuyến khích: Cặp voucher vé xem phim 2D tại CGV
  • Đặc biệt, 01 giải nhất tháng: Bàn phím cơ Keychron K8 Pro QMK/VIA Wireless

3. Cách thức tham gia và nhận thưởng

Tham gia chương trình ngay hôm nay chỉ với 3 bước đơn giản:

  • Bước 1: Truy cập: Chuẩn hóa CV online
  • Bước 2: Đăng nhập tài khoản TopDev
  • Bước 3: Upload CV của bạn tại công cụ Convert CV

Đến đây, bạn đã hoàn thành các bước để tham gia chương trình. Mỗi tuần, TopDev sẽ thực hiện chương trình quay số và chọn ra người may mắn thắng giải. Giải thưởng sẽ được công bố vào mỗi thứ hai hằng tuần trong thời gian chạy chương trình, thông qua trên fanpage TopDev và thông báo trực tiếp qua email người dùng may mắn sử dụng trên nền tảng TopDev từ ngày 11/12/2023.

Bạn còn chần chờ gì mà không tham gia chuẩn hóa CV ngay. Đừng để CV của bạn trở thành rào cản, hãy để TopDev giúp bạn tỏa sáng!

trải nghiệm ngay

—–

Lưu ý:

– Các khoản thuế, phí (nếu có) phát sinh từ việc nhận giải thưởng sẽ do cá nhân nhận thưởng chi trả.
– Thời gian tối đa để cá nhân trúng thưởng xác nhận sau khi nhận được email/thông báo qua điện thoại chúc mừng từ TopDev là 15 (mười lăm) ngày, sau thời gian này BTC sẽ chuyển lại thành giải thưởng cho chương trình tiếp theo.
– Email đăng nhập sẽ là căn cứ để xác định người trúng thưởng trong quá trình quay số và chọn người thắng giải.
– Nếu có bất kỳ tình huống phát sinh, TopDev sẽ là bên đưa ra quyết định cuối cùng..

Mọi thắc mắc giải đáp liên quan đến chương trình khuyến mại này, xin liên hệ media@topdev.vn hoặc fanpage TopDev. Bằng việc tham gia Chương trình Khuyến mại này, người dùng mặc định chấp thuận tất cả các Thể lệ và Điều kiện của Chương trình Khuyến mại được liệt kê trên.

5 mẹo viết CV IT giúp đánh bại hệ thống sàng lọc tự động ATS

5 mẹo viết CV IT giúp đánh bại hệ thống sàng lọc tự động ATS

Khi phỏng vấn, nhiều Developer chỉ quan tâm làm thế nào để gây ấn tượng với nhà tuyển dụng trong lần gặp đầu tiên, mà quên đi mất việc phải làm sao để vượt qua vòng sàng lọc CV. Ở các công ty lớn, với lượng apply lên đến hàng trăm thì việc ứng dụng hệ thống sàng lọc ứng viên ATS (Applicant Tracking System) để tăng hiệu quả tuyển dụng là điều tất yếu. Lúc này, nếu CV của bạn không đáp ứng đủ các yêu cầu từ hệ thống thì chắc chắn sẽ bị loại bỏ ngay tức khắc.

5 mẹo cực hay viết CV IT chuẩn ATS

ATS đơn thuần là một hệ thống được xây dựng trên các thuật toán chặt chẽ nên không thể nào nhìn nhận hay phát hiện được tiềm năng thật sự của ứng viên. Do đó, nếu CV của bạn không đủ chi tiết hoặc chưa được tối ưu theo yêu cầu của ATS thì việc bị hệ thống đánh giá thấp sẽ rất đáng tiếc. Vậy nên, dưới đây sẽ là một vài mẹo nhỏ giúp bạn vượt ải sàng lọc nhanh chóng.

mẹo viết CV IT chuẩn ATS

1. Viết đề mục đơn giản, cấu trúc rõ ràng

ATS sẽ hoạt động bằng cách quét CV để tìm kiếm từ khóa và phân loại chúng vào các mục để dễ đánh giá. Do đó, bạn hãy trình bày các đề mục một các đơn giản và phổ thông nhất. Đừng cố gắng tùy biến theo phong cách cá nhân, điều này có thể làm hệ thống không thể phân loại được.

Để an toàn bạn hãy giữ nguyên tên của các đề mục và trình bày chi tiết, bao gồm các phần như: Thông tin cá nhân, Mục tiêu nghề nghiệp, Trình độ học vấn, Kinh nghiệm làm việc, Kỹ năng, Thành tích. Bạn có thể in đậm, in hoa chữ và tăng size chữ để giúp hệ thống dễ dàng nhận dạng thông tin.

2. Sử dụng từ khóa liên quan đến vị trí ứng tuyển

Tương tự như cách chúng ta tìm kiếm trên Google, hệ thống ATS sẽ thu hẹp hồ sơ ứng viên bằng cách sàng lọc từ khóa. Bạn có thể tìm kiếm các từ khóa liên quan đến vị trí ứng tuyển bằng cách xem mô tả công việc hoặc các vị trí tương tự trên các trang web tuyển dụng.

Một cách hiệu quả khác là sử dụng AI để hỗ trợ phân tích từ khóa. Bạn có thể nhập mô tả công việc và yêu cầu Chat GPT đưa ra các từ khóa liên quan đến mô tả công việc đó. Sau đó bạn hãy sàng lọc các từ khóa phù hợp và đưa vào CV IT của mình.

mẹo viết CV IT chuẩn ATS
Nhập yêu cầu phân tích JD và đưa ra từ khóa từ JD đó

mẹo viết CV IT chuẩn ATS
Kết quả Chat GPT đưa ra

Ngoài ra, bạn cũng nên lưu ý về tần suất xuất hiện của từ khóa cũng như vị trí của từ khóa trong CV. Một số hệ thống ATS sẽ đánh giá mức độ thành thạo của kỹ năng dựa trên số lần từ khóa đó xuất hiện. Ví dụ nếu từ khóa đã xuất hiện một lần trong phần kỹ năng, sau đó lại được nhắc lại ở phần kinh nghiệm làm việc hoặc giáo dục thì hệ thống sẽ đánh giá cao khả năng sử dụng kỹ năng này của bạn.

>>> Xem thêm: Tối ưu hóa CV bằng ChatGPT: Gây ấn tượng nhà tuyển dụng ngay từ lần đầu

3. Thiết kế đơn giản và bố cục rõ ràng

Một CV sáng tạo sẽ gây ấn tượng trong mắt nhà tuyển dụng nhưng với hệ thống ATS thì không. Một CV có thiết kế bắt mắt, sử dụng biểu đồ, font chữ nghệ thuật sẽ khiến ATS “bối rối” và không đánh giá cao CV của bạn. Thêm nữa, bạn cũng không nên chia thành các cột trong CV vì hệ thống được lập trình đọc data từ trái qua phải, từ trên xuống dưới nên nếu chia cột nội dung sẽ bị lẫn lộn, hệ thống rất khó phân biệt.

Với các vị trí chuyên về kỹ thuật như ngành IT thì bạn chỉ nên viết CV một cách rõ ràng, đơn giản, tuân theo bố cục chuẩn ATS.

4. Kiểm tra lỗi chính tả thật kỹ

Đây là yêu cầu hiển nhiên cho dù bạn viết CV cho hệ thống ATS sàng lọc hay cho nhà tuyển dụng xem. Tuy nhiên, một vài nhà tuyển dụng có thể sẽ bỏ qua lỗi này còn máy móc thì không. Một khoảng cách bị dư hay một từ sai chính tả cũng có thể khiến bạn bị ATS trừ điểm. Do đó, bạn hãy kiểm tra CV của mình thật kỹ trước khi gửi nhé.

  Các kỹ năng cần có trong CV IT để chinh phục mọi nhà tuyển dụng

5. Chọn đúng định dạng file

Hai định dạng file bạn nên sử dụng để gửi CV IT là .pdf và .docx. Tuy nhiên, tệp .docx được cho là hiệu quả và thân thiện hơn với hệ thống đánh giá ứng viên ATS. Do đó, ngoại trừ trường hợp CV tải lên yêu cầu định dạng .pdf thì các trường hợp khác bạn hãy gửi định dạng .docx để chắc chắn rằng ATS có thể phân tích được.

Thuật toán tham lam (Greedy Algorithm) – Thực hành với C++

Thuật toán tham lam (Greedy Algorithm) – Thực hành với C++

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

Hôm nay chúng ta quay trở lại với series thuật toán chuyên sâu nhé. Mặc dù, nói tới thuật toán là mình cảm thấy đau đầu vì tính phức tạp của nó, nhưng khi đã thẩm thấu xong một thuật toán, bản thân lại cảm thấy vô cùng thích thú

Bài viết hôm nay, mình sẽ đề cập tới thuật toán tham lam (Greedy Algorithms) – nghe tên thôi đã thấy tham rùi.

Cùng với thuật toán “Chia để trị –  Divide and Conquer”, thuật toán tham lam là một trong những thuật toán thường xuyên xuất hiện trong các câu hỏi phỏng vấn tuyển dụng. Thật là thiết sót nếu bạn lại bỏ lỡ không biết về thuật toán này.

Thuật toán tham lam là gì?

Hiểu một cách “nông dân” nhất có thể về thuật toán này như sau: Khi bạn gặp một bài toán lớn phải chứng minh nó đúng. Ví dụ: Chứng minh toàn bộ người dân Việt Nam đều là người cần cù, chịu khó, làm việc chăm chỉ.

Vấn đề là bạn không thể gặp và tiếp xúc tất cả người Việt Nam được. Thay vào đó, bạn gặp điểm một số người thôi, những người cùng quê, cùng gia đình, bạn bè… và bạn thấy đúng là họ đều cần cù, chịu khó, làm việc chăm chỉ cả. Thế là bạn suy ra toàn bộ người Việt Nam đều như vậy.

Tư tưởng của thuật toán này chỉ có vậy thôi.

Cái vấn đề của thuật toán này là: Có thể kết quả cuối cùng không chính xác và phụ thuộc rất nhiều vào bài toán con mà bạn chọn ra để kiểm chứng.

Nhưng ngược lại, thuật toán tham lam lại có ưu điểm là tốc độ xử lý nhanh. “võ đoán” thì lại chẳng nhanh, “may hơn khôn” mà.

Để hiểu hơn về thuật toán này, chúng ta cùng xem xét một ví dụ sau nhé.

  Thuật toán tìm kiếm trong C++

  Bạn biết gì về thuật toán Radix Sort trong JavaScript?

Ví dụ đếm coins sử dụng thuật toán Tham lam

Giả sử trong ví, bạn có một số tờ tiền có các mệnh giá tương ứng: 1$, 2$, 5$ và 10$. Yêu cầu là chọn ra các tờ tiền để có tổng số tiền cần trả cho nhà hàng.

Trường hợp 1: tổng số tiền cần trả là 16$

Sử dụng thuật toán tham lam, bạn sẽ bắt đầu chọn các bước như sau:

  • Đầu tiên, cứ lấy một đồng 10$ đã. Vậy là còn thiếu 6$ nữa
  • Thế thì, tiếp theo, sẽ lấy 1 tờ 5$ và cuối cùng là tờ 1$

Với cách làm này, kết quả và bước thực hiện rất tối ưu. Nhưng… Tại sao bạn lại chọn tờ 10$ trước? Bạn hoàn toàn có thể chọn các tờ tiền khác trước cũng được mà?

Đây chính là đặc điểm của thuật toán tham lam.

Trường hợp 2: tổng số tiền cần trả là 17$

Cũng tương tự như cách ở trên, Bạn có thể sẽ làm như sau:

  • Đầu tiên là lấy tờ 10$ đã.
  • Tiếp theo, bạn lại chọn 7 tờ mệnh giá 1$.

thuật toán Tham lam

Như trong trường hợp này thì thuật toán đã không còn tối ưu nữa.

Cấu trúc cơ bản của thuật toán Tham lam

Dưới đây là một tiêu chí, đặc điểm nhận biết để xem với một bài toán nào đó mà áp dụng thuật toán tham lam liệu có hiệu quả không?

  • Chúng ta được cung cấp một danh sách các tài nguyên giống như coins, tasks,v.v…
  • Chúng ta có thể bắt đầu với nguồn tài nguyên có giá trị lớn nhất.
  • Tiếp theo, chúng ta có thể tiếp tục bổ sung các tài nguyên có giá trị lớn hơn để đạt đưuọc giải pháp tối ưu hóa nhất.

Việc làm C++ lương cao, hấp dẫn dành cho bạn!

Thực hành thuật toán tham lam với C++

Trăm hay không bằng tay quen, để có thể hiểu và làm chủ được một thuật toán, không có gì nhanh hơn là tự tay thực hành giải một bài toán.

Bài toán: Tìm thời gian tốt nhất để mua và bán cổ phiếu

Mô tả bài toán: bạn được cung cấp một mảng giá của một cố phiếu trong một số ngày. Bạn phải chọn ra một ngày để mua cổ phiếu và một ngày khác để bán cổ phiếu đó. Kết quả trả về là lợi nhuận mà bạn kiếm được.

Gợi ý giải pháp: Bỏ qua một bên các kiến thức chuyên ngành về chứng khoán, về “tâm linh”… Chúng ta chỉ bám vào nguyên tắc duy nhất: “Mua đáy bán đỉnh”. Tức là mua khi giá cổ phiếu thấp nhất và bán khi nó có giá cao nhất.

  • Ý tưởng sắp xếp mảng là không khả thi. Vì giá cổ phiếu nó đi theo từng ngày, chứ không có độc lập. Do đó, trước hết bạn tìm giá cố phiếu thấp nhất từ mảng đầu vào đã.
  • Vị trí của phần tử mà có giá cổ phiếu thấp nhất chính là ngày mình sẽ mua cổ phiếu
  • Còn ngày bán, chắc chắn phải là những ngày sau khi bạn mua cổ phiếu đó.
  • Do đó, bạn chạy một vòng lặp bắt đầu từ ngày mua cổ phiếu và tìm giá trị cổ phiếu cao nhất trong số những ngày còn lại.
  • Cuối cùng là trừ giá cổ phiếu ở ngày bán cho giá cổ phiếu tại ngày mua là ra kết quả cần tìm.

Ví dụ dữ liệu:

Đầu vào: [7,1,5,3,6,4]

Kết quả mong muốn: 5

thuật toán Tham lam

Code mẫu:

//C++ Program For Best Time to Buy and Sell Stock
#include
#include<bits/stdc++.h>

using namespace std;

int main() {
    //Implementing the array for prices on ith days of stock
    int n = 6;
    vector<int> prices = {7,1,5,3,6,4};

    //for storing best days to buy and sell stock
    pair<int,int> ans;
    //For storing maximum profit
    int maxProfit = 0;
    //For storing minimum purchase of stock
    int minBuy = INT_MAX;
    //index of minbuy
    int ind;

    for(int i=0;i<prices.size();i++){

        //if we get min price for buying than earlier then we update minBuy and its index
        if(minBuy>prices[i]){
            ind = i;
           minBuy = prices[i];
        }

        //Finding maximum profit by checking selling at ith day prices with minBuy
        if(maxProfit<prices[i] - minBuy){
            maxProfit=prices[i] - minBuy;
            ans = {ind,i};  // storing the days of buying and selling
        }
    }

    //Printing the best time to buy and sell stock and its maximum profit
    cout<<"Best Time to buy on day "<<ans.first+1<<" and sell on day "<<ans.second+1<<endl;
    cout<<"Maximum Profit Will be "<<maxProfit;
    return 0;
}

Chạy chương trình:

Best Time to buy on day 2 and sell on day 5.
Maximum Profit Will be 5

Tạm kết

Như vậy là chúng ta đã tìm hiểu xong về thuật toán tham lam, một trong những thuật toán phổ biến nhất.

Minh hi vọng, sau bài viết này bạn sẽ tự tin đi phỏng vấn mà không còn run sợ khi nhà tuyển dụng hỏi tới!

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

Xem thêm:

Promise JS là gì? Cách sử dụng Promise trong JavaScript

Promise JS là gì? Cách sử dụng Promise trong JavaScript

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

Sẽ thật là thiếu sót nếu không nói về Promise trong JavaScript. Thực tế, các bài viết về Promise đã có rất nhiều người viết, bạn đọc có thể tìm thấy chúng bằng Google hoặc thi thoảng lại bắt gặp trên một hội nhóm có liên quan đến lập trình nào đó. Nhưng vì Promise là một kiến thức quan trọng và mỗi người lại có cách truyền đạt khác nhau do vậy đội ngũ TopDev đã cho ra đời bài viết này để đi sâu vào Promise là gì? một vài lưu ý và cả những nhầm lẫn có thể có. Qua đó giúp cho bạn đọc hình dung và tránh được một số lỗi trong quá trình coding của mình.

Promise JS là gì?

Promise là một cơ chế trong JavaScript giúp bạn thực thi các tác vụ bất đồng bộ mà không rơi vào callback hell hay pyramid of doom, là tình trạng các hàm callback lồng vào nhau ở quá nhiều tầng.

Hay nói cách khác, Promise JavaScript là một đối tượng đại diện cho kết quả của một hoạt động bất đồng bộ (asynchronous) trong tương lai.

Cách hoạt động của Promise

Một Promise gồm có 3 trạng thái tương ứng với 3 kết quả của hàm bất đồng bộ.

  • pending là trạng thái ban đầu, đang chờ kết quả.
  • fulfilled là trạng thái xử lý thành công, có kết quả trả về.
  • rejected là trạng thái thất bại, có thể kèm theo lỗi chi tiết.

Cách hoạt động của Promise

Cú pháp tạo một Promise

Để tạo một Promise, bạn sử dụng đối tượng Promise với một hàm constructor (hàm khởi tạo). Hàm khởi tạo này nhận hai tham số là resolvereject, dùng để báo cáo khi Promise được giải quyết hoặc bị từ chối.

let myPromise = new Promise(function(resolve, reject) {
    // logic bất đồng bộ
    let success = true;
    
    if (success) {
        resolve("Thành công!"); // Giải quyết Promise nếu thành công
    } else {
        reject("Thất bại!"); // Từ chối Promise nếu có lỗi
    }
});

Ví dụ sử dụng Promise JS

Ví dụ chúng ta tạo ra một Promise, nhận vào một số x, nếu x chia hết cho 2 thì trả về trạng thái fulfilled và ngược lại.

function fn(x) {
  return new Promise((resolve, reject) => {
    if (x % 2 === 0) {
      resolve(true);
    } else {
      reject(new Error('x is not even'));
    }
  })
}

Về bản chất, Promise là đại diện cho kết quả trả về trong tương lai. Ở ví dụ trên, chúng ta hoàn toàn không cần thiết phải tạo ra một Promise để xử lý, vì tất cả hành động bên trong hàm fn đều là đồng bộ. Vậy thì như thế nào là bất đồng bộ cũng như nên tạo ra Promise khi nào?

>> Thế nào là hàm bất đồng bộ? Click xem ngay!

Lấy ví dụ về hành vi thực hiện một truy vấn GET đến địa chỉ https://example.com, lúc này việc xử lý không đơn thuần phụ thuộc vào tốc độ của CPU nữa mà phụ thuộc vào tốc độ mạng của bạn. Mạng càng nhanh, bạn sẽ nhanh chóng có kết quả và ngược lại. Trong JavaScript, chúng ta có hàm fetch để gửi request, và hàm này là bất đồng bộ, nó trả về một Promise.

fetch('https://example.com');

Để xử lý kết quả của Promise, chúng ta có then và catch tương ứng với hai trường hợp thành công và thất bại.

fetch('https://example.com')
    .then(res => console.log(res))
    .catch(err => console.log(err));

Nếu sau một thời gian xử lý, fetch có trạng thái fulfilled, hàm trong then sẽ được kích hoạt, ngược lại, fetch có trạng thái rejected, ngay lập tức hàm trong catch được thực thi.

Đôi khi bạn sẽ bắt gặp một vài câu hỏi kiểu như là dự đoán kết quả trả về của ví dụ sau:

console.log('1');

fetch('https://example.com')
    .then(res => console.log(res))
    .catch(err => console.log(err))
    .finally(() => console.log('3'));

console.log(‘2’);

Thực ra câu hỏi này nhằm kiểm tra kiến thức của bạn về hành vi bất đồng bộ trong JavaScript. Kết quả in ra là 1, 2, 3 chứ không phải là 1, 3, 2. Điều này xảy ra là do cơ chế xử lý bất đồng bộ, vì kết quả của hành vi bất đồng bộ sẽ được trả về trong tương lai cho nên JavaScript sẽ nghĩ rằng: “OK, hàm bất đồng bộ này chưa có kết quả ngay được, để đó đã, xử lý tiếp các lệnh bên dưới, khi nào hết sạch thì quay lại xem nó có kết quả chưa”

Trong Promise có một số hàm static hữu dụng trong nhiều trường hợp như: allallSettledany và race.

Promise.all nhận vào một mảng các Promise, nó cũng trả về một Promise và có trạng thái fulfilled khi tất cả Promise trong mảng đều thành công, ngược lại, nó có trạng thái rejected khi chỉ cần 1 Promise trong mảng bị thất bại.

Promise.allSettled cũng tương tự như Promise.all chỉ có điều nó luôn trả về tất cả kết quả của Promise trong mảng cho dù là thành công hay thất bại. Cả hai Promise.all và Promise.allSettled hữu ích trong trường hợp bạn cần chạy nhiều hàm bất đồng bộ ngay lập tức mà không quan trọng thứ tự kết quả.

Trong khi Promise.race trả về kết quả của Promise được giải quyết nhanh nhất trong mảng, không kể là thành công hay thất bại, thì Promise.any lại trả về kết quả thành công của Promise có trạng thái fulfilled đầu tiên trong mảng. race và any phù hợp trong các trường hợp bạn có nhiều Promise thực hiện hành động giống nhau và cần một trường hợp dự phòng giữa các kết quả đó.

Việc làm JavaScript Hồ Chí Minh dành cho bạn!

Promise JS thay thế “callback hell”

Thật ngạc nhiên khi biết rằng trước kia JS không có Promise, đúng vậy bạn không nghe nhầm đâu. Mọi tác vụ bất đồng bộ trước kia được xử lý qua callback, chúng ta cần xác định một hàm callback để xử lý kết quả trong tương lai.

Dưới đây là một callback hell điển hình.

api.getUser('pikalong', function(err, user) {
  if (err) throw err
  api.getPostsOfUser(user, function(err, posts) {
    if (err) throw err
    api.getCommentsOfPosts(posts, function(err, comments) {
      // vân vân và mây mây...
    })
  })
})

Ví dụ trên khi được viết lại bằng Promise sẽ là:

api.getUser('pikalong')
  .then(user => api.getPostsOfUser(user))
  .then(posts => api.getCommentsOfPosts(posts))
  .catch(err => { throw err })

Để tạo ra một promise object thì bạn dùng class Promise có sẵn trong trình duyệt như sau:

const p = new Promise( /* executor */ function(resolve, reject) {
  // Thực thi các tác vụ bất đồng bộ ở đây, và gọi `resolve(result)` khi tác
  // vụ hoàn thành. Nếu xảy ra lỗi, gọi đến `reject(error)`.
})

Trong đó, executor là một hàm có hai tham số:

  • resolve là hàm sẽ được gọi khi promise hoàn thành
  • reject là hàm sẽ được gọi khi có lỗi xảy ra

Ví dụ một hàm bất đồng bộ fnA, nhận vào một hàm callback có chứa 2 tham số data đại diện cho kết quả khi thành công và err đại diện cho lỗi. Tương tự là các hàm fnBfnC… Như vậy nếu muốn kết hợp các hàm xử lý này với nhau thì chúng ta phải lồng chúng vào nhau.

fnA((data1, err1) => {
    fnB((data2, err2) => {
        fnC((data3, err3) => {
        ….  
        }
    }
}

Khi có quá nhiều callback được viết như vậy, mã của chúng ta sẽ trở thành “địa ngục gọi lại” theo đúng nghĩa đen, gây rối rắm và cản trở quá trình đọc hiểu.

Promise được giới thiệu để mang đến một cách tiếp cận mới trong quá trình xử lý bất đồng bộ. Chúng ta vẫn sẽ có callback nhưng hạn chế được “hell”, vì giờ đây mọi thứ được xử lý nối tiếp nhau thông qua then.

fnA()
    .then(data => fnB(data))
    .then(data => fnC(data))
    ...  
    .catch(err => console.log(err));

Ngay sau đó, rất nhiều hàm xử lý bất đồng bộ bằng callback trước đó được viết lại bằng cách sử dụng new Promise. Trong Node.js, chúng ta còn có hẳn một build-in modules để hỗ trợ việc chuyển đổi này là util.promisify. Callback đến bây giờ vẫn được hỗ trợ, tuy nhiên với nhiều lợi ích mà Promise mang lại, nhiều thư viện mới ra đời sử dụng Promise để xử lý bất đồng bộ theo mặc định.

Promise trong các vòng lặp

Có nhiều sai lầm đáng tiếc khi sử dụng Promise mà chưa hiểu rõ bản chất của nó, một trong số đó có thể kể đến như là xử lý bất đồng bộ tuần tự trong vòng lặp.

Giả sử bạn cần lặp qua 5 trang, gọi API phân trang từ 1 -> 5 và ghép dữ liệu trả về theo thứ tự vào trong một mảng.

const results = [];
for (let i = 1; i <= 5; i++) {
  fetch('https://example.com?page=' + i)
    .then(response => response.json())
    .then(data => results.push(data));
}

Đoạn mã trên tạo ra một vòng lặp lấy dữ liệu từ page 1 đến page 5, dữ liệu trả về được đẩy vào trong results. Thoạt nhìn kết quả sẽ là một mảng dữ liệu theo thứ tự từ trang đầu đến trang cuối, nhưng thực tế, mỗi lần chạy, bạn sẽ thấy dữ liệu trong results được sắp xếp không theo một quy luật nào cả.

Hãy nhớ lại fetch, trả về một Promise, đại diện cho một kết quả trong tương lai… Trong khi for đang cố gắng lặp qua nhanh nhất có thể, có thể xem rằng 5 lệnh fetch được gọi và bắt đầu chạy “gần như ngay lập tức”. Lúc này, tốc độ CPU không còn quá quan trọng nữa, tốc độ mạng mới là thứ quyết định đến lệnh fetch nào có kết quả đầu tiên, và ngay khi có, nó lập tức được push vào results, chính vì thế mà dữ liệu được thêm vào một cách ngẫu nhiên.

Để giải quyết, có rất nhiều cách. Ví dụ:

const results = [];
fetch("https://example.com?page=1")
  .then((response) => response.json())
  .then((data) => results.push(data))
  .then(() => fetch("https://example.com?page=2"))
  .then((response) => response.json())
  .then((data) => results.push(data));
  …

Thật điên rồ, chẳng ai lại đi viết như thế cả, ví dụ có đến 1000 page thì sẽ thế nào? Đùa thế chứ, ví dụ trên chỉ cố gắng làm sáng tỏ việc chờ request trước đó hoàn thành thì mới xử lý tiếp đến request tiếp theo như thế nào.

Bluebird là một thư viện xử lý Promise rất tốt, nó cung cấp nhiều hàm tiện ích giúp chúng ta làm việc dễ dàng hơn với các hàm bất đồng bộ.

Ví dụ trên viết lại bằng cách sử dụng hàm each của Bluebird.

const results = [];
Promise.each([1, 2, 3, 4, 5], (i) => {
  return fetch('https://example.com?page=' + i)
    .then(response => response.json())
    .then(data => results.push(data));
});

“Kim tự tháp” Promises

Một lỗi chúng ta hay mắc phải khi mới làm quen với Promise, đó là tạo ra “kim tự tháp” promises như thế này.

api.getUser('pikalong')
  .then(user => {
     api.getPostsOfUser(user)
       .then(posts => {
         api.getCommentsOfPosts(posts)
         .then(comments => {
           console.log(comments)
         })
         .catch(err => console.log(err))
       })
       .catch(err => console.log(err))
  })
  .catch(err => console.log(err))

Lý do vì chúng ta quên mất tính chất liên kết (chaining) của promise, cho phép bên trong hàm resolve có thể trả về một giá trị đồng bộ hoặc một promise khác. Do đó cách giải quyết là:

api.getUser('pikalong')
  // Trả về một promise
  .then(user => api.getPostsOfUser(user))
  .then(posts => api.getCommentsOfPosts(posts))
  .catch(err => { throw err })

Theo chúng tôi, việc hiểu và sử dụng thành thạo tính liên kết là một trong những điểm QUAN TRỌNG NHẤT khi làm việc với Promise. Khi promise lồng vào nhau từ 2 tầng trở lên thì đã đến lúc bạn phải refactor lại rồi.

3 cách xử lý nhiều Promise cùng lúc

Chạy các Promise tuần tự

Trong trường hợp muốn chạy các promises một cách tuần tự như sơ đồ ở trên, bạn có thể dùng hàm Array.prototype.reduce .

[promise1, promise2, promise3].reduce(function(currentPromise, promise) {
  return currentPromise.then(promise)
}, Promise.resolve())

// Đoạn ở trên khi được viết dài dòng ra
Promise.resolve().then(promise1).then(promise2).then(promise3)

Async/await mang đến giải pháp “xinh đẹp” hơn, cho phép bạn truy xuất đến giá trị của các promises phía trước nếu cần thiết.

async function() {
  const res1 = await promise1()
  const res2 = await promise2(res1)
  const res3 = await promise3(res2)
}

Chạy nhiều Promises cùng lúc với Promise.all()

Lại có trường hợp bạn muốn thực thi và lấy ra kết quả của nhiều promises cùng lúc. Giải pháp “ngây thơ” sẽ là dùng vòng lặp, hoặc .forEach.

const userIds = [1, 2, 3, 4]

// api.getUser() là hàm trả về promise
const users = []
for (let id of userIds) {
  api.getUser(id).then(user => ([...users, user]))
}

console.log(users) // [], oát-đờ-heo?

Lý do là vì khi promise chưa kịp resolve thì dòng console.log đã chạy rồi. Chúng ta có thể sửa bằng cách dùng Promise.all([promise1, promise2, ...]). Phương thức này nhận vào một mảng các promises và chỉ resolve khi tất cả các promises này hoàn thành, hoặc reject khi một trong số chúng xảy ra lỗi.

>> Xem thêm: Xử lý bất đồng bộ với Promise.all trong JavaScript

const userIds = [1, 2, 3, 4]

Promise.all(usersIds.map(api.getUser))
  .then(function(arrayOfResults) {
    const [user1, user2, user3, user4] = arrayOfResults
  })

Nếu dùng async/await thì…

async function() {
  const userIds = [1, 2, 3, 4]
  const [user1, user2, user3, user4] = await Promise.all(usersIds.map(api.getUser))
}

Promise.race()

Ngoài hai kiểu chạy tuần tự và song song ở trên, chúng ta còn có Promise.race([promise1, promise2, ...]). Phương thức này nhận vào một mảng các promises và sẽ resolve/reject ngay khi một trong số các promises này hoàn thành/xảy ra lỗi.

Promise.race([
  ping('ns1.example.com'),
  ping('ns2.example.com'),
  ping('ns3.example.com'),
  ping('ns4.example.com')
]).then(result => {})

Các lưu ý khi sử dụng Promise

Các lưu ý khi sử dụng Promise JavaScript

nguồn ảnh: @tapasadhikary

Luôn đưa vào .then() một hàm

Bạn thử đoán xem đoạn code sau sẽ in ra gì?

Promise.resolve(1)
  .then(2)
  .then(console.log)

Câu trả lời là 1 đó. Phương thức .then đòi hỏi tham số của nó phải là một hàm. Nếu bạn đưa vào .then() một giá trị, nó sẽ bị bỏ qua, giải thích tại sao đoạn code trên hiển thị 1. Trường hợp tương tự:

Promise.resolve(1)
  .then(Promise.resolve(2))
  .then(console.log) // 1

Cách giải quyết:

Promise.resolve(1)
  .then(() => 2)
  // hoặc như thế này, mặc dù hơi dư thừa
  .then(() => Promise.resolve(2))
  .then(console.log) // 2

Chúng ta sẽ được kết quả như ý.

Cẩn thận với this khi dùng tham chiếu hàm

Giả sử bạn có đoạn code sau:

const add2 = x => x + 2

Promise.resolve(4).then(result => add2(result))

Hàm onSuccess không làm gì khác ngoài việc chuyển result vào cho add2, nên bạn có thể dùng tham chiếu hàm để đoạn code trên gọn hơn.

Promise.resolve(4).then(add2)

Bạn có thể nghĩ, vậy với phương thức của một đối tượng, ta cũng có thể đưa tham chiếu hàm vào .then()?

class User {
  constructor(user) {
    this.user = user
  }

  getUsername() {
    return this.user.username
  }
}

const u = new User({ username: 'pikalong' })
Promise.resolve()
  .then(u.getUsername)
  .then(console.log)

Nhưng bạn lại nhận được lỗi sau:

Unhandled rejection:[TypeError: Cannot read property ‘user’ of undefined]

Lý do là vì khi trong strict mode, biến ngữ cảnh this chỉ được xác định khi trực tiếp gọi phương thức của đối tượng đó, hoặc thông qua .bind(). Bạn có thể xem giải thích chi tiết hơn ở đây.

Để giải quyết lỗi này, bạn có thể dùng một trong những cách sau:

.then(() => u.getUsername())

// hoặc
.then(u.getUsername.bind(u))

// hoặc dùng hàm mũi tên khi khai báo phương thức trong class (cần plugin
// `transform-class-properties` của Babel)
class User {
  // ...
  getUsername = () => {
    return this.user.username
  }
}

Cẩn thận với return không tường minh

Xét hai đoạn mã sau:

api.getUser('pikalong')
  .then(user => {
    return api.getPostsByUser(user)
  })
  .then(console.log) // posts

api.getUser('pikalong')
  .then(user => {
    api.getPostsByUser(user)
  })
  .then(console.log) // undefined

Đoạn mã thứ hai trả về undefined vì trong JavaScript nếu một hàm không công khai trả về một giá trị, undefined mặc định sẽ được trả về (nguồn). Do đó, bạn cần lưu ý về giá trị return khi làm việc với Promise.

Phân biệt .then(resolve, reject) và .then(resolve).catch(reject)

Hàm reject trong .then(resolve, reject) chỉ có thể chụp được lỗi từ những .then() phía trước nó, mà không thể bắt được lỗi xảy ra trong hàm resolve cùng cấp.

api.getUser('pikalong')
  .then(user => { throw new Error('Lỗi rồi bạn ei') }, err => { /* Không có gì ở đây cả */ })

api.getUser('pikalong')
  .then(user => { throw new Error('Lỗi rồi bạn ei') })
  .catch(err => console.log(err)) // Chụp được rồi bạn ei

Lưu ý là promise sẽ dừng quá trình thực thi khi bắt được lỗi

Promise.resolve()
  .then(() => { throw 'foo' })
  .then(() => { throw 'bar' }, err => { console.error("here", err) })
  .catch(err => console.error('final', err))

// console:
// "here bar"

Promise không có cơ chế mặc định truyền dữ liệu

Một trong những yếu điểm của Promise là không có cơ chế mặc định để bạn truyền dữ liệu giữa các promise objects với nhau. Nghĩa là:

api.getUser('pikalong')
  .then(user => api.getPostsByUser(user))
  .then(posts => {
    // Muốn sử dụng biến user ở trên thì làm sao đây?
  })

Một cách là dùng Promise.all().

api.getUser('pikalong')
  .then(user => Promise.all([user, api.getPostsByUser(user)]))
  .then(results => {
     // Dùng kỹ thuật phân rã biến trong ES6. Bạn lưu ý chúng ta dùng 1 dấu , để
     // tách ra phần tử thứ hai của mảng mà thôi
     const [ , posts ] = results

     // Lại tiếp tục truyền dữ liệu bao gồm [user, posts, comments] xuống promise sau
     return Promise.all([...results, api.getCommentsOfPosts(posts)])
  })

Hoặc, nếu bạn cảm thấy phân tách mảng khó dùng vì phải nhớ thứ tự của các giá trị thì ta có thể dùng object như sau:

api.getUser('pikalong')
  .then(user => api.getPostsByUser(user).then(posts => ({ user, posts })))
  .then(results => api.getCommentsOfPosts(results.posts).then(comments => ({ ...results, comments })))
  .then(console.log) // { users, posts, comments }

Lại một lần nữa, async/await lại tỏa sáng vì giúp bạn truy xuất đến kết quả của những promises phía trước.

async function() {
  const user = await api.getUser('pikalong')
  const posts = await api.getPostsOfUser(user)
  const comments = await api.getCommentsOfPosts(posts)
}

Cẩn thận nha, Promise không lazy

Với đoạn code sau:

console.log('before')
const promise = new Promise(function fn(resolve, reject) {
  console.log('hello')
  // ...
});
console.log('after')

Kết quả được in ra console lần lượt sẽ là:

before
hello
after

Bạn có thể thấy hàm executor của Promise được thực thi ngay lập tức. Điều này có thể dẫn đến những kết quả không mong muốn, chẳng hạn như:

const getUsers = new Promise((resolve, reject) => {
  return http.get(`/api`, (err, result) =>  err ? reject(err) : resolve(result))
})

button.onclick = e => getUsers

Cách giải quyết là đưa vào một hàm trả về promise.

const getUsers = () => new Promise((resolve, reject) => {
  return http.get(`/api`, (err, result) =>  err ? reject(err) : resolve(result))
})

button.onclick = e => getUsers()

Cuối cùng, .finally()

Bên cạnh .then() và .catch(), chúng ta còn có .finally(onFinally). Phương thức này nhận vào một hàm và sẽ được kích hoạt dù cho promise trước nó hoàn thành hay xảy ra lỗi.

showLoadingSpinner()
api.getUser('pikalong')
  .then(user => {})
  .catch(err => {})
  .finally(hideLoadingSpinner)

// async/await
async function() {
  try {
    showLoadingSpinner()
    api.getUser('pikalong')
  } catch(err) {
  } finally {
    hideLoadingSpinner()
  }
}

Lưu ý là phương thức này hiện chỉ được hỗ trợ bởi Firefox, Chrome và Opera thôi nhé.

Trên đây, đội ngũ biên tập viên của TopDev đã cung cấp tất tần tật thông tin về Promise và cách sử dụng Promise trong JavaScript, hi vọng bài viết trên sẽ hữu ích với bạn.

Xem thêm:

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

Tìm việc làm IT mới nhất trên TopDev

Serverless là gì? So sánh, ứng dụng và ưu điểm của Serverless

Serverless là gì? So sánh, ứng dụng và ưu điểm của Serverless

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

Vấn đề

Serverless chắc hẳn là một khái niệm không quá xa lạ với nhiều người. Khi nhắc đến Serverless, chúng ta thường nghĩ ngay đến “không có máy chủ” đúng như cái tên của nó. Hmm… không có máy chủ tức là như thế nào?

Không biết tại sao người ta lại nghĩ ra cái tên đó, nhưng theo tôi họ muốn nhấn mạnh về vấn đề bạn không cần phải có máy chủ để chạy mã của mình. Chúng ta đều biết, việc chạy mã thường yêu cầu có một máy chủ để triển khai tất cả mọi thứ lên trên đó. Nào là mã nguồn, cơ sở dữ liệu, hàng đợi tin nhắn… cho tech stacks đang sử dụng.

Máy chủ thường có hai loại, Cloud và vật lý. Trong khi Cloud rất dễ dàng để thuê thì máy chủ vật lý cần mất nhiều thời gian lẫn tiền bạc để thiết lập. Nhưng dù là loại nào đi nữa, chúng ta vẫn cần có người vận hành chúng. Vận hành nghĩ là cài đặt, theo dõi, và khắc phục sự cố… buộc chúng ta cần có nhiều hiểu biết lẫn thời gian bỏ ra để đảm bảo hệ thống hoạt động ổn định.

Serverless bỏ qua công đoạn đó, không cần vận hành vì đơn giản chúng ta “đâu có máy chủ”!? Đó là về mặt khách hàng, tức là đang nói về những người sử dụng Serverless, họ không cần quan tâm đến máy chủ, miễn là dịch vụ họ thuê được chạy tốt. Còn về phía nhà cung cấp, dĩ nhiên họ cần phải vận hành máy chủ. Có thể nói, họ “gánh” cho ta những rủi ro trong quá trình vận hành, họ cần phải là người có kiến thức chuyên sâu về vận hành để đảm bảo dịch vụ được duy trì ổn định. Nếu không, chẳng ai dám sử dụng dịch vụ của họ nữa.

Lấy ví dụ, bạn muốn có một máy chủ cơ sở dữ liệu PostgreSQL. Bạn có thể thuê một VPS giá 5$/month ở đâu đó, rồi về cài Postgres lên thế là xong, thích dùng thế nào thì dùng thì cần gì phải sử dụng dịch vụ của bên thứ 3 nào nữa chứ? Một ngày nọ, bỗng nhiên không thể kết nối vào database được nữa, bạn SSH vào server, thấy Postgres đang bị tắt, bạn bật lên, một lỗi xuất hiện, bạn khắc phục, một lỗi khác lại đến… bực mình bạn khởi động lại, máy chủ liên tục báo CPU 100%, bạn cay cú đập đập vào bàn phím… Đó chỉ là một ví dụ về sử rủi ro của quá trình tự vận hành máy chủ.

Tuy nhiên Serverless được sinh ra không phải để thay thế cho máy chủ truyền thống, nó chỉ góp phần làm phong phú thêm lựa chọn công nghệ của chúng ta. Bài viết ngày hôm nay, hãy đi vào xem Serverless là gì và nó làm được những gì nhé!

Serverless là gì?

Serverless là một mô hình tính toán đám mây (cloud computing) mà ẩn đi hoặc giảm bớt việc quản lý cơ sở hạ tầng cho nhà phát triển. Không cần quản lý máy chủ, tiết kiệm chi phí tài nguyên, được vận hành bởi đội ngũ chuyên nghiệp và chỉ trả tiền cho những gì sử dụng. Ngoài ra Serverless cũng cho khả năng mở rộng theo chiều ngang đáng kể.

Không cần quản lý máy chủ thì rõ rồi, còn tiết kiệm chi phí tài nguyên và chỉ trả tiền cho những gì sử dụng là như thế nào? Nếu bạn thuê một máy chủ, tức là bạn đang bỏ tiền ra thuê từng giây từng phút máy chủ sống. Tưởng tưởng sẽ có thời điểm nào đó máy chủ của bạn rảnh rỗi, như vào buổi đêm chẳng hạn, bạn vẫn phải bỏ tiền ra cho chúng. Với Serverless, nhiều nhà cung cấp có cách tính tiền dựa trên số lần gọi đến dịch vụ, tức là gọi bao nhiêu thì trả tiền bấy nhiêu, không gọi đồng nghĩa với việc không phải trả tiền.

Đặc trưng của Serverless là “stateless”, tức là không lưu lại trạng thái, do đó chúng ta không bị phụ thuộc nhiều vào session, cookie… từ đó tăng khả năng mở rộng bằng cách tạo thêm nhiều dịch vụ tương tự để tăng khả năng xử lý.

  AWS Lambda là gì? Cách hoạt động và ứng dụng của Lambda

Khác biệt gì so với máy chủ truyền thống?

Khác biệt rõ ràng nhất là chúng ta không có quản lý máy chủ trong Serverless. Không cần hoặc rất ít quan tâm đến quản lý tài nguyên như CPU, bộ nhớ và mạng.

VPS là một máy chủ ảo được tạo ra từ một máy chủ vật lý, cung cấp tài nguyên cụ thể như CPU, bộ nhớ và mạng. Ngược lại, Serverless không yêu cầu máy chủ cụ thể và chạy các chức năng khi có sự kiện kích hoạt.

  Docker to Serverless (Google Cloud Platform)

Quản lý tài nguyên là một khác biệt quan trọng khác. Trong khi VPS đòi hỏi người quản trị phải quản lý tài nguyên thì Serverless tự động quản lý chúng, giúp giảm bớt gánh nặng cho nhà phát triển.

Giá thuê máy chủ thường được tính theo tài nguyên đã cấp phát, ví dụ 1 CPU 2 GB RAM 30GB SSD… Trong khi đó, serverless tính phí dựa trên lượng sử dụng thực tế, ví dụ bạn gọi 100 yêu cầu thì trả tiền cho 100 yêu cầu đó.

Nhìn chung, máy chủ thích hợp cho các ứng dụng có nhu cầu tài nguyên ổn định và dự án lớn, trong khi Serverless là lựa chọn tốt cho các ứng dụng có khả năng chịu tải biến thiên theo khoảng thời gian. Sự khác biệt giữa chúng cung cấp những lợi ích độc đáo, đáp ứng nhu cầu đa dạng của các dự án công nghệ ngày nay.

Tham khảo việc làm Cloud lương hấp dẫn trên TopDev

Sử dụng trong trường hợp nào?

Chung quy, những gì máy chủ làm được đều có thể triển khai thông qua Serverless, chỉ có điều mức độ hỗ trợ đến đâu và chúng ta không thể đòi hỏi bằng hoặc hơn máy chủ truyền thống vì chúng được sinh ra không phải thay thế cho nhau.

Trước hết, Serverless là một lựa chọn hiệu quả cho triển khai API Gateway, nơi chi phí chỉ phát sinh khi có yêu cầu API được gửi. Điều này giúp giảm thiểu chi phí không cần thiết khi không có sự tương tác.

Xử lý hình ảnh và đa phương tiện cũng là một ứng dụng linh hoạt của Serverless. Việc sử dụng nó cho các chức năng như xử lý và chuyển đổi hình ảnh, video, âm thanh giúp giảm chi phí xử lý tập trung vào các nhiệm vụ quan trọng.

Serverless cũng thích hợp cho việc xử lý sự kiện hệ thống, nơi các chức năng chỉ được kích hoạt khi cần thiết, giảm tải và chi phí liên quan.

Ngoài ra, Serverless còn hữu ích trong việc xử lý thông tin từ thiết bị IoT, giúp giảm chi phí duy trì máy chủ liên tục và tăng tính linh hoạt.

Tích hợp với Webhooks và các dịch vụ bên ngoài thông qua Serverless cũng mang lại lợi ích chi phí, giảm gánh nặng cho việc tích hợp.

Những ứng dụng này minh họa rõ ràng những cơ hội mà Serverless mang lại để tiết kiệm chi phí và tối ưu hóa cơ sở hạ tầng trong môi trường thực tế.

Serverless với Cloudflare Worker

Cloudflare Workers cung cấp giải pháp Serverless cho phép bạn tạo ra các ứng dụng mà không cần quan tâm đến máy chủ. Được chống lưng bởi Cloudflare, Workers có sẵn trên mạng toàn cầu, điều đó nghĩa là ứng dụng của bạn được hưởng lợi dựa trên CDN.

Workers hỗ trợ nhiều ngôn ngữ lập trình, phổ biến nhất là JavaScriptRust. Trong khi JS được chạy dựa trên V8 của Chrome thì Rust cũng được biên dịch thành WebAssembly và chạy trong V8.

Ngoài ra, Cloudflare còn cung cấp rất nhiều dịch vụ để chúng ta tự tái tạo lại được “ngăn xếp công nghệ” của mình như R2, Pub/Sub, Queue, D1, Pages, AI…

Tổng kết

Serverless đem đến sự đơn giản và linh hoạt bằng cách loại bỏ gánh nặng quản lý máy chủ, giảm chi phí tài nguyên, và chỉ thanh toán cho sự sử dụng thực tế. Serverless không phải là thay thế mà là một lựa chọn bổ sung, mở rộng các khả năng công nghệ cho các dự án. Đồng thời, Serverless có thể triển khai API Gateway, xử lý đa phương tiện, đến xử lý sự kiện hệ thống, IoT, và tích hợp với Webhooks. Cloudflare Worker cung cấp ứng dụng Serverless linh hoạt với nhiều ngôn ngữ lập trình và sự hỗ trợ mạng toàn cầu, mang đến cho chúng ta một sự lựa chọn với độ tin cậy cao.

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

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

Java Core là gì? Phân biệt Java Core và Java

Java Core là gì? Phân biệt Java Core và Java

Java là một ngôn ngữ lập trình được sử dụng phổ biến nhất hiện nay với ứng dụng của nó trong nhiều lĩnh vực khác nhau từ lập trình Web, viết ứng dụng cho desktop, thiết bị di động hay các phần mềm hệ thống lớn. Ngôn ngữ lập trình Java bao gồm nhiều thành phần, phiên bản khác nhau và khiến cho anh em lập trình viên có thể dễ bị nhầm lẫn giữa các khái niệm như Java Core, Java SE, Java EE,… Bài viết hôm nay chúng ta cùng đi trả lời cho câu hỏi Java Core là gìphân biệt được Java Core và các phiên bản Java khác để hiểu sâu hơn về ngôn ngữ này nhé.

Các phiên bản của ngôn ngữ lập trình Java

Java là ngôn ngữ lập trình bậc cao, thiết kế cho việc triển khai lập trình hướng đối tượng; đây là ngôn ngữ độc lập với nền tảng tức là không có giới hạn đối với bất kỳ phần cứng hay hệ điều hành cụ thể nào. Java còn có thể được định nghĩa là một nền tảng (Platform) với tính bảo mật cao, nó được phát triển bởi Sun Microsystems ra mắt từ những năm 1995.

Có 4 phiên khác nhau của ngôn ngữ lập trình Java, đó là Java SE (Standard Edition), Java EE (Enterprise Edition), Java ME (Micro Edition) và JavaFX.

Phân biệt Java Core và Java

Java SE là một nền tảng cơ bản cho phép phát triển giao diện điều khiển, các ứng dụng mạng và các ứng dụng dạng Win Form. Java EE được xây dựng trên nền tảng Java SE giúp cho việc phát triển ứng dụng Web, các ứng dụng ở cấp doanh nghiệp. Java ME được thiết kế đặc biệt để phát triển các ứng dụng cho nền tảng di động. Nền tảng JavaFX sử dụng đồ họa xây dựng các ứng dụng giao diện người dùng đẹp mắt và tương tác cao.

  Phân biệt giữa Java ME, Java SE và Java EE

  Java Serializable là gì? Serialization và Deserialization trong Java

Java Core là gì?

Java Core là một thuật ngữ được Sun Microsystems (nhà phát triển Java) sử dụng để miêu tả phiên bản tiêu chuẩn của Java, hay chính là Java SE. Nó là phiên bản cơ bản nhất để đặt nền tảng cho những phiên bản Java khác với cùng một tập hợp công nghệ liên quan. Java Core thường được sử dụng để phân biệt với Java Advance.

Phân biệt Java Core và Java

Java Core bao gồm tất cả các khái niệm nền tảng và cơ bản của ngôn ngữ Java được sử dụng để tạo ra các ứng dụng độc lập. Tất cả các khái niệm trong Java Core đều được sử dụng trong Java Advance như OOPs (hướng đối tượng), Exception Handling (xử lý lỗi), File IO, Collections, Threads, JDBC (Database Connectivity),… Advance Java ngoài chứa Core Java thì còn bao gồm các khái niệm nâng cao, các công nghệ, frameworks được sử dụng để tạo ra các ứng dụng Web Java như Servlet, JSP, Spring, Networking,… Phiên bản Java EE cũng có thể được xem là chỉ Advance Java để chỉ việc xây dựng và phát triển ứng dụng dành cho doanh nghiệp.

Tham khảo việc làm Fresher Java mới nhất trên TopDev

Phân biệt Java Core và Java

Như đã giải thích ở trên, chúng ta có thể dễ nhận thấy Java Core và Java là 2 khái niệm hoàn toàn khác nhau. Java là một ngôn ngữ lập trình bậc cao, trong khi Java Core đề cập đến tập hợp các thư viện, khái niệm, kỹ thuật cơ bản của ngôn ngữ Java và làm cơ sở để xây dựng các ứng dụng bằng ngôn ngữ lập trình này.

Phân biệt Java Core và Java

Nếu xem Java là một hệ sinh thái chung của tất cả các phiên bản, nền tảng để viết phần mềm thì chúng ta có thể phân biệt Java Core và Java như sau:

  • Về phiên bản cấu thành: Java được cấu thành từ J2SE, J2EE, J2ME và JavaFX. Java Core chỉ chứa J2SE. Nói cách khác thì Java Core là tập con của Java.
  • Về tính năng: Java Core cung cấp các tính năng cơ bản của Java từ kiểu dữ liệu, biến, hàm, gói,… còn Java cung cấp các tính năng nâng cao như OOP, đa luồng, bảo mật, GC,… Như vậy thì một lập trình viên cần học và nắm chắc Java Core trước khi đi sâu thêm các kiến thức nâng cao của Java
  • Về tính ứng dụng thực tế: JavaCore được sử dụng riêng để tạo ra các ứng dụng chạy trên desktop và máy chủ như J2EE, WebLogic, Glassfish, nền tảng ứng dụng doanh nghiệp JBoss và Apache. Còn với hệ sinh thái mở rộng hiện nay thì Java có thể được các nhà phát triển sử dụng tạo ra các ứng dụng trên nhiều nền tảng khác nhau như thiết bị di động, TV, trình duyệt Web,…

Java tuyển dụng lương cao, đãi ngộ tốt

Kết bài

Khi nhắc đến việc phân biệt giữa Java Core và Java, chúng ta đơn thuần là chỉ ra sự khác nhau giữa 2 khái niệm dễ nhầm lẫn này vì Java Core chính là một thành phần của Java. Trong lộ trình học và phát triển để trở thành một Java Developer, bạn cần nắm chắc kiến thức Java Core là gì để rồi từ đó tiếp cận với các kiến thức chuyên sâu hơn trong Advance Java. 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

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

Đừng bỏ lỡ việc làm IT mọi cấp độ tại TopDev

Các kỹ năng cần có trong CV IT để chinh phục mọi nhà tuyển dụng

Các kỹ năng cần có trong CV IT để chinh phục mọi nhà tuyển dụng

Trong thời đại công nghệ phát triển như vũ bão, ngành IT là một trong những ngành nghề hot nhất hiện nay. Để có thể cạnh tranh trong thị trường việc làm IT ứng viên cần có một CV IT ấn tượng, thu hút được sự chú ý của nhà tuyển dụng.

Vậy làm thế nào để có thể chinh phục được nhà tuyển dụng? Một trong những yếu tố quan trọng nhất chính là các kỹ năng trong CV mà bạn thể hiện. Kỹ năng là yếu tố chứng minh năng lực và khả năng của ứng viên trong công việc. Một CV IT có đầy đủ các kỹ năng phù hợp với vị trí ứng tuyển sẽ giúp ứng viên ghi điểm trong mắt nhà tuyển dụng.

Top 7 các kỹ năng quan trọng trong CV IT

Ngành IT là một ngành nghề đòi hỏi trình độ chuyên môn cao và kỹ năng mềm tốt. Để có thể chinh phục nhà tuyển dụng, ứng viên IT cần trang bị cho mình những kỹ năng cần thiết.

Kỹ năng chuyên môn

Các kỹ năng cần có trong CV IT

Kỹ năng chuyên môn là những kỹ năng liên quan trực tiếp đến công việc IT mà ứng viên ứng tuyển. Đây là yếu tố quan trọng nhất quyết định khả năng phù hợp của ứng viên với công việc này.

Khi trình bày kỹ năng chuyên môn trong CV bạn hãy liệt kê hết tất cả các ngôn ngữ lập trình mà bạn thành thạo, các framework mà bạn đang sử dụng. Hoặc liệt kê về các kỹ năng về quản trị hệ thống, thiết kế web, phân tích data,… Tùy vào vị trí ứng tuyển mà bạn giới thiệu các phần kỹ năng chuyên môn cho phù hợp.

Kỹ năng mềm

Kỹ năng mềm là những kỹ năng không liên quan trực tiếp đến công việc IT, nhưng lại rất quan trọng trong việc đánh giá tổng thể năng lực của ứng viên. Các kỹ năng mềm phổ biến trong CV IT bao gồm:

Kỹ năng giao tiếp

Kỹ năng giao tiếp là khả năng truyền đạt thông tin hiệu quả với người khác. Đây là một kỹ năng quan trọng đối với tất cả mọi người, đặc biệt là những người làm việc trong ngành IT. Kỹ năng này không chỉ để làm việc hiệu quả với đồng nghiệp mà còn để tương tác với khách hàng và người quản lý dự án.

  Chỉ cần một bản CV hay nhiều bản cho nhiều công việc khác nhau?

Kỹ năng tư duy phản biện

Tư duy phản biện là khả năng phân tích, đánh giá và đưa ra ý kiến ​​một cách khách quan, logic. Để thể hiện kỹ năng tư duy phản biện trong CV IT của bạn, bạn có thể sử dụng các từ khóa như “phân tích”, “đánh giá”, “giải quyết vấn đề”, “tìm kiếm giải pháp”, “đưa ra quyết định”, v.v. trong phần mô tả kinh nghiệm làm việc của mình.

Kỹ năng tư duy phản biện

Bạn cũng có thể đề cập đến các dự án hoặc nhiệm vụ mà bạn đã hoàn thành bằng cách sử dụng kỹ năng tư duy phản biện để giải quyết các vấn đề kỹ thuật. Ngoài ra, bạn có thể đề cập đến các khóa học hoặc chứng chỉ liên quan đến kỹ năng tư duy phản biện mà bạn đã hoàn thành.

Kỹ năng giải quyết vấn đề

Một trong các kỹ năng cần có trong CV của lập trình viên chính là kỹ năng giải quyết vấn đề. Kỹ năng này sẽ giúp bạn giải quyết các vấn đề phát sinh trong công việc, tìm ra những giải pháp sáng tạo cho các vấn đề và làm việc hiệu quả trong môi trường có nhiều thay đổi.

  Tối ưu hóa CV bằng ChatGPT: Gây ấn tượng nhà tuyển dụng ngay từ lần đầu

Kỹ năng làm việc nhóm

Kỹ năng làm việc nhóm là khả năng phối hợp hiệu quả với các thành viên khác để hoàn thành một mục tiêu chung. Để thể hiện kỹ năng làm việc nhóm trong CV IT của bạn, bạn có thể sử dụng các từ khóa như “làm việc nhóm”, “hợp tác”, “chia sẻ kiến thức”, “đóng góp ý kiến”, “tương tác”,…

Kỹ năng làm việc nhóm là một kỹ năng quan trọng giúp ứng viên IT có thể thành công trong công việc. Bằng cách rèn luyện kỹ năng làm việc nhóm, ứng viên IT có thể phối hợp hiệu quả với các thành viên khác để hoàn thành công việc, tạo dựng mối quan hệ tốt đẹp và đạt được những thành công trong sự nghiệp.

Kỹ năng lãnh đạo

Kỹ năng lãnh đạo không chỉ bao gồm khả năng tổ chức, sắp xếp công việc phù hợp với kỹ năng của nhóm mà còn đòi hỏi tính quyết đoán, chính trực và công bằng từ người lãnh đạo. Bất kể ở vị trí quản lý hay lãnh đạo dự án nhỏ, những kỹ năng này luôn đóng vai trò quan trọng.

Kỹ năng lãnh đạo

Doanh nghiệp hiện đại đặt ưu tiên cao vào việc xây dựng các đội, nhóm mạnh mẽ. Điều này đảm bảo rằng công việc diễn ra mượt mà và đạt được kết quả cao hơn. Vì vậy, ứng viên nắm vững kỹ năng lãnh đạo sẽ tạo được ấn tượng tích cực trong tâm trí nhà tuyển dụng và có khả năng được lựa chọn cao.

Kỹ năng quản lý thời gian

Kỹ năng quản lý thời gian là một trong các kỹ năng cần có trong CV. Kỹ năng quản lý thời gian là khả năng lập kế hoạch, sắp xếp và sử dụng thời gian một cách hiệu quả. Kỹ năng quản lý thời gian là một kỹ năng quan trọng trong ngành IT vì nó giúp ứng viên có thể hoàn thành công việc hiệu quả, tăng năng suất và giúp ứng viên tránh bị quá tải công việc.

Tạo CV online miễn phí, nhanh chóng trên TopDev

Cách viết các kỹ năng trong CV xin việc đúng chuẩn

Cách viết các kỹ năng trong CV xin việc đúng chuẩn

Để viết các kỹ năng trong CV xin việc đúng chuẩn, bạn có thể tham khảo các bước sau:

  • Đọc kỹ mô tả công việc và yêu cầu của vị trí ứng tuyển để hiểu rõ những kỹ năng cần thiết cho công việc đó.
  • Liệt kê các kỹ năng chuyên môn và kỹ năng mềm mà bạn có, sắp xếp theo thứ tự ưu tiên.
  • Cung cấp bằng chứng cụ thể để chứng minh cho các kỹ năng của bạn. Ví dụ, thay vì viết “Tôi có kỹ năng giao tiếp tốt”, bạn có thể viết “Tôi có thể giao tiếp hiệu quả với khách hàng, đồng nghiệp và cấp trên”.
  • Nhấn mạnh mức độ thành thạo của từng kỹ năng trong CV.
  • Sử dụng các từ khóa phù hợp để thể hiện kỹ năng của bạn, ví dụ như “phân tích”, “đánh giá”, “giải quyết vấn đề”, “tìm kiếm giải pháp”, “đưa ra quyết định”, “làm việc nhóm”, “giao tiếp”, v.v.
  • Tránh các lỗi thường gặp khi viết kỹ năng trong CV xin việc, ví dụ như viết quá nhiều kỹ năng không liên quan đến công việc, không nhấn mạnh mức độ thành thạo của từng kỹ năng, v.v.

Tóm lại

Trong bài viết này, chúng ta đã tìm hiểu về cách viết các kỹ năng trong CV IT và những lưu ý để có được một phần kỹ năng chuyên nghiệp. Hy vọng những gợi ý này sẽ giúp bạn viết một CV IT ấn tượng và chứa đựng đầy đủ các kỹ năng của bạn. Chúc bạn thành công!

Xem thêm:

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

Top 5 kinh nghiệm fix bug từ Senior Developer

Top 5 kinh nghiệm fix bug từ Senior Developer

Fix bug muôn đời vẫn là công việc cần làm, sẽ làm của Developer, có là low code platform thì vẫn có bug mà fix, vậy những lập trình viên lâu năm đút túi cho mình kinh nghiệm fix bug gì?

Tất cả sẽ được chia sẻ trong bài viết này. Có tí kinh nghiệm có khi lại hay chứ fix thì ngày nào chả fix.

kinh nghiệm fix bug từ Senior Developer
Văn phong thuần developer, anh em đọc cho vui, tích luỹ được kinh nghiệm gì cho mình thì tích luỹ nha.

1. Cố gắng tái hiện bug – Reproduce the Bug

Kinh nghiệm đầu tiên là tái hiện bug, bug vụt qua đời ta nhanh như cờ hó chạy ngoài đồng. Nên ta cần tái hiện.

Tất nhiên dựa vào kinh nghiệm mà anh em Senior có thể fix được bug nhanh hơn, nhưng về tái hiện thì chưa chắc. Nếu bug ở trên production, được thực hiện qua một vài trên thao tác UI. Việc tái hiện có thể là tương đương về tốc độ khi so sánh giữa Senior và Junior.

Tuy nhiên, có một bí mật mà anh em có nhiều kinh nghiệm thường áp dụng để tái hiện bug nhanh nhất có thể. Dưới đây chỉ là một số thông tin ví dụ, tuỳ thuộc vào dự án mà anh em có thể áp dụng để tái hiện nhanh nhất có thể nha!

kinh nghiệm fix bug từ Senior Developer
Vòng đời thì dài mà ngày nào cũng có. Nguồn ảnh / Source: javatpoint.com

    • Môi trường đang xảy ra bug là gì?. (production, dev hay staging, …)
    • DB đang sử dụng data như nào?
    • Request gửi đi là gì? (capture lại toàn bộ request)
    • Debug đặt đúng chưa (cái này tưởng là ngớ ngẩn nhưng nhiều ông bug trên staging lại debug ở môi trường development)
    • Account đang sử dụng xảy ra bug là account nào?
    • Một số dự án phức tạp còn có thời điểm
    • Các thao tác nào đã thực hiện trước đó để gây ra bug

Sau khi thực hiện đầy đủ các bước, nếu không có gì sai sót thì ôi thôi bug là từ đây mà ra chứ đâu. Tái hiện nhanh đồng nghĩa với việc anh em sẽ có thêm thời gian để fix bug.

  Top 5 kinh nghiệm fix bug từ Senior Developer

2. Đánh giá và xác định điểm gây lỗi

Kinh nghiệm fix bug thứ hai là đánh giá và xác định điểm gây ra lỗi. Vậy cụ thể anh em đánh giá như thế nào?

Sau khi đã tái hiện xong bug, bước thứ hai là đánh giá và xác định chỗ nào gây ra bug. Tất nhiên với các anh em Senior thì đôi khi chỉ cần nhìn mã lỗi hoặc content của lỗi thôi đã đoán ra được bug từ đâu tới. Nhưng đối với anh em còn ít kinh nghiệm thì làm thế nào.

kinh nghiệm fix bug từ Senior Developer

Cũng không phải quá xì chét (thông thường các anh em mới đều thế). Anh em cứ thử follow một số câu hỏi dưới đây sẽ dễ dàng hơn để tìm ra chỗ gây ra bug:

    • Lỗi này từ đâu mà tới (Frontend hay Backend, nếu có FE,BE) – Tất nhiên là phỏng đoán.
    • Mã lỗi này thường liên quan tới cái gì – Tất nhiên khúc này không ai có thể cản được anh em google, Stack overflow. Thông thường search tí là ra, nhưng cũng tránh sa đà quá để mà rối.
    • Phần code nào liên quan tới lỗi này (đánh giá sơ bộ dựa trên màn hình, trên nhóm tính năng).

Tại sao phía trên tui lại nhấn mạnh nhiều tới từ sơ bộ, bởi chưa có nhiều kinh nghiệm không thể yêu cầu anh em phải phán đoán chính xác. Việc phán đoán sơ bộ giúp giảm căng thẳng, bình tĩnh từ tốn để tìm ra bug.

Xem thêm các việc làm tuyển dụng Tester hấp dẫn tại TopDev

3. Chia để trị – Divide and conquer

Kinh nghiệm thứ ba cũng là kinh nghiệm xương máu. Chia để trị, nghe như hồi Pháp thuộc mà đúng là như thế thật. Code thì mênh mông bát ngát, nếu mà không chia ra tìm từng phần thì biết tới ngày nào.

Sinh ra cái trò debug cũng thế. Debug cả đống rồi vụt cái bug lướt qua đời ta như một cơn gió. Để thực hiện chia để trị tốt khi tìm và fix bug.

Divide and conquer

    • Những phần nào không có vấn đề có thể comment
    • Nếu phần trên cần có data cho phần dưới -> có thể hard code hoặc fake data
    • Càng ít code focus tìm lỗi càng tìm lỗi nhanh, anh em nên nhớ
    • Viết được theo kiểu functional programming thì fix nhanh hơn
    • Già đầu hay trẻ trâu thì cũng đều cần chia để trị cho những con bug khó

Chia ra mà trị, chia ra để mà tìm là kinh nghiệm xương máu. Thường các anh em mới vào hay rén vụ comment hoặc tách rõ phần nào không vấn đề phần nào có vấn đề. Nhưng tin tui đi, anh em đừng ngại, cứ tách bạch ra rồi sẽ tìm được bug nhanh hơn.

  Chức danh Senior, Developer là gì? Khác gì với coder nhỉ!

4. Đánh giá ảnh hưởng

Kinh nghiệm thứ 4 khi fix bug là đánh giá ảnh hưởng, thường các anh em ít kinh nghiệm quên mất khúc này. Con bug ngồi mò nửa ngày, trằn trọc cả đêm, fix được cái mừng quá nhảy cẫng lên báo deploy, deploy gấp cho bố mà quên đánh giá ảnh hưởng.

Mấy ông có kinh nghiệm thì thường không “háo hức” như thế. Một số câu hỏi cần trả lời trước khi fix xong bug

Đánh giá ảnh hưởng

    • Bug này có thể gây ra bug khác không?. Tại sao lại có bug này
    • Những chỗ nào tương tự chỗ này, có thể tiếp tục gây ra bug?
    • Fix được bug này có ảnh hưởng gì tính năng không, cần kiếm tra lại phát cuối

Thường đối với những anh em còn non kinh nghiệm việc đánh giá ảnh hưởng thường rất khó. Có thể task này mình làm nhưng task khác ông kia làm. Tui chả quan tâm, nhưng việc đánh giá ảnh hưởng là rất quan trọng, anh em cần luyện tập để trở thành lập trình viên giỏi. Cái này luyện dần không bao giờ là thừa nha.

5. Xác nhận đã fix – verify issue fixed

Cuối cùng cũng là cái hay ho nhất, xác nhận đã fix. Thường rất nhiều anh em bỏ qua mất khúc này. Ồ ze fix xong rồi là fix xong rồi nhưng deploy lên lại cứ lỗi.

verify issue fixed

Vậy xác nhận đã fix là như thế nào?

    • Còn phần code nào comment không? Fix này lòi kia là do deploy mà quên té comment khúc khác dẫn tới đem lên chạy trật lất.
    • Đã xác nhận fix thật chưa, tái hiện lại tại môi trường gây ra bug, tài khoản gây ra bug
    • Còn chỗ nào giống vậy chưa fix không?
    • Với behavior khác chút xíu thì còn bug không?

Bước này cũng là bước cần thiết để anh em nâng cao trình độ. Nên anh em cố gắng rèn luyện, làm gì cũng cần confirm chắc chắn, bảo fix xong là fix xong chứ không có ơ mà nha.

6. Tham khảo

Cảm ơn anh em đã đọc bài – Thank you for your time – Happy coding!

Tác giả: Kiên Nguyễn

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

METRO.digital Vietnam culture and ways of working

Who are we?

METRO.digital stands as METRO’s tech product-led powerhouse; with longstanding global wholesale experience, METRO.digital develops worldwide customized tech solutions and products for all METRO countries. Located in Germany, Romania, and Vietnam, the METRO.digital teams comprised of over 900 dedicated colleagues representing 49 nationalities, are working continuously on one goal: digitalizing the wholesale industry.  

METRO.digital is a name deeply rooted in the legacy of METRO, a global leader in wholesale and food trade that operates globally in 21 countries and has more than 90.000 employees.

We leverage METRO’s long history and expertise in B2B to build a more sustainable market ecosystem by placing the client’s needs in the organization’s center.

What is our culture?

In a highly interdisciplinary and international company like METRO.digital, knowledge exchange and learning from each other is of utmost importance for us to collaborate in an effective and efficient way. Therefore, we have established and frequently run multiple formats (Townhall, brown bags, All-hands, communities, and more), to not only share information, but also foster discussions by giving any employee the opportunity to participate actively.

 “Next to technology and know-how, passion is the most important piece of the puzzle in an IT company. It drives the relentless pursuit of excellence and plays a key role in keeping the focus on solving complex challenges. Looking to the left and to the right or even taking the simple, pragmatic path contributes – together with all the other values – on a common objective: Being able to offer the customer high-quality added value. “- Tobias Wolfram (M.companion)

metro digital“I am very glad that I did this internship! It is still open what profession I want to take after school. Before the internship I was interested in psychology, and I learned now that there are so many jobs where it can be helpful to have knowledge in psychology. In METRO.digital for instance you need to understand the customer and you have to think like them. It also might be helpful during interactions within your team, to see things and problems from the perspective of colleagues.”- Annabell Moeser

Teamwork is our unwritten value; it represents who we are and how we solve our challenges. Regardless of the location, professional background, and skills, we all work together to achieve the same goals, and we do it with ownership, pragmatism, respect, and, most of all, passion. Team is the STAR in METRO.digital and we all live by it.

How do we work?

METRO.digital must cover a lot of contexts; therefore, we need a structure that enables us to find the best mix between stable teams and a flexible organization. Thus, we use the idea of a matrix organization. It allows us to distinguish between people management-related tasks and the work done in a product team. Leadership is shared in these contexts, making it easier for us to act as an organization.

We act as a united team with a sole purpose: to solve customers’ problems and satisfy them with our solutions. We will continue to run organizational experiments to find the best solution for our business because change is the only constant.

We sometimes see that the fear of failure keeps teams in a routine and blocks their true potential. In a safe environment, the team is encouraged to experiment and see failure as an opportunity to improve, make evidence-based decisions, and find pragmatic solutions.

Product coaching helps everyone apply product thinking to their work, getting more effective in realizing business value sooner via better collaboration, faster learning, and more creativity.

The benefits of product thinking help us to have a meaningful impact and become more effective at work. 

Product thinking also enables more psychologically empowered teams thanks to the leadership styles heavily promoted by product thinking, compared to “command and control”-style leaders that tell people what to do. Self-organized teams applying product thinking are more satisfied than teams following a defined plan, as they are empowered to make decisions that maximize value to both the users and the business. 

And what drives satisfaction? Individual and team motivation. Which, according to Daniel H. Pink´s theory, is led by autonomy, mastery, and purpose. Three elements are directly connected to product thinking and in our METRO.digital values (ownership, pragmatism, respect, and passion). Everything is connected!

metro digital 3

Join us at the Web Summit 2023 and find more about us directly from our colleagues!

Bỏ túi một số quy tắc thiết kế API hữu ích

quy tắc thiết kế API

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

Vấn đề

Khi viết chương trình, chúng ta có các Design Pattern nên hoặc thậm chí cần được tuân theo để giúp cho mọi người trong nhóm có thể hiểu và phối hợp với nhau một cách nhịp nhàng. Các “mẫu thiết kế” là minh chứng rõ nhất cho việc đọc hiểu dễ hơn khi con người chúng ta cùng chung một lối suy nghĩ.

Design API cũng vậy, việc tạo ra hàng tá endpoint trong một khoảng thời gian là khá dễ nhưng làm sao để duy trì được sự thống nhất trong suốt quá trình phát triển mới là điều khó. Dự án phát triển theo năm tháng, con người cũng thay đổi, càng có nhiều bộ óc tham gia vào quá trình, càng có nhiều tính cách được bộc phát qua những dòng code.

Thực tê, Design API phụ thuộc vào tính sáng tạo của từng cá nhân, tổ chức. Nếu một nhóm không quá khắt khe với vấn đề đặt tên cho một endpoint thì thế giới này là của bạn, hãy tự do sáng tạo dựa trên những gì có thể nghĩ ra được. Ngược lại, có những tổ chức lại đưa ra những quy định ngặt nghèo trong quá trình này, buộc chúng ta phải tuân theo. Nhưng dù là thế nào đi nữa, mục đích cuối cùng của việc đó vẫn là làm sao để đại đa số lập trình viên nhìn vào đều có thể hiểu hoặc biết cách để tìm kiếm thứ mà họ cần.

Tôi là một người thích sự sáng tạo, nhưng không nên phá cách. Có những thứ mình vẫn cần tuân theo để đảm bảo được sự minh bạch của API. Bài viết này hôm nay, tôi sẽ trình bày một số quy tắc trong quá trình Design API mà rất nhiều lập trình viên trên thế giới đang áp dụng. Nếu không tin, sau khi đọc xong bài viết này, hãy thử “vọc vạch” một bộ API của bất kỳ bên thứ 3 nào đó đang cung cấp để xem họ đang làm như thế nào.

Một lần nữa, các quy tắc nêu ra dưới đây chỉ để tham khảo và không bắt buộc ai phải làm theo. Nếu bạn nhận ra được lợi ích từ việc tuân theo nguyên tắc, tôi tin rằng đây là một điều không nên bỏ qua. Không dài dòng nữa, vào việc thôi!

  Bỏ túi 8 API hữu ích cho anh em developer

  Thiết kế API – ba điều bắt buộc phải nắm rõ

Một số quy tắc

Đầu tiên, hãy làm rõ một số khái niệm liên quan đến việc thiết kế API.

Chúng ta có resource, đại diện cho “tài nguyên” muốn truy cập hoặc thực hiện một thao tác. Khi gọi đến một endpoint, dữ liệu được trả về, nó là danh sách bài viết, chi tiết bài viết… gọi chung là resource. Bên cạnh đó, trong resource thường có các thuộc tính (attributes), chúng là một thành phần của resource hoặc được tính toán dựa trên resource.

Một “bộ sưu tập” hay Collections là tập hợp của các resource, thông thường các resource giống nhau được xếp chung vào một Collections. Ví dụ đối với một tài nguyên là “Users”, chúng ta có tập hợp các thao tác với người dùng như là thêm, sửa, xóa… gọi là Collections.

URLs thì rõ rồi, đường dẫn đến resource của bạn. Ví dụ /articles để trỏ vào danh sách bài viết.

Xem thêm tuyển dụng Design Pattern hấp dẫn trên TopDev

Quy tắc về đường dẫn (path)

Xác định bộ sưu tập cho tài nguyên, ví dụ /articles cho các bài viết, /comments cho các bình luận và luôn sử dụng danh từ số nhiều.

Sử dụng “kebab-case” cho mọi thứ trong đường dẫn URLs, “camelCase” cho tham số trong truy vấn. Ví dụ /special-articles?isHighlight=true.

Sử dụng “mã định danh” như ID của resource để thao tác với một tài nguyên chỉ định. Ví dụ: /articles/nodejs-la-gi để tương tác với bài viết có URL “nodejs-la-gi”.

Tránh sử dụng đường dẫn có chứa thuộc tính của resource hoặc là các hành động đối với resource, nó sẽ gây ra nhiều rắc rối cũng như phức tạp hóa đường dẫn sau này. Ví dụ: không nên /articles/nodejs-la-gi/summary hoặc /articles/nodejs-la-gi/reset-view, hãy thử chuyển thuộc tính vào parameters hoặc trong request body, ví dụ /articles/nodejs-la-gi?summary=true.

Nên xác định tiền tố cho phiên bản API, ví dụ /v1/articles để trỏ đến phiên bản 1 của API. Nếu sau này nâng cấp API, chúng ta có thể mở rộng thêm /v2/v3… mà hạn chế ảnh hưởng đến các phiên bản trước đó.

Quy tắc về phương thức

Có 5 phương thức HTTP phổ biến mà chắc hẳn ai cũng nghe qua.

GET: Để lấy một tài nguyên.
POST: Để tạo tài nguyên mới.
PUT: Để cập nhật các tài nguyên hiện có.
PATCH: Để cập nhật các tài nguyên hiện có, nhưng chỉ cập nhật các trường được cung cấp, để yên những trường khác.
DELETE: Để xóa các tài nguyên hiện có.

Kết hợp với quy tắc về đường dẫn, các phương thức HTTP góp phần làm rõ thêm hành động bạn đang muốn tương tác với tài nguyên là gì. Ví dụ:

GET /articles – lấy danh sách tất cả bài biết.
GET /articles/nodejs-la-gi – lấy chi tiết bài viết có URL nodejs-la-gi.
POST /articles – tạo mới một bài viết.
DELETE /articles – xóa bài viết.

Quy tắc về response status code

HTTP response status code là những con số cho biết liệu một yêu cầu HTTP có được hoàn thành hay là không.

Có rất nhiều status code nhưng dưới đây là một vài con số chúng ta thường hay gặp:

200 OK: thành công.
201 Created: thường được trả về khi API vừa tạo một tài nguyên mới thành công.
204 No Content: thao tác thành công nhưng không có gì được trả về, ví dụ như thao tác DELETE một tài nguyên đã có.
400 Bad Request: báo lỗi khi một yêu cầu không hợp lệ, có thể là hành vi gửi lên dữ liệu không hợp lệ cho nên cần phải từ chối xử lý.
401 Unauthorized: lỗi khi yêu cầu này cần xác thực thông tin hợp lệ trước khi hành động, ví dụ như chưa đăng nhập vào hệ thống.
403 Forbidden: lỗi khi không có quyền thực hiện chức năng này.
404 Not Found: lỗi không tìm thấy tài nguyên hoặc hành động.
500 Internal Server Error: một lỗi “không xác định” từ máy chủ, có thể do sự cố ngoài ý muốn như lỗi phần cứng, phần mềm, mạng…

Ngoài ra, bạn đọc có thể tham khảo thêm mã lỗi khác tại HTTP response status codes – Mozilla. Việc tuân thủ status code giúp đạt được sự thống nhất trong quá trình phát triển, cũng như cho các bên tích hợp API.

Quy tắc về response body

Giữ cho response body của bạn được xuyên suốt từ đầu đến cuối. Ví dụ một phản hồi thành công bao gồm mã phản hồi, thông điệp và dữ liệu trả về.

{
  "status": 200,  
  "message": "OK",  
  "data": {
    "id": 1,  
    "name": "John Doe",  
    "email": "johndoe@example.com"
  }
}

Nếu là thông báo lỗi, hãy kèm theo mã lỗi và thông điệp lỗi.

{
  "code": 400,  
  "message": "Bad Request"
}

Giữ thông báo lỗi chung nhất có thể để hạn chế việc làm lộ dữ liệu hoặc thông tin quan trọng khác.

Ngoài ra, có một vài quy tắc khác trong việc thiết kế API như:

Luôn phân trang cho các yêu cầu đến tài nguyên dạng danh sách, ví dụ /articles?limit=10&offset=0 hoặc /articles?page=1&limit=10… Nếu có thể, trả về thêm tổng số resource có trong danh sách đó. Các tài nguyên dạng danh sách cũng có thể cần được sắp xếp theo một thứ tự nào đó, ví dụ /articles?sort=createdAt:desc

Tài nguyên chi tiết thông thường trả về hết thuộc tính có thể có, nhưng đó không phải lúc nào cũng cần, có thể hỗ trợ cần lấy những thuộc tính nào thông qua lọc, ví dụ /articles?field=url,title,content,createdAt

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

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

Tin tuyển dụng IT mọi cấp độ trên TopDev đang chờ bạn ứng tuyển!