Home Blog Page 157

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

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?

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

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

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)

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

Kiến thức về

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

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

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

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ì?

Computer Science là 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 2020

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

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

Các thuật toán sắp xếp phổ biến và 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

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

Thế nào là nghệ thuật giao việc của nhà quản lý?

giao việc

Nhà quản lý hay sếp là một “đàn anh” có vai trò quan trọng đối với việc định hướng lộ trình sự nghiệp cho một nhân viên. Sếp không chỉ thực hiện tốt nhiệm vụ của mình mà còn phải có nghệ thuật giao việc hiệu quả. Điều này tạo điều kiện để nhân viên có thể phát triển toàn diện năng lực một cách tốt nhất. Vậy đâu là những yếu tố tạo ra nghệ thuật giao việc của một nhà quản lý. Cùng TopDev phân tích trong bài viết sau đây.

Những sai lầm trong cách giao việc của sếp

giao việc

Như tiêu đề đã nói, giao việc không phải là một vấn đề đơn giản. Nó đòi hỏi một nhà quản lý/sếp phải thật sự hiểu rõ về nhân viên của mình. Do chưa nắm bắt chính xác, nhiều sai sót có thể xảy ra. Ví dụ như việc phân bố và quản lý công việc cho nhân viên. Điều này vô tình càng đẩy khoảng cách giữa sếp và nhân viên đi xa hơn. Đồng thời, ảnh hưởng trực tiếp sự phát triển của tổ chức nói chung và cá nhân mỗi nhân viên nói riêng.

Vậy nguyên nhân là do đâu?

Nhà quản lý ôm đồm quá nhiều công việc

Không khó để hiểu tại sao nhiều người sếp lại làm như vậy. Đơn giản vì họ cho rằng mình đủ khả năng để tự giải quyết được các công việc một cách nhanh chóng mà vẫn đảm bảo tốt hiệu quả công việc. Hoặc vẫn tồn tại nhiều lý do khác về sự cạnh tranh. Do vậy, sếp sẵn lòng chấp nhận thực hiện những nhiệm vụ dù nó có áp lực. Họ chưa muốn ủy quyền việc xử lý các đầu việc cho nhân viên. Đó cũng là lý do họ chưa thật sự là một người sếp tốt được. Họ thiếu đi sự nhìn nhận bao quát để có thể giao trách nhiệm cho đúng người – đúng việc.

Xem thêm: Chọn sếp tốt hay công ty tốt? – Đâu là nước đi đúng đắn?

Giao việc cho những “gương mặt thân quen”

Trường hợp này, sếp chỉ tập trung giao việc cho những nhân viên có quá nhiều kinh nghiệm. Thực tế, đây là một nước đi thông minh để đảm bảo rằng chất lượng công việc vẫn được duy trì tốt và không bị quá tải.

Thế nhưng, liệu rằng đó có phải là một chiến lược hoàn hảo hay không? Tất nhiên là không, dù đó là nhân viên quá dày dặn kinh nghiệm hay một nhân viên mới thì việc tạo ra những cơ hội trải nghiệm là điều cần thiết thực hiện.

Nhân viên mới họ không thiếu năng lực, cái họ thiếu chính là sự trải nghiệm. Nếu sếp không tạo điều kiện cho họ cọ xát thì làm sao họ có thể phát huy hết tài năng của mình. Đôi khi phải chấp nhận những rủi ro để tạo ra những bước ngoặt lớn hơn trong sự nghiệp. 

Nhà quản lý giao việc không đúng người, đúng việc

giao việc

Mỗi nhân viên đều sở hữu những đặc trưng riêng. Có thể họ khéo léo, tinh tế. Có những người lại quyết đoán. Và tất nhiên, cũng có những cá nhân thật sự nổi trội về mọi mặt. Không những thế. Nhà quản lý hay sếp là những thuyền trưởng. Họ có vai trò dẫn dắt, chỉ đạo tổ chức cho các các nhân viên tiềm năng của mình đi đúng hướng. Sự thận trọng trong quyết định chọn người của nhà quản lý thật sự rất quan trọng. 

Việc chọn sai người thực hiện công việc sẽ tạo ra những lỗ hổng lớn. Giao việc không đúng khả năng của nhân viên, giao tiếp một cách mơ hồ, chưa thống nhất,.. tất cả sẽ làm ảnh hưởng đến giá trị chân chính của doanh nghiệp. Vì vậy, mỗi nhà quản lý hãy luôn sáng suốt khi giao việc nhé! 

Kế hoạch giao việc hiệu quả cho nhân viên

Cụ thể, việc lập kế hoạch giao việc hiệu quả sẽ giúp hạn chế được những rủi ro. Nhà quản lý cần phải có một kế hoạch phù hợp nhất. Đi từ việc xác định các yếu tố về mục tiêu, đối tượng, kế hoạch thực hiện cho đến việc theo dõi, đánh giá kết quả đạt được:

  • Xác định đúng trọng tâm vấn đề (tức mục tiêu công việc): Ví dụ lượng traffic của doanh nghiệp trong tháng gần nhất cần đạt được là 950,000 lượt xem. Chúng ta cần xác định phải thực hiện như thế nào để đạt được mục tiêu đó trong một tháng.
  • Tổ chức phân công: Nhà quản lý cần xem xét tiến trình và sắp xếp các công việc theo mức độ quan trọng  – khẩn cấp khác. Điều này tạo ra một hướng đi logic và đảm bảo tối ưu hiệu quả thực hiện. 
  • Chọn đối tượng phụ ứng: Đây là thời điểm thích hợp để nhà tuyển dụng tìm kiếm những đối tượng phù hợp về khả năng và trình độ.
  • Thiết lập kế hoạch: Tập trung triển khai các bước gồm các nhiệm vụ chi tiết và tiến hành thực hiện công việc
  • Theo dõi và đánh giá quá trình thực hiện: Kiểm tra và thúc đẩy các nhân viên. Phản hồi, báo cáo để tìm ra những bất cập và điều chỉnh kịp thời. Đánh giá hiệu quả công việc và rút ra những kinh nghiệm.

Xem thêm: 4 cách thúc đẩy sự phát triển nhân viên tại công ty

Từ những lý do đó, ta nhận thấy các nhà quản lý như những người nghệ sĩ và việc chọn đúng người – đúng việc  là cả một nghệ thuật.

Nghệ thuật giao việc của nhà quản lý

John Quincy Adams, một nhà chính khách nổi tiếng đã từng chia sẻ:

“Nếu hành động của bạn thôi thúc người khác ước mơ nhiều hơn, học tập nhiều hơn, hành động nhiều hơn, và trở nên tốt đẹp hơn, bạn chính là một nhà lãnh đạo thật sự”

Giao việc không chỉ đơn giản là sự chuyển giao lại quyền hạn và trách nhiệm cho nhân viên. Đối với họ, đó còn là sự tin tưởng từ tổ chức. Họ sẽ cảm nhận được sự động viên và được đóng góp tạo ra các giá trị chung cho doanh nghiệp. Đó là một hành động nên được thực hiện.

