Home Blog Page 154

6 câu lệnh linux hay dùng trong phân tích log

Bài viết được sự cho phép của tác giả Ngo Thang

Hôm nay mình chia sẻ cho mọi người 1 số câu lệnh linux mình hay dùng trong phân tích log trên server.

  14 khóa học Tech miễn phí chất lượng từ MIT, Harvard, Linux...
  Console không chỉ có phương thức log!

1. Các usecase hay dùng

  • Muốn điều tra nguyên nhân khi số lượng access đến server tăng dột biến
  • Đã phát hiện trên server có lỗ hổng và muốn điều tra xem đã có ai xâm nhập vào hay chưa

2. Các câu lệnh linux hay dùng

Command line Giải thích
grep Tìm các dòng chứa chuỗi được chỉ định
awk Phân tách cột và tìm kiếm hàng có điều kiện
sort Sắp xếp dòng
uniq Loại bỏ các hàng trùng lặp và đếm
wc Đếm số ký tự, số dòng
sed Thay thế điều kiện quy định

3. Đối tượng phân tích

# access_log

203.0.113.1 - - [03/May/2020:12:00:00 +0900] "GET /index.html HTTP/1.1" 200 1000 "http://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
203.0.113.1 - - [03/May/2020:12:10:00 +0900] "GET /index.html HTTP/1.1" 200 1000 "http://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
203.0.113.2 - - [03/May/2020:12:20:00 +0900] "GET /index.html HTTP/1.1" 200 1000 "http://example.com/" "Mozilla/5.0 (Windows NT 6.3; Win64; x64)"
203.0.113.2 - - [03/May/2020:12:30:00 +0900] "GET /index.html HTTP/1.1" 200 1000 "http://example.com/" "Mozilla/5.0 (Windows NT 6.3; Win64; x64)"
203.0.113.2 - - [03/May/2020:12:40:00 +0900] "GET /index.html HTTP/1.1" 200 1000 "http://example.com/" "Mozilla/5.0 (Windows NT 6.3; Win64; x64)"
198.51.100.3 - - [03/May/2020:12:50:00 +0900] "GET /index.cgi?page=<Script>alert('Evil')</Script> HTTP/1.1" 200 3000 "-" "Evil User Agent"
198.51.100.3 - - [03/May/2020:13:00:00 +0900] "GET /../../../../../etc/shadow HTTP/1.1" 200 3000 "-" "Evil User Agent"

Trong đó:

  • 203.0.113.0/24 là địa chỉ ip đúng từ người dùng
  • 198.51.100.0/24 là địa chỉ ip từ nguồn đáng ngờ

4. Áp dụng

4.1. Tìm kiếm đặc biệt (grep)

・Điều tra cuộc tấn công vào thư mục

$ grep -n "\.\." access_log
7:198.51.100.3 - - [03/May/2020:13:00:00 +0900] "GET /../../../../../etc/shadow HTTP/1.1" 200 3000 "-" "Evil User Agent"

・Điều tra chèn script đáng ngờ

$ grep -i "<script>" --color access_log
198.51.100.3 - - [03/May/2020:12:50:00 +0900] "GET /index.cgi?page=<Script>alert('Evil')</Script> HTTP/1.1" 200 3000 "-" "Evil User Agent"

・Điều tra chèn thẻ tag html đáng ngờ

$ grep -E "<[^>]+>[^<]+<[^>]+>" -o access_log
<Script>alert('Evil')</Script>

Giải thích về option trong grep:

option Giải thích
-n Hiển thị số dòng của dòng match
-i Không phân biệt chữ hoa và chữ thường
—color Hiển thị màu đối với từ đã match
-o Hiển thị phần đã match
-E Sử dụng biểu thức regex

4.2. Loại bỏ log không cần thiết

・Loại bỏ log từ nguồn chuẩn

$ grep -v "203.0.113." access_log
198.51.100.3 - - [03/May/2020:12:50:00 +0900] "GET /index.cgi?page=<Script>alert('Evil')</Script> HTTP/1.1" 200 3000 "-" "Evil User Agent"
198.51.100.3 - - [03/May/2020:13:00:00 +0900] "GET /../../../../../etc/shadow HTTP/1.1" 200 3000 "-" "Evil User Agent"

Giải thích về option trong grep:

option Giải thích
-v Không hiển thị dòng match

4.3. Trích xuất phần tử(awk)

・Trích xuất ra địa chỉ ip client

$ awk '{print $1}' access_log 
203.0.113.1
203.0.113.1
203.0.113.2
203.0.113.2
203.0.113.2
198.51.100.3
198.51.100.3

・Trích xuất ra User Agent của client