Hãy là một “đàn anh” đúng nghĩa

giao việc

Mỗi nhà quản lý, lãnh đạo nhân sự hay sếp đều là những người đã từng trải nghiệm. Vì thế, bạn phải thể hiện mình là đàn anh đúng nghĩa. Hãy làm gương cho nhân viên của mình từ những hành động dù là nhỏ nhất. 

Muốn nhân viên của mình đi đúng hướng, bạn nên có những mô tả cụ thể về các mục tiêu cần đạt được. Bên cạnh đól bạn cần phải là một hình mẫu xứng đáng để nhân viên học tập. Hãy là phiên bản tốt hơn ngày hôm qua vì đối với nhân viên. Vì tất nhiên, không gì hiệu quả hơn bằng hình mẫu trực tiếp.

Dấn thân và đồng hành cùng nhân viên

Đừng tạo ra khoảng cách quá xa giữa bạn và nhân viên. “Chỉ trỏ”, “ra lệnh” dường như không thể khiến một tập thể tốt hơn. Mỗi nhà quản lý hãy đơn giản chia sẻ và cùng nhân viên trải nghiệm công việc. 

Họ cần thấy được sự nhiệt thành của nhà lãnh đạo, sếp,.. để có cho mình mong muốn được dấn thân. Chính điều này cũng quyết định đến khả năng đồng hành của một nhân viên. Vì vậy, hãy cố gắng tạo nên cảm giác đồng hành với nhân viên. Nhà lãnh đạo có thể ứng dụng lý thuyết tháp nhu cầu Maslow để hiểu thêm về những mong muốn của nhân viên mình. Nếu thấu hiểu nhân viên và tạo được sợi dây kết nối thì bạn là nhà lãnh đạo tài tình.

Xem thêm: Tháp nhu cầu Maslow và ứng dụng trong quản lý nhân sự

Lưu tâm về sự chi tiết

Là một người quản lý, một người sếp, bạn không nên chỉ giao việc cho xong. Nhân viên luôn có những thắc mắc cần bạn giải đáp. Nhân viên luôn mong muốn nhận được lời khuyên bạn. Nếu là một nhà quản lý giỏi, bạn nên giải thích vấn để để giúp họ có trải nghiệm tốt nhất với công việc. 

Cung cấp những thông tin giúp nhân viên nắm rõ chi tiết vấn đề. Nó còn giúp giảm thiểu những rào cản phát sinh. Từ đó, họ thực hiện công việc theo đúng với định hướng đề ra. Cũng từ đó mà đảm bảo được hiệu suất công việc một cách tốt nhất. Ngoài ra, nếu nhân viên gặp những vấn đề khó khăn, nhà quản lý cần giúp đỡ họ. Nhà quản lý có thể chỉ ra những điều thú vị trong nhiệm vụ/công việc mà nhân viên đang đảm nhận. Đó là cách kích thích động lực làm việc của họ; hạn chế đi tình trạng chán nản có thể xảy ra.

Lời kết

Giao việc cho nhân viên là cả một nghệ thuật. Nghệ thuật được xây dựng trên cơ sở tính thần thấu hiểu. Nhà quản lý không chỉ quan tạm đến năng lực, trình độ mà còn kể đến sự phụ ứng. Giao việc còn có ý nghĩa quan trọng về mức độ đồng hành tại một công ty. Vì vậy, hãy là một nhà quản lý tải năng. Cho họ thấy rằng bạn luôn dõi theo họ, tạo những điều kiện tốt nhất để phát để phát huy toàn bộ năng lực. 


Tuyển Dụng Nhân Tài IT Cùng TopDev
Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products

Bí quyết deal lương giúp bạn “lật bài ngửa” với nhà tuyển dụng

deal lương

Deal lương được xem là một thách thức lớn nhất trong buổi interview. Vì việc deal lương như là một điểm nhấn quan trọng. Cùng với các hệ giá trị về năng lực như sự tin tưởng – ấn tượng ban đầu, bản lĩnh cá nhân,…deal lương sẽ là phần chốt lại quá trình phỏng vấn.

Chắc bạn sẽ không xa lạ gì với câu hỏi: “Bạn mong muốn mức lương bao nhiêu?” Đây là câu hỏi được nhà tuyển dụng dùng để đánh giá toàn diện hơn về một ứng viên. Liệu bạn đã có những kỹ năng deal lương cần thiết để đáp trả nhà tuyển dụng chưa? Qua bài viết sau đây, TopDev sẽ chia sẻ cho bạn bí quyết deal lương hiệu quả, giúp bạn “lật bài ngửa” những nhà tuyển dụng khó nhằn nhất.

Tổng quan về lương Gross – lương Net

deal lương

Trước khi bắt đầu tìm hiểu những bí quyết đàm phán về lương bổng, bạn cần nắm những kiến thức cơ bản về 2 loại lương sau: Lương gross và lương net.

Lương Gross là phần tổng thu nhập của người lao động. Nó bao gồm cả các khoản đóng bảo hiểm và thuế. Mức lương thực nhận của người lao động sẽ phải trích ra một phần để đóng bảo hiểm và nộp thuế thu nhập cá nhân.

Lương Net là lương thực nhận của người lao động sau khi đã trừ hết các khoản chi phí bảo hiểm và thuế thu nhập cá nhân.

Xem xét thực tế, nhiều người nghĩ lương Net có lợi hơn. Tuy nhiên, khi nhìn vào thực tế khi chúng ta quy đổi lương Net sang Gross và ngược lại, số tiền người lao động nhận được không đổi. Dù bạn thỏa thuận với nhà tuyển dụng bằng cách nào, họ đều sẽ tính toán để lương Net và lương Gross ở mức tương đương với nhau.

Ví dụ: Mức lương Gross là 16,000,000 VND ~ Net 14,154,000 trong trường hợp đóng bảo hiểm trên lương chính thức.

Vậy nên khi nhà tuyển dụng quyết định trả bạn mức lương Gross là 16,000,000 VND, nếu bạn đàm phán mức lương Net thì lương của bạn sẽ là 14,154,000 và ngược lại. Về cơ bản lương bạn nhận được vẫn không đổi dù bạn đàm phán lương Net hay Gross.

Tính lương chuẩn với công cụ tính lương gross – net từ TopDev

Deal lương hiệu quả khi phụ ứng với từng trường hợp

Bạn không thể ngồi đó nở một nụ cười tươi để giải quyết cho câu hỏi mức lương mong muốn từ nhà tuyển dụng. Điều đó vô tình làm bạn mất đi thiện cảm. Đừng để sự bối rối, thiếu tự tin ảnh hưởng đến suy nghĩ và câu trả lời của bạn. TopDev sẽ chỉ ra cho bạn cách deal lương hiệu quả theo từng trường hợp thực tế.

Deal lương khi bạn là ứng viên nhảy việc, đã có kinh nghiệm

Nếu là người đi đã từng đi làm, bạn sẽ có nhiều lợi thế hơn trong việc deal lương. 

Cụ thể, trong trường hợp nếu vị trí mới của bạn tương ứng với vị trí tại công ty cũ, hãy xem xét:

  • Khối lượng công việc bạn sẽ đảm nhận có tương ứng với bản mô tả chi tiết công việc (Job Description) ở doanh nghiệp cũ hay không?
  • Đánh giá mức độ, hiệu suất công việc mà mình từng thực hiện ở vị trí cũ.

Khi tủ tự tin với năng lực hiện tại, bạn có thể bắt đầu deal lương. Cụ thể, bạn hãy deal một mức lương mong muốn với mức độ gia tăng từ 15-20% so với mức lương cũ. Hãy tự tin nếu điều đó phù hợp với năng lực của bạn. 

>>> Xem thêm: 5 lưu ý để viết đánh giá hiệu suất của bạn

Ngược lại, nếu vị trí mới có nhiều điểm khác so với vị trí cũ, bạn nên có những chiến lược thông minh hơn. Có thể bạn e ngại vì bản thân chưa đủ tự tin để deal một mức lương cao hơn. Hãy bình tĩnh và đưa ra cách thức giải quyết phù hợp.  

Cụ thể, bạn có thể deal một mức lương bằng hoặc cao hơn mức lương ban đầu. Tuy nhiên tỉ lệ gia tăng không quá 10%. Điều bạn cần quan tâm lúc này là thời gian trải nghiệm. Tại sao lại như thế?

Vì bạn cần thời gian để thích ứng với công việc mới. Chính điều này giúp bạn đánh giá được mức độ phù hợp với công việc. Sau một khoảng thời gian thử sức và học hỏi, bạn sẽ dễ dàng thương lượng về một mức lương mong muốn hơn.

Deal lương khi bạn chưa từng có trải nghiệm phỏng vấn

Đây được xem là trường hợp khá thách thức. Vì bạn là một ứng viên mới ra trường, chưa từng đi phỏng vấn. Kiến thức về lương bổng và sự chuẩn bị còn hạn chế.

deal lương

Nếu nhà tuyển dụng không đề cập về lương bổng, bạn đừng nhắc đến nó. Trừ khi bạn rất tự tin về khả năng của mình. Nếu cho rằng bản thân đủ trải nghiệm, bạn có thể thỏa thuận ngay với nhà tuyển dụng.

Tuy vậy, bạn vẫn nên kiểm soát tốt mong muốn của mình. Nếu  bạn là diện first job- first interview, mọi chuyện còn quá xa lạ. Điều quan trọng nhất lúc này là sự thấu hiểu về thị trường nhà tuyển dụng và những mong muốn của mình.

Khoảng cách giữa trường đại học và thị trường làm việc nó thật sự quá lớn. Và vấn đề nằm ở chỗ, bạn chưa hiểu được nhà tuyển dụng họ cần gì. Đó là rào cản khiến bạn mãi loay hoay, không biết thể hiện mình như thế nào? Có tốt hay chưa? Vì vậy nếu bạn vội vàng deal lương khi còn quá non nớt, đó là một nước đi sai lầm. Bạn nên nhớ, chưa đến lúc để bạn kỳ kèo nhà tuyển dụng về lương bổng.

>>> Xem thêm: Tips lời khuyên giúp nhà tuyển dụng phỏng vấn ứng viên hiệu quả

Thời điểm tuyệt vời nhất đối với một bạn trẻ vừa ra trường để thảo luận về vấn đề lương bổng cũng là từ 3-6 tháng thử việc. Lúc này bạn sẽ có độ chín nhất định. Khoảng thời gian ấy đủ để bạn hiểu được những mong đợi từ doanh nghiệp. Đồng thời, thể hiện được năng lực của mình và sự cam kết về tính trách nhiệm.

Deal lương khi thách thức đạt đến giới hạn

Giới hạn chính là cách mà nhà tuyển dụng đặt ra để thử thách tính chân thật của bạn.

deal lương

Họ cố hỏi bạn về mức lương với hai giả thuyết như sau:

Một là, bạn quá phô trương về bản thân. Hay đó là cách bạn đang phóng đại về khả năng của chính mình. Thực tế, năng lực của bạn không như thế. Nhà tuyển dụng đủ sự dày dặn  để nhìn để nhìn thấu được cái bạn sở hữu. Họ cố tình hỏi vì đã đến lúc khép lại cuộc hội thoại thiếu chân thật này.

Hai là, bạn là ứng viên họ đánh giá cao. Có thể bạn có những tố chất và kỹ năng thích hợp cho vị trí của họ. Bạn có thể không giỏi nhưng bạn có những điểm đặc biệt. Họ hỏi bạn về lương để xem xét cách bạn đối mặt với nó như thế nào. Cách bạn trả lời và dám vượt qua thách thức sẽ thể hiện rõ bạn là ai. Đó là những gì họ cần thay vì một ứng viên chỉ mãi nói về những điều hay ho.

Bạn cần phải tự tìm hiểu và có sự chuẩn bị tốt nhất trước buổi phỏng vấn. Không một công thức deal lương nào hiệu quả bằng những trải nghiệm cá nhân. Những kỹ năng giao tiếp, điều tiết cảm xúc, các kiến thức về lương bổng,…sẽ giúp bạn hoàn thiện năng lực. Qua đó, bạn sẽ đủ sức dẫn dắt và thể hiện mình một cách trọn vẹn trong suốt buổi interview. Nếu nắm bắt được mục đích bản thân, hiểu rõ mong đợi của nhà tuyển dụng, bạn sẽ tự khắc có những phản hồi khôn ngoan.

Lời kết

Mức lương chính là cái phản ánh trực tiếp sự cống hiến và giá trị mà bạn mang lại cho doanh nghiệp. Hãy là người thật sự bản lĩnh, nghiêm túc và tâm huyết tạo ra các giá trị cho doanh nghiệp. Có như thế, chắc chắn rằng những đãi ngộ về mức lương sẽ không làm bạn phải thất vọng. Một lần nữa, đừng quên những trải nghiệm thực tế và rèn luyện các kiến thức để mình có đủ năng lực deal lương với nhà tuyển dụng.

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

Xem thêm Top các vị trí tuyển dụng ngành it hot nhất trên TopDev

Những Project Cá Nhân Giúp Mình Lên Trình Senior Javascript

project css
Những project cá nhân giúp mình lên trình senior Javascript

Bài viết của tác giả: Afonso Pacifer

Project Javascript – Một trong những quyết định quan trọng nhất mình rút ra được trong sự nghiệp làm dev đó chính là phải “vượt lên” việc chỉ dùng tool

Mình quyết định tạo ra tools của bản thân, không phải để bán hay với mục đích thương mại gì, mà chỉ để thực sự hiểu cách mà những thứ công nghệ này hoạt động và cải thiện kỹ năng mình thế nào. Và cùng xem tiếp câu chuyện ngắn mình đã lên trình bản thân với các project cá nhân cuả mình.

Tìm việc làm Javascript cho bạn