$ awk -F[\"] '{print $6}' access_log 
Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Mozilla/5.0 (Windows NT 6.3; Win64; x64)
Mozilla/5.0 (Windows NT 6.3; Win64; x64)
Mozilla/5.0 (Windows NT 6.3; Win64; x64)
Evil User Agent
Evil User Agent

Giải thích về option trong awk:

option Giải thích
{print $1} Hiển thị ra cột đầu tiên được phân tách bằng dấu phân cách
-F Chỉ định dấu phân cách (mặc định là khoảng trắng)

4.4. Thống kê và sắp xếp (sort/uniq/wc)

・Hiển thị ra số lượng của mỗi địa chỉ ip client

$ awk '{print $1}' access_log | sort | uniq -c | sort -rn
      3 203.0.113.2
      2 203.0.113.1
      2 198.51.100.3

・Tổng số lượng của địa chỉ duy nhất ip client

$ awk '{print $1}' access_log | sort | uniq | wc -l
3

Giải thích:

command line, option Giải thích
uniq -c Hiển thị số trùng lặp (yêu cầu sắp xếp để so sánh trước và sau)
sort -n Sắp xếp các trường số theo giá trị số học
sort -r Sắp xếp theo thứ tự giảm dần (mặc định là thứ tự tăng dần)
wc -l Hiển thị ra số dòng

4.5. Thay thế (sed)

・Ẩn danh địa chỉ IP nguồn để truy cập bình thường

$ sed "s/203\.0\.113\.[0-9]\{1\,3\}/xxx.xxx.xxx.xxx/g" access_log
xxx.xxx.xxx.xxx - - [03/May/2020:12:00:00 +0900] "GET /index.html HTTP/1.1" 200 1000 "http://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
xxx.xxx.xxx.xxx - - [03/May/2020:12:10:00 +0900] "GET /index.html HTTP/1.1" 200 1000 "http://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
xxx.xxx.xxx.xxx - - [03/May/2020:12:20:00 +0900] "GET /index.html HTTP/1.1" 200 1000 "http://example.com/" "Mozilla/5.0 (Windows NT 6.3; Win64; x64)"
xxx.xxx.xxx.xxx - - [03/May/2020:12:30:00 +0900] "GET /index.html HTTP/1.1" 200 1000 "http://example.com/" "Mozilla/5.0 (Windows NT 6.3; Win64; x64)"
xxx.xxx.xxx.xxx - - [03/May/2020:12:40:00 +0900] "GET /index.html HTTP/1.1" 200 1000 "http://example.com/" "Mozilla/5.0 (Windows NT 6.3; Win64; x64)"
198.51.100.3 - - [03/May/2020:12:50:00 +0900] "GET /index.cgi?page=<Script>alert('Evil')</Script> HTTP/1.1" 200 3000 "-" "Evil User Agent"
198.51.100.3 - - [03/May/2020:13:00:00 +0900] "GET /../../../../../etc/shadow HTTP/1.1" 200 3000 "-" "Evil User Agent"

Giải thích:

option Giải thích
s/string A/string B/g Thay chuỗi A bằng chuỗi B. Thay thế tất cả bằng cách thêm g.

Kết luận

Nếu sử dụng 6 câu lệnh mình bảo bên trên thì chúng ta có thể phân tích log 1 cách dễ dàng.

Hơn nữa, thông thường hay sử dụng kí tự pipe line | để phân tích log 1 cách hiệu quả hơn.

Ví dụ:

$ grep -v "203.0.113." access_log | awk '{print $1}' | sort | uniq -c | sort -rn
      2 198.51.100.3

==============

Bài viết gốc được đăng tải tại nghethuatcoding.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

GitHub là gì? Giới thiệu tính năng và hướng dẫn cài đặt GitHub

Làm thế nào để lưu trữ source code sau mỗi lần update dự án? GitHub đã ra đời để giải quyết vấn đề này! GitHub là một trong những resource phổ biến hiện nay để lưu trữ, chia sẻ mã nguồn và làm việc cùng nhau trên các dự án. Nếu bạn thấy GitHub thú vị và muốn tìm hiểu thêm, hãy đọc hết bài chia sẻ về GitHub này của TopDev. Chúng tôi sẽ giải thích GitHub là gì, các tính năng nổi bật, nó được sử dụng để làm gì và cách bắt đầu sử dụng GitHub.

Github là gì?

GitHub là một mạng xã hội đặc biệt dành cho lập trình viên, là một hệ thống quản lý dự án, lưu trữ source code, theo dõi và cộng tác trong các dự án phần mềm. Github là gì?

Các lập trình viên có thể clone lại mã nguồn từ một repository và Github chính là một dịch vụ máy chủ repository công cộng, mỗi người có thể tạo tài khoản trên đó để tạo ra các kho chứa của riêng mình để có thể làm việc.

Ngoài ra, GitHub là một dịch vụ nổi tiếng cung cấp kho lưu trữ mã nguồn Git cho các dự án phần mềm. Github có đầy đủ những tính năng của Git, ngoài ra nó còn bổ sung những tính năng về social để các developer tương tác với nhau.

GitHub có 2 phiên bản: miễn phí và trả phí. Với phiên bản có phí thường được các doanh nghiệp sử dụng để tăng khả năng quản lý team cũng như phân quyền bảo mật dự án.
Còn lại thì phần lớn chúng ta đều sử dụng Github với tài khoản miễn phí để lưu trữ source code.

Github cung cấp các tính năng social networking như feeds, followers, và network graph để các developer học hỏi kinh nghiệm của nhau thông qua lịch sử commit.

Nếu một comment để mô tả và giải thích một đoạn code. Thì với Github, commit message chính là phần mô tả hành động mà bạn thực hiện trên source code.

Github trở thành một yếu tố có sức ảnh hưởng lớn trong cộng động nguồn mở. Cùng với Linkedin, Github được coi là một sự thay thế cho CV của bạn. Các nhà tuyển dụng cũng rất hay tham khảo Github profile để hiểu về năng lực coding của ứng viên.

Giờ đây, kỹ năng sử dụng git và Github từ chỗ ưu thích sang bắt buộc phải có đối với các ứng viên đi xin việc.

GitHub hoạt động như thế nào?

Với GitHub các lập trình viên có thể tạo tài khoản, tải lên các tệp và quản lý các dự án lập trình.

Tuy nhiên, sức mạnh thực sự của GitHub nằm ở khả năng cộng tác giữa các người dùng, đặc biệt là các nhóm phát triển làm việc cùng nhau trên các dự án mã nguồn mở hoặc các dự án doanh nghiệp.

Hầu hết các dự án phát triển phần mềm đều được xây dựng bởi một nhóm lập trình viên. Những thành viên trong nhóm này có thể làm việc tại một cùng công ty hoặc từ xa, đồng bộ hoặc không đồng bộ. Điều này tạo ra nhiều thách thức cho việc hợp tác phát triển phần mềm, nhưng GitHub giúp quá trình này trở nên dễ dàng hơn nhờ vào một số tính năng.GitHub hoạt động như thế nào?

GitHub tập trung mã nguồn và tài liệu trong một nơi duy nhất

GitHub cho phép tất cả mã nguồn và tài liệu dự án được lưu trữ tập trung trong các “repository” (kho lưu trữ). Điều này đảm bảo rằng bất kỳ ai muốn đóng góp vào dự án đều có quyền truy cập vào những tài nguyên cần thiết, giảm thiểu các vấn đề về truy cập thông tin. Mỗi repository thường đi kèm với các hướng dẫn cụ thể, giúp người tham gia hiểu được mục tiêu và quy tắc của dự án.

Quản lý xung đột mã

Lập trình không chỉ đơn giản là viết mã; nó còn đòi hỏi sự sáng tạo và linh hoạt. Ví dụ, hai lập trình viên có thể đang làm việc trên các phần mã khác nhau, nhưng chúng cần phải hoạt động hài hòa với nhau. Đôi khi, một phần mã có thể khiến phần mã khác bị lỗi, hoặc có thể có tác động không mong muốn lên cách mà phần khác hoạt động. GitHub giải quyết vấn đề này bằng cách hiển thị rõ ràng những thay đổi từ hai lập trình viên trước khi họ đẩy (push) mã lên “branch” (nhánh chính) của dự án. Điều này giúp phát hiện và khắc phục các lỗi tiềm ẩn trước khi chúng ảnh hưởng đến toàn bộ dự án.

GitHub giúp theo dõi và khôi phục phiên bản mã nguồn

Một trong những tính năng quan trọng nhất của GitHub là khả năng quản lý phiên bản. Điều này cho phép bạn theo dõi mọi thay đổi trong dự án và quay lại các phiên bản trước đó nếu cần. GitHub dựa trên công nghệ Git, một hệ thống kiểm soát phiên bản (version control system), giúp lưu lại các thay đổi qua từng “commit” (lần lưu mã). Bạn có thể quay lại phiên bản trước đó nếu phát hiện lỗi, hoặc theo dõi ai đã thay đổi những gì và khi nào.

Mạng xã hội cho developers

Bên cạnh đó, GitHub được coi là một mạng xã hội dành cho lập trình viên lớn nhất và dễ dùng nhất với các tính năng cốt lõi như:

  • Wiki, issue, thống kê, đổi tên project, project được đặt vào namespace là user.
  • Watch project: theo dõi hoạt động của project của người khác. Xem quá trình người ta phát triển phầm mềm thế nào, project phát triển ra sao.
  • Follow user: theo dõi hoạt động của người khác.

Có 2 cách tiếp cận GitHub: Tạo project của riêng mình Contribute cho project có sẵn: fork project có sẵn của người khác, sửa đổi, sau đó đề nghị họ cập nhật sửa đổi của mình (tạo pull request).

Git và GitHub – sự khác biệt

Git và GitHub – sự khác biệt

GitHub được xây dựng trên công nghệ Git, nhưng hai khái niệm này không hoàn toàn giống nhau. Git là một hệ thống quản lý phiên bản mã nguồn mở, giúp theo dõi các thay đổi trong mã nguồn, và bạn có thể sử dụng Git mà không cần GitHub. GitHub là một nền tảng dựa trên Git, cung cấp giao diện web dễ sử dụng và nhiều tính năng bổ trợ như quản lý cộng tác, lưu trữ mã nguồn từ xa, và theo dõi lỗi. GitHub mở rộng khả năng của Git bằng cách hỗ trợ làm việc theo nhóm và cộng tác từ xa một cách hiệu quả

Một vài khái niệm của Git bạn cần nắm

  • git: là prefix của các lệnh được sử dụng dưới CLI
  • branch: được hiểu như là nhánh, thể hiện sự phân chia các version khi 2 version đó có sự sai khác nhất định và 2 version đều có sự khác nhau.
  • commit: là một điểm trên cây công việc (Work Tree ) hay gọi là cây phát triển công việc
  • clone: được gọi là nhân bản, hay thực hiện nhân bản. Sử dụng để clone các project, repository trên các hệ thống chạy trên cơ sở là git, ví dụ như: bitbucket, github, gitlab, cor(1 sản phẩm mã nguồn mở cho phép người dùng tự tạo git server cho riêng mình trên vps, server),… Việc clone này sẽ sao chép repository tại commit mình mong muốn, dùng để tiếp tục phát triển. Thao tác này sẽ tải toàn bộ mã nguồn, dữ liệu về máy tính của bạn.
  • folk: Folk là thao tác thực hiện sao chép repository của chủ sở hữu khác về git account của mình. sử dụng và đối xử như 1 repository do mình tạo ra.
  • repository: Kho quản lý dữ liệu, là nơi lưu trữ các dữ liệu, mã nguồn của project.
  • tag: sử dụng để đánh dấu một commit khi bạn có quá nhiều commit tới mức không thể kiểm soát được.
  • remote: sử dụng để điều khiển các nhánh từ một repository trên git server, đối xử với các nhánh trên remote tương tự như đối xử với các nhánh trên local
  • diff: So sánh sự sai khác giữa phiên bản hiện tại với phiên bản muốn so sánh, nó sẽ thể hiện các sự khác nhau
  • .gitignore: file mặc định của git sử dụng để loại bỏ (ignore) các thư mục, file mà mình không muốn push lên git server

Lịch sử của GitHub

GitHub được viết bằng Ruby on Rails và Erlang do Tom Preston-Werner, Chris Wanstrath, và PJ Hyett phát triển trang web được đưa ra và chạy chính thức vào tháng 4 năm 2008.

Tính đến thời điểm tháng 3 năm 2018 Github đang là dịch vụ máy chủ lưu trữ các mã nguồn lập trình lớn nhất thế giới. Với hơn 25 triệu người dùng và hơn 80 triệu mã nguồn dự án, Github đã trở thành một phần không thể thiêu đối với cộng đồng phát triển mã nguồn mở và cộng đồng lập trình viên trên toàn thế giới.

Lợi ích của Github đối với lập trình viên

Quản lý source code dễ dàng

Khi bạn tạo một repo, toàn bộ source code của repo đó được lưu trên GitHub. Tại đây, bạn có thể coi lại quá trình mình đã làm việc thông qua các comment sau mỗi lần commit. Và cái hay ở đây, là nhiều người có thể cùng làm một repo.

Lợi ích đầu tiên, chính là bạn biết được ai đã commit và commit cái gì. Tiếp theo, source của bạn có thể phát triển theo nhiều nhánh. Nguyên tắc làm việc với các nhánh như thế này: Bạn có thể rẽ nhiều nhánh để phát triển project. Nhưng cuối cùng, bạn phải merge lại vào nhánh MASTER để ra được project hoàn chỉnh.

Tham khảo việc làm GIT lương cao tại TopDev

Tracking sự thay đổi qua các version

Khi có nhiều member cùng thực hiện một dự án thì khá là phức tạp để theo dõi revisons – ai thay đổi cái gì, lúc nào và mấy cái files đó được stored ở đâu. Đừng lo vì GitHub đã tính đến chuyện này giúp bạn, bằng cách luôn lưu lại những thay đổi bạn đã push lên repository. Cũng tương tự với Microsoft Word hay Google Drive, bạn có một lịch sử phiên bản để phòng trường hợp các phiên bản trước đó bị mất hay không được lưu.

Markdown

Markdown là một cách định dạng text trên web. Bạn có thể chỉnh sửa cách hiển thị của document, format từ như định dạng in đậm hay in nghiêng, thêm hình và tạo list những thứ bạn có thể làm với Markdown. Hầu hết, Markdown chỉ là đoạn text đơn thuần với những ký tự đặc biệt chèn vào, như # hay *. Trong GitHub thì bạn có thể sử dụng Mardown ở những nơi: Git, Comments tại Issues và Pull Requests, các file có đuôi .md hay .markdown extension.

Xem thêm huớng dẫn của Markdown

Github giúp chứng tỏ bạn là ai

Chẳng thể phủ nhận những lời hay ý đẹp bạn viết trong CV là cần thiết. Nhưng Source code luôn là minh chứng tốt nhất để thể hiện bạn là developer thực thụ. Có thể nói, 1 phần GitHub “nho nhỏ” trong CV có thể đánh bóng vị trí của bạn, nổi bật hơn những ứng cử viên khác. Đối với nhà tuyển dụng, GitHub cũng giống như một chiếc máy liar-detech – phân biệt real developer với những kẻ “faker”.

Hãy đầu tư cho mình một tài khoản Github thật ấn tượng và đưa đường dẫn vào trong CV, chẳng nhà tuyển dụng nào lại dại dột mà bỏ qua bạn đâu.

Có rất nhiều công ty lớn trên thế giới xem đây là một yêu cầu trong quy trình tuyển dụng của họ. Nếu bạn có nhiều đóng góp cho cộng đồng hoặc có nhiều sản phẩm trên Github, sẽ là một lợi thế rất lớn so với các ứng viên khác. Vì bằng cách đăng tải các project của mình lên đây, bạn đã tạo cho mình một profile cá nhân vô cùng đáng tin cậy.

Vì khi nhìn vào đó, nhà tuyển dụng sẽ biết được ngay thế mạnh của bạn là gì, và khả năng coding của bạn thế nào.

Github giúp cải thiện kỹ năng code, thậm chí là tracking bug

Có hàng ngàn hàng vạn cách để học, học trên Github sẽ là một ý kiến không tồi trong thời đại này. Với hàng vạn open source projects, hàng trăm ngàn contributors, hàng tỉ commit mỗi ngày thì chỉ bằng việc xem. So sánh, học tập từ những thay đổi đó đã đem lại cho bạn hàng tá điều hay để cải thiện kỹ năng code của bản thân mình.

“Bug tracking” là một tính năng được GitHub tích hợp vào để đơn giản hóa quá trình “tìm và diệt bọ”. Để hiểu được quy trình thì những gì bạn cần làm là mở dashboard của từng project lên và filter các thông tin. Sau đó, các câu hỏi sẽ được hệ thống, sắp xếp theo mức độ phổ biến, thời gian update hay tương tại. Phần mềm này cũng có giao diện khá mượt nên luôn được xếp hạng cao trong cộng đồng IT dev.

Github là một kho tài nguyên tuyệt vời

Với chức năng Explore, bạn có thể theo dõi, tìm kiếm những open source projects theo đúng technology pattern mà bạn ưa thích. Github hỗ trợ code search không kể nó ở dưới dạng một project riêng biệt hay là website. Ngoài ra, nền tảng này cũng có SEO khá tốt nên người dùng có thể tìm kiếm bất kỳ code string nào được chia sẻ public.

Github Action

Trên server của Github có những workflow scripts chạy tự động. Dev có thể dùng chúng để phản hồi các events trên repositories hoặc thực hiện vài action. Ví dụ như tôi có viết một cái tiện ích nho nhỏ, Autotagger – GitHub Marketplace, sẽ tự động tạo git tafs khi mà số phiên bản của package.json thay đổi. Nhìn thì đây chỉ là hành động nhỏ nhưng sẽ có tác động rất lớn khi phải truy tìm code ngược về bản phát hành, và bớt đi một cơn “nhức đầu” cho các project maintainers đó chứ.

GitHub là gì? Những lợi ích GitHub mang lại cho lập trình viên

Github Package Registry

Cái package registry này cho phép lập trình viên duy trì distribution registries của họ, bao gồm npm, docker, maven, nuget và Ruby gems.

GitHub là gì? Những lợi ích GitHub mang lại cho lập trình viên

Đừng ngần ngại mà không tạo ngay cho mình một tài khoản Github. Tạo những project của riêng mình và chia sẻ với mọi người, hoặc bạn có thể thoải mái fork một project của một open source nào đó. Tạo pull request hoặc issues nếu như tìm được lỗi, cần support.

Mở rộng mối quan hệ

  • Gặp gỡ những dev mới: Vài ngàn developer toàn cầu đang tham gia mạng lưới rộng lớn của GitHub để chia sẻ kinh nghiệm của họ cũng như những ý tưởng rất đỉnh.
  • Chia sẻ kinh nghiệm bản thân: Git cho phép user share code, text fragments hay bất kỳ thông tin nào với các dev khác. Do đó bạn có thể dùng nó để trao đổi text, hay gists work như git repositories, từ đó tách ra và update các phiên bản đó.

Bắt đầu sử dụng GitHub

Dưới đây là các bước cơ bản để bắt đầu sử dụng GitHub:

  • Bước 1: Tạo tài khoản GitHub Truy cập GitHub và đăng ký tài khoản miễn phí.
  • Bước 2: Tạo một kho lưu trữ (Repository) mới Kho lưu trữ là nơi bạn lưu trữ mã nguồn và các tệp liên quan đến dự án của mình. Để tạo kho lưu trữ mới:
    • Nhấp vào biểu tượng dấu cộng (+) ở góc trên bên phải và chọn “New repository”.
    • Điền thông tin cần thiết như tên, mô tả và thiết lập quyền riêng tư (công khai hoặc riêng tư).

Bắt đầu sử dụng GitHub

    • Bước 3: Bạn cần cài đặt Git trên máy tính để có thể tương tác với GitHub từ dòng lệnh. Tải Git từ Git downloads và cài đặt
  • Bước 4: Kết nối Git với GitHub Mở terminal hoặc command prompt và cấu hình Git với thông tin tài khoản GitHub của bạn:
git config --global user.name "Your GitHub Username" git config --global user.email "Your GitHub Email"
  • Bước 5: Khởi tạo kho lưu trữ Git trên máy tính của bạn Điều hướng đến thư mục dự án của bạn và khởi tạo kho lưu trữ Git bằng cách chạy
git init
  • Bước 6: Thêm mã nguồn vào kho lưu trữ Thêm các tệp của bạn vào kho lưu trữ bằng cách chạy:
git add .
  • Bước 7: Commit mã nguồn của bạn Tạo một commit để lưu trạng thái mã nguồn của bạn:
git commit -m "First commit"
  • Bước 8: Kết nối kho lưu trữ cục bộ với GitHub Kết nối kho lưu trữ trên máy tính với kho lưu trữ GitHub của bạn:
git remote add origin https://github.com/username/repository-name.git git push -u origin master
  • Bước 9: Sử dụng GitHub Desktop (Tùy chọn) Nếu bạn không thích làm việc với dòng lệnh, GitHub Desktop là một ứng dụng giao diện người dùng dễ sử dụng. Tải và cài đặt GitHub Desktop từ GitHub Desktop.
  • Bước 10: Tạo và quản lý các nhánh (Branches) Nhánh giúp bạn làm việc trên các tính năng hoặc bản sửa lỗi mới mà không ảnh hưởng đến mã nguồn chính. Để tạo một nhánh mới:
git checkout -b feature-branch
  • Bước 11: Push các thay đổi lên GitHub Sau khi hoàn thành các thay đổi, push lên kho lưu trữ GitHub:
git push origin feature-branch

Qua bài viết của TopDev, hi vọng đã giúp bạn hiểu hơn về GitHub và các tính năng cũng như cách sử dụng GitHub. Chúc bạn có một khởi đầu suôn sẻ với GitHub!

Bài viết liên quan:

Xem ngay tin đăng tuyển lập trình viên đãi ngộ tốt trên TopDev

Tăng tốc lập trình Android với Kotlin

Bài viết được sự cho phép của tác giả Trần Duy Thanh

Kotlin cho Android là một plug-in giúp ta tăng tốc lập trình Android. Vì sự bất tiện của việc truy suất các control trên giao diện nên plug-in Kotlin ra đời. Cộng đồng Kotlin rất mới mẻ, tính tới 12h:00 khuya ngày 19/03/2017 thì có khoảng 600 ngàn lập trình viên và cộng đồng này ngày càng tăng chóng mặt. Và các công ty hiện nay cũng bắt đầu tuyển dụng lập trình viên Android với Kotlin.

Tăng tốc lập trình Android với Kotlin

Kotlin là một ngôn ngữ lập trình, Tui sẽ có những bài học riêng về ngôn ngữ này để áp dụng cho lập trình Android với Kotlin để tăng tốc lập trình. Tuy nhiên trong bài học này Tui chỉ hướng dẫn cách nhanh nhất để đưa plug-in tuyệt vời này vào ứng dụng Android.

Những ai lập trình android thường chán ngán với hàm findViewById để truy suất tới các control trên giao diện, hoặc là phải sử dụng Data Binding để mapping model-view. Kotlin giúp ta cách dễ nhất để có thể tương tác trực tiếp tới các Id của các Control trên giao diện (tương tự như C# mà ta lập trình trong Visual Studio)

  5 điều lập trình viên Java Developer chắc chắn sẽ thích ở Kotlin
  Java đang ngăn cản sự phát triển của Android và Kotlin không phải là cách giải quyết
  • Đầu tiên ta tạo một Project Android trong Android Studio với tên “ThuKotlin” (thử học Kotlin) và thiết kế màn hình tương tự dưới đây:

Tăng tốc lập trình Android với Kotlin

Giao diện trên có 2 EditText (để nhập số a và số b), nút Button Tính để cộng 2 số a, b nhập từ giao diện.

  • Tiếp theo ta tiến hành cài Plug-in Kotlin: Vào menu File/chọn Setting:

Tăng tốc lập trình Android với Kotlin

  • Sau khi chọn Settings…==>chọn Plug-in:

Tăng tốc lập trình Android với Kotlin

  • Sau đó chọn Browse respositories ở màn hình trên, ta tiến hành tìm kiếm kotlin:

Tăng tốc lập trình Android với Kotlin

Ta chọn đúng Kotlin như màn hình Tui chụp ở trên rồi bấm vào nút Install, ta chờ hơi lâu 1 tí nha, chờ tới khi nào nó tải xong thì thôi:

Tăng tốc lập trình Android với Kotlin

Sau khi tải plugin Kotlin xong thì ta cần khởi động lại Android Studio:

Tăng tốc lập trình Android với Kotlin

Sau khi khởi động xong ta vào menu Tools/ chọn Kotlin/ chọn configure Kotlin in Project:

Tăng tốc lập trình Android với Kotlin

Sau Khi chọn Configure Kotlin In Project, ta có màn hình sau:

Tăng tốc lập trình Android với Kotlin

Ở màn hình trên ta chọn “Android with Gradle

Lúc này Android Studio sẽ hiển thị cửa sổ để chọn Version Kotlin:

Tăng tốc lập trình Android với Kotlin

Mặc định ta thấy là 1.0.7, ta bấm vào để chọn 1.1.1 (Nếu không thấy thì cứ để mặc định 1.0.7 có gì ta sửa sau)

Ta chọn cấu hình xong thì bấm nút OK, kết quả tập tin cấu hình build.gradle trong Project level:

Tăng tốc lập trình Android với Kotlin

Ở trên ta thấy ext.kotlin_version là 1.0.7==>ta cần đổi thành 1.1.1

Ta bổ sung thêm:

classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"

cuối cùng build.gradle trong Project level ta có như sau:

Tăng tốc lập trình Android với Kotlin

Tiếp tục vào build.gradle trong Module level:

Tăng tốc lập trình Android với Kotlin

Ta bổ sung thêm:

apply plugin: 'kotlin-android-extensions'

Cuối cùng ta có build.gradle trong Module level:

Tăng tốc lập trình Android với Kotlin

Sau cùng bấm vào nút Sync Now:

Tăng tốc lập trình Android với Kotlin

Bước cuối cùng ta sẽ chuyển MainActivity (coding java) thành MainActivity (coding kotlin ) bằng cách vào menu Code/ chọn Convert Java file to Kotlin File:

Sau khi bấm Convert Java File to Kotlin File, ta chờ chút xíu để chương trình chuyển đổi java class thành kotlin class:

Tăng tốc lập trình Android với Kotlin

Kết quả sau khi chuyển đổi:

Tăng tốc lập trình Android với Kotlin

Bây giờ ta có thể dễ dàng tương tác trực tiếp các control trên giao diện theo ngôn ngữ lập trình Kotlin như sau:

Bạn quan sát đấy, nó truy suất vô cùng dễ dàng, ngắn gọn (dĩ nhiên bạn phải biết lập trình bằng ngôn ngữ Kotlin cho android, Tui sẽ sắp xếp giảng khóa học này cho các bạn sau). Kết quả thực hiện:

Tăng tốc lập trình Android với Kotlin

Giờ muốn thêm một màn hình Activity với Kotlin hay là tạo Class Kotlin thì ta chọn Kotlin Activity hoặc Kotlin File/ Class , Android Studio sẽ tự động chuyển Activity qua dạng kotlink luôn, và phần mở rộng của Kotlin là .tk nhé:

Tải source code ở đây: https://www.mediafire.com/file/l9gg9u9raca75gz/ThuKotlin.rar

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

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

Xem thêm các tuyển dụng lập trình android hấp dẫn tại TopDev

Nói về Serialization trong Java

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

Serialization là một khái niệm giúp chúng ta có thể chuyển đổi trạng thái của một Java object thành một định dạng nào đó để Java object này có thể được lưu trữ ở đâu đó và sau đó, nó sẽ được sử dụng bởi một tiến trình khác.

Thông thường, khi sử dụng Serialization, Java object của chúng ta sẽ được chuyển đổi qua byte streams và chúng ta có thể lưu byte stream này trong bộ nhớ, trên ổ đĩa, truyền qua mạng đến một server nào đó hoặc cũng có thể lưu chúng vào database.

Tìm việc làm Java cho sinh viên mới ra trường

Và khi một tiến trình khác sử dụng một Java object đã được Serialization, nó sẽ chuyển đổi định dạng đã Serialization về trạng thái của Java object ban đầu. Nhờ vậy, tiến trình đó có thể sử dụng lại Java object của chúng ta.

Để cho một object có thể sử dụng Serialization được, chúng ta phải cho object của chúng ta hiện thực một interface với tên gọi là java.io.Serializable. Interface này không có bất kỳ một phương thức nào cần hiện thực cả các bạn ạ!

Để các bạn có thể hiểu rõ hơn, mình sẽ làm một ví dụ để minh chứng những điều mình vừa nói nhé!

Ví dụ ở đây, mình có một đối tượng là Student:

Vì mình muốn sử dụng Serialization nên mình sẽ hiện thực interface Serializable cho đối tượng Student như sau:

Như các bạn thấy, mình đã thêm một biến tên là serialVersionUID trong object Student của mình. Mục đích của biến này là để chắc chắn trước và sau khi chuyển đổi, lớp Student của chúng ta là một đấy các bạn.

OK, bây giờ chúng ta sẽ viết code để chuyển đổi đối tượng Student và lưu byte streams của nó vào một tập tin nào đó xem thử nhé!

  10 Java Web Framework tốt nhất
  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Bây giờ, một tập tin đã được tạo và nếu bạn kiểm tra tập tin mà bạn đã lưu đối tượng Student của chúng ta, bạn sẽ thấy nội dung giống giống như sau:

Vậy làm thế nào để tiến trình khác có thể sử dụng tập tin mình đã tạo trong ví dụ trên để sử dụng, chúng ta viết code tiếp nhé!

Kết quả:

Như bạn thấy trước và sau khi chuyển đổi, đối tượng Student của mình vẫn có những thông tin mà chúng ta đã lưu trước đó.

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

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

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

Băn khoăn ngành lập trình: Lựa chọn nào ở ngưỡng 30?

Một lập trình viên 30 tuổi sẽ có những suy nghĩ gì về tương lai? Những định hướng nào sẽ là sự lựa chọn phù hợp? Đó là những tâm sự chung của nhiều anh em lập trình chạm ngưỡng 30. Dựa vào tình hình thực tế, TopDev sẽ phân tích những lối đi riêng mà dân lập trình lựa chọn. Đó là chặng đường kế tiếp họ sẽ trải qua trên hành trình nghề nghiệp của mình.

Sau 30, có lẽ bạn sẽ nhận ra nhiều điều. Hết hứng thú với việc học và trải nghiệm lập trình? Lập trình dường như trở thành một công việc để nuôi sống bản thân? Vậy sự hứng thú trong nghề nghiệp liệu có tồn tại? Có phải là do sự xáo trộn hay những áp lực còn bủa vây chăng?

lập trình

Trải qua nhiều biến thăng trầm giai đoạn 20 – 30 tuổi, đây là lúc phù hợp nhất để dân lập trình có một định hướng rõ ràng và lâu dài. Tất nhiên, song hành cùng đó, niềm vui công việc rất quan trọng.

Nhiều anh em lập trình họ chọn cách tiếp tục code để phát triển khả năng, nâng cao năng lực của bản thân. Họ chọn đó là công việc mà họ sẽ tiếp tục trải nghiệm. Một người bạn của tôi đã ngoài 40, anh ấy giờ đây xem việc code là một người bạn hằng ngày. Lúc này có lẽ động lực về niềm vui thể hiện rõ và những áp lực không còn quá lớn. 

Lối rẽ từ sự am hiểu chuyên môn lập trình – Hướng đi phổ biến định hình một chuyên gia

Đã đến lúc có một chuyển mình mới cho sự nghiệp. Đó có thể là sự liều lĩnh. Nhưng, sự dấn thân của thời tuổi trẻ đã cho họ lối tư duy, nhận thức sâu sắc; giúp họ đủ khả năng tạo ra những điều mới mẻ hơn. Dựa vào những am hiểu về chuyên môn, họ lựa chọn một phân nhánh nhỏ và tập trung khai thác về nó.

  9 CSS animation mới "mãn nhãn" cho các project

Chẳng hạn khi ở ngưỡng 30, bạn lựa chọn trải nghiệm F&BVới hơn 20 năm kinh nghiệm, bạn có đầy đủ những hiểu biết để đối mặt với sự lựa chọn mới. Không quá khó để bạn thuần thục những công việc; tiếp cận, đào sâu khía cạnh công việc này. Từ lập trình, phần mềm tích điểm cung ứng cho chuỗi hệ thống; việc lắp đặt, xử lý cấu hình,…bạn đều nắm rất rõ.

lập trình

Xem thêm: Lộ trình 10 phút để trở thành một Junior Full Stack Web Developer

Hoặc bạn quyết định sẽ chuyển hướng sang fullstack. Những vấn đề về thống kê biểu đồ; phân tích tính hiệu quả, phán đoán, đưa ra các quyết định mua – bán là chuyện nhỏ đối với bạn.

Điều quan trọng là bạn cần phát huy hết khả năng và áp dụng nó vào đúng mục đích phát triển tiếp theo của mình.

Hãy nhớ, thời gian sau 30 tuổi là lúc bạn sống với những hướng đi mới. Bạn tìm tòi, nghiên cứu, theo dõi sự thay đổi và tạo ra những cái mới xoay quanh lối rẽ về chuyên môn. Đó không còn là một công việc đơn thuần nữa. Vì giờ đây, bạn đang thực hiện công việc của một chuyên gia công nghệ thực thụ. 

Xây dựng thương hiệu lập trình riêng – Khẳng định dấu ấn bản thân

Xem thêm: Mức lương lập trình viên: Bạn xứng đáng mức lương bao nhiêu?

lập trình

Như đã chia sẻ từ trước, anh em lập trình họ đủ sức dẫn đầu về xu thế. Tuy nhiên, một số lại lựa chọn một định hướng khác hơn. Đó là tập trung vào việc tạo nên thương hiệu riêng nhằm khẳng định dấu ấn bản thân mình. Họ quyết định sáng lập ra các công ty, doanh nghiệp – những đứa con tinh thần mà họ ấp ủ, dành nhiều tâm huyết. Nhiều người nghĩ rằng, liệu họ lập công ty vào thời điểm này có quá trễ?

Họ đều là những chiến binh với đầy đủ tố chất, bản lĩnh. Vấn đề chỉ là ở thời gian. Bạn cần hiểu để mở một công ty đòi hòi sự am hiểu về tất cả mọi thứ. Từ cơ cấu vận hành, am hiểu nhiều lĩnh vực khác nhau; marketing, sales, tư vấn doanh nghiệp, xây dựng các hệ thống, theo dõi và hướng dẫn, lãnh đạo đội ngũ, quản lý các chu trình,… họ đều phải nắm bắt và đảm đương tốt. 

Ngoài ra, nếu so về trình độ hiện tại, họ đủ sức đưa ra những lời khuyên phát triển về mặt hệ thống; tầm nhìn chiến lược, cách tổ chức vận hành cho một doanh nghiệp. Họ còn giỏi trong việc kết nối những nhân tố xuất sắc. Điều này góp phần tạo ra một doanh nghiệp với tổng thể toàn diện. Sứ mệnh và sự phát triển chung của tổ chức có thực hiện được hay không là do chính họ cùng những người cộng sự của mình.

Đào tạo và dẫn dắt – Truyền lửa đam mê công nghệ

Nếu không chọn code chuyên nghiệp; thực hiện nghiên cứu như một chuyên gia đầu ngành; theo đuổi mục tiêu phát triển doanh nghiệp, anh em lập trình sau 30 tuổi hoàn toàn có thể lựa chọn con đường này. Đó là đào tạo lĩnh vực giáo dục công nghệ.

lập trình

Tiếp tục học lên cao và trở về chốn giảng đường là lựa chọn của nhiều anh em. Bạn có thể đào tạo, dẫn dắt các bạn sinh viên, những người đang có niềm yêu đến gần hơn với công nghệ. Hoặc các khóa học online – trực tuyến cũng là sự lựa chọn hoàn hảo.

Ngoài ra, bạn có tham gia cộng tác làm diễn giả, khách mời – cố vấn chuyên môn cho các chương trình công nghệ có quy mô lớn, được tổ chức thường niện như Vietnam Mobile Day, Vietnam Web Summit,…

Nhiệm vụ của bạn là truyền tải cho họ các kiến thức nền tảng từ cơ bản đến nâng cao. Chia sẻ với họ về khó khăn, áp lực tồn tại khi họ chấp nhận theo đuổi ngành học này. Tất nhiên, với tư cách là từng trải, bạn sẽ có những lời khuyên chân thành và phù hợp nhất. Đồng thời, cũng tạo ra động lực thúc đẩy đam mê , nhiệt huyết trong chính họ. 

Về phía những người trẻ đang muốn dấn thân vào con đường lập trình, hãy chọn lựa thật thông minh. Cụ thể, một người thầy với bề dày sự trải nghiệm sẽ cho bạn những kiến thức chuyên sâu nhất. Hãy lựa chọn những ngôn ngữ lập trình thuộc lớp “đàn anh” như Java, PHP,… để học. Bạn cần hiểu và tiếp cận với các nguồn tư liệu chuyên sâu ngay từ những nền tảng cơ bản nhất.

Lời kết

Mỗi sự lựa chọn đều có giá trị riêng của nó. Ở ngưỡng 30, mọi anh em lập trình đã có cho mình nhiều trải nghiệm khác nhau. Đây cũng là khoảng thời gian đẹp nhất để bắt đầu chuyển mình thực hiện những mục tiêu mới.  TopDev hi vọng những phân tích từ bài viết đã cho anh em lập cũng như những ai yêu thích ngành lập trình nói riêng có những hình dung chân thật về bức tranh cuộc sống ngành lập trình ở tuổi 30. Mong rằng mọi người sẽ tìm được cho mình một hướng đi đúng đắn và ngày càng thăng tiến hơn trong sự nghiệp.

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

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

Kỹ năng search google cho lập trình viên

Bài viết được sự cho phép của tác giả Tin Tran

Để trở thành một lập trình viên thì không quá khó, nhưng để trở thành một lập trình viên giỏi thì không phải dễ. Lập trình viên giỏi thì sẽ cần nhiều kỹ năng và hơn hết kỹ năng không thể thiếu đó là “search google”. Với lượng kiến thức khổng lồ về lập trình thì không ai có thể nhớ hết được mọi thứ, còn những người mà nhớ được thì họ không phải là người nên tôi không để cập đến ở đây. Vì vậy kỹ năng về tìm kiếm thông tin rất cần thiết nên bài viết này tôi sẽ dựa vào những kiến thức của tôi sẽ bày vẽ cho các bạn những cách tôi thường dùng, tôi không tự nhận mình là một lập trình viên giỏi nên tôi không dám dạy bảo gì cả mà chỉ chia sẻ về nó mà thôi.

1. Vì sao kỹ năng search google lại quan trọng?

Khi code gặp một vấn đề nào đó hoặc bạn quên một cú pháp nào đó thì việc search google đúng từ khóa giúp bạn tìm kiếm nhanh chóng thông tin, tiết kiệm được nhiều thời gian để làm những việc khác. Trường hợp nếu bạn tìm không đúng sẽ dẫn đến việc bạn tiêu tốn hết nhiều thời gian và dẫn đến trễ deadline, khi đi làm việc tuân thủ deadline rất là quan trọng.

2. Nguyên nhân newbie thường không biết cách “search google”

Trên các group IT tôi hay thấy những câu hỏi mà search google một chút là sẽ ra ngay (đứng trên là một người có kinh nghiệm như tôi). Tuy nhiên những người mới lập trình hoặc những bạn mới đi làm thường sẽ không biết cách search google vì các bạn không đủ kiến thức để hiểu vấn đề của mình là gì và nếu search ra đúng chỗ nhưng cũng không biết nó là cái gì, áp dụng vào ra sao.

  Elasticsearch là gì? Tìm hiểu về Elasticsearch

  Instant AJAX Search với Laravel và Vuejs

3. Cách search google mà tôi thường dùng

VD1 : Vào một ngày đẹp trời tôi đang code javascript xử lý một array và tôi muốn xóa một phần tử trong array theo vị trí index trong mảng, nhưng tôi đã quên mất cách làm. Tôi liền mở google và gõ “javascript delete element in array” và google search được hàng ngàn kết quả. Tôi liền nhấn vào link đầu tiên và tìm ra được kết quả mong muốn.

Đọc ví dụ bên trên thấy dễ vler phải không, đúng là rất dễ nhưng chỉ khi mình tìm được từ khóa, tôi sẽ chỉ cho các bạn biết làm sao tôi tìm được từ khóa này. Đầu tiên tôi đang muốn làm gì? Hiện tại tôi đang muốn “xóa phần tử trong một mảng của javascript”. Tôi sẽ cho bạn một cú pháp các bước search như sau.
1. Cú pháp : Tên ngôn ngữ + nội dung
2. Khi đó tôi sẽ có từ khóa như sau : javascript + xóa phần tử trong một mảng.
3. Tiếp theo sẽ đem nội dung lên google dịch ta được : javascript delete element in array. Và đem từ khóa này đi search thôi

VD2 : Tôi đang code java về việc đảo ngược các phần tử trong một list có sẵn. Tôi lên google dịch vào gõ “đảo ngược list” tôi được một chuỗi là “reverse the list” gắn với từ khóa “java” nữa tôi được một chuỗi ” java reverse the list”. Quá dễ phải không nào.

Túm cái váy lại là khi search google thì các bạn nên search theo tiếng anh vì cộng đồng lập trình trên thế giới đều sử dụng tiếng anh là chủ yếu, nếu bạn search theo tiếng việt nhiều khi sẽ không ra kết quả. Và hôm nay tôi cũng xin chúc ai đọc bài viết này năm mới gặp nhiều may mắn. Xin chân thành cám ơn đã quan tâm theo dõi, nếu thấy hay hãy like fanpage ở bên cạnh và share nhé

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

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

Xem ngay những tin đăng tuyển dụng IT mới nhất trên TopDev

DRY không hiệu quả, hãy dùng WET

Bài viết được sự cho phép của tác giả Lưu Bình An

Khi bạn học lập trình bạn sẽ được nghe tới khái niệm DRY (Don’t Repeat Yourself), bạn rất có thể đã vận dụng sai ý nghĩa của nó.

  "Code dễ đọc" là như thế nào?
  "Mẹo bỏ túi" cho dân coder mới vào nghề

Trên wiki: DRY là nguyên tắc bạn đừng viết lặp lại một đoạn code

Bạn: Ok, những phần code bị trùng mình sẽ chuyển thành abstraction

Giải pháp trông có vẻ hiển nhiên đúng, nhưng không, abstraction của bạn thường là sai.

Đây là lý do tại sao:

  1. Bạn thì code bị duplicate
  2. Bạn đưa đoạn duplicate ra thành một abstract (method, class)
  3. Bạn thay thể toàn bộ phần duplicate bằng abstraction mới
  4. Bạn nghĩ code đã hoàn hảo
  5. Thời gian trôi đi
  6. PM đưa thêm các yêu cầu mới.
  7. Bạn bắt đầu hiện thực các yêu cầu mới
  8. Với yêu cầu mới này, bạn phải chỉnh sửa vài đoạn trong abstraction, if...else các kiểu, đổi parameter, abstraction của chúng ta có thể đưa ra những action khác nhau theo những điều kiện khác nhau
  9. Giờ abstraction của trọng sẽ cho ra những kết quả khác nhau trên những case khác nhau
  10. Yêu cầu mới lại đến, thêm parameter tiếp, thêm câu điều kiện tiếp
  11. Và giờ đây đoạn code của bạn không còn dễ maintain, nói thẳng ra là một đống hầm bà lằng khó nuốt
  12. Chúc mừng, bạn đã bị over engineer và gây ra một abstract quá đỗi phức tạp

Vậy thì sao? Hãy thử WET (Write everything twice)

WET

Như cách chơi chữ đã thể hiện, nó là trường phái đối nghịch hoàn toàn với DRY, khi bắt đầu viết code, bạn sẽ không thể nào lường trước được mọi yêu cầu, mọi tính năng. Vì thế đừng vội vàng áp dụng abstraction

Bạn hãy nhớ

Cái giả phải trả cho duplicate vẫn rẻ hơn nhiều cho một abstract viết sai

Ví dụ bạn viết một ứng dụng, bạn dựng ra một component tên Button để sử dụng nhiều nơi, nghe rất hợp lý. Một yêu cầu mới xuất hiện, ở trang landing page họ muốn có một nút bấm rất fancy và không giống với tất cả những nút bấm trước đây.

Ok, thay đổi cũng nhỏ thôi, chỉ cần thêm tí điều kiện if..else, 90% phần code là của Button và 10% code là của FancyButton

Sự thật đáng buồn là sẽ có rất nhiều những thay đổi như thế xuất hiện và khả năng rất cao là bạn không đủ kinh nghiệm để có hiện thực những abstraction đủ dễ hiểu, dễ maintain.

Lời khuyên? Copy copy code đó ra, đừng ngần ngại

Bạn thấy quan điểm của mình bậy quá bậy!, bạn có thể tham khảo thêm quan điểm của Dan Abramov

The WET Codebase

In this talk, my aim was to show why strict adherence to writing code that is free of duplication inevitably leads to software we can’t understand

Tạm dịch, tuân thủ nghiêm ngặc quy tắc DRY sẽ dẫn đến một phần mềm mà chúng ta không hiểu nổi nó.

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

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

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

Tại sao Test Coverage là một phần quan trọng của Kiểm thử phần mềm?

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

Test coverage là một chỉ số quan trọng trong kiểm thử phần mềm về chất lượng và hiệu quả. Bài viết này chúng ta sẽ tìm hiểu khái niệm test coverage, kỹ thuật, số liệu và cách cải thiện nó.

Thế giới đã chứng kiến ​​một số sự kiện thảm khốc do các lỗi phổ biến trong phần mềm. Một sự kiện như vậy, mà cá nhân tôi nhớ lại, là việc khai trương Heathrow Terminal 5, Vương quốc Anh vào năm 2008.

Các kỹ sư đã khá tự tin về hoạt động của hệ thống xử lý hành lý của khách hàng do đã trải qua quá trình kiểm thử nghiêm ngặt . Tuy vậy hệ thống xử lý hành lý không thể đối phó khi đối mặt với một số tình huống thực tế; dẫn đến việc tắt hoàn toàn hệ thống. Trong 10 ngày sau đó, khoảng 42.000 hành lý không thể đi cùng chủ sở hữu và hơn 500 chuyến bay đã bị hủy.

Tất cả điều này là do các kỹ sư không thực hiện được phạm vi thử nghiệm của các tình huống có thể xảy ra trong thực tế.

Trong bài viết này, chúng ta sẽ thảo luận về tất cả các khía cạnh của test coverage – phạm vi kiểm thử,  và cách nó ảnh hưởng trực tiếp đến việc sản xuất, cho dù đó là phát triển phần mềm tùy chỉnh hoặc kiểm thử phần mềm.

Tuyển Tester làm việc online

Test Coverage là gì?

Test coverage được định nghĩa là một kỹ thuật xác định xem các trường hợp thử nghiệm có thực sự bao trùm mã ứng dụng hay không và bao nhiêu mã được thực hiện khi chạy các trường hợp thử nghiệm đó.

Nếu có 10 yêu cầu và 100 thử nghiệm được tạo và nếu 90 thử nghiệm được thực hiện thì phạm vi thử nghiệm là 90%. Bây giờ, dựa trên số liệu này, người kiểm tra có thể tạo các trường hợp kiểm tra bổ sung cho các kiểm tra còn lại. Dưới đây là một số lợi thế của test coverage.

  • Bạn có thể xác định các lỗ hổng trong yêu cầu, trường hợp kiểm tra và lỗi ở cấp độ sớm và cấp mã.
  • Bạn có thể ngăn ngừa rò rỉ lỗi không mong muốn bằng cách sử dụng phân tích test coverage.
  • Test coverage cũng giúp kiểm tra hồi quy, ưu tiên trường hợp kiểm thử, tăng cường bộ kiểm thử và tối thiểu hóa bộ kiểm thử.
  Cách Engineer Nhật Bản thực hiện test như thế nào
  Biện hộ: Vì sao các Developer không test phần mềm của họ?

Các kỹ thuật Test Coverage

Statement Coverage

Statement Coverage đảm bảo rằng tất cả các dòng lệnh trong mã nguồn đã được kiểm tra ít nhất một lần. Nó cung cấp các chi tiết của cả hai khối mã được thực thi và thất bại trong tổng số các khối mã.

Hãy để hiểu nó với ví dụ về sơ đồ sau. Trong ví dụ đã cho, đường dẫn 1A-2C-3D-E-4G-5H này bao gồm tất cả các câu lệnh và do đó nó chỉ yêu cầu trên một trường hợp thử nghiệm để đáp ứng tất cả các yêu cầu. Một trường hợp thử nghiệm có nghĩa là một Statement Coverage.

Tại sao Test Coverage là một phần quan trọng của Kiểm thử phần mềm?

Trong mã nguồn phức tạp, một đường dẫn không đủ để bao gồm tất cả các câu lệnh. Trong trường hợp đó, bạn cần viết nhiều trường hợp kiểm tra để bao quát tất cả các câu lệnh.

Ưu điểm:

  • Nó có thể được áp dụng trực tiếp vào mã đối tượng và không yêu cầu xử lý mã nguồn.
  • Nó xác minh những gì mã nguồn viết được dự kiến ​​sẽ thực thi và không thực thi

Nhược điểm:

  • Nó chỉ bao gồm các điều kiện “true” của mã nguồn.
  • Statement Coverage hoàn toàn không quan tâm với các toán tử logic (|| và &&)

Decision/Branch coverage

Các nhà phát triển không thể viết mã trong một chế độ liên tục, tại bất kỳ điểm nào họ cần phân nhánh mã để đáp ứng các yêu cầu chức năng. Sự phân nhánh trong mã thực sự là một bước nhảy từ điểm quyết định này sang điểm khác. Branch coverage kiểm tra mọi đường dẫn có thể hoặc chi nhánh trong mã được kiểm thử.

Branch coverage có thể được tính bằng cách tìm số đường dẫn tối thiểu để đảm bảo rằng tất cả các cạnh đã được che phủ. Trong ví dụ đã cho, không có đường dẫn duy nhất đảm bảo vùng phủ sóng của tất cả các cạnh cùng một lúc.

Ví dụ: nếu bạn đi theo đường dẫn 1A-2C-3D-E-4G-5H này bao gồm số cạnh tối đa (A, C, D, E, G và H), bạn vẫn sẽ bỏ lỡ hai cạnh B và F. Bạn cần đi theo một đường dẫn khác 1A-2B-E-4F để che hai cạnh còn lại. Bằng cách kết hợp hai con đường trên, bạn có thể đảm bảo đi qua tất cả các con đường. Đối với ví dụ này, phạm vi kiểm thử chi nhánh của chúng tôi là 2 vì chúng tôi đang theo hai đường dẫn và nó yêu cầu hai trường hợp thử nghiệm để đáp ứng các yêu cầu.

Ưu điểm:

  • Nó bao gồm cả các điều kiện đúng và sai không có khả năng được gọi trong statement coverage.
  • Nó đảm bảo tất cả các nhánh được kiểm thử.

Nhược điểm:

Nó bỏ qua các nhánh trong các biểu thức Boolean xảy ra do các toán tử ngắn mạch.

Path Coverage

Path Coverage là một phương pháp kiểm tra cấu trúc liên quan đến việc sử dụng mã nguồn của chương trình để tìm mọi đường dẫn thực thi có thể.

Path Coverage đảm bảo phạm vi của tất cả các đường dẫn từ đầu đến cuối. Trong ví dụ này, có bốn đường dẫn có thể kiểm thử:

  1. 1A-2B-E-4F
  2. 1A-2B-E-4G-5H
  3. 1A-2C-3D-E-4G-5H
  4. 1A-2C-3D-E-4F

Tại sao Test Coverage là một phần quan trọng của Kiểm thử phần mềm?

Ưu điểm:

  • Nó giúp giảm các test thừa.
  • Cung cấp phạm vi kiểm tra cao vì nó bao gồm tất cả các câu lệnh và các nhánh trong mã.

Nhược điểm:

  • Đánh giá mỗi đường dẫn là một thách thức cũng như tốn thời gian vì một số đường dẫn theo cấp số nhân của số nhánh. Ví dụ, một hàm chứa 10 câu lệnh if có 1024 đường dẫn để kiểm tra.
  • Đôi khi nhiều đường dẫn không thể thực hiện do mối quan hệ của dữ liệu.

Condition Coverage

Condition Coverage sẽ kiểm tra phạm vi điều kiện nếu cả hai kết quả (có nghĩa là “true” hay “fail”) của mọi điều kiện đã được thực hiện. Kết quả của điểm quyết định chỉ liên quan để kiểm tra các điều kiện. Nó đòi hỏi hai trường hợp thử nghiệm cho mỗi điều kiện cho hai kết quả.

Số liệu Test Coverage là gì?

Số liệu test coverage đo lường nỗ lực kiểm thử và giúp trả lời câu hỏi “Bao nhiêu phần của ứng dụng đã được kiểm thử? Số liệu test coverage có thể được chia thành ba phần: số liệu cấp mã, số liệu kiểm tra tính năng và số liệu cấp độ ứng dụng.

Có nhiều công thức khác nhau để tính toán các kết quả này và tạo báo cáo mức độ bao phủ kiểm thử.

Số liệu cấp mã

Tỷ lệ phần trăm testcase được thực hiện

Nó cũng được gọi là các bài kiểm thử được thực hiện được tính bằng tỷ lệ phần trăm của các testcase được thực hiện / thực hiện trong tổng số các testcase.

Tại sao Test Coverage là một phần quan trọng của Kiểm thử phần mềm?

Ưu điểm là bạn có được cái nhìn tổng quan về tiến trình kiểm thử bằng cách đếm số lần testcase đã pass và fail.

Nhược điểm là việc đếm các testcase pass không liên quan đến chất lượng của các testcase đó. Ví dụ, một số testcase có thể pass vì nó kiểm tra điều kiện đơn giản hoặc một số lỗi trong mã của testcase đó dẫn đến testcase đó không hoạt động đúng theo yêu cầu.

Số liệu kiểm tra tính năng

Độ bao phủ yêu cầu

Độ bao phủ yêu cầu được sử dụng để xác định các trường hợp kiểm thử bao gồm các yêu cầu phần mềm được xử lý tốt như thế nào. Đối với điều đó, bạn chỉ cần chia số lượng yêu cầu được bao phủ trên tổng số yêu cầu trong phạm vi cho một sprint, phát hành hoặc dự án.

Tại sao Test Coverage là một phần quan trọng của Kiểm thử phần mềm?

Các trường hợp kiểm thử theo yêu cầu

Số liệu này được sử dụng để xem những tính năng nào đang được kiểm thử và số lượng kiểm thử phù hợp với yêu cầu. Hầu hết các yêu cầu chứa nhiều trường hợp kiểm thử. Điều rất quan trọng là phải biết trường hợp kiểm thử nào bị lỗi đối với một yêu cầu cụ thể để viết lại các trường hợp kiểm thử cho các yêu cầu cụ thể khác.

Tại sao Test Coverage là một phần quan trọng của Kiểm thử phần mềm?

Số liệu này rất quan trọng đối với các bên liên quan vì nó cho thấy tiến trình phát triển ứng dụng / phần mềm.

Số liệu cấp ứng dụng

Mật độ khiếm khuyết

Mật độ khiếm khuyết là thước đo tổng số khiếm khuyết đã biết chia cho kích thước của thực thể phần mềm được đo.

Tại sao Test Coverage là một phần quan trọng của Kiểm thử phần mềm?

Nó được sử dụng để xác định các khu vực cần tự động hóa. Nếu mật độ khiếm khuyết cao cho các chức năng cụ thể hơn nó yêu cầu kiểm tra lại. Để giảm các nỗ lực kiểm tra lại, các trường hợp kiểm tra các lỗi đã biết có thể được tự động hóa.

Điều quan trọng là phải xem xét mức độ ưu tiên của khiếm khuyết (thấp hoặc cao) trong khi đánh giá các khiếm khuyết.

Ví dụ, nhiều khiếm khuyết ưu tiên thấp có thể vượt qua vì các tiêu chí chấp nhận đã được thỏa mãn. Mặt khác, chỉ có một khuyết điểm ưu tiên cao có thể ngăn cản các tiêu chí chấp nhận được thỏa mãn.

Các yêu cầu bên ngoài Test Coverage

Sau khi tính toán phạm vi yêu cầu, bạn sẽ tìm thấy một số yêu cầu không được bao phủ. Bây giờ, điều quan trọng là phải biết về từng yêu cầu chưa được đề cập và giai đoạn yêu cầu là gì.

Tại sao Test Coverage là một phần quan trọng của Kiểm thử phần mềm?

Số liệu này giúp kiểm tra các kỹ sư và nhà phát triển để xác định và loại bỏ các yêu cầu chưa được khám phá khỏi tổng số yêu cầu trước khi họ gửi chúng đến giai đoạn sản xuất.

Làm thế nào để cải thiện Test Coverage?

Xóa mã “chết”

Test coverage có thể hiểu là tỷ lệ số dòng mã được bao phủ  trên tổng số mã trong ứng dụng (cover_code / total_code). Bạn có thể tăng phạm vi test coverage bằng cách giảm mẫu số là tổng mã. Điều này có thể được thực hiện bằng cách xóa mã chết hoặc những đoạn mã thừa. Thông thường, mã “chết” có thể được tìm thấy trong lịch sử phát triển chương trình khi các tính năng đã được thay đổi. Bằng cách này, bạn có thể tăng tổng tỷ lệ bao phủ mã của mình mà không cần viết bất kỳ testcase bổ sung nào.

Mã “chết” có thể được tìm thấy dễ dàng bằng cách kiểm tra thủ công hoặc sử dụng các công cụ tự động hóa. Trước khi loại bỏ mã “chết”, bạn cần thực hiện kiểm tra chức năng và đảm bảo nó thực hiện chính xác theo yêu cầu. Bạn cũng có thể sử dụng các công cụ phân tích để xác định mã “chết” không sử dụng trong mã nguồn.

Xoá các đoạn mã trùng lặp

Xóa mã trùng lặp có thể cải thiện tỷ lệ test coverage theo cách tương tự như xóa mã “chết”.

Kết luận

Các nhà phát triển ngày nay có hệ thống hơn và các tổ chức tìm kiếm các biện pháp kiểm tra tính đầy đủ và hiệu quả để hiển thị các tiêu chí hoàn thành kiểm thử. Trong đó, test coverage được coi là đặc biệt có giá trị. Dựa vào tỉ lệ test coverage giúp chúng ta giảm thiểu rủi ro tối đa trong phát triển phần mềm.

Xem thêm tuyển dụng tester hồ chí minh, đà nẵng, hà nội mới nhất tại TopDev

Bài viết gốc đăng tải tại Tạp chí Lập trình

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

Những điều bạn cần biết về mô hình CI/CD với CircleCI

Bài viết được sự cho phép của tác giả: Vũ Công Tấn Tài

Đợt tháng 3 vừa rồi, mình có lên kế hoạch tổ chức một buổi seminar nho nhỏ để chia sẻ với các bạn sinh viên về mô hình tích hợp liên tục (continuous integration), gọi một cách ngắn gọn là mô hình CI/CD trong phát triển và triển khai phần mềm. Rất không may là đợt rồi xảy ra dịch Covid-19, khiến các kế hoạch bị hủy bỏ.

Vì không thể tổ chức seminar nên mình đành để tài liệu ở đây và trình bày ngắn gọn nội dung trong bài post này. Hi vọng có thể chia sẻ với mọi người chút kiến thức hữu ích.

  Mô hình 3 lớp (three-layer) có gì hay?
  So sánh 4 mô hình truyền thông trong hệ thống IoT

Hình thức và tóm tắt nội dung

Ban đầu, mình định tổ chức buổi chia sẻ dạng trình chiếu và tương tác, do đó tài liệu mình soạn ra ở dạng file trình bày (slide). Phần nội dung slide trình bày được để ở mục dưới, trong phần này mình sẽ tóm tắt một vài ý chính trong bài.

Một số ý chính của nội dung chia sẻ:

  • Lý do ra đời của hệ thống tích hợp liên tục: không phải ngẫu nhiên mà người ta nghĩ ra trò CI/CD trong phát triển phần mềm, cái gì cũng có lí do của nó cả.
  • Mô hình hoạt động của một hệ thống CI/CD: khi biết mình gặp vấn đề gì rồi, người ta sẽ nghĩ ra một cách thức nào đó để giải quyết nó, mô hình CI/CD là một trong số đó. Phần này mình cũng đề cập tới một vài lợi ích và sự đánh đổi khi theo đuổi mô hình này.
  • Triển khai CI/CD với CircleCI: Khi đã nghĩ ra được mô hình giải quyết, người ta phải tạo ra công cụ để thực hiện điều đó, và người ta đã tạo ra CircleCI. Lưu ý là: CircleCI chỉ là 1 công cụ để thực hiện mô hình CI/CD, ngoài ra còn nhiều công cụ khác lắm: Jenkins, JavisCI, …
  • Hướng dẫn và demo triển khai CI với CircleCI

Mình có để link mã nguồn demo CircleCI ở cuối bài, các bạn có thể tham khảo.

Mình hay sử dụng CI/CD trong trường hợp nào

Triển khai liên tục (CD: continuous deployment) là một vấn đề khó, hoặc rất khó. Nó không chỉ liên quan tới cách setup hệ thống, mà còn có thể liên quan tới khách hàng sử dụng, dữ liệu người dùng, downtime khi update, … Vậy nên trong hầu hết trường hợp, mình chỉ sử dụng tích hợp liên tục (CI).

Một số trường hợp có thể dùng CI:

  • Cài đặt các hệ thống kiểm tra coding standards (kiểm tra lint, style, khi làm việc đội nhóm.
  • Thực thi automation test (unit test, configuration test, e2e test, …) mỗi khi source code có sự thay đổi.
  • Đóng gói phần mềm (build file apk, file cài đặt, …)

Nội dung file trình bày

Đây là slide nội dung chính về mô hình CI/CD và các khái niệm cơ bản khi triển khai với CircleCI:

Mã nguồn demo:

  • Chạy CI kiểm tra định dạng mã nguồn với Eslint và Unit test với Jest mỗi khi có sự thay đổi source code: CircleCI experimental project.
  • Chạy CI thực thi unit test với PHPUnit cho project: PHPUnit experiment.

Nếu các bạn thấy hữu ích, đừng ngại ngần mà nhấn sao (Star) trên github cho mình nhé.

Cảm ơn các bạn.

Bài viết gốc đăng tải tại Những dòng code vui

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

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

React Bind Pattern: 5 cách chỉ định tham chiếu this

Bài viết được sự cho phép của tác giả: Lưu Bình An

Để thay đổi ngữ cảnh của chữ this trong javascript, sử dụng ở đâu và như thế nào cho hợp lý nhất
  3 bước tối ưu hiệu năng React App bằng các API mới của React
  5 sai lầm thường thấy khi viết react component

Sử dụng React.createClass

Nếu sử dụng React.createClass react tự động bind toàn bộ từ khóa this

const Contacts = React.createClass({
  render() {
    return (
      <div onClick={this.handChange} />
    );
  }
});

Tuy nhiên từ khi ES6 có hỗ trợ class, React.createClass có thể bị tách ra các release trong tương lai.

Bind trong lúc render

Nếu khai báo một component React bằng cách extends React.Componentthis sẽ không được tự động bind như đã nói ở trên

class Contacts extends React.Component{
  render() {
    return (
      <div onClick={this.handChange.bind(this)}/>
    );
  }
};

Cách này tuy là sạch sẽ gọn ràng dễ hiểu, tuy nhiên lại ảnh hưởng nhiều tới performance vì mỗi function sẽ reallocated lúc render. Kinh nghiệm không bind bằng cách này

Sử dụng Arrow function

Tương tự như cách trên, sử dụng arrow function để không thay đổi giá trị của this lúc render

class Contacts extends React.Component{
  render() {
    return (
      <div onClick={e => this.handChange} />
    );
  }
};

Cách này cũng không nên làm vì ảnh hưởng tới performance luôn

Bind trong cunstructor

constructor(props) {
    super(props);
    this.handleChange = this.handleChange.bind(this);
}

Đây là cách được khuyến cáo sử dụng, nếu thật sự quan tâm tới performance thì nên sử dụng cách này khi muốn bind từ khóa this.

Sử dụng Arrow Function trong thuộc tính của class

Muốn sử dụng cách này, phải bật tính năng transform-class-properties trong Babel, xem thêm package này tại http://babeljs.io/docs/plugins/transform-class-properties

handleChange = () => {
  // call this function from render 
  // and this.whatever in here works fine.
};

Đây cũng là cách mà mình thường sử dụng nhất vì vừa sạch vừa tốt cho performance

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

Có thể bạn quan tâm: React Pattern: Tập trung PropTypes

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

Chia sẻ kinh nghiệm khi chuẩn bị ra trường, xin việc và phỏng vấn (Phần 1)

Bài viết được sự cho phép của tác giả Nguyễn Trương Trung Tín

Bài post đầu tiên của blog, mình muốn chia sẻ với các bạn chút ít kinh nghiệm của mình về những vấn đề xoay quanh việc chuẩn bị ra trường, xin việc và phỏng vấn. Thật ra mình cũng chưa ra trường nhưng cũng đã từng đi phỏng vấn được 3 lần (pass 2 lần) và bên cạnh đó cũng tham khảo được ít kinh nghiệm từ các anh đi trước về việc viết CV, về việc chuẩn bị cho những buổi phỏng vấn,… Nên mình mong bài post này sẽ có ích cho các bạn đang chuẩn bị đi xin việc lần đầu.

Chuẩn bị cá nhân:

Chọn công việc và công ty: Theo cá nhân của mình thì bước chuẩn bị này rất quan trọng. Đầu tiên bạn phải xác định được chính xác công việc mà bạn muốn làm, đừng thấy bạn bè hay chạy theo công việc này công việc kia mà ham. Sẽ rất mau chán về sau khi bạn làm lâu dài và đương nhiên bạn sẽ không đầu tư được tốt hơn so với công việc mà bạn thích. Còn về việc chọn cty mình có biết được 1 bài blog này cũng khá hay về việc đó nên mình share link cho các bạn luôn cho nhanh.(Chọn công việc, chọn công ty – Binhtvt)

Chuẩn bị kiến thức: Từ công việc mà bạn đã xác định muốn làm ở trên bạn hãy chuẩn bị thật tốt (lưu ý là thật tốt) những kiến thức xoay quanh nó vì khi vào phỏng vấn người ta sẽ hỏi đến chừng nào bạn bí ở 1 kiến thức nào đó, nếu bạn bí sớm quá thì coi như khả năng bạn “tạch” càng cao. Ví dụ như bạn muốn làm Android thì chuẩn bị thật tốt Java, kiến trúc Android, được thì thêm C/C++, OOP,… đừng có mà ráng cố gắng nhồi nhét thêm C#, SQL, PHP,… này nọ. Bạn có thể biết, có thể ghi vào CV, nhưng chả ai hỏi tới đâu, yên tâm.

Tự PR bản thân: Ngoài ra bạn cũng phải chuẩn bị 1 vài thứ để PR bản thân. Ví dụ như 1 link github chứa đầy các project và số lượng commit rất đều đặn. Cũng có thể là vài ứng dụng trên store có vài nghìn lượt down chẳng hạn. 1 vài bài blog kiến thức hay. Hoặc là 1 số giải thưởng hackathon, học bổng,…. Nó sẽ gây ra ấn tượng tốt đối với người phỏng vấn cho bạn hơn. Nên tốt hơn hết nếu bạn chưa có những thứ đó thì bây giờ nên chuẩn bị là vừa.

Dọn sạch trang cá nhân: Cuối cùng thì nếu bạn có để những trang thông tin cá nhân lên CV như facebook, google+,… thì bạn nên dọn sạch những stt mang đậm chất giải tỏa, nói xấu người này người kia, share link bậy bạ, hay chửi tục này nọ gì đó. Vì mấy sếp xem CV mà “lở” có vào trang của bạn thì “tạch” vì biết đâu được mấy sếp sẽ nghĩ là: ”tuyển thằng này về cho sau này nó nói xấu, chửi bới sau lưng mình à”. Và những trang cá nhân đó nên để hình thật và tên thật của bạn thì tốt hơn. Hoặc ít nhất là tên tiếng anh và hình cũng được, như vậy sẽ trông bạn chuyên nghiệp hơn. Cuối cùng thì tốt nhất là trang cá nhân của bạn nên có những bài post mang tính công nghệ xíu, hoặc những bài share đâu đó cũng được.

  Làm gì để có được một công việc tốt sau khi tốt nghiệp

Viết CV:

Về phần viết CV có thể mình viết vẫn chưa được tốt lắm. Nhưng do hôm trước mình đọc thử vài CV của 1 số bạn cũng khóa thì có vẻ CV mình cũng còn ngon lành lắm. CV mình nộp 3 lần đều được bên cty họ cho pass vào vòng interview hết. Nên mình xin chia sẻ 1 về phần này luôn.

Ngôn ngữ: Về ngôn ngữ CV thì mình không nói đến nha, vì có người giỏi tiếng anh thì họ viết bằng tiếng anh, còn không giỏi thì viết bằng tiếng Việt cũng chả ai nói gì. Còn nếu người ta yêu cầu viết bằng ngôn ngữ gì thì bạn không giỏi ngôn ngữ đó thì ráng tìm cao nhân mà giúp đở cho 1 bảng CV “đúng ngữ pháp” xíu.

Thông tin cá nhân: Đầu tiên trong CV thì đương nhiên mình phải có 1 phần thông tin cá nhân. Phần này quan trọng nhất vẫn là Tên, email, sđt để người ta còn biết mà liên lạc. Nhưng mình nghĩ quan trọng nhất là hình cá nhân và đường link dẫn đến trang cá nhân, vì qua 2 thứ này như mình nói ở trên thì nếu bạn chuẩn bị tốt họ sẽ có cái nhìn tốt về bạn ngay từ đầu CV luôn.

Vị trí mong muốn và lí do: Phần tiếp theo là phần vị trí mong muốn và tại sao bạn lại muốn vào vị trí đó. Phần này mình nghĩ là phần tối quan trong của cả CV. Bạn phải cho nhà tuyển dụng thấy được tại sao họ nên chọn bạn, bạn phải thể hiện được sự hiểu biết của mình về cty họ trong phần này. Ví dụ bạn muốn vào làm vị trí android developer ở cty họ. Vì sao? Bạn có thể trả lời là vì mình nghĩ cty abc gì đó là một cty trẻ, nhiệt huyết, là một môi trường thuận lợi để phát triển bản thân, nơi mà ý kiến mọi người đều được tôn trọng, cty thuộc top abc, xyz gì đó. Phần này mình nghĩ các bạn nên nâng tầm cty đó càng cao thì càng tốt.

Học vấn và giải thưởng: Về phần học vấn và giải thưởng thì mình xin cho qua, không đề cập đến, vì phần này có bao nhiêu bạn cứ liệt kê ra hết là được. Và càng về sau thi người ta cũng chả quan tâm cấp ba bạn học trường chuyên gì, giải mấy quốc gia,…

Kĩ năng nghề nghiệp: Đến phần kĩ năng nghề nghiệp, phần này các bạn nên nhớ là càng thể hiện mình biết nhiều thì càng chết nhé. Người tuyển dụng sẽ hỏi dựa vào CV, nếu bạn tham lam ghi càng nhiều vào thì người ta sẽ hỏi bạn càng nhiều. Ví dụ bạn phỏng vấn android và ghi là biết tất cả về android là bạn xong rồi đấy. Tốt nhất nên ghi những thứ bạn thấy mình giỏi nhất như làm multithread, service, custom layout,… thì họ chỉ hỏi những phần bạn ghi thôi. Bạn cứ yên tâm, ghi ít không phải là không biết nhiều nhé, Người ta hỏi bạn 1 lĩnh vực mà bạn trả lời thật tốt, hiểu sâu đến mức mà không thể hiểu được nữa. Thì người ta sẽ đánh giá bạn rất chịu khó tìm hiểu, sau này giao task rất yên tâm, bạn sẽ làm rất là cặn kẻ. Còn ghi nhiều mà hỏi 1 vấn đề bạn chỉ trả lời được vài ba câu là bí thì làm sao người ta tin tưởng giao bạn làm gì được.

Kinh nghiệm và project đã làm: Về phần project và kinh nghiệm, thì 2 phần này thì do mình làm ít project và đi làm chưa lâu nên cũng ko biết chia sẻ gì, các bạn cứ thấy project nào thật sự tốt hoặc kinh nghiệm đã làm gì rồi thì ghi vào thôi. Nhớ là ghi rõ ràng vào nhé, làm ở đâu năm nào tới năm nào. Project làm về gì, mô tả, team bao nhiêu người,… đây là những thứ mà người ta sẽ quan tâm đến.

Đam mê, sở thích cá nhân, kỹ năng mềm: Cũng như trên phần đam mê sở thích hay là soft skill này nọ, các bạn cứ ghi vào. Nhưng phần này nhớ đừng ghi nhiều quá, người ta không quan tâm lắm đâu. Chỉ làm dài thêm CV không đáng thôi, để dành đất mà ghi phần khác vào.

Hướng phát triển (hướng nghiên cứu): Cái này cũng nên tùy thuộc vào công ty và công việc bạn làm mà ghi vào nhé. Ví dụ như muốn vào Zalo của VNG làm thì các bạn có thể ghi hướng nghiên cứu mà bạn thích là VOIP, real-time system, mobile application optimization. Còn vào công ty nào làm web thì hứng thú bên web sercurity chẳng hạn, phần này tùy cách bạn chém gió nhé.

Reference: Cuối cùng là phần các bạn có cũng được mà không có cũng không sao. Nhưng có vẫn tốt hơn, bạn nên xin phép và ghi tên 1 số anh chị mà hướng dẫn bạn, hoặc từng làm việc với bạn ở công ty trước vào. Có thể là team leader của bạn lúc trước. Hoặc thầy hướng dẫn luận văn gì đấy. Có thể là độ nổi tiếng của họ sẽ giúp bạn 1 vé được đi phỏng vấn đấy. Ví dụ như team leader của bạn cũng từng làm team leader bên cty này. Và làm rất tốt nên họ sẽ đánh giá cao những người đã được người đó lead.

Phần sau mình sẽ chia sẻ về việc đi phỏng vấn “lần đầu” cho các bạn chưa đi pv lần nào hoặc chuẩn bị sẽ đi.

Bài viết gốc đăng tải tại tinntt.github.io

Bạn có thể xem thêm các mẫu CV cho sinh viên mới ra trường hoặc tạo CV online miễn phí tại TopDev để tăng khả năng tìm được công việc phù hợp.

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

Kiến thức về “Lazy-loading images” mà bạn cần biết

Bài viết được sự cho phép của tác giả: Lương Văn Phúc

Lời tựa

Trong bài viết lần này, hãy cùng mình nghiên cứu từ “lịch sử” cho đến “hiện đại” các vấn đề về lazy loading images nhé (có cả lý thuyết và code). Những trình bày của mình dựa trên kinh nghiệm và kiến thức của bản thân, cộng thêm nghiên cứu và tổng hợp từ nhiều nguồn khác nhau nhằm cung cấp cho các bạn cái nhìn đầy đủ nhất cả về lý thuyết lẫn thực hành. Nếu các bạn có góp ý hay bổ sung gì thì hãy để lại bình luận bên dưới nhé.

Kĩ thuật “lazy-loading images” hiện nay đã có nhiều cải tiến so với trước, tuy nhiên mình sẽ chưa đi ngay vào code mà sẽ tản mạn về lý thuyết một tí. Bạn nào muốn nhảy nhanh đến phần thực hành thì có thể bỏ qua phần chém gió dài dòng của mình nhé.

Lý thuyết: Lazy loading là gì?

Kiến thức về "Lazy-loading images" mà bạn cần biết
“Trì hoãn” việc tải các tấm ảnh khuất màn hình. Ảnh addyosmani.com

Mình bổ sung phần này dành cho các bạn mới (fresh). Trước khi ứng dụng một công nghệ hay kĩ thuật gì vào dự án, các bạn nên hiểu về lý thuyết, thuật ngữ liên quan và lý do sử dụng nhé, vì biết đâu bạn đang sử dụng “dao mổ trâu để giết gà” đấy.

Lazy loading: có một điều quan trọng các bạn cần hiểu là nó chỉ là một khái niệm (ý tưởng) thôi nhé. Nghĩa là nó có thể được sử dụng trong nhiều trường hợp khác nhau, nhiều ngôn ngữ lập trình khác nhau, và mỗi nơi lại có nhiều cách implement khác nhau, nhưng ý tưởng thì cũng tương đối giống nhau thôi. Ví dụ như trong Angular thì có lazy loading modules…

Mình xin lấy một ví dụ mà chắc ai cũng đã từng gặp, hãy tưởng tượng rằng bạn bước vào một quán nhậu:

  • Bạn gọi một loạt 10 món ăn, bạn đợi quán chế biến và mang thức ăn lên cho bạn.
  • Bạn đợi thật lâu và đùng một cái quán bê lên cả 10 món một lúc.

Bạn có thật sự mong đợi điều trên không? Có một cách “tốt” hơn trong trường hợp này:

  • Bạn chỉ nên gọi 3 món thôi và thưởng thức.
  • Bạn canh thời điểm phù hợp và gọi tiếp 3 món nữa.
  • Sau khi ăn 6 món, bạn thấy no và quyết định thanh toán và ra về, vậy là bạn đã tiết kiệm tiền (và thực phẩm) cho 4 món còn lại, và bạn vẫn cảm thấy vui vì không phải chờ đợi quá lâu.

Lazy loading chính là vậy đó. Khi user vào một trang web có rất nhiều feature (ảnh), nhiều khi họ chỉ vào mỗi trang chủ dạo chơi thôi. Và trong trang chủ, họ cũng chỉ xem cái giao diện đầu tiên chứ chưa chắc đã scroll xuống và xem hết. Trong trường hợp đó, tại sao chúng ta lại bắt browser tải về tất cả mọi feature, tất cả mọi tấm ảnh trong khi user chưa cần hoặc có thể không cần đến?

Trong giới hạn của bài viết này, mình xin phép chỉ phân tích về kĩ thuật lazy loading images thôi nhé.

  Hướng dẫn lazy load component trong React

Tại sao lại phải “lazy-loading images”?

Giải quyết vấn đề về performance

Khi bạn viết code 100 tấm ảnh chứa trong các thẻ img, browser sẽ tải về tất cả các tấm ảnh ấy, dù cho user có muốn hay không, hay có scroll và xem hết 100 tấm ảnh ấy không. Vì thế, việc lazy-load sẽ giúp browser tải ít resource (ảnh) lại, trả kết quả về user nhanh hơn. Bất kì user nào cũng thích các trang web chạy nhanh hơn là chậm.

Tiết kiệm tài nguyên

Việc “trì hoãn” những resource chưa cần thiết giúp tiết kiệm CPU, GPU, bộ nhớ, băng thông… đặc biệt là trên các thiết bị di động có tốc độ kết nối chậm.

Tăng giải nghiệm người dùng

Ngày nay số lượng người dùng trên mobile đã vượt qua cả trên desktop. Nếu trang của bạn có quá nhiều hình ảnh gây chậm tốc độ tải trang, thì user sẽ cảm thấy rằng đó là một trang web tệ và không còn muốn quay lại lần sau.

Tăng điểm số trên các trang đo tốc độ web, ví dụ như Pagespeed Insights

Nếu bạn quan tâm đến “điểm số” của web thì lazy load sẽ giúp điểm số tăng cao hơn nhé (nếu bạn áp dụng đúng cách). Bên cạnh đó, tốc độ web và trải nghiệm người dùng ảnh hưởng rất lớn đến xếp hạng (ranking) trang web trên Google search nữa nhé.

Khi nào thì cần “lazy-loading images”?

Mặc dù lazy-load có rất nhiều lợi ích như trên, bạn cần đặt câu hỏi cho bản thân liệu bạn có thật sự cần nó không, vì “lazy-loading images” cũng có những tác hại (mình có chia sẻ ở cuối bài viết) nếu chúng ta lạm dụng hoặc sử dụng sai cách. Vậy khi nào thì chúng ta nên lazy-load hình ảnh của web:

  • Trang của bạn có nhiều hình ảnh và chúng đang làm chậm trang web của bạn.
  • Hình ảnh trong trang của bạn nằm khuất màn hình và không cần phải tải tức thời.
  • Bạn cần tối ưu tốc độ tải trang trên mobile (và cả desktop), thì “lazy-load images” là một việc nên làm (tất nhiên chỉ lazy load thôi chưa đủ đâu nhưng nhanh được thêm bao nhiêu hay bấy nhiêu)

Trước khi lazy load, chúng ta cần phải làm gì?

Trước khi áp dụng bất kì kĩ thuật lazy load images nào, còn nhiều việc mà bạn phải làm trước đó:

Ảnh của bạn phải được optimize về kích thước (pixel), dung lượng (KB), định dạng (format) hợp lý. Nếu bạn đang load một tấm hình banner cho trang home lên đến 4MB, thì bạn cần phải nén chúng lại trước nhé. Dù có áp dụng lazy-load nhưng một tấm hình 4MB với 500KB sẽ khác nhau rất nhiều đấy.

Kết hợp với thuộc tính srcset để load tấm hình tối ưu nhất dựa theo kích thước màn hình.

Bản chất của “lazy-loading images” rất đơn giản

Bạn nói với browser rằng: “Này browser, tao có các tấm ảnh này, nhưng mày đừng tải nó nhé. Khi nào user scroll đến vị trí tấm ảnh nào, thì mày hãy tải tấm ảnh ấy ngay”. Có 3 vấn đề cốt lõi mà mình tô đậm trong đoạn hội thoại trên.

1. Đừng tải: Khi bạn gán thuộc tính src cho thẻ img, browser sẽ tải nó ngay và luôn, nên để bảo browser đừng tải nó, đơn giản là chúng ta đừng sử dụng thuộc tính src

<!-- Browser sẽ tải tấm ảnh này ngay -->
<img src="example.jpg">

<!-- Bằng cách không sử dụng "src", browser sẽ không tải tấm ảnh đó ngay nữa -->
<!-- Bạn có thể sử dụng bất kì tên gì bạn muốn như "temp-src", "my-src", nhưng cách "chuẩn và tiện"
  nhất là sử dụng data-src nhé. -->
<img data-src="example.jpg">

2. scroll đến vị trí tấm ảnh: để kiểm tra được điều này, developers thường dùng những thứ gọi là “trick” như sự kiện scroll, hay mới hơn là “Intersection Observer API”. Mình sẽ code cả 2 cách trên trong phần tiếp theo nhé.

3. tải tấm ảnh: để bắt browser tải tấm ảnh, chúng ta chỉ đơn giản là copy tấm ảnh từ data-src vào thuộc tính src (hoặc background-image cho ảnh background) thôi.

<!-- Bằng cách sử dụng javascript, chúng ta copy url của tấm ảnh từ data-src vào src
  là browser sẽ tải tấm ảnh ngay thôi -->
<img src="example.jpg" data-src="example.jpg">

Lazy-load ảnh background cũng tuân theo các bước như trên, chỉ là thay vì copy từ data-src vào src, chúng ta copy vào background-image là được. Các ví dụ bên dưới mình đều ứng dụng cho cả 2 trường hợp src và background-image nhé.

Kĩ thuật 1: lazy load chính thống và hiện đại

Chém gió hơi nhiều rồi, mình đi vào code ngay nhé. Thay vì đi ngược từ cách “cổ xưa” cho đến cách “hiện đại”, mình xin giới thiệu về cách hiện đại trước. Cách này là cách chính thống (nghĩa là nó không phải trick), bạn sẽ không cần bất kì dòng Javascript nào, hay bất kì config gì phức tạp. Điều duy nhất bạn làm là báo cho browser biết tấm ảnh nào cần lazy load là xong, với thuộc tính loading

<!-- Bạn chỉ cần thêm loading="lazy" vào tấm ảnh của bạn là xong -->
<img src="example.jpg" loading="lazy">

<!-- Thông tin thêm, loading="lazy" còn áp dụng được cho cả iframe nhé -->
<iframe src="example.html" loading="lazy"></iframe>

Thuộc tính loading có 3 giá trị là lazyeager và auto

  • lazy: browser cần lazy-load tấm ảnh này
  • eager: browser cần tải tấm ảnh này ngay lập tức (hoặc càng sớm càng tốt). Nếu tấm ảnh đang được load với cơ chế lazy mà bạn đổi nó sang eager thì nó sẽ lập tức tải ngay.
  • auto: browser sẽ quyết định việc có nên lazy-load ảnh hay không.

Một điều quan trọng bạn cần lưu ý là nếu bạn muốn lazy-load ảnh background, thì cách này sẽ không chạy đâu nhé. Thay vào đó bạn phải dùng 2 cách mà mình đề cập bên dưới.

Một lưu ý khác nữa, là browser không đợi đến lúc tấm ảnh xuất hiện ở viewport mới tải, mà khi tấm ảnh gần xuất hiện ở viewport là nó đã tải rồi nhé. Điều này giúp browser tải tấm ảnh sớm nhất có thể để nó sẵn sàng xuất hiện trên màn hình kịp lúc, vì tải cũng mất thời gian mà. Nếu bạn muốn tìm hiểu thêm thì có thể search từ khóa “threshold” nhé.

Theo trang Can I Use, thuộc tính này đã được hỗ trợ trên Chrome và Firefox, không hỗ trợ IE, còn Safari thì đang thử nghiệm và sẽ sớm có thôi.

Fallback

Trong trường hợp browser chưa support thuộc tính loading, thường ta sẽ dùng polyfill hoặc fallback. Mình ví dụ một đoạn code fallback để kiểm tra nếu trình duyệt chưa support thuộc tính loading thì sẽ tự dùng third-party bên ngoài để lazy-load.

<!-- Let's load this in-viewport image normally -->
<img src="hero.jpg" alt="..">

<!-- Let's lazy-load the rest of these images -->
<img data-src="unicorn.jpg" loading="lazy" alt=".." class="lazyload">
<img data-src="cats.jpg" loading="lazy" alt=".." class="lazyload">
<img data-src="dogs.jpg" loading="lazy" alt=".." class="lazyload">

<script>
  if ('loading' in HTMLImageElement.prototype) {
    const images = document.querySelectorAll("img.lazyload");
    images.forEach(img => {
      img.src = img.dataset.src;
    });
  } else {
      // Dynamically import the LazySizes library
    let script = document.createElement("script");
    script.async = true;
    script.src =
      "https://cdnjs.cloudflare.com/ajax/libs/lazysizes/4.1.8/lazysizes.min.js";
    document.body.appendChild(script);
  }
</script>

Nguồn: https://addyosmani.com/blog/lazy-loading/

Kĩ thuật 2: lazy load sử dụng Intersection Observer API

Định nghĩa về “Intersection Observer API” thì mình không nêu ra ở đây vì nó nằm ngoài phạm vi bài viết. Ứng dụng của nó thì có rất nhiều, và “lazy-loading images” là một trong số những ứng dụng ấy. Nói nôm na, bạn sử dụng API này để biết được khi nào user scroll đến vị trí tấm ảnh, và khi ấy chúng ta “ép” browser tải tấm ảnh ngay lập tức.

Tuy sử dụng Intersection Observer cho việc lazy-load là một cách không quá “lỗi thời”, nó vẫn không được support trên IE nhé. Tuy nhiên hầu hết các browser hiện nay và cả mobile nữa đều support nó, nên có thể nói đây là cách khá “an toàn”.

Nếu vì tính chất công việc mà bạn buộc phải support IE, bạn có thể sử dụng polyfill để giả lập Intersection Observer API, hoặc sử dụng kĩ thuật số 3 tiếp theo đây.

Kĩ thuật 3: lazy load sử dụng scroll event (resize, orientationChange…)

Kĩ thuật này là khá cổ điển, có thể xem nó là giải pháp cuối cùng để lazy-load images nếu bạn buộc phải support các browser cũ. Giải pháp này tuy chạy nhưng có nhiều vấn đề về performance và hiệu ứng giật (lag), vì nó là cách thủ công mà. Bạn sẽ phải tính toán xem vị trí của tấm ảnh xem nó đã xuất hiện ở trên màn hình chưa, và cứ lặp đi lặp lại mỗi khi user scroll.

Mình không khuyến khích các bạn sử dụng cách này cho production nhé. Nếu buộc phải support các browser cũ, thì polyfill của Intersection Observer ở trên là đủ rồi.

>> Xem thêm: Hướng dẫn lazy load component trong React

“Lazy-loading images” có hại không?

Mặc dù lazy-load là một kĩ thuật tốt và hiệu quả, việc sử dụng lazy loading images sẽ có một số mặt hại sau:

1. Page bị nhảy khi tấm ảnh được load (layout shift)

Vấn đề này là thường gặp nhất khi áp dụng lazy-load. Lý do là vì browser không biết được kích thước của tấm ảnh trước khi nó thật sự load nó. Vì thế khi load xong tấm ảnh, nó sẽ đẩy content xung quanh ra xa gây giật trang khá khó chịu. Có rất nhiều cách để giải quyết vấn đề này, nhưng để tránh bài viết quá dài nên mình chỉ đưa một cách đơn giản và dễ hiểu nhất thôi. Nếu các bạn cần tìm hiểu thêm nhiều cách khác thì có thể Google hoặc để comment bên dưới nhé.

Cách để tránh layout shift thường thấy là chỉ ra chính xác kích thước của tấm ảnh, khi đó browser sẽ dành chỗ trước cho tấm ảnh đó trên layout, để đảm bảo khi load xong tấm ảnh, nó sẽ lấp đúng khoảng trống đó và không gây lỗi layout shift.

<!-- Chỉ cho browser biết kích thước tấm ảnh để tránh lỗi "layout shift" -->
<img src="sample.png" loading="lazy" width="200" height="200">
<img src="sample.png" loading="lazy" style="height:200px; width:200px;">

Ngoài ra, bạn nên tránh lazy-load những tấm ảnh ở ngay phần đầu của trang (thuật ngữ chuyên môn gọi là above-the-fold) để tránh việc layout shift nhé.

Kiến thức về "Lazy-loading images" mà bạn cần biết

2. Khi web bị tắt Javascript

Đối với những user đã tắt Javascript trên trình duyệt (tỉ lệ rất thấp), thì cách sử dụng Intersection Observer hay scroll sẽ không những không chạy, mà nó còn làm những tấm ảnh của bạn mãi mãi không xuất hiện. Để giải quyết vấn đề đó, ta có thể sử dụng thẻ noscript

<img data-src="sample.jpg">

<!-- Nếu javascript bị tắt, thì hãy load tấm ảnh ngay nhé -->
<noscript>
  <img data-src="sample.jpg" />
</noscript>

Tuy nhiên bạn không cần phải lo lắng vì thật sự tỉ lệ user lướt web mà tắt javascript là rất thấp.

3. Không tốt cho SEO

Vẫn là khi sử dụng Intersection Observer hay scroll. Khi con bot (mình ám chỉ GoogleBot) crawl trang web của bạn, nó sẽ không hiểu data-src là gì mà nó chỉ hiểu src mà thôi. Trong trường hợp này nó sẽ xem như tấm hình đó bị lỗi và không index tấm hình của bạn. Tuy nhiên nói vậy không có nghĩa là không có giải pháp, có một số trick dành cho bạn nếu bạn quan tâm:

  • Feed cho con bot bằng cách thủ công thông qua sitemap (nếu bạn là dân SEO thì bạn sẽ hiểu nó là gì)
  • Kiểm tra xem navigator.userAgent có phải là bot của Search Engine không. Nếu phải thì ta bỏ qua việc lazy-load bằng cách thực hiện ngay thao tác copy từ data-src sang src. Việc này khá tricky nên mình không nói chi tiết ở đây (nó liên quan đến SSR và CSR). Nếu bạn có thắc mắc gì thì để lại comment bên dưới nhé.

4. Thêm code Javascript chỉ để lazy load vài tấm ảnh

Nếu số lượng ảnh cần lazy load chỉ dưới 5 tấm, và chúng không ảnh hưởng nhiều đến tốc độ tải trang, thì mình khuyên không nên sử dụng lazy load. Điều này chỉ khiến bạn tốn thêm nhiều dòng code javascript, và sẽ lớn hơn nếu bạn nhúng cả polyfill vào nữa. Thay vào đó, hãy tìm cách optimize tấm ảnh của bạn, và sử dụng native lazy-load nếu có thể.

5. loading="lazy" không hỗ trợ background image

Nếu bạn muốn lazy load ảnh background, thì cách sử dụng loading="lazy" sẽ không chạy và bạn buộc phải dùng 2 cách còn lại nhé.

Tóm tắt bài viết trong một table

Native Intersection Observer scroll event handler
Performance Tốt nhất Tốt Không quá tệ nếu xử lý tốt
Background Image Không
Javascript Không cần Cần Cần
SEO Không ảnh hưởng Có ảnh hưởng Có ảnh hưởng
User friendly Tốt nhất Tốt Có thể giật nếu xử lý không tốt
Browser support Chưa nhiều (thiếu safari)
Không support IE
Tốt trên các browser
Không support IE
Tốt trên hầu hết browser, kể cả IE
Polyfill Không cần (bản thân nó đã là một polyfill)

Download Source codes

Mình đính kèm source code đơn giản cho 3 giải pháp ở trên, bạn nào cần thì có thể tải về để tham khảo nhé.

https://drive.google.com/file/d/16jTYVUiA5xykDrhaP60GwvuztOPTOhwB/view?usp=sharing

Kết luận

“Lazy-loading images” chỉ là một trong rất nhiều kĩ thuật để tối ưu performance cho web. Sắp tới mình sẽ viết thêm nhiều bài viết phân tích về web performance nhé.

Bài viết của mình khá dài rồi, hi vọng các bạn thích bài viết lần này của mình, mình sẽ luôn cập nhật để nó không bị lỗi thời nhé. Nếu các bạn có góp ý hay thắc mắc gì thì xin để lại comment bên dưới.

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

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

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

Phân biệt ArrayList và LinkedList

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

Danh sách được sử dụng rất nhiều trong quá trình chúng ta lập trình và mảng là kiểu mà chúng ta hay sử dụng nhất. Nhưng đôi khi mảng thông thường không thể đáp ứng được hết nhu cầu sử dụng của chúng ta như kích thước không thể thay đổi chẳng hạn. Vì thế có 2 loại vê cấu trúc dữ liệu mà chúng ta thường dùng để thay thế đó chính là ArrayList và LinkedList. Cả 2 đều giúp chúng ta sử dụng dễ dàng hơn. Nhưng đôi khi chúng ta không biết phải sử dụng cái nào cho hiệu quả. Vậy nên bài blog này sẽ phân tích để giúp mọi người hiểu rõ hơn và tối ưu tốc độ của code hơn nhé.

  Khái niệm cơ bản về SOAP, REST và cách phân biệt chúng
  Phân biệt lập trình viên Junior, Mid-Level và Senior

Trước hết, chúng ta cùng phải hiểu ArrayList và LinkedList là gì? Và chúng quản lý các phần tử như thế nào?

  • ArrayList là dùng một mảng động (như mảng thường nhưng có thể thay đổi kích thước và các phương thức thêm) để lưu trữ phần tử.
  • LinkedList sử dụng danh sách liên kết để lưu trữ phần tử. Mỗi phần thử có thể được gọi là 1 node trong danh sách.

Vậy cả 2 đều dùng để lưu trữ danh sách. Giờ chúng ta cùng xem sự khác nhau của chúng nhé.

Chúng khác nhau ở những đặc điểm sau:

  1. Cách lưu trữ phần tử: Định nghĩa đã nêu rõ rồi đúng không nào
  2. ArrayList thêm và xóa phần tử chậm hơn LinkedList: Điều này khá dễ hiểu vì LinkedList chỉ cần thay đổi luồng trỏ của các node trong danh sách nên độ phức tạp là O(1) còn ArrayList phải tăng/lùi tất cả những vị trí sau vị trí muốn thêm/xóa nên độ phức tạp là O(n).
  3. ArrayList truy xuất phần tử nhanh hơn LinkedList: ArrayList muốn truy xuất đến phân tử thứ mấy trong danh sách thì chỉ cần gọi vị trí đó ra là được nên mất O(1) phức tạp, còn LinkedList thì phải duyệt qua các phần tử trước đó thì mới truy xuất được đến phần tử cần lấy nên độ phức tạp là O(n)
  4. ArrayList chỉ có thể hoạt động như 1 list thông thường, còn LinkedList có thể hoạt động như ArrayList, stack, queue. (stack và queue mình sẽ nói đến ở bài blog khác nhé)
  5. ArrayList yêu cầu ít bộ nhớ hơn LinkedList: Vì ngoài lưu trữ giá trị thì các node trong LinkedList còn phải chứa các tham chiếu đến phần tử trước, sau của nó nữa.

Như vậy mọi người có lẽ đã hiểu rõ về 2 loại danh sách thường sử dụng này.

Author: Nguyễn Minh Quân

Bài viết gốc được đăng tải tại Tạp chí Lập trình

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

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

2 nhận định sai lầm về việc bắt đầu học lập trình

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

Đây là một trong những câu hỏi phổ biến nhất mà tôi nhận được – “Có quá nhiều ngôn ngữ lập trình, tôi không biết phải bắt đầu từ đâu. Đâu là ngôn ngữ giúp tôi có mức thu nhập ổn định?”

  19 Bí Kíp Bạn Có Thể Dùng Khi Phạm Sai Lầm Với Git
  11 sai lầm cần tránh nếu muốn thành công, đặc biệt vào những ngày cuối tuần

Bạn chắc hẳn cũng đang có những băn khoăn này.

Và chắc chắn nhiều người sẽ rối tung giữa hàng đống lựa chọn. (Và) phần nhiều sẽ đi tham khảo ý kiến người khác (giống như tôi đã từng) và nhận được những câu trả lời như:

“Tôi YÊU JavaScript. Nó là tốt nhất!”

“Python là ngôn ngữ tuyệt vời nhất và tôi không bao giờ thèm ngó ngàng tới ngôn-ngữ-ABC-nào-đó”

“C là lựa chọn sáng suốt và nó bao hàm hết toàn bộ nền tảng”

“Ruby là ngôn ngữ dễ dùng nhất! Hãy học nó đi!”

Sẽ có lúc bạn cảm thấy, gần như TẤT CẢ đều là TỐT NHẤT và bạn lại quay lại điểm bắt đầu của vấn đề.

Đây là lúc bàn tới 2 nhận định sai lầm về việc học lập trình.

SAI LẦM #1: Bạn chỉ cần bắt đầu học lập trình với 1 ngôn ngữ lập trình duy nhất

2 nhận định sai lầm về việc bắt đầu học lập trình

Hãy quên hết mớ ý kiến của đám đông đi vì sẽ không bao giờ có hồi kết cho cuộc tranh luận ngôn ngữ lập trình nào đáng học nhất. Và đây là một điều mà tôi phát hiện ra rằng không có ai đề cập tới: “Đám cưới của bạn chưa chắc sẽ diễn ra với mối tình đầu!”

Công nghệ không ngừng thay đổi nhanh chóng, bạn sẽ được kỳ vọng có thể đảm nhiệm nhiều hơn một ngôn ngữ lập trình, sử dụng nhiều frameworks khác nhau. Có thể nói đối với ngôn ngữ lập trình, bạn đang ở trong chế độ “đa thê”. Các công ty công nghệ thông thường đều sử dụng nhiều frameworks & ngôn ngữ lập trình khác nhau cho những nhu cầu khác nhau.

Và vì mọi thứ luôn biến đổi, những gì được ưa chuộng ngày hôm nay chưa chắc sẽ là tâm điểm của ngày mai. Ngôn ngữ chỉ là một phần nhỏ trên bước đường học lập trình cơ bản cho người mới bắt đầu.

Những điều bạn cần làm không chỉ là học 1 ngôn ngữ lập trình. Bạn cần học cách để trở thành một lập trình viên sẵn sàng thích ứng với mọi thay đổi.

SAI LẦM #2: Học ngôn ngữ lập trình quan trọng hơn xây dựng nền tảng căn bản

2 nhận định sai lầm về việc bắt đầu học lập trình

“Học cách dùng NodeJS và làm theo từng bước của framework là đủ”

“Cứ học thẳng luôn Django hoặc Ruby, cần gì phải băn khoăn cách xây dựng lại mọi thứ từ đầu”

Đó là lời khuyên của rất nhiều người. Nhưng nó thật sự rất nguy hiểm. Bất cứ ai nói với bạn những điều tương tự như trên đều đang đẩy bạn đến bờ vực của sự thất bại trong tương lai.

Bạn muốn trở thành Software developer, không phải một lập trình viên theo khung mẫu. Framework có thể bị “thất sủng” bất kỳ lúc nào và đó là “chuyện bình thường ở huyện”.

Có nhiều công ty lựa chọn không dùng tới framework để xây dựng các nền tảng công nghệ, hoặc có thể họ sẽ dùng framework nhưng biến tấu lại dựa trên như yêu cầu của công ty.

Trong những trường hợp này, bạn cần có kiến thức nền vững vàng. Framework được tạo ra để giúp cho cuộc sống của bạn dễ dàng hơn. Nó tuỳ thuộc vào lĩnh vực bạn lập trình và bạn cần hiểu được bản chất của các framework.

Sử dụng framework thì dễ, NHƯNG hiểu được bản chất mới là vấn đề quan trọng. Thực tế, việc thấu hiểu này sẽ giúp bạn thích các framework hơn rất nhiều.

Gạt bỏ những nhận định sai lầm đi!

Nếu bạn đã từng nghe theo những quan điểm sai lầm trên, bạn sẽ khó trở thành một lập trình viên giỏi nếu không sớm gạt bỏ chúng ra khỏi đầu!

Chúng ta sẽ bàn thêm về việc điều gì tạo nên một lập trình viên giỏi trong những lần tới. Nhưng trước đó, hãy bàn tới một số điều quan trọng chính yếu mà chưa có ai từng nói với bạn khi bắt đầu học lập trình.

Bài viết gốc được đăng tải tại Tạp chí Lập trình

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

Xem thêm TOP các IT Jobs for Developer hấp dẫn tại TopDev

Những lý do làm kìm hãm sự thăng tiến của bạn

Thăng tiến trong sự nghiệp là mong muốn chung của bất kỳ nhân viên nào. Dù xuất phát điểm với các vị trí khác nhau, song sự thăng tiến được xem là đích đến đáng mong đợi trong hành trình nghề nghiệp. Tuy nhiên, để có thể phát triển, bạn cần quan tâm đến rất nhiều khía cạnh: sự nỗ lực, không ngừng tự học hỏi – rèn luyện. Tuy nhiên, bạn nên cân nhắc với từng hành động phản ánh sự cố gắng và hoàn thiện của mình. Với bài viết sau, TopDev sẽ chỉ ra những lầm tưởng về thực tế đang kìm hãm đến sự thăng tiến của bạn.

Thành tích tốt nhất quyết định sự thăng tiến?

Để có được sự thăng tiến, bạn cần chứng minh mình là người đủ năng lực. Điều đó thể hiện qua những kết quả cụ thể. Đôi khi, cần có các số liệu để xác minh. Từ những biểu hiện từ kết quả, bạn sẽ được đánh giá năng lực theo các mức độ khác nhau.

thăng tiến

Để phát triển, kết quả của bạn phải thật xuất sắc, vượt xa những mong đợi từ tổ chức. Vô tình điều này đã tạo ra một mặc định rằng kết quả công việc là yếu tố duy nhất để đạt được sự thăng tiến. Thế nhưng, đó là một lầm tưởng lớn. Nhiều cá nhân họ làm việc như một con thiêu thân thân không biết mệt mỏi. Cuối cùng, họ lại rơi vào tuyệt vọng khi cơ hội thăng tiến này không dành cho họ. 

Thực tế cho thấy, kết quả công việc không phải là yếu tố duy nhất quyết định sự thăng tiến. Câu chuyện đánh giá và phát triển nhân viên luôn có những thay đổi. Một nhân viên có nhiều điều kiện hơn để thể hiện năng lực của mình. Tổ chức sẽ đánh giá một cách toàn diện hơn về năng lực nhân viên thông qua các tiêu chí: hiệu suất làm việc; kỹ năng lãnh đạo, teamwork; tiềm năng phát triển,…Ngoài kết quả, bạn hãy thể hiện mình là một nhân viên chỉn chu, luôn biết lắng nghe và chịu học hỏi. Đặc biệt hơn, thái độ đối với công việc là điều rất quan trọng. Từ những cân nhắc cụ thể, bạn sẽ có cách thiết lập chiến lược phát triển phù hợp cho riêng mình.

Khi được sếp quý mến, bạn sẽ thăng tiến nhanh hơn

Nếu được sếp quan tâm và theo dõi, đưa ra những góp ý thẳng thắn để hoàn thiện thì đó là một điểm tốt. Không bàn đến những khía cạnh khác ngoài vấn đề năng lực chuyên môn, bạn chắc chắn là nhân viên mà sếp có nhiều kỳ vọng. 

Tuy nhiên, vẫn chưa có sự chắc chắn nào cho một sự thăng tiến. Bạn nên nhớ, sự thăng tiến không chỉ hoàn toàn dựa vào sếp. Đó còn mà đó là sự nhìn nhận, đánh giá tổng thể từ nhiều trưởng các bộ phận, phòng ban khác nhau. 

thăng tiến

Xem thêm: Để thăng tiến, cần phải có chiến lược!

Để có được sự thăng tiến, bạn cần nhận được sự ủng hộ từ mọi người, sự công nhận về thực lực từ tổ chức. Vì thế, thay vì cứ quá tập trung vào việc làm hài lòng sếp, hãy làm việc một cách chuyên nghiệp. 

Hãy quan tâm đến việc phát triển mối quan hệ với đồng nghiệp nhiều hơn. Bạn có thể đóng góp ý kiến trong các cuộc họp để gia tăng sự tương tác. Dù bạn là đàn em trong doanh nghiệp, hãy thực hiện việc đó với một tinh thần ham học hỏi. Đừng đi xa khỏi những giới hạn cho phép đồng thời tuân thủ các quy tắc xử sự chung. Bạn không cần phân tích quan điểm như một chuyên gia nhưng đòi hỏi bạn phải đặt cái tâm của mình vào. Hãy nhớ rằng, phải biết cách thể hiện mình. Hãy thể hiện mình như khiến mình trở nên vô hình khi luôn thụ động. Tập cách mở lòng để có thể tạo ra những cơ hội mới cho chính bản thân. 

Sở hữu kỹ năng về công nghệ, chắc chắn sẽ thăng tiến! 

Ngoài ngoại ngữ, sự am hiểu về công nghệ được xem là lợi thế lớn trong cuộc chiến nghề nghiệp. Và không khó để bạn đến gần hơn với sự thăng tiến. Tuy vậy, bạn không nên đánh giá một cách chủ quan, thiếu sự nhìn nhận bao quát như vậy.

thăng tiến

Liệu bạn có tự đánh giá được mức độ thể hiện các kỹ năng công nghệ của mình hay chưa? Có phải chăng bạn đang quá tự tin chăng? Đó là những câu trả lời bạn cần phải thắc mắc.

Không thể phủ nhận các kỹ năng công nghệ sẽ giúp bạn nổi bật hơn. Song, ngày nay khi thị trường lao động phát triển, công nghệ gần như trở thành một yêu cầu bắt buộc. Dường như chúng không thể đủ sức nặng để giúp bạn tiến xa hơn. Trong khi đó, sự sáng tạo; năng lực chuyên môn, khả năng kết nối cũng là những điều bạn nên rèn luyện. Đây hầu như lại là những yếu tố quan trọng góp phần tạo ra giá trị của bạn. 

Hãy lập kế hoạch cân bằng trong mọi kỹ năng. Có thế, con đường thăng tiến sẽ rộng mở với bạn.

Suy nghĩ áp định: Tốt gỗ hơn tốt nước sơn

Có thể nói, ngoại hình sáng không phải điều kiện tiên quyết để bạn được thăng tiến. Nhưng phải thừa nhận việc có một ngoại hình tốt sẽ giúp bạn dễ đạt được thành công, đặc biệt là các công việc trong môi trường nghệ thuật, giao tiếp cộng đồng,… 

thăng tiến

Xã hội hiện đại, việc chăm chút cho ngoại hình là một việc cần làm. Tuy nhiên, vẫn phải trong một chuẩn mực cho phép. Đồng thời, phù hợp với công việc, văn hóa của công ty. Cái quan trọng là bạn đừng đánh giá thấp vai trò của ngoại hình. Nếu chuyên môn tốt đi với một ngoại hình thích hợp, bạn sẽ có cho mình sự tự tin. Dù muốn hay không, bạn cần đảm bảo rằng vẻ ngoài của mình luôn được chăm sóc.

Đừng bao giờ vô tâm với ngoại hình của mình. Khi bạn có một ngoại hình thu hút, tài năng của bạn sẽ được tỏa sáng hơn. 

Lời kết

Có rất nhiều lý do có thể khiến bạn bị chậm lại. Quan trọng là bạn có nhận ra được những lý do tạo ra rào cản ngăn bước mình đến với sự thăng tiến hay không? Hãy xác định rõ chúng; thay đổi suy nghĩ và bắt đầu hoàn thiện những thiếu sót. TopDev tin rằng nếu bạn có khả năng, thái độ và sự cố gắng, thành công sẽ đến với bạn nhanh thôi.

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

Xem thêm Tìm việc làm cho it trên TopDev

Computer Science là gì? Học những gì và ra trường làm gì?

Các nhóm ngành công nghệ thông tin chưa bao giờ hạ nhiệt và được rất nhiều bạn sinh viên quan tâm, hôm nay hãy cùng TopDev tìm hiểu về ngành Computer Science trước khi chọn ngành học cho mình nhé!

Computer Science là gì?

Computer Science (tên tiếng Việt là Khoa học máy tính) là một ngành học, trong đó nó nghiên cứu về tất cả những gì liên quan về cấu trúc máy tính (bao gồm tất cả các lý thuyết, cơ sở lý luận về ứng dụng, thông tin, tính toán, thực thành của hệ thống máy tính), nghiên cứu về môi trường ngoại mạng, môi trường web. 

Ngoài ra ngành học này cũng có liên quan đến các hệ điều hành hay bộ xử lý thông tin & dữ liệu, ngôn ngữ lập trình cho cả phần cứng và phần mềm. Xa hơn một chút, Computer Science nghiên cứu cả về trí tuệ nhân tạo AI, vấn đề bảo mật và an toàn cho máy tính, thiết kế ứng dụng, phát triển ứng dụng…

tuyển dụng it

Có thể nói Computer Science là phương thức mà con người tạo ra với mục đích dùng để tiếp cận với nền khoa học thực tiễn để có thể tính toán cấu trúc, biểu hiện, thuật toán cơ bản và đưa ra số liệu chính xác cho việc nghiên cứu tính khả thi.

Để hiểu theo cách đơn giản, xúc tích nhất thì Computer Science là ngành nghiên cứu về tất cả các loại thuật toán, hệ thống tính toán. Ngành này không chuyên về bất kỳ loại ngôn ngữ nào vì chính Khoa học máy tính đã tạo ra quy tắc của các loại ngôn ngữ…

Ngành Computer Science học những gì?

Ngành Computer Science rất rộng lớn, nó bao gồm nhiều ngành nhỏ như: Lập trình Kinh doanh, Lập trình Khoa học, Lập trình Cơ sở dữ liệu, Lập trình Hệ thống, Lập trình cho Internet, Bảo mật và Khôi phục, đây là các ngành chuyên về thuật toán ngôn ngữ và các hệ thống. 

Ngoài ra cũng có một số ngành chuyên về ứng dụng thực tiễn như Đồ họa máy tính, ngành tương tác người-máy…tất cả những ngành này đều có điểm chung là đều liên quan đến công nghệ.

Computer Science cung cấp cho sinh viên một nền tảng kiến thức vững chắc và kỹ năng cần thiết để phát triển, thiết kế và duy trì các hệ thống máy tính và phần mềm. Chương trình đào tạo ngành này bao gồm nhiều môn học và lĩnh vực khác nhau, từ lý thuyết cơ bản đến các ứng dụng thực tiễn. Dưới đây là một cái nhìn tổng quan về những gì sinh viên sẽ học trong ngành.

1. Cơ sở lý thuyết và Toán học

  • Toán học rời rạc (Discrete Mathematics): Học về logic, tập hợp, lý thuyết đồ thị, tổ hợp và xác suất, nền tảng cho nhiều lĩnh vực trong khoa học máy tính.
  • Giải tích (Calculus): Các khái niệm về đạo hàm, tích phân, và các ứng dụng trong tính toán.
  • Đại số tuyến tính (Linear Algebra): Học về ma trận, vector và không gian vector, quan trọng trong xử lý đồ họa và trí tuệ nhân tạo.

2. Lập trình và Thuật toán

  • Ngôn ngữ lập trình (Programming Languages): Học nhiều ngôn ngữ lập trình như Python, Java, C++, và các ngôn ngữ khác.
  • Cấu trúc dữ liệu và giải thuật (Data Structures and Algorithms): Học cách tổ chức dữ liệu và các thuật toán để xử lý dữ liệu hiệu quả.
  • Phân tích và thiết kế thuật toán (Algorithm Analysis and Design): Các phương pháp thiết kế thuật toán và phân tích độ phức tạp thời gian và không gian.

3. Hệ thống và Mạng

  • Kiến trúc máy tính (Computer Architecture): Học về cấu trúc và tổ chức của máy tính, các thành phần phần cứng và nguyên lý hoạt động.
  • Hệ điều hành (Operating Systems): Nguyên lý và cấu trúc của hệ điều hành, quản lý tài nguyên và điều khiển quá trình.
  • Mạng máy tính (Computer Networks): Các nguyên lý và công nghệ mạng, giao thức truyền thông, và bảo mật mạng.

4. Cơ sở dữ liệu và Hệ thống thông tin

  • Cơ sở dữ liệu (Databases): Nguyên lý và thiết kế cơ sở dữ liệu, hệ quản trị cơ sở dữ liệu (DBMS), SQL và NoSQL.
  • Hệ thống thông tin (Information Systems): Thiết kế, phát triển và quản lý các hệ thống thông tin phục vụ cho doanh nghiệp và tổ chức.

5. Trí tuệ nhân tạo và Học máy

  • Trí tuệ nhân tạo (Artificial Intelligence): Các khái niệm cơ bản về AI, học máy (Machine Learning), và các ứng dụng của AI.
  • Học máy (Machine Learning): Các thuật toán học máy, xử lý dữ liệu, và triển khai các mô hình học máy.

6. Đồ họa máy tính và Thực tế ảo

  • Đồ họa máy tính (Computer Graphics): Nguyên lý và kỹ thuật để tạo và xử lý hình ảnh 2D và 3D.
  • Thực tế ảo (Virtual Reality): Công nghệ và ứng dụng của thực tế ảo và tăng cường, phát triển môi trường ảo.

7. Phát triển phần mềm và Kỹ nghệ phần mềm

  • Kỹ nghệ phần mềm (Software Engineering): Các phương pháp, quy trình phát triển phần mềm, kiểm thử và bảo trì phần mềm.
  • Phát triển ứng dụng (Application Development): Thiết kế và phát triển các ứng dụng di động, web và doanh nghiệp.

8. Bảo mật và An ninh mạng

  • An ninh mạng (Cybersecurity): Các nguyên lý và thực hành để bảo vệ hệ thống thông tin và dữ liệu khỏi các mối đe dọa.
  • Mật mã học (Cryptography): Nguyên lý và kỹ thuật mã hóa thông tin để bảo mật truyền thông.

Ngành Computer Science cung cấp một chương trình đào tạo toàn diện, từ lý thuyết cơ bản đến các ứng dụng thực tiễn. Sinh viên sẽ được trang bị kiến thức và kỹ năng cần thiết để phát triển các hệ thống phần mềm, quản lý cơ sở dữ liệu, bảo mật thông tin, và ứng dụng trí tuệ nhân tạo. Tham khảo chương trình đào tạo của trường Đại học Công nghệ thông tin TPHCM tại đây.

Phân biệt giữa ngành Computer Science và Công nghệ thông tin

topdev

Trên thực tế có rất nhiều người lẫn lộn giữa Computer Science và IT, hoặc cũng có người cho rằng Computer Science, IT là một. Hơn cả thế, mọi người đôi khi còn lẫn lộn giữa  Computer Science, IT và CE (Computer Engineering – Kỹ thuật máy tính), vậy sự khác nhau giữa những ngành đó là gì?

Vai trò Computer Science là gì?

Công việc chính của các Computer Science là nghiên cứu, khai thác sâu về khoa học máy tính, các nhà khoa học sẽ chỉ tập trung vào việc phân tích, giải quyết các vấn đề xoay quanh chương trình máy tính.

Họ sẽ dựa vào cấu trúc dữ liệu, thuật toán, thậm chí họ còn vận dụng cả toán cao cấp, đại số tuyến tính, mã máy, các loại ngôn ngữ lập trình khác nhau để có thể tạo ra được các sản phẩm/phương pháp mới giúp cải thiện hệ sinh thái công nghệ. 

Khoa học máy tính có khó không? Tại sao ít người chọn học ngành này?

Vai trò IT là gì?

Còn đối với ngành Công nghệ thông tin (Information Technology), nó không khai thác sâu về công nghệ hay khoa học máy tính mà nó sử dụng công nghệ để phục vụ cho một mục đích công nghệ khác, hoàn thành thực hiện các nhiệm vụ, thao tác được ấn định.

Các sản phẩm của IT gồm các hệ điều hành, phần mềm, ứng dụng được tạo ra để phục vụ, hỗ trợ, giải quyết các vấn đề liên quan đến công nghệ.

Một điểm khác biệt nữa giữa Computer Science là IT không chỉ cặm cụi nghiên cứu mà đôi khi còn phải đi gặp và tương tác với khách hàng, đồng nghiệp. Đối với các vấn đề công nghệ cần được giải quyết, họ sẽ là người đưa ra ý kiến, giải thích sao cho có thể giải quyết được tình trạng vấn đề theo cách khả thi nhất.

Đối với các sinh viên theo ngành IT, thông thường sẽ được làm quen với IT bằng cách “ăn nằm” với các thể loại lý thuyết toán cơ bản đến nâng cao và cao cấp, tìm hiểu về dữ liệu chuyên sâu, mạng…

Có thể bạn muốn xem thêm: Nên học chuyên ngành nào: Kỹ thuật phần mềm vs Khoa học máy tính?

Học Computer Science xong ra làm nghề gì?

Computer science là gì?

Những ngành nghề liên quan đến Computer Science khá nhiều, bao gồm các ngành liên quan đến IT. Sau đây TopDev xin liệt kê một vài ngành nghề tiêu biểu và nổi bật liên quan đến Computer Science như:

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

Kỹ sư phần mềm có chức năng vai trò quan trọng trong việc xây dựng về khía cạnh kỹ thuật trong 1 quy trình tạo ra phần mềm. Khác hẳn với nhà phát triển phần mềm, các nhà phát triển phần mềm sẽ không thao tác quá nhiều vào khía cạnh kỹ thuật trước khi phần mềm được tạo ra. 

Kỹ sư phần mềm đôi khi cũng sẽ đảm nhiệm được vai trò của nhà phát triển phần mềm, nhưng ngược lại, nhà phát triển phần mềm thì chưa chắc có thể đảm nhiệm được vị trí của kỹ sư phần mềm.

Tham khảo thêm: Tuyển dụng Software Engineer lương cao tại Topdev

Phân tích dữ liệu – Data Analytics

Người đảm nhiệm vị trí này sẽ là người có nhiều kỹ năng quan sát, đánh giá, tư duy logic và phân tích sâu một dữ liệu nào đó, từ đó đưa ra những phán đoán chính xác. Đồng thời các nhà phân tích dữ liệu còn phải có khả năng ăn nói, trình bày, thuyết trình lưu loát để có thể trình bày cho người chịu trách nhiệm tuyến trên.

Tham khảo thêm: Tuyển dụng Data Analyst lương cao tại Topdev

Nhà phát triển App – Applications software developer

Đây là nghề khá hot trong giới lập trình viên trẻ ngày nay vì không những có mức lương cao mà hiện tại các app cũng được phát triển khá mạnh mẽ với nhiều tính năng khác nhau từ app game đến các app phục vụ cho đời sống, các app mạng xã hội… chính vì thế nghề phát triển App có tiềm năng phát triển rất lớn.

Để có thể phát triển, duy trì ứng dụng và dựng lên một ứng dụng hay phần mềm nào thì cũng cần có tư duy sáng tạo. Có hàng trăm, hàng ngàn ứng dụng được tạo ra và được ra mắt trong các store nhưng vẫn bị flop, không ai quan tâm, nhưng cũng không vì thế mà ngành này bị mai một mà còn ngày càng được nguồn nhân lực trẻ tuổi quan tâm nhiều hơn.

Kỹ sư hệ thống – Systems engineer

Các hẳn những hệ điều hành nổi tiếng như Microsoft Windows, Android,iOS hay Linux đã không còn gì quá xa lạ với chúng ta trong xã hội 4.0 như hiện nay. Thực chất, không phải ngành nghề nào khác mà nghề Kỹ sư hệ thống là nghề đã tạo ra những sản phẩm bất hữu đó. 

Những vị Kỹ sư này sẽ giữ vai trò vị trí chủ chốt trong việc thiết kế và xây dựng toàn hệ thống của một dự án nào đó mà chỉ cần thiết bị điện tử của bạn có mạng là sẽ sử dụng được ví dụ như laptop, thiết bị điện thoại di động, hệ thống xe hơi tiên tiến…

Tham khảo thêm: Tuyển dụng System Engineer lương cao tại Topdev

Nhà phát triển web – Web developer

Đừng nhầm lẫn giữa nhà phát triển web và nhà thiết kế đồ họa nhé, bản chất và vai trò của 2 vị trí này rất khác nhau nhưng lại bị mọi người nhầm lẫn. Thế mạnh của một nhà thiết kế đồ họa là tính sáng tạo, và vai trò của họ sẽ là những người sản xuất ra các hình ảnh đẹp mắt được hiển thị trên các trang web.

Computer science là gì?

Còn vai trò của một nhà phát triển web chính là sử dụng các ngôn ngữ lập trình, mã lập trình để viết lên các tính năng, thuộc tính của trang web. Họ sẽ phải tích hợp giữa việc lập trình đồ họa, video, âm thanh… trong một trang web lại với nhau.

Tham khảo thêm: Tuyển dụng Web Developer lương cao tại Topdev

Chuyên viên Công nghệ thông tin – IT

Như đã nói ở trên, ngành Computer Science bao phủ khá rộng, nó thậm chí còn có vai trò của các chuyên viên IT như: 

Phân tích an ninh thông tin

Vai trò của nghề này giống với chức danh của nó, những người theo nghề này sẽ nhận lấy trách nhiệm như một bảo an, bảo vệ, họ có chức năng giám sát và giữ an toàn cho bộ phận mạng lưới mạng.

Có nghĩa là họ phải giữ trật tự an ninh mạng, phân tích an ninh mạng, tìm lỗi bugs của hệ thống để kịp thời sửa chữa không để cho các hacker (kẻ xấu) ăn cắp thông tin, làm rò rỉ thông tin…

Chính vì thế mà họ có một vai trò khá quan trọng trong các tổ chức lớn, có nhu cầu bảo mật thông tin cao như Chính phủ, ngân hàng..

Chuyên gia hỗ trợ máy tính – IT helpdesk

Nghe thì có vẻ đây chỉ là một công việc đảm nhận một vai trò đơn giản, đó là ‘hỗ trợ’. Tuy nhiên, để có thể làm được công việc hỗ trợ này, các chuyên gia hỗ trợ cần phải có kiến thức rộng và gần như là bao trùm trên diện rộng để có thể hỗ trợ hiệu quả hơn. 

Công việc này của họ không cần có chuyên môn quá cao nhưng nhất thiết phải có kiến thức ở nhiều lĩnh vực. Các công việc thường thấy ở các chuyên gia hỗ trợ là khắc phục sự cố, trả lời thắc mắc, tư vấn và dĩ nhiên là không thể thiếu việc hỗ trợ.

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

Các quản trị viên hệ thống có nghĩa vụ quản lý, bảo trì và coi sóc chất lượng hoạt động của hệ thống mạng (mạng diện rộng, cục bộ,…) của doanh nghiệp/ tổ chức.

Những nghề vừa được liệt kê trên tuy chỉ là một góc nhỏ liên quan đến ngành Computer Science nhưng các nghề trên có vai trò khá đặc thù và quan trọng trong từng doanh nghiệp, tổ chức.

  Top các khóa học Computer Science, Programming, Data Science MIỄN PHÍ cần học ngay!

Mức lương của ngành có Computer Science cao không?

Một trong những lý do khiến ngành nghề này trở thành ngành “hot hit” trong mắt giới trẻ hiện tại 1 phần cũng là do mức lương trung bình của ngành này khá nhỉnh hơn so với các ngành nghề khác. Với mỗi level khác nhau, mức lương trung bình của vị trí này cũng khác nhau 1 chút!

Computer Science level Fresher

Computer science là gì?

Đối với các “nai tơ” mới vừa ra trường, mức lương giao động rơi vào khoảng từ 10 triệu trở lên tùy vào tiềm năng phát triển của bản thân bạn mà mức lương cũng có thể lên đến 12 – 15 triệu. Đây là một mức lương đáng mong đợi cho vị trí nhân viên mới ra trường, mức lương này cao gấp 2 lần đối với các ngành khác.

Computer Science level Junior

Đối với Computer Science level Junior thì họ đã có những kinh nghiệm làm việc nhất định tuy thời gian không lâu (level Junior: từ 1 – 3 năm làm việc). Đối với những trường hợp tuyển dụng như thế này thì còn tùy nào kinh nghiệm, thành tựu, khối lượng công việc, chuyên môn, sở trường mà họ đã đạt được trong thời gian làm việc trước đó, khả năng phát triển trong tương lai mà mức lương sẽ giao động từ hơn 18  – 22 triệu/ tháng. Đây được xem là mức lương khá hấp dẫn tại thị trường lao động của nước ta.

Trải nghiệm công cụ tính lương gross to net chuẩn tại TopDev

Computer Science level Senior

Với một Computer Science có kinh nghiệm đầy mình ở level Senior (kinh nghiệm làm việc từ 3 năm trở lên) thì có mức lương trung bình khá vượt trội. Với mức lương cao như thế này, có thể xem đây là mức cao nhất so với mặt bằng chung các level Senior có thể đạt được.

Mức lương trung bình cho vị trí Computer Science level Senior giao động từ khoảng trên 200 triệu/ tháng. Số lương này sẽ ngày tăng lên tùy theo nhiệm vụ mà họ đảm nhận, độ khó của dự án, kinh nghiệm làm việc, thời gian làm tại công ty. Với thời gian làm việc trên 3 năm tại một công ty tại vị trí Computer Science, chắc hẳn sẽ có chỗ đứng và tiếng nói và vị trí nhất định trong team, đôi khi sẽ còn kiêm luôn cả chức năng đào tạo, training nhân viên mới.

Chính vì thế mức lương 200 triệu/ tháng cho vị trí Computer Science level Senior là không ngoa 1 chút nào!

Tham khảo các trường có ngành Computer Science:

4 khóa học Computer Science miễn phí và tính phí

Khóa học từ Harvard

Với khóa học CS50 của Harvard, ngoài những kiến thức chuyên môn về Computer Science thì bạn còn có thể học thêm nhiều kiến thức chuyên sâu xoanh quanh thuật toán, các vấn đề về lập trình, cấu trúc dữ liệu, bảo mật, Công nghệ phần mềm, phát triển web, data, các loai ngôn ngữ như CSS, HTML, PHP, JavaScript, C#…

Link tham khảo: CS50: Introduction to Computer Science

Khóa học từ EdX

Đây là một khóa học riêng biệt cung cấp các kiến thức liên quan đến Máy tính và Lập trình. Khóa học bao gồm các chủ đề sau (sử dụng ngôn ngữ lập trình Python): Hệ thống số, Kiểu dữ liệu số và biểu thức số học, Câu lệnh phân nhánh, Câu lệnh lặp lại [Vòng lặp], Chức năng…

Link tham khảo: Basics of Computing and Programming

Khóa học từ Udemy (Có tính phí)

Khóa học “CS101 Bootcamp: Giới thiệu về Khoa học Máy tính & Phần mềm” là một khóa học / bootcamp về Khoa học Máy tính và lập trình phần mềm cho bất kỳ ai chưa có kiến thức kỹ thuật về máy tính. Chỉ với chiếc điện thoại thông minh hoặc máy tính cũng đủ để bạn tham gia khóa học kéo dài 2 giờ này và khám phá các kiến thức cơ bản về Computer Science và lập trình phần mềm, cũng như các chủ đề cập nhật và mới nhất xu hướng công nghệ trong Computer Science.

Link tham khảo: CS101 Bootcamp: Introduction to Computer Science & Software

Khóa học từ Coursera (Có tính phí)

Coursera cung cấp các khóa học về Computer Science cho từng cấp độ từ cơ bản đến nâng cao. Các khóa học riêng lẻ với các ngôn ngữ phổ biến như html và css, Javascript, lập trình hướng đối tượng trong Java và Angular.js, lập trình Python, Scala , Linux và Ruby On Rail rất đa dạng, tùy theo nhu cầu mà bạn có thể chọn cho mình một khóa học riêng lẻ nhưng vẫn phù hợp với nhu cầu.

Khi bạn đã nắm được kiến ​​thức cơ bản về lập trình bằng một hoặc nhiều ngôn ngữ, bạn có thể tiếp tục các khóa học nâng cao hơn cho phép bạn sử dụng các kỹ năng đã học này để nâng sự nghiệp của bạn lên một tầm cao mới.

Ngoài các khóa học trực tuyến, Coursera cung cấp các Dự án có hướng dẫn ngắn hạn để bạn trau dồi kỹ năng Khoa học Máy tính của bạn.

Link tham khảo: Computer Science

  460 khóa học online miễn phí về Programming & Computer Science nên bắt đầu trong tháng 7! (phần 1)

Tổng kết Computer Science là gì?

Tuy đây là một ngành nghề đa dạng và có mức lương cao, nhưng nó cũng đòi hỏi người lao động có lượng kiến thức và tư duy logic khá cao. Thực tế, không phải ai cũng đủ yêu cầu và có đam mê kiên trì theo đuổi ngành. Rất nhiều bạn trẻ đã đứt gánh giữa đường hoặc làm trái nghề vì cảm thấy “chúng ta không thuộc về nhau”. Vì là một ngành đòi hỏi kỹ năng và logic khá cao, nên các bạn hãy cân nhắc khi chọn ngành học cho phù hợp nhé!

Xem thêm việc làm Computer Science với mức lương cao tại TopDev!

Dịch vụ Thị trường Edtech Landscape

Thị trường Edtech 2021 ngày càng phát triển mạnh mẽ nhờ những lợi ích mà nó đã mang đến cho nền Giáo dục Việt Nam.

Tổng quan thị trường Edtech 2021

Vào năm ngoái, năm 2019, số liệu về tốc độ tăng trưởng kép của thị trường Giáo dục Điện tử Việt Nam khá cao, không những thế, Việt Nam còn thuộc top 10 các nước có sự tăng trưởng mạnh mẽ trên thế giới về E-learning, đạt 44,3%.

Theo các chuyên gia của Ken Research, cho đến năm 2023, tốc độ tăng trưởng của Việt Nam vẫn sẽ tiếp tục tăng lên đến con số đáng kinh ngạc hơn nữa. Đó cũng chính là lý do khiến cho Việt Nam trở thành “miếng bánh ngon” của các nhà đầu từ nước ngoài và các startup.

thị trường Edtech 2020

Xem thêm báo cáo về Thị trường Edtech Landscape 2020

Số tiền đầu tư cho thị trường ngành Edtech chỉ đứng sau ngành E-Commerce (34,7 triệu đô) và Fintech (129,1 triệu đô) với số tiền đầu từ là 20,2 triệu USD. Cho đến năm 2019, số tiền vốn đầu tư nước ngoài dành cho Edtech đã lên đến con số 55 triệu đô.

Trong tương lai gần, cụ thể là thị trường Edtech 2021 – 2022, các Edtech startup Việt Nam có thể nhận được nguồn vốn từ nước ngoài hơn nữa, theo dự kiến nguồn vốn sẽ tăng vọt lên đến 50% nếu thị trường Edtech 2021 tiếp tục giữ vững phong độ của đà tăng trưởng này.

Một trong những nguyên nhân thúc đẩy thị trường Edtech phát triển mạnh tại Việt Nam 1 phần là do ảnh hưởng xu hướng phát triển chung của toàn khu vực Đông Nam Á. Đối với các nhà đầu tư trên thế giới thị trường Edtech Châu Á tại thời điểm hiện tại đang là 1 trong những thị trường đầu tư đầy tiềm năng phát triển với tốc độ tăng trưởng mạnh mẽ.

Bên cạnh đó còn, Đông Nam Á cũng là một khu vực tập hợp các điều kiện cần và điều kiện đủ để phát triển Edtech thuận lợi như: tỷ lệ dân số trẻ chiếm phần lớn, tỷ lệ người dùng điện thoại thông minh cao, nền kinh tế phát triển…

Thuận lợi của nền Edtech tại thị trường Việt Nam là: có nguồn nhân lực dồi dào và cạnh tranh, nền tảng hệ thống công nghệ tại Việt Nam nhỉnh hơn 1 vài nước trong khối Châu Á. Ngoài ra, có rất nhiều người Việt Nam đang sinh sống và làm việc ở những khu vực kinh tế như Silicon Valley, mở ra nhiều cơ hội để kết nối với thị trường trong và ngoài nước với nhau.

  GiÀNH GIẢI THƯỞNG $90,000 với EDTECH ASIA HACKATHON
  Thị trường EdTech Vietnam- Nhiều tiềm năng nhưng còn bị bỏ ngỏ tại Việt Nam

Xu thế của thị trường Edtech 2021

Xu hướng STEM/STEAM đang ngày càng được nhắc đến nhiều hơn trong thời gian qua, đây được xem là một bước đệm giúp thế hệ trẻ có thể có sự phát triển vượt bậc. Theo ước tính, thị trường edtech VN sẽ đạt 3 tỷ đô vào năm 2023.

Quan sát được, các đơn vị nước ngoài đã bắt đầu đưa các sản phẩm công nghệ giáo dục vào việt Nam, nhất là cho lứa tuổi mầm non và tiểu học. Từ đó, các sản phẩm edtech ngày càng đa dạng và phong phú.

Đáng chú ý, sự tăng trưởng của E-Learning trong giai đoạn giãn cách xã hội đã tăng đáng kể. VNPT E-Learning của tập đoàn VNPT có số khách truy cập tăng gấp 4 lần, đạt con số 5 triệu, với đỉnh điểm là 100,000 khách truy cập trong một giờ. 

Hoặc ViettelStudy của Viettel đạt 41 triệu lượt truy cập trong một tháng và được sử dụng trong 26,000 trường khắp cả nước, gồm 29,000 bài học ở các cấp độ. 

thị trường Edtech 2020

Sự chuyển đổi công nghệ trong Giáo dục

Các công ty Edtech trong tương lai sẽ còn phát triển mạnh mẽ hơn vì Việt Nam đang có xu hướng chuyển đổi công nghệ hóa trong cả đời sống và giáo dục. Mở rộng cơ hội phát triển Edtech tại Việt Nam bằng các phương pháp công nghệ hóa bài giải. Nối tiếp theo đó, các xu hướng công nghệ giảng dạy mới cũng ra đời ví dụ như bảng thông minh, bài giảng thực tế ảo, giáo dục tích hợp, trí tuệ nhân tạo…

Gia tăng số lượng khách hàng tiềm năng

Cho đến cuối năm 2019 thì tổng số học sinh, sinh viên trên cả nước ta được ghi nhận là có 22 triệu người, trong đó có hơn 90% các học sinh sinh viên sử dụng điện thoại di động, máy tính hoặc laptop để phục vụ việc học. Dự đoán số lượng học sinh và các nhân viên có nhu cầu học thêm kiến thức sẽ ngày càng nhiều hơn trong năm 2023-2025.

Đây cũng là 1 cơ hội lớn để các doanh nghiệp Edtech có bùng nổ trong những năm sắp tới, giúp nhà trường giải quyết vấn đề nhân sự của giảng viên, giúp thiết kế bài giảng hiệu quả hơn.

  13 kênh dạy lập trình căn bản bằng tiếng Việt ai cũng có thể học

Tìm hiểu về các phân khúc thị trường Edtech 2020

Theo số liệu thống kê của tổ chức Tracxn 2019 hiện có 109 tổ chức khởi nghiệp hoạt động trong thị trường Edtech với các đối tượng phân khúc khác nhau tại Việt Nam. Các phân khúc đó là:

Early Childhood Education

Mô hình giáo dục cho trẻ em là mô hình được phát triển dành riêng cho trẻ nhỏ, mô hình này sáng tạo và cung cấp các nội dung tươi sáng, phù hợp với độ tuổi của các bé. Các nội dung ấy bao gồm những trò chơi giáo dục, bài tập vận dụng phát triển trí tuệ phù hợp với trẻ em. 

Các công ty thuộc phân khúc này: Sunbot, Kidup, Monkey Junior, Kyna Kid, Kidtopi, Kỹ năng thoát hiểm cho bé, Touch English…

Learning Management Systems

Hệ thống quản lý học tập là hệ thống đóng vai trò trong việc quản lý các khóa học, lớp học dựa trên nền tảng digital platform (nền tảng số), nền tảng này có chức năng hỗ trợ các giáo viên, người hướng dẫn, nhà trường kết nối với sinh viên, học sinh và cả phụ huynh, giúp các học sinh sinh viên vẫn dễ dàng tiếp nhận được kiến thức thông qua mạng, việc chia sẻ nội bài học cũng giúp các phụ huynh dễ quản lý tiến độ học của con em hơn.

Các công ty thuộc phân khúc này: Wewiin, Ai Việt Nam, Hương Việt, Trí Nam…

thị trường Edtech 2020

Next-Gen Study Tools

Công cụ hỗ trợ học tập là các công cụ, các trò chơi hỗ trợ cho việc học tập, trong đó có một số startup nổi bật như: Edunet, Edu2Review, Lumosity…

Broad Online Learning Platforms

Nền tảng cung cấp khóa học online này sẽ cung cấp đa dạng các khóa học khác nhau thuộc nhiều lĩnh vực khác nhau trải dài từ 13 môn văn hóa (toán học, văn học, hóa học…), các khóa dạy nghề nghiệp, kỹ năng sống, kỹ năng mềm…

Các công ty thuộc phân khúc này: Kyna.vn, Unica, Edumall, Brands Việt Nam, Wikilady, Adabook, Testbank, Alada…

Tech Learning

Nền tảng học công nghệ thông tin có ích rất nhiều trong việc học lập trình, ngoài ra, người dùng các Tech Learning còn có thể học thêm nhiều kỹ năng công nghệ từ cơ bản tới nâng cao khác nữa. Các “trường” học Tech Learning đang nổi bật trong phân khúc này là Code4Startup, CoderSchool, MClass.

Language Learning

Nền tảng học ngoại ngữ có vai trò hỗ trợ người sử dụng nó nâng cao trình độ ngoại ngữ. Việc học ngoại ngữ sẽ trở nên đơn giản và tiện lợi hơn bao giờ hết với nền tảng học ngoại ngữ này. Có 1 số trung tâm ngoại ngữ cũng đã kết hợp giữa việc dạy truyền thống và nền tảng ngoại ngữ như Wall Street English…

Ngoài ra, cũng có một vài công ty ứng dụng nền tảng học ngoại ngữ này như: Akira, Antoree, VOOA, Tienganh123, hellochao, TFlat, Leerit, Dekiru.vn…

Enterprise Learning

  Đồng hành cùng VTC Academy tại Vietnam Mobile Day 2018

Nền tảng giáo dục dành cho doanh nghiệp hỗ trợ các tổ chức giáo dục về việc thiết kế nội dung giảng dạy cho các tổ chức đó.

Các công ty thuộc phân khúc này: Nexedu, OMT, DES…

Online to Offline

Mô hình giáo dục kết hợp có vai trò kết nối các bạn học sinh, sinh viên hoặc những người dùng có nhu cầu tiếp thu học tập thêm kiến thức với các giáo sư, tiến sĩ, chuyên gia trong các môn học, ngành nghề thông qua 1 ứng dụng trên điện thoại thông minh. 

Ở đó, các chuyên gia sẽ được tiếp nhận các câu hỏi từ người dùng, sau đó hỗ trợ giải đáp thắc mắc cho người dùng. Thông thường quá trình giải đáp thắc mắc của các chuyên gia kéo dài từ 10 phút hoặc hơn tùy vào nhu cầu.

Các công ty thuộc phân khúc này: Topica, Tanaca, AiTalk…

Test Preparation

Các Mô Hình luyện thi chuyên về việc cung cấp các khóa luyện thi Cao đẳng, Đại học, ôn luyện, luyện giải đề cho các học sinh thuộc Cấp 3, đặc biệt là dành cho khối lớp 12.

Thị trường Test Preparation phát triển rất mạnh và đa dạng ở thị trường Việt Nam, các mô hình luyện thi mọc lên như nấm nhưng không phải Test Preparation nào cũng thành công, một số gương mặt nổi trội trong thị trường Test Preparation là : Học Mãi, Moon, Tuyển sinh 247, Zuni, ViettelStudy…

School Administration

Hệ thống quản lý trường học có vai trò trong việc giúp nhà trường hoàn thành tốt công việc soạn thảo quy định, chính sách và hành chính trong nhà trường. Hiện nay có 2 công ty nổi bật trong phân khúc này nhất đó là VNPT school và SMAS.

thị trường Edtech 2020

Lợi thế của thị trường Edtech 2020

Thị trường Edtech còn nhiều cơ hội phát triển

Có thể nói, thị trường giáo dục điện tử nước ta còn khá mới mẻ và non trẻ. Nhìn chung, các nền tảng giáo dục được phát triển dành cho nhà trường, doanh nghiệp… đều còn rất mới và chưa được thúc đẩy mạnh mẽ như các ngành khác.

Đặc biệt ở các phân khúc thị trường như Curriculum Production – thiết kế khóa học/chương trình học và phân khúc Review – hỗ trợ người dùng tìm kiếm thêm thông tin về các khóa học, nhà trường, so sánh điểm mạnh, điểm yếu của các khóa học, trường học đó từ đó giúp người dùng đưa ra quyết định đúng đắn phù hợp với bản thân hơn vẫn còn chưa được phát triển nhiều. 

Hiện nay, trên phân khúc thiết kế khóa học/chương trình học có 1 vài đơn vị nhỏ lẻ như Addie, Arkki. Còn trên phân khúc Review khóa học thì có Edu2review là nổi bật.

Có thể thấy, thị trường Edtech 2020 tại Việt Nam tuy có sự tăng trưởng khá tốt nhưng vẫn chưa được đầu tư, tập trung mạnh mẽ như những ngành khác. Đây vừa là khó khăn và là cơ hội của nước ta, với tình hình phát triển hiện tại, các Startup nước ta có thể đạt được nhiều đột phá trong các sản phẩm giáo dục công nghệ.

Thị trường Edtech được Chính phủ bảo trợ

Dự kiến vào năm 2023, lượng người dùng sử dụng Internet truy cập vào mạng sẽ tăng mạnh ở mức 75% (theo dự đoán của Statista Database). Bên cạnh đó, Nhà nước cũng tạo rất nhiều điều kiện cho các Startup về Edtech có cơ hội phát triển các ứng dụng công nghệ hiện đại của mình vào quy trình giảng dạy, phát triển giáo dục.

Có thể thấy được Chính phủ đã có nhiều chính sách nâng đỡ nền Giáo dục Điện tử, quy mô của thị trường Edtech cũng ngày được mở rộng, tiếp cận được nhiều người dùng tiềm năng hơn, thu hút nhiều nguồn lực, vốn nước ngoài đầu tư vào Việt Nam.

Việt Nam chấp nhận đầu tư nhiều hơn vào thị trường Giáo dục

Đây cũng là 1 trong những lợi thế đáng nói đến trong thị trường Việt Nam, chỉ nói riêng năm 2019 thì nền kinh tế của Việt Nam đã tăng gấp 1,3 lần năm 2015, tốc độ tăng trưởng trong năm đó là 7,02%. Thu nhập trung bình của mỗi người tại Việt Nam giao động ở mức 2.800USD/người. 

  "Ngành IT này học rất dễ, tài liệu ko bao giờ thiếu. Quan trọng là phải có đam mê và chịu cày"
  10 kênh Youtube học lập trình không thể bỏ qua dành cho Junior Web Developer / Designer

Theo số liệu cho thấy, người Việt Nam sẵn lòng chi tiêu trung bình 40% tổng thu nhập/tháng cho việc giáo dục. Chính vì thế, thị trường Việt Nam chắc chắn là miếng bánh ngon được nhiều nhà đầu tư trong và ngoài nước dòm ngó.

Cơ hội kêu gọi vốn đầu tư của các Edtech Việt Nam cũng được mở rộng, các Edtech trong nước cần nhanh nhạy nắm bắt thời cơ kịp thời để có thể đưa ra nhiều sản phẩm giáo dục phù hợp với tiêu chuẩn thị trường tại Việt Nam.

thị trường Edtech 2020

Khó khăn của thị trường Edtech 2020

Bên cạnh những lợi thế vừa được nêu trên, chắn chắn không thể tránh khỏi những khó khăn mà thị trường Edtech 2020 phải đối mặt. Có thể nói, trong tất cả các ngành nghề thì ngành Giáo dục luôn là ngành khó nhằn nhất vì tính chất của thị trường này.

Sự cạnh tranh giữa mô hình Giáo dục truyền thống và Giáo dục Điện tử

Mặc dù tốc độ tăng trưởng của Giáo dục điện tử có chiều hướng tăng (40%), tốc độ tăng trưởng của thị trường Edtech cũng đang có dấu hiệu tăng trưởng cao nhưng thói quen học tập và dạy học của các lớp học mô hình truyền thống vẫn còn được giữ vững. 

Nhiều giáo viên, phụ huynh cho rằng việc học tại trường lớp hiệu quả và “đáng tiền” hơn so với việc học Online tại nhà. 

Bên cạnh đó Edtech là mô hình 2 mặt, nó vừa có những sản phẩm dành do học viên, vừa có những sản phẩm dành cho các cơ sở giáo dục, thế nên vấn đề mà thị trường Edtech phải đối mặt đến từ cả 2 phía. 

Rất nhiều tình trạng các trường học, có sở giáo dục không đủ điều kiện để sử dụng các sản phẩm Edtech.

Sản phẩm của Edtech kén người tiêu thụ

Tất cả các sản phẩm của Edtech điều thiên về Giáo dục hoặc công cụ để hỗ trợ cho Giáo dục, chính vì vậy các sản phẩm của Edtech đều phải tốn nhiều thời gian, trải qua nhiều quá trình kiểm tra mới có thể đưa vào áp dụng trong ngành giáo dục.

Trải qua nhiều quá trình đầu tư nguồn vốn và chất xám là thế, tuy nhiên khi các sản phẩm được hoàn thành thì lại gặp trở ngại, khó khăn trong việc tiêu thụ vì các sản phẩm từ Edtech khá đặc thù.

Từ việc khó khăn trong tiêu thụ sẽ dẫn đến việc không đạt được doanh thu như kỳ vọng. Các doanh thu từ Edtech được xem là doanh thu khó có lợi nhuận cao vì ngành giáo dục là một quá trình, không phải chỉ trong ngày 1 ngày 2.

Các công ty đầu tư cũng cần mất khoảng 5 năm mới có thể đánh giá được một doanh nghiệp/công ty Edtech có đang đi đúng hướng hay không, và bản thân các công ty Edtech cũng cần một khoảng thời gian khá dài mới có thể biết được liệu sản phẩm của mình có phù hợp với thị trường hay không.

Chính vì thế, các doanh nghiệp thường phải “gồng” mình để vượt qua giai đoạn khó khăn đó để nhận được sự thừa nhận từ cộng đồng hoặc ít nhất là nhận được nguồn vốn từ các nhà đầu tư.

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

Xem thêm Top công việc IT tại TopDev!

Cách tiếp cận một ngôn ngữ/công nghệ mới

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

Không như các ngành khác, kiến thức trong ngành IT rất nhanh hết hạn.

  • Với ngành xây dựng, xây một cây cầu cách đây 50 năm cũng chẳng khác gì xây một cây cầu bây giờ.
  • Với ngành y, bệnh cảm cúm cách đây 50 năm triệu chứng cũng giống bệnh cảm cúm bây giờ.
  • Nhưng với ngành IT, công nghệ, ngôn ngữ hoặc framework nổi tiếng cách năm 10 – 15 năm giờ chẳng ai xài nữa cả.

Trong bài viết này, mình muốn giới thiệu cho các bạn một góc nhìn về các cách tiếp cận một ngôn ngữ/công nghệ mới. Đây là những cách mà mình tự tìm ra, tự tổng hợp trên mạng, cộng với một số lời khuyên của các bậc đàn anh.

Bản thân mình thấy nó khá là hữu dụng, hi vọng chúng cũng sẽ hữu dụng với các bạn.

Nói về lý thuyết một chút, những kiến thức bạn cần học về một công nghệ có thế chia làm 4 loại sau (Lấy ngôn ngữ C# làm ví dụ):

  • Nền tảng (Fundamentals)
  • Kiến thức (Information)
  • Kỹ năng (Skills)
  • Nâng cao (Innovation)
Cách tiếp cận một ngôn ngữ/công nghệ mới

1. Nền tảng (Fundamentals)

Đây là những kiến thức cơ sở nhất, là những viên gạch đặt nền móng cho kiến thức sau này (VD như: cấu trúc dữ liệu, OOP, vòng lặp, đệ quy, callback, 1 số mô hình MVC MVVM, cơ chế hoạt động của web, …).

Vì chúng là kiến thức nền tảng, mang tính học thuật nhiều nên đôi khi khá là phi thực tế và buồn ngủ. Chắc hẳn ai cũng từng nhức đầu đau não khi nghe các thầy giảng về sự kiện, con trỏ hàm, cây nhị phân, đệ quy…

Tuy nhiên, nếu nắm vững những kiến thức nền tảng này, bạn sẽ thấy việc chuyển đổi qua lại giữa các ngôn ngữ khác nhau rất dễ dàng, vì chúng được xây dựng dựa trên nền tảng chung (Như bản thân mình, vì đã rõ cơ chế get/post, giao tiếp giữa client/server, mô hình MVC, mình có thể học nhanh Zend của PHP, Struts2 của Java, ASP.MVC của C#).

Trường đại học chủ yếu dạy những kiến thức này, do đó đôi khi bạn sẽ thấy chương trình học khá khô khan. Hãy nhớ điều mình từng học khi xem phim kiếm hiệp thời xưa, để học được võ công thượng thừa, phải rành những chiêu thức cơ bản trước. Những chiêu thức hoa mĩ đều từ cơ bản mà ra cả.

Ngoài ra, những kiến thức cơ bản này thường “sống lâu”, rất khó “hết hạn” : hàm sort qua 10, 20 năm vẫn giữ nguyên cách sort; cấu trúc dữ liệu stack, binary tree, mô hình MVC qua 10, 20 năm vẫn không hề thay đổi.

  "Bách khoa toàn thư" ngôn ngữ lập trình Perl
  "Khi công nghệ không chỉ dành cho nam giới" - Lea Trúc, Founder của Women Meet Tech

2. Kiến thức (Information)

Đây là những kiến thức bậc cao hơn, liên quan tới từng ngôn ngữ/framework chuyên biệt (VD như LINQ, Event, WinForm, WebForm,…). Những kiến thức này gắn liền với thực tế, có thể áp dụng được ngay vào làm việc.

Để học nhanh, áp dụng được những kiến thức này, các bạn phải có fundamental vững. Mình từng gặp khó khăn khi viết ajax, viết jQuery, function lồng vào nhau v…v. Khi mình hiểu ra chúng gọi là callback, mình học và viết code ajax, jQuery dễ hơn nhiều.

Một số trường dạy nghề (APTech, Nhất Nghệ …) thường tập trung nhiều vào kiến thức dạng information, lướt qua kiến thức cơ bản dạng fundamentals. Do đó học viên được đào tạo ra thường có kiến thức thực tiễn, có thể làm được việc ngay.

Nhưng vấn đề chung mà một số bạn hay gặp là: tuy làm được nhưng lại không hiểu cơ chế hoạt động, khi gặp lỗi ko biết nguyên nhân, không biết cách sửa. Lý do là vì kiến thức cơ bản (fundamentals) không đủ.

Một điều cần lưu ý nữa là những kiến thức dạng này khá nhanh “hết hạn”, vd như cách routing trong MVC 4 sẽ khác MVC 2, một số hàm trong Entity Framework 6 sẽ khác Entity Framework 4.

Do đó nếu không kịp cập nhật, bạn sẽ dễ trở nên lỗi thời, vì kiến thức cũ không sử dụng được nữa!

3. Kỹ năng (Skills)

Đây là loại kiến thức đáng giá nhất (theo nghĩa đen), các công ty sẽ trả lương cho bạn nếu bạn có skills, có thể làm được việc. Kỹ năng có thể học được 1 phần từ trong sách vở, nhưng phần lớn bạn học được là do quá trình làm việc lâu dài, tiếp xúc nhiều với một công nghệ, giải quyết những tình huống cơ bản và phức tạp.

Ví dụ như: Information là việc bạn biết cơ chế routing, binding của ASP MVC. Skill là việc bạn biết áp dụng cơ chế routing, binding để tạo 1 trang search, insert, update. Skill phức tạp hơn là khi bạn đọc yêu cầu của khách hàng, bạn sẽ mường tượng ra cách viết front end thế nào, back-end ra sao, bắt tay vào code ở đâu.

Lương ở các vị trí senior thường cao hơn, lý do là họ đã tiếp xúc với công nghệ nhiều, kĩ năng liên quan tới công nghệ đó sẽ giỏi hơn. Skill có dựa trên infomation, do đó nó cũng khá dễ hết hạn.

Nếu bạn là senior ngôn ngữ Cobol, Basic nhưng thị trường không cần những skill đó nữa, skill của bạn sẽ trở nên vô dụng. Hãy tập trung đầu tư làm mới skill cho mình nhé.

4. Thuần thục (Innovation)

Đây là cảnh giới tối cao của kiến thức, đạt tới cảnh giới này bạn sẽ được gọi là seniormaster, hoặc được phong thánh. Để đạt được cảnh giới này, ngoài quá trình làm việc, tiếp xúc lâu dài với công nghệ, họ còn phải bỏ thời gian đào sâu, mày mò, nghiên cứu công nghệ đó.

Ngoài những kiến thức chung, họ còn biết vô số những thứ chuyên sâu  như: Code C# được biên dịch như thế nào, quan hệ giữa các component trong C#, performance của Interface và Abstract class, …

Bạn không cần lo lắng quá về cảnh giới này, bản thân chúng ta có thể lên được vị trí cao, có mức lương thoải mái mà không cần những kiến thức dạng innovation thế này.

Author: Bùi Đức Thịnh – Học viên C0220H1 đăng tải tại Tạp chí Lập trình

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

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

Các thuật toán sắp xếp phổ biến trong JavaScript

Bài viết được sự cho phép của tác giả Lưu Bình An

Chúng ta sẽ hiện thực các thuật toán này bằng JavaScript,.

Hàm helper để swap giá trị

function swap(arr, a, b) {
    let temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}

Hàm để so sánh giá trị

const Compare = {
    LESS_THAN: -1,
    BIGGER_THAN: 1
};

function defaultCompare(a, b) {
    if (a === b) {
        return 0;
    }
    return a < b ? Compare.LESS_THAN : Compare.BIGGER_THAN;
}

Bubble Sort

  • Tình huống tốt nhất: độ phức tạp = O(N) (đi qua đúng n phần tử)
  • Tình huống xấu nhất: độ phức tạp = O(N^2) (đi qua n mũ 2 phần tử)

Cái này rất ít xài trong thực tế, chỉ để dạy và học, vì nó chậm nhất so với các thuật toán khác.

Ý tưởng là sẽ so sánh 2 phần tử liền kề, hoán đổi vị trí cho phù hợp

Các thuật toán sắp xếp phổ biến và JavaScript

function bubbleSort(arr, compare = defaultCompare) {
    const { length } = arr;
    for (let i = 0; i < length; i++) {
        for (let j = 0; j < length - 1 - i; j++) { // refer to note below
            if (compare(arr[j], arr[j + 1]) === Compare.BIGGER_THAN) {
                swap(arr, j, j + 1);
            }
        }
    }
    return arr;
}

Để hình dung thuật toán này, bạn có thể nghiên cứu cái hình mô tả bên dưới

Các thuật toán sắp xếp phổ biến và JavaScript

Selection Sort

Không phân biệt tính huống tốt hay xấu gì cả, nó luôn có độ phức tạp = O(N^2)

Các thuật toán sắp xếp phổ biến và JavaScript

Ý tưởng của thuật toán là tìm ra giá trị nhỏ nhất trong đám, rồi đưa nó về vị trí đầu tiên, lặp lại cho các phần tử kế tiếp.

Các thuật toán sắp xếp phổ biến và JavaScript

function selectionSort(arr, compare = defaultCompare) {
    const { length } = arr;
    let minIndex;
    for (let i = 0; i < length - 1; i++) {
        minIndex = i;
        for (let j = i; j < length; j++) {
            if (compare(arr[minIndex], arr[j]) === Compare.BIGGER_THAN) {
                minIndex = j;
            }
        }
        if (i !== minIndex) {
            swap(arr, i, minIndex);
        }
    }
    return arr;
}

Các thuật toán sắp xếp phổ biến và JavaScript

Insertion Sort

  • Tình huống tốt nhất: độ phức tạp = O(N)
  • Tình huống xấu nhất: độ phức tạp = O(N^2)

Thuật toán này nó sẽ tạo ra mảng mới, tìm và chèn từng phần tử một vào đúng thứ tự. Sẽ như sau

  1. Cứ coi như phần tử đầu tiên là đúng vị trí
  2. Lấy phần tử đầu tiên này so sánh với phần tử tiếp theo, nó có 2 tình huống một là ở yên vị trí đang ở, hay là chúng ta chèn phần tử thứ 2 vào trước phần tử đầu.
  3. Lặp lại tương tự

Các thuật toán sắp xếp phổ biến và JavaScript

function insertionSort(arr, compare = defaultCompare) {
    const { length } = arr;
    let temp;
    for (let i = 1; i < length; i++) {
        let j = i;
        temp = arr[i];
        while (j > 0 && compare(arr[j - 1], temp) === Compare.BIGGER_THAN) {
            arr[j] = arr[j - 1];
            j--;
        }
        arr[j] = temp;
    }
    return arr;
}

Merge Sort

Độ phức tạp cố định: O(N Log N)

Là thuật toán chia để trị, chi nhỏ các phần tử ban đầu ra thành các nhóm nhỏ hơn để dể xử lý từng cụm

function mergeSort(arr, compare = defaultCompare) {
    if (arr.length > 1) {
        const { length } = arr;
        const middle = Math.floor(length / 2);
        const left = mergeSort(arr.slice(0, middle), compare);
        const right = mergeSort(arr.slice(middle, length), compare);
        arr = merge(left, right, compare);
    }
    return arr;
}

function merge(left, right, compare) {
    let i = 0;
    let j = 0;
    const result = [];
    while (i < left.length && j < right.length) {
        result.push(compare(left[i], right[j]) === Compare.LESS_THAN ? left[i++] : right[j++]);
    }
    return result.concat(i < left.length ? left.slice(i) : right.slice(j));
}

Quick sort

  • Tình huống tốt nhất: độ phức tạp = O(N Log N)
  • Tình huống xấu nhất: độ phức tạp = O(N^2)

Đây là thuật toán được sử dụng nhiều nhất, vẫn là phương pháp chia để trị

Có thể xem lại bài giới thiệu về Quick Sort của mình

Các thuật toán sắp xếp phổ biến và JavaScript

function quickSort(arr, compare = defaultCompare) {
    return quick(arr, 0, arr.length - 1, compare);
}

function quick(arr, left, right, compare) {
    let i;
    if (arr.length > 1) {
        i = partition(arr, left, right, compare);
        if (left < i - 1) {
            quick(arr, left, i - 1, compare);
        }
        if (i < right) {
            quick(arr, i, right, compare);
        }
    }
    return arr;
}

function partition(arr, left, right, compare) {
    const pivot = arr[Math.floor((right, left) / 2)];
    let i = left;
    let j = right;

    while (i <= j) {
        while (compare(arr[i], pivot) === Compare.LESS_THAN) {
            i++;
        }
        while (compare(arr[j], pivot) === Compare.BIGGER_THAN) {
            j--;
        }
        if (i <= j) {
            swap(arr, i, j);
            i++;
            j--;
        }
    }
    return i;
}

Bucket Sort

  • Tình huống tốt nhất: độ phức tạp = O(N + k)
  • Tình huống xấu nhất: độ phức tạp = O(N^2)

Ý tưởng là sẽ chia đôi thành 2 mảng, rồi trên từng mảng đó, áp dụng một thuật toán sắp xếp trên đó, như insertion sort

Các thuật toán sắp xếp phổ biến và JavaScript

function bucketSort(arr, bucketSize) {
    if (arr.length < 2) {
        return arr;
    }
    // create buckets and distribute the elements
    const buckets = createBuckets(arr, bucketSize);
    // sort the buckets using insertion sort and add all bucket elements to sorted result 
    return sortBuckets(buckets);
}

function createBuckets(arr, bucketSize) {
    // determine the bucket count
    let min = arr[0];
    let max = arr[0];
    for (let i = 1; i < arr.length; i++) {
        if (arr[i] < min) {
            min = arr[i];
        } else if (arr[i] > max) {
            max = arr[i];
        }
    }
    const bucketCount = Math.floor((max - min) / bucketSize) + 1;

    // initialize each bucket (a multidimensional array)
    const buckets = [];
    for (let i = 0; i < bucketCount; i++) {
        buckets[i] = [];
    }

    // distribute elements into buckets
    for (let i = 0; i < arr.length; i++) {
        const bucketIndex = Math.floor((arr[i] - min) / bucketSize);
        buckets[bucketIndex].push(arr[i]);
    }
    return buckets;
}

function sortBuckets(buckets) {
    const sortedArr = [];
    for (let i = 0; i < buckets.length; i++) {
        if (buckets[i] != null) {
            insertionSort(buckets[i]); // quick sort is another good option
            sortedArr.push(...buckets[i]);
        }
    }
    return sortedArr;
}

Lưu ý bucket sort chạy tốt nhất khi có thể chia đều các phần tử cho các bucket, việc chia thành 2 bucket cũng không bắt buộc, có thể chia nhiều hơn nếu số lượng phần tử nhiều

Các thuật toán sắp xếp phổ biến và JavaScript

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

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

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

Exception là gì? Tổng quan về Exception trong Java

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

Exception là gì?

Ý nghĩa trong từ điển: Exception là một tình trạng bất thường.

Trong Java, Exception là một sự kiện mà phá vỡ luồng chuẩn của chương trình. Nó là một đối tượng mà được ném tại Runtime. Một exception (ngoại lệ) trong Java là một vấn đề xảy ra trong quá trình thực hiện của chương trình. Một ngoại lệ có thể xảy ra với nhiều lý do khác nhau, như dưới đây:

  • Người dùng nhập dữ liệu không hợp lệ.
  • Một file cần được mở nhưng không thể tìm thấy.
  • Kết nối mạng bị ngắt trong quá trình thực hiện giao tiếp hoặc JVM hết bộ nhớ.

Tuyển dụng lập trình viên Java lương cao tại đây

Một vài những ngoại lệ xảy ra bởi lỗi của người dùng, một số khác bởi lỗi của lập trình viên và số khác nữa đến từ lỗi của nguồn dữ liệu vật lý.

Để hiểu về cách xử lý ngoại lệ trong Java, bạn cần phải hiểu những loại ngoại lệ như sau:

Checked Exception

Checked Exception: Là ngoại lệ thường xảy ra do người dùng mà không thể lường trước được bởi lập trình viên. Ví dụ, một file được mở, nhưng file đó không thể tìm thấy và ngoại lệ xảy ra. Những ngoại lệ này không thể được bỏ qua trong quá trình biên dịch. Checked Exception là các lớp mà kế thừa lớp Throwable ngoại trừ RuntimeException và Error. Ví dụ như IOException, SQLException, … Checked Exception được kiểm tra tại thời gian biên dịch compile-time.

Unchecked Exception

Unchecked Exception: Một ngoại lệ xảy ra ở runtime là ngoại lệ có thể tránh được bởi lập trình viên. Unchecked Exception là các lớp kế thừa RuntimeException, ví dụ ArithmaticException, NullPointerException, ArrayIndexOutOfBoundsException, … Unchecked Exception không được kiểm tra tại compile-time, thay vào đó chúng được kiểm tra tại runtime.

Error

Error: Nó không giống các exception, nhưng vấn đề xảy ra vượt quá tầm kiểm soát của lập trình viên hay người dùng. Error được bỏ qua trong code của bạn vì bạn hiếm khi có thể làm gì đó khi chương trình bị error. Ví dụ như OutOfMemoryError, VirtualMachineError, AssertionError, … Nó được bỏ qua trong quá trình Java biên dịch.

Exception Handling

Xử lý ngoại lệ (Exception Handling) là một kỹ thuật để xử lý các Runtime Error như ClassNotFound, IO, SQL, Remote, … Lợi thế chính của xử lý ngoại lệ là để duy trì luồng chuẩn của ứng dụng. Exception thường phá vỡ luồng chuẩn của ứng dụng, và đó là tại sao chúng ta sử dụng Exception Handling.

Cấp bậc exception trong Java

Tất cả các lớp exception đều là lớp con của lớp java.lang.Exception . Lớp exception là lớp con của lớp Throwable. Một loại lớp exception khác là Error cũng là lớp con của lớp Throwable.

Error không thường được đặt bẫy bởi các chương trình Java. Error thường được tạo ra để thể hiện lỗi trong môi trường runtime. Ví dụ: JVM hết bộ nhớ. Thông thường các chương trình không thể khôi phục từ các lỗi.

Lớp Exception có hai lớp con chính là : IOException và RuntimeException.

Các phương thức của lớp Exceptions trong Java

Dưới đây là danh sách các phương thức phố biến của lớp Throwable trong Java:

  1. public String getMessage(): Trả về một message cụ thể về exception đã xảy ra. Message này được khởi tạo bởi phương thức constructor của Throwable.
  2. public Throwable getCause(): Trả về nguyên nhân xảy ra exception biểu diễn bởi đối tượng Throwable
  3. public String toString(): Trả về tên của lớp và kết hợp với kết quả từ phương thức getMessage().
  4. public void printStackTrace(): In ra kết quả của phương thức toString cùng với stack trace đến System.err.
  10 câu hỏi JavaScript để tăng cường kỹ năng của bạn
  1001 cách tạo Array trong Javascript (Phần 1)

Các từ khóa để Xử lý ngoại lệ trong Java

Có 5 từ khóa được sử dụng để Xử lý ngoại lệ trong Java, đó là:

  1. try.
  2. catch.
  3. finally.
  4. throw.
  5. throws.

Bài viết gốc được đăng tải từ Trần Quang Huy tại Tạp chí Lập trình

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

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