Thử thách đầu tiên với project CSS cá nhân

Mình luôn là một “CSS guy”. Năm 2015, được sử ủng hộ từ bạn bè, mình đã tham gia thử thách Write Code Every Day. Nói đơn giản là mình làm trong những project open source hàng ngày trong khoảng 1 năm.

html/css

Những ngày đầu coding thì kỹ năng Javascript của mình còn rất hạn chế. Và mọi thứ trở nên khá dần khi mình nhận lời mời để nói chuyện tại Front in Valle (một hội thảo về front-end khá lớn tại nuớc mình – Brazil) mà mình có thể nói về bất kỳ chủ đề nào. Mình đã có 1 ý tưởng khá độc đáo: đó chính là mình sẽ tìm hiểu về javascript để tạo ra một cái CSS preprocessor (Bộ tiền xử lý CSS) của bản thân.

Banana CSS

banana css

Thế là năm 2016 mình đã tạo ra một bộ tiền xử lý CSS được gọi là banana CSS, với mục đích là để học javascript, thế nhưng cuối cùng nó lại là Node.js, làm thế nào để viết CLI, lint, unit test, JSDocs, continuous integration, data structure (cấu trúc dữ liệu), AST, làm thế nào để tạo plugin gulp, …

banana css

Các bạn có thể tham khảo Project Banana CSS tại đây.

  10 CSS Animation Tools phổ biến
  5 điều phiền toái nhất của CSS
  Kinh nghiệm lập trình: 9 cảnh giới mà bạn có thể đạt tới

Đào sâu hơn về front-end development

Lúc này thì mình thật sự cần phải hiểu hơn javascript trong browser, nên mình đã cân nhắc về tool chính mà mình dùng hàng ngày và đ đến kết luận rằng nó chính là React.js

Cho nên…

millenium.js

Năm 2017 mình tạo ra project gọi là millenium.js, với dòng giới thiệu là:

javascript millenium.js

Một thư viện dùng để tạo ra Functional Stateless Components và render với Virtual DOM. Thích hợp để tạo những app cực nhẹ và nhanh với Redux.

Hay ngắn gọn hơn:

🚀 Render your front-end in less than 12 parsecs (Render front-end với chưa tới 12 parsecs).

Với project này. mình đã tìm hiểu về performance, những ví dụ để tạo library front-end, thuật toán, JSX, … Đương nhiên mình cũng giữ lại những best practice của các project cũ.

millenium.js redux

Xem phần DEMO online với Redux.

Các bạn có thể tham khảo project millennium.js tại đây

Khám phá những thứ mới

Năm 2017 sau khi xem phim Ready Player One, mình quyết định sẽ tạo game với javascript.

Thật ra để tạo một cái game với javascript khá đơn giản, bạn chỉ cần chọn tool (khá nhiều lựa chọn), đọc document, thử nghiệm là xong.

Nhưng, lựa chọn của mình mình là: Tạo một cái tool mới chỉ để làm game mà thôi.

Với project này, mình tự đặt ra một số rule khá hài như:

  • Không dùng Canvas/WebGL
  • Chỉ dùng CSS để render animations
  • Viết code functional
  • Tối đa code isomorphic/universal

burnout.js

Cuối cùng thì mình tạo ra burnout.js:

javascript

Công cụ game 2D để quản lý va chạm

Với project này, mình đã hiểu hơn về functional programming, DOM performance và những thuật toán (để tính toán những va chạm) và nhiều thứ khác

Link project burnout.js

Dùng chung tool CSS từ project này với project khác

Tới thời điểm này, mình nhận ra mình nên tạo ra một cái tool automated testing (kiểm tự động).

N.O.M.s

🔮 Universal/isomorphic javascript unit tests for witches.

[Unit test javascript universal/isomorphic dành cho phù thủy]

Khi đang làm burnout.js mình tranh thủ build N.O.M.s (testing tool) với 100% burnout.js unit tests sử dụng thư viện N.O.M.s

Mục đích của việc tạo ra test library là gì?

  • Có thể hoạt động trên browser và Node.js (universal/isomorphic)
  • Tạo tất cả assertions với pure Javascript (Javascript đơn thuần) (không sử dụng browser APIs hay module Node.js)
  • Sử dụng Emojis.
  • Không sử dụng CLI custom để chạy test.

html/css

Link N.O.M.s project.

Có đáng để “sáng chế” lại mọi thứ hay không?

Sau những projects này (và rất nhiều những project khác), năm 2019/2020 mình tập trung build sản phẩm cho doanh nghiệp, tạo ra những app Front-End phức tạp và lead một team full-stack.

Đúc kết lại, từ những năm cuối thực hiện các dự án open source, mình đã nâng trình technical lên rất nhiều và hầu như không gặp phải khó khăn gì khi thực hiện các kiến trúc phức tạp khi sử dụng  React.JS, immutable.js, web components, flux, tests, PRPL pattern, back-end APIs (Node.JS/python), MongoDB, và rất nhiều những công cụ, tools cho web applications!

Kết thúc cái blog này mình sẽ nhắc lại câu nói từ đầu bài:

Một trong những quyết định quan trọng nhất mình rút ra được trong sự nghiệp làm dev đó chính là phải “vượt lên” việc chỉ dùng tool, mình đã tạo ra chúng!

Bài viết gốc tại Dev.to

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

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

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

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

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

Vấn đề

Bạn viết code, chạy thử trên localhost, yeah mọi thứ super nhanh

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

Nhưng khi chạy trên production thì mọi thứ sẽ trở nên như thế này

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

Sẽ có rất nhiều giải pháp để xử lý vấn đề này.

Tại sao chúng ta phải load một component mà user chưa sử dụng đến, thậm chí có khi trong suốt quá trình làm việc, user sẽ không đụng đến một số màn hình?

Giải pháp

Nếu bạn làm web nhiều thì chắc có nghe đến lazy load image, để giảm bớt số lượng request gởi đi và dữ liệu trả về cho lần load đầu tiên. Trong React cũng có khái niệm tương tự như vậy.

Tất cả những việc đó thực hiện được là nhờ sự thần thánh của webpack

Thông thường chúng ta import component như sau

import ScreenComponent from './ScreenComponent';

Vậy đã bao giờ bạn thử

import('./ScreenComponent');

Vâng, nó sẽ trả về 1 Promise!

Nếu import như thế, Webpack sẽ split file build ra và thực hiện việc load chỉ khi được gọi

Code ví dụ

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

import React, { Component } from 'react';
import Todo from './Todo';

constructor(props) {
    super(props);
    this.state = {
      value: '',
      todos: []
    }
}
// ...
render() {
    return (
      <div className="App">
        <header className="App-header">
          Add todo
        </header>
        <input value={this.state.value} onChange={this.changeValue} />
        <button onClick={this.submitValue}>Add</button>
        <hr />
        <Todo todos={this.state.todos} />
      </div>
    );
}

Nếu ở màn hình này, user chưa có gì trong state.todos, chúng ta không thực sự cần import Todo from './Todo';, chỉ khi user nhấn add để thêm một item vào trong state.todos chúng ta mới cần load component <Todo />

Thêm state.LLTodo để kiểm tra việc load component todo chưa, chúng ta đưa việc load này vào componentDidUpdate()

import React, { Component } from 'react';
//import Todo from './Todo'; // bỏ component import ở đây

constructor(props) {
    super(props);
    this.state = {
      value: '',
      todos: [],
      LLTodo: null
    }
}
componentDidUpdate(prevProps, prevState) {
    if (!this.state.LLTodo) {
      this.lazyLoadTodo();
    }
}
lazyLoadTodo = () => {
    const lazyLoad = import('./Todo');
    debugger; // để xem nó trả về gì
}

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

Nó đã trả về cho chúng ta một Promise, sửa lại hàm này thành async

lazyLoadTodo = async () => {
    const {default: Todo} = await import('./Todo');
    this.setState({LLTodo: Todo});
}

Chúng ta kiểm tra việc render này theo state.LLTodo

render() {
    const {LLTodo, todos} = this.state;
    const lazyLoadTodo = LLTodo ? <LLTodo todos={todos} /> : null;
    return (
      <div className="App">
        <header className="App-header">
          Add todo
        </header>
        <input value={this.state.value} onChange={this.changeValue} />
        <button onClick={this.submitValue}>Add</button>
        <hr />
        {lazyLoadTodo}
      </div>
    );
}

Để thực sự thấy được kết quả, chúng ta có thể build, hoặc trên mở tab network, khi nhập giá trị vào trong input, một file [tên].chunk.js sẽ được load thêm vào.

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

File 1.chunk.js được load khi component được update

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

Mở file này ra để check xem sau

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

Đúng là file component của chúng ta được được tách ra 😀

Lazy load react-router

Giờ xem xét phần chúng ta setup cho cái route, đại khái nó sẽ như thế này

import Home from './Home'
import Blog from './Blog'

<Switch>
    <Route exact path="/" component={HomeComponent} />
    <Route path="/blog" component={BlogComponent} />
</Switch>

Áp dụng lazy load component với route, ở đây mình viết thêm một hàm asyncComponent, nó sẽ nhận vào hàm import('path/to/file') và return về component đó.

import React, {Component} from 'react';

export default function asyncComponent(getComponent) {
  class AsyncComponent extends Component {
    static Component = null;
    state = { 
      // chổ này hơi tricky, trỏ về chính nó
      Component: AsyncComponent.Component 
    };

    componentDidMount(prevProps, prevState) {
      // không re-load nếu đã có rồi
      if (!this.state.Component) {
        getComponent().then(Component => {
          AsyncComponent.Component = Component;
          this.setState({ Component })
        })
      }
    }

    render() {
      const { Component } = this.state;
      if (Component) {
        return <Component {...this.props} />
      }
      return null;
    }
  }
  return AsyncComponent;
}

Hàm asyncComponent() này chúng ta sẽ truyền vào cho nó function là getComponent() (chính là hàm import)

Chỉnh lại cách chúng ta import component cho từng route

// Dynamically imported components
const Home = asyncComponent(() =>
  import('./Home').then(module => module.default)
)

const Blog = asyncComponent(() =>
  import('./Blog').then(module => module.default)
)

<Switch>
  <Route exact path="/" component={Home} />
  <Route path="/blog" component={Blog} />
</Switch>

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

Tổng kết

Việc lazy load component không quá khó, không cần thêm bất kỳ thư viện, config gì cả nếu bạn đang init project bằng create-react-app, nhưng nó sẽ là giải pháp phải làm khi file bundle của bạn đã quá lớn và ngày càng lớn hơ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 việc làm react hấp dẫn tại TopDev

Tìm hiểu chủ đề các vòng thi Kambria Code Challenge và sẵn sàng dự thi Quiz 04 ngay hôm nay

Code Challenge

Kambria Code Challenge là chuỗi cuộc thi và hackathon trực tuyến về lĩnh vực Trí tuệ nhân tạo được thiết kế để thu hút sự tham gia của các lập trình viên khắp nơi trên thế giới, kết nối họ trở thành một phần của cộng đồng các lập trình viên tại Kambria. Đây cũng là cơ hội để các bạn kiểm tra kiến thức về thuật toán AI, chứng minh các kỹ năng về lập trình của bạn, đồng thời nhận phần thưởng và phát triển cơ hội nghề nghiệp với các công ty công nghệ là đối tác của Kambria.

Kambria Code Challenge có tổng cộng 4 Quiz, trong đó Quiz 04 có giải thưởng lớn nhất với tổng trị giá $700. Mỗi Quiz sẽ xoay quanh từng chủ đề về AI, bao gồm:

🔹 Quiz 1: Multilayer Neural Network

🔹 Quiz 2: Convolutional Neural Network

🔹 Quiz 3: Recurrent Neural Network

🔹 Quiz 4: Reinforcement Learning

Hướng dẫn đăng ký dự thi Quiz 04 – Kambria Code Challenge

1️⃣ Truy cập app.kambria.io/bounty

2️⃣ Click Quiz 04 Bounty

3️⃣ Click vào nút Join This Challenge

4️⃣ Điền đầy đủ thông tin trên trang hồ sơ cá nhân

5️⃣ Nhận email xác nhận tham gia Quiz 04

6️⃣ Tham gia dự thi đúng giờ!

04 bao gồm 2 bounty với cấp độ & giải thưởng khác nhau

Quiz Bạn chỉ có thể tham gia 1 trong 2 bounty:

💎Standard Quiz 04 Bounty: tất cả mọi người đều có thể đăng ký tham gia. Bounty này có tổng cộng 15 câu hỏi với độ khó tương đương với các Quiz trước đây của Kambria Code Challenge.

💎Special Quiz 04 Bounty: chỉ những thí sinh đã tham gia ít nhất 2 Quiz của Kambria Code Challenge mới được tham gia Special Bounty. Special Bounty có tổng cộng 20 câu hỏi với độ khó cao hơn, cùng với giải thưởng lớn hơn.

Nếu bạn đủ điều kiện để tham gia Special Quiz 04 Bounty, hãy chú ý kiểm tra email thường xuyên. Kambria sẽ gửi email để hướng dẫn bạn tham gia vòng thi đặc biệt này.

—–

Thông tin Quiz 04:

Dịch vụ Thị trường cung cấp dịch vụ SaaS Landscape 2020

Thị trường cung cấp dịch vụ SaaS 2020

Thị trường cung cấp dịch vụ SaaS 2020 trong nước ta còn khá trẻ. Tuy Việt Nam cũng là nước luôn cập nhật xu hướng công nghệ của thế giới nhưng xu hướng thị trường SaaS và thị trường Điện toán đám mây vẫn còn là một thị trường khá trẻ và chỉ mới nhận được sự đầu tư và chú ý trong 1 vài năm trở lại đây.

Hiện tại thị trường cung cấp dịch vụ SaaS 2020 đã nhận được nhiều sự chú ý và ưu tiên phát triển hơn nhiều năm về trước, rất nhiều công ty công nghệ phát triển SaaS đã bắt đầu “trở mình” và đạt được nhiều sự quan tâm hơn. Nhờ các công ty công nghệ phát triển SaaS và đưa SaaS đến tay người dùng (các doanh nghiệp) nên thị trường cung cấp dịch vụ SaaS 2020 không còn ảm đạm như vài năm trước mà đã bắt đầu nhộn nhịp hơn. 

Trong báo cáo thị trường IT Landscape 2020 cũng đã đưa ra 1 vài số liệu của sự tăng trưởng trong thị trường này. Để có thể hiểu rõ tình hình cùng các số liệu trong báo cáo, trước tiên chúng ta cần có kiến thức tổng quát về thị trường SaaS.

Thị trường cung cấp dịch vụ SaaS 2020

Tổng quát Thị trường cung cấp dịch vụ SaaS 2020

Khái niệm SaaS

SaaS được sáng tạo và phát triển theo mô hình Điện toán đám mây, SaaS là từ viết tắt của “Software as a Service”, nó là một trong những hệ thống dịch vụ thuộc về phần mềm. Có thể hiểu những công ty SaaS là những công ty cung cấp dịch vụ chứ không phải buôn bán bất cứ sản phẩm nào liên quan đến phần mềm.

Hiểu theo cách đơn giản hơn, thì nó nghĩa là các công ty SaaS tự tạo hoặc phát triển phần mềm được vận hành trên nền tảng web. Dựa trên nhu cầu của người dùng, Sau đó họ bán lại dịch vụ theo hình thức khách hàng phải nạp tiền mỗi tháng trên tài khoản của khách để duy trì trạng thái hoạt động.

Ví dụ: khách hàng có nhu cầu tìm kiếm, phân tích thông tin, thứ hạng của đối thủ, SaaSu đó rất nhiều các công ty phát triển nền tảng cung cấp đủ theo các nhu cầu trên trên web của họ, bạn có thể tìm kiếm, phân tích thông tin, thứ hạng của bất kỳ đối thủ bạn muốn chỉ với điều kiện là bạn truy cập vào trang web của họ, đăng nhập vào tài khoản đã được thanh toán là bạn đã có thẻ sử dụng được những dịch vụ của họ.

Trong giới Công nghệ, SaaS được đánh giá là phần nổi trội, tiên tiến hơn so với các phần mềm on-premise cũ ( các phần mềm được mua lại từ các công ty phát triển phần mềm)

Tình hình thực tế

Có lẽ bạn sẽ không nhận ra rằng bạn đã từng sử dụng qua mô hình dịch vụ SaaS, đơn giản là vì bạn không phân biệt được đó là SaaS hay chỉ là một trang web bình thường. TopDev sẽ giới thiệu đến bạn 1 vài trang web SaaS trong các ngành nghề khác nhau như: trang vexere.com (hệ thống đặt vé xe khách), 1office.vn (nền tảng quản trị doanh nghiệp), videocv.vn (giải pháp phỏng vấn thông qua video), Amazon (trang mua sắm trực tuyến, Google (trang tìm kiếm), Adobe Creative Cloud (nền tảng Điện toán đám mây)… và còn nhiều nền tảng khác cho nhiều ngành nghề, nhu cầu khác nữa.

Có thể nói, SaaS hiện tại được phát triển với quy mô khá rộng, SaaS đã và đang phát triển rất mạnh tại thị trường nước ngoài. Chí nói đơn giản như sự phổ biến của Amazon và Google, có thể nói trên toàn thế giới rất ít ai không biết đến 2 ông lớn này. Thị trường SaaS tại Việt Nam tuy cũng đã có sự phát triển vượt bậc nhưng vẫn cần cố gắng rất nhiều mới có thể theo kịp thị trường thế giới.

Trong một bảng dự đoán thị trường SaaS 2022, các chuyên gia của BCC Research cho rằng thị trường công nghệ SaaS sẽ được định giá lên đến 94,9 tỷ USD vào năm 2022 (trước đó SaaS có giá 44,4 tỷ USD trong năm 2017).

  SaaS rồi còn gì nữa?
  Thị trường SaaS Vietnam - "Viên kim cương thô" mới cần "dũa" tại thị trường Việt Nam

Có thể thấy, chỉ trong vòng 5 năm mà tốc độ tăng trưởng và giá trị của thị trường SaaS đã tăng hơn gấp đôi, có nghĩa là CAGR (tốc độ tăng trưởng/năm) của thị trường SaaS rơi vào khoảng 16,4%/năm, đây thật sự là một số liệu tăng trưởng rất tuyệt vời của ngành.

Một trong những nguyên nhân chính có thể dẫn đến sự phát triển của SaaS có lẽ là do sự không giới hạn nhà cung cấp. Trong thị trường SaaS 2020, những ai có ý tưởng, tiềm năng, nguồn lực và tài nguyên điều có thể trở thành một công ty phần mềm dịch vụ SaaS.

Chính vì thế, SaaS có mặt trong rất nhiều ngành nghề là cho xu hướng của thị trường cung cấp dịch vụ SaaS 2020 sẽ đánh mạnh vào việc ưu tiên tích hợp giữa các dịch vụ SaaS với nhau thay vì độc lập phát triển. Việc tích hợp các dịch vụ SaaS với nhau giúp chúng có thể vận hành mượt mà, trơn tru hơn, tạo ra hiệu quả tốt hơn khi hoạt động độc lập chỉ với 1 dịch vụ SaaS.

Cũng chính vì lẽ đó nên thông thường 1 công ty SaaS thường phát triển rất nhiều dịch vụ SaaS khác nhau, có chức năng sử dụng độc lập và bổ trợ cho nhau. Theo báo cáo thống kê của BCC Research cứ trung bình 1 doanh nghiệp sẽ sở hữu 16 phần mềm (năm 2017).

Xu hướng thị trường cung cấp dịch vụ SaaS 2020 ở Việt Nam

Thị trường cung cấp dịch vụ SaaS 2020

Theo báo cáo thị trường IT Landscape 2020 cũng đã đưa ra 1 vài số liệu, mặc dù có những xu hướng sử dụng SaaS tại Việt Nam, song thị trường chưa thực sự hấp dẫn khi các công ty đất Việt còn khá cứng nhắc trong việc áp dụng thay đổi, chỉ 5-7% công ty đang ứng dụng SaaSaS. Tuy nhiên điều này cũng nói lên cơ hội cho các nhà cung cấp SaaS, họ cần đầu tư hơn về thời gian, về công sức và vốn trong quá trình giáo dục thị trường Việt Nam.

Nhìn qua bối cảnh hiện tại của các startup về B2B SaaS, phổ biến nhất là phần mềm quản lý bán lẻ và phần mềm chăm sóc khách hàng. Một số sản phẩm nổi bật khác thuộc các ngành HR, marketing, logistics, và cybersecurity. 

Về dự án remote.vn: Trao đổi về dự án hỗ trợ doanh nghiệp trong giai đoạn dịch COVID-19 – Vietnam Remote Work, Bộ trưởng Thông tin và Truyền thông Nguyễn Mạnh Hùng cho biết: “Dịch Covid-19 lây lan là do tiếp xúc. Công nghệ số là không tiếp xúc.

Vì vậy, cơ hội lớn nhất lúc này là đẩy nhanh chuyển đổi số, là tạo ra các ứng dụng công nghệ số, là đưa mọi hoạt động sản xuất kinh doanh lên môi trường số.” 

Ưu điểm

Với những lợi ích mà SaaS đem lại bằng việc tối ưu hóa sử dụng Internet, có thể thấy thị trường SaaS đang trở nên có tầm ảnh hưởng đối với ngành công nghệ. Trong đó có thể nói đếm một số ưu điểm như:

Tối ưu hóa chi phí cho doanh nghiệp

Ngoài việc hỗ trợ nghiệp vụ, thời gian, nhân sự cho doanh nghiệp mà SaaS còn hỗ trợ doanh nghiệp tiết kiệm rất nhiều chi phí cho các phần mềm hỗ trợ. Khi sử dụng SaaS doanh nghiệp không cần phải bỏ ra một khoản tiền lớn để mua các phần mềm.

Khi mua phần mềm, các doanh nghiệp sẽ phải thanh toán chi phí lắp đặt, đồng bộ hóa dữ liệu từ hệ thống với phần mềm, mua giấy phép sử dụng phần mềm…

Ví dụ, khi doanh nghiệp bạn muốn cài đặt phần mềm ERP, là phần mềm quản lý doanh nghiệp, bạn sẽ mất khoảng thời gian từ 1-4 ngày cho việc cài đặt, tích hợp phần mềm lên hệ thống của doanh nghiệp bạn, ngoài ra bạn còn phải tốn chi phí mua và chi phí bảo trì, nâng cấp…tổng các chi phí cho phần mềm quản lý ERP rơi vào khoảng 42 ngàn USD.

Thị trường cung cấp dịch vụ SaaS 2020

Trong khi đó nếu bạn sử dụng SaaS thì lại không như thế, cũng có cùng chung 1 chức năng nhưng người dùng chỉ cần đăng nhập trên nền tảng web là đã có thể sử dụng ngay mà không cần tốn thời gian cài đặt nhưng hiệu quả thì vẫn tốt

Đa số các mô hình chuẩn SaaS ngày nay đều có mục đích hướng người dùng đến 2 dạng: đó là dạng dùng thử (được tính theo lần hoặc ngày tùy công ty) hoàn toàn miễn phí, SaaSu thời gian dùng miễn phí bạn có thể nạp thêm tiền từng tháng để được sử dụng không giới hạn trong tháng và có thể unlock nhiều chức năng mở rộng hơn.

Dạng tiếp theo là dạng bán theo pack cho 1 hoặc nhiều tài khoản sử dụng chung trong 1 công ty, doanh nghiệp sử dụng có thể chọn gói mua theo tháng, quý hoặc năm tùy theo nhu cầu sử dụng có lâu dài hay không, vì thông thường để kích cầu doanh thu, các gói hạn mức 1 năm sẽ có giá và quyền lợi tốt hơn.

Các dịch vụ của SaaS còn có thể biến hóa dưới nhiều hình thức cung cấp các gói cơ bản, nâng cao và cao cấp để người dùng có thể lựa chọn. Khi bạn không còn nhu cầu sử dụng nữa bạn chỉ cần chọn ngưng sử dụng và ngưng thanh toán. 

Điều đặc biệt khi sử dụng SaaS là bạn có thể chủ động đăng ký sử dụng và quyết định ngừng sử dụng chỉ trong “một nốt nhạc” mà không phải mất quá nhiều thời gian, qua nhiều loại thủ tục rườm rà.

Ví dụ: Kênh xem phim Netflix là một kênh xem phim chất lượng cao được cả thế giới biết đến với nhiều bộ phim độc quyền do chính Netflix sản xuất. Trong 1 vài năm trở lại đây Netflix đang dần chiếm lĩnh thị phần người xem phim tại Việt Nam và việc “share acc” trong Netflix là một điều không còn xa lạ nữa.

Netflix cho phép người xem đóng tiền hằng tháng cho 1 tài khoản, nhưng trong 1 tài khoản lại có thể truy cập được cùng lúc 4 thiết bị điện tử để xem phim trên đó. Vậy có nghĩa là chỉ với 1 khoản tiền hằng tháng mà cùng lúc có thể đến 4 người sử dụng. Đó là một trong những hướng đi thông minh của Netflix.

  10 dự đoán hàng đầu của ngành IT trên toàn thế giới
  34 sản phẩm phần mềm Social Networking tốt nhất

Tối ưu hóa thời gian, nhân lực

Như đã nói ở trên, ngoài việc tiết kiệm chi phí, doanh nghiệp cũng sẽ tiết kiệm được cả thời gian và nhân lực khi sử dụng mô hình SaaS. Đối với mô hình cũ on-premise, các doanh nghiệp thông thường mất trung khoảng 6 tháng để có thể vừa lên kế hoặc vừa triển khai và vừa cài đặt hoàn chỉnh hệ thống on-premise (đôi khi phải tạm dừng 1 vài bộ phần để cài đặt, mượn nhân lực của công ty để hỗ trợ cài đặt). Còn với mô hình SaaS thì chỉ mất thời gian từ 1-2 ngày để tạo, thiết lập tài khoản sử dụng cho các nhân viên và training nhân viên sử dụng hệ thống.

Cập nhật hệ thống, các tính năng công nghệ mới trong SaaS nhanh chóng

Trong quá trình sử dụng các tính năng từ bất kỳ hệ thống on-premise truyền thống hay SaaS thì đôi khi sẽ xảy ra một chút trục trặc trong việc vận hành. Đối với các doanh nghiệp lâu đời còn sử dụng các hệ thống on-premise thì chắc hẳn doanh nghiệp đó phải cần “nuôi dưỡng” bộ phận IT riêng trong công ty để giải quyết những trường hợp đó, hoặc trong trường hợp muốn nâng cấp phần mềm, tính năng mới, sửa lỗi bugs… 

Ngược lại, đối với các doanh nghiệp sử dụng SaaS thì họ không cần phải tập trung và dành quá nhiều thời gian, nguồn vốn vào đó, vì đã có đội ngũ hỗ trợ từ các công ty cung cấp dịch vụ SaaS giúp họ làm điều này. 

Điểm lợi nhất của SaaS đó là, các doanh nghiệp SaaS sẽ luôn muốn dịch vụ phần mềm của mình là tốt nhất nên sẽ luôn nâng cấp, cập nhật bản mới liên tục với nhiều tính năng mở rộng hơn để có thể thu hút thêm người dùng, họ thường xuyên tối ưu các tính năng cũ và bổ sung thêm nhiều tính năng mới. 

Những doanh nghiệp sử dụng SaaS sẽ không cần phải mua hay cài đặt thêm bất kỳ phần mềm nào trên hệ thống nữa nhưng vẫn có thể sử dụng những tính năng mới đó  chỉ nhờ vào việc update bản cũ lên bản mới thông qua đường truyền Internet.

Chính vì sự thuận tiện tiết kiệm ấy mà phần lớn các doanh nghiệp sử dụng SaaS điều là các doanh nghiệp vừa và nhỏ vừa mới startup.

Thuận tiện cho việc sử dụng, thao tác bất cứ nơi đâu

topdev

Khác với phần mềm on-premise, mỗi lần muốn sử dụng thì bạn phải thao tác trên đúng thiết bị đã được cài đặt trong hệ thống của công ty điển hình như máy tính để bàn tại công ty.

Hiện nay, các doanh nghiệp SaaS đều hỗ trợ người dùng truy cập bằng nhiều loại trình duyệt khác nhau như Google Chrome, Cốc Cốc, Firefox,… từ các thiết bị, hệ điều hành khác nhau như iOS, MacOS, Windows, Android

SaaS được phát triển dựa trên nền tảng sử dụng phần mềm trên web thông qua kết nối Internet. Khi bạn đăng ký sử dụng SaaS, các doanh nghiệp sẽ cấp cho tài khoản đăng ký của bạn (1 hoặc nhiều tài khoản tùy theo nhu cầu) quyền hạn để sử dụng, chính vì thế trong trường hợp người dùng muốn sử dụng SaaS thì chỉ cần bất kỳ thiết bị nào có chức năng online trên trình duyệt là sẽ sử dụng được SaaS. 

Có khả năng tích hợp, kết hợp với các phần mềm SaaS khác

Điểm mạnh tiếp theo của SaaS đó chính là SaaS cho phép các phần mềm trao đổi dữ liệu qua lại với nhau (trong cùng hoặc khác ứng dụng/ nhà cung cấp miễn là được cấp phép) và cho phép đồng nhất dữ liệu thông qua hệ thống API.

Với điểm mạnh này của SaaS doanh nghiệp sẽ có cơ hội tiếp cận với các công nghệ mới, nhận được những dự đoán từ nhiều ứng dụng, khía cạnh và giá trị khác nhau, làm tăng năng suất, hiệu quả công việc gia tăng.

Đối với phần mềm truyền thống, nó được tạo ra dựa trên nền tảng vận hành độc lập, không liên kết với bất kỳ ứng dụng nào khác. Chính vì thế nó thiếu đi sự linh động, tính kết nối, mở rộng từ đó cho ra năng suất, hiệu quả thấp hơn so với SaaS. Đút kết từ những điểm yếu của hệ thống cũ nên khi phát triển SaaS các nhà cung cấp cũng đã cố gắng đẩy mạnh, lấy chức năng tích hợp là điều kiện kiên quyết để phát triển.

Mở rộng/thu hẹp quy mô sử dụng đơn giản

Một trong những ưu điểm phải kể đến của cả Điện toán đám mây và SaaS là cả 2 đều có thể dễ dàng mở rộng quy mô sử dụng lên gấp đôi, gấp 3 hoặc bất kể bao nhiêu bạn muốn, các tài khoản dùng để sử dụng SaaS cũng dễ dàng tạo mà không hề ảnh hưởng hay cắt ngang đến tiến trình hoạt động, cơ sở dữ liệu hoặc cơ sở hạ tầng…Điều này khá “hợp ý” với các doanh nghiệp không muốn mất quá nhiều thời gian vào việc chờ đợi hệ thống vận hành.

Nhược điểm

Trên thực tế, dù nền công nghệ trong và ngoài nước hiện nay phát triển rất mạnh, nhưng bất kỳ nền công nghệ nào cũng có điểm yếu của nó, thị trường mô hình SaaS cũng có những nhược điểm riêng của nó.

Tính bảo mật

Điểm yếu của SaaS là tính bảo mật kém hơn so với các phần mềm on-premise. Khi sử dụng SaaS thì máy chủ được đặt ở phía nhà cung cấp SaaS, các nhà cung cấp ấy sẽ lưu trữ và bảo toàn dữ liệu của các doanh nghiệp trên đám mây nên nhiều doanh nghiệp đã lo sợ dữ liệu của mình sẽ bị biến mất hoặc bị hack, rò rỉ thông tin của công ty. 

Việc SaaS không bảo mật tốt bằng SaaS cũng dễ hiểu vì các phần mềm on-premise được cài đặt và lưu trữ trên chính hệ thống của doanh nghiệp sử dụng, nếu có vấn đề rò rỉ thông tin thì phần lớn nguyên do đến từ chính phía doanh nghiệp đó.

Việc sử dụng phần mềm on-premise hay SaaS vẫn còn làm các doanh nghiệp nhức đầu nhưng khi thị trường Điện toán đám mây 2020 có sự phát triển vượt bậc, công nghệ 4.0 của Điện toán đám mây đã phần nào giải quyết được sự phân vân của các doanh nghiệp.

Với công nghệ mã hóa dữ liệu hiện đại cùng các điều khoản cam kết bảo mật đính kèm (Cam kết SLA) khi sử dụng đã phần nào làm giảm bớt rủi ro cho việc mất dữ liệu, rò rỉ thông tin… phần mềm SaaS đã ngày càng có chỗ đứng trong lòng các doanh nghiệp.

  Bạn đã sẵn sàng dấn thân thêm hàng trăm “version" của bản thân để thành công?
  Cùng Vincere lan tỏa đam mê, vững xây bệ phóng để vươn xa

Chỉ sử dụng được khi có Internet

tuyển dụng it

Vì là phần mềm được tạo trên nền tảng web nên người dùng muốn sử dụng SaaS phải truy cập vào web có kết nối mạng để có thể đăng nhập vào tài khoản có SaaS. Trong quá trình sử dụng, nếu đột nhiên đường truyền bị gián đoạn thì bạn cũng sẽ không sử dụng được nữa, bạn cũng sẽ không sử dụng đc SaaS trong trường hợp đang ở trên máy bay hoặc đang ở nơi không có mạng.

Đó cũng là một điểm yếu khi sử dụng SaaS đang được các nhà cung cấp cố gắng khắc phục tại thời điểm hiện tại bằng cách cung cấp thêm chức năng hỗ trợ cho việc sử dụng phần mềm SaaS dù đang ở ngoại tuyến.

Cập nhật tính năng nhiều 

Điểm mạnh của SaaS là thường xuyên cập nhật tính năng mới và miễn phí nhưng đó cũng chính là điểm yếu của SaaS. Chính vì quá thường xuyên nâng cấp nên đôi khi các nhân viên chỉ mới vừa làm quen với phần mềm thì đã được cập nhật bản mới và phải làm quen lại từ đầu. Đối với các công ty có tỷ lệ nhân viên cao tuổi chiếm phần lớn, khó khăn trong việc tiếp nhận công nghệ mới mỗi ngày thì nên cân nhắc khi sử dụng.

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

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