Home Blog Page 30

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

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

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

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

Promise JS là gì?

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

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

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

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

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

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

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

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

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

Ví dụ sử dụng Promise JS

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

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

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

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

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

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

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

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

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

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

console.log('1');

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

console.log(‘2’);

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

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

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

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

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

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

Promise JS thay thế “callback hell”

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Promise trong các vòng lặp

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

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

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

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

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

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

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

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

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

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

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

“Kim tự tháp” Promises

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Promise.race()

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

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

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

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

nguồn ảnh: @tapasadhikary

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

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

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

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

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

Cách giải quyết:

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

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

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

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

const add2 = x => x + 2

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

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

Promise.resolve(4).then(add2)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// console:
// "here bar"

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

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

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

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

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

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

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

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

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

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

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

Với đoạn code sau:

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

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

before
hello
after

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

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

button.onclick = e => getUsers

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

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

button.onclick = e => getUsers()

Cuối cùng, .finally()

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

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

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

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

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

Xem thêm:

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

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

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

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

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

Vấn đề

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

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

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

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

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

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

Serverless là gì?

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

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

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

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

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

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

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

  Docker to Serverless (Google Cloud Platform)

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

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

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

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

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

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

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

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

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

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

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

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

Serverless với Cloudflare Worker

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

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

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

Tổng kết

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

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

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

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

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

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

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

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

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

Phân biệt Java Core và Java

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

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

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

Java Core là gì?

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

Phân biệt Java Core và Java

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

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

Phân biệt Java Core và Java

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

Phân biệt Java Core và Java

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

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

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

Kết bài

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

Tác giả: Phạm Minh Khoa

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

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

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

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

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

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

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

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

Kỹ năng chuyên môn

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

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

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

Kỹ năng mềm

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

Kỹ năng giao tiếp

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

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

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

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

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

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

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

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

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

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

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

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

Kỹ năng lãnh đạo

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

Kỹ năng lãnh đạo

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

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

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

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

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

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

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

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

Tóm lại

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

Xem thêm:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

kinh nghiệm fix bug từ Senior Developer

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

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

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

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

3. Chia để trị – Divide and conquer

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

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

Divide and conquer

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

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

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

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

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

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

Đánh giá ảnh hưởng

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

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

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

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

verify issue fixed

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

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

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

6. Tham khảo

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

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

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

METRO.digital Vietnam culture and ways of working

Who are we?

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

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

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

What is our culture?

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

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

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

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

How do we work?

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

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

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

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

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

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

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

metro digital 3

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

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

quy tắc thiết kế API

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

Vấn đề

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

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

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

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

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

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

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

Một số quy tắc

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Quy tắc về response status code

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

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

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

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

Quy tắc về response body

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

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

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

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

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

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

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

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

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

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

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

Vietnam Web Summit 2023 – BỨC TRANH TOÀN CẢNH CÔNG NGHỆ TẠI VIỆT NAM

Vietnam Web Summit 2023

Bối cảnh công nghệ năm 2023 tiếp tục được định hình bởi Cuộc cách mạng công nghiệp 4.0. Các công nghệ mới như AI, Cloud, Data,… ngày càng phát triển mạnh mẽ, có tác động sâu sắc đến mọi lĩnh vực của đời sống, từ sản xuất, kinh doanh, dịch vụ, đến giáo dục, y tế, giải trí,… 

Đứng trước những cơ hội và thách thức từ sự phát triển phi thường của công nghệ, việc làm chủ và ứng dụng chúng vào đời sống là một trong những vấn đề được quan tâm. Vietnam Web Summit 2023 trở lại với chủ đề Human & Tech: Co-Create The Future, hướng đến phân tích bối cảnh công nghệ Việt Nam ở hiện tại đồng thời mở ra viễn cảnh mới, nơi sự sáng tạo được chắp cánh vươn xa nhờ có Công nghệ.

Vietnam Web Summit 2023

Human & Tech: Co-Create The Future – Chung sức đồng kiến tạo tương lai

Chúng ta đang ở một thời điểm mà thế giới luôn xoay chuyển không ngừng, công nghệ hiện đại liên tục ra đời và mang đến sự bùng nổ không tưởng. Không chỉ dừng lại ở vai trò hỗ trợ, lĩnh vực công nghệ hiện nay đang dần định hình tương lai của chúng ta.

Bởi thế, con người và công nghệ phải là hai cá thể không thể tách rời. Sự kết hợp hài hòa giữa khả năng sáng tạo của con người và sức mạnh đột phá của công nghệ sẽ góp phần mang đến một bức tranh toàn cảnh về tương lai đầy triển vọng.

Không chỉ nói đến phương diện gắn kết giữa công nghệ và con người, mà con người cũng cần có sự kết nối tư duy cùng nhau. Sự hợp tác giữa người với người, thông qua công nghệ, sẽ tạo nên những giải pháp tối ưu cho các bài toán, thách thức của thời đại.

Vietnam Web Summit 2023

Vietnam Web Summit 2023 – Hội nghị Công nghệ đáng mong đợi trong tháng 12 này 

Đi qua chặng hành trình 7 năm của mình, Vietnam Web Summit đã dần trở thành nơi gặp gỡ, kết giao của những tín đồ công nghệ. Tại đây, chúng ta sẽ cùng nói về những ý tưởng mới, những xu hướng dẫn đầu và cách mà công nghệ thay đổi cuộc sống.

Sự trở lại của Vietnam Web Summit 2023: Human & Tech: Co-Create The Future được kỳ vọng  mang đến cho người tham gia một câu chuyện mới. Không chỉ xoay quanh các chủ đề về Technical, Business và Marketing, sự kiện năm nay còn chứa đựng loạt nội dung mới mẻ về bài toán thu hút và giữ chân nhân tài.

Đặc biệt, sự kiện Vietnam Web Summit 2023: Human & Tech: Co-Create The Future sẽ mở đăng ký vé miễn phí dành cho tất cả những ai yêu thích và quan tâm đến bất kì lĩnh vực nào tại sự kiện. 

Một số điểm nhấn tại Vietnam Web Summit 2023: Human & Tech: Co-Create The Future

Cơ hội giao lưu diễn giả

Vietnam Web Summit 2023

Với sự góp mặt từ hơn 60 diễn giả uy tín đến từ các công ty công nghệ, người tham gia được lắng nghe chuyện nghề của họ và có cơ hội trực tiếp tương tác, phản biện.

Loạt chủ đề hấp dẫn

Cơ hội để trở thành một trong những người đầu tiên chạm tay đến những xu hướng công nghệ mới nhất với các nhóm nội dung về:

  • Bối cảnh công nghệ tại Việt nam
  • Nhân sự & định hướng phát triển nhân tài IT
  • Diễn đàn đổi mới công nghệ: AI, Cloud và hơn thế nữa.

Cơ hội kết nối và phát triển

Sự kiện mang đến một không gian dành riêng cho việc Networking dành cho các tín đồ công nghệ, các doanh nghiệp và khách hàng.

Vietnam Web Summit 2023: Human & Tech: Co-Create The Future mở ra một không gian công nghệ đầy mê hoặc, hứa hẹn mang đến cho người tham dự không chỉ là những kiến thức mới, mà còn là sự kết nối đầy giá trị giữa con người và công nghệ hiện đại. Từ đó mong muốn cộng đồng công nghệ nói chung và IT Việt Nam nói riêng sẽ ngày càng phát triển và kiến tạo nên một nguồn sức mạnh to lớn nữa.

Sự kiện năm nay sẽ được tổ chức tại hai địa điểm là thành phố Hồ Chí Minh và Thủ đô Hà Nội, quy tụ hàng chục Diễn giả uy tín như Hiếu PC, Philip Hùng Cao, Wilson Lieu, Sven Pruessing, Subbaiyan Ganapathy, Thảo Trần… cùng sự tham gia của các doanh nghiệp như Metro Digital, ABC, Vietguys,… Đây hứa hẹn là một trong những sự kiện về Công nghệ uy tín và đáng mong chờ nhất trong tháng 12 này. 

ĐĂNG KÝ THAM GIA HOÀN TOÀN MIỄN PHÍ TẠI: https://topdev.vn/s/oztngOJU

Tham khảo AGENDA sự kiện tại: https://topdev.vn/vws/agenda-vws2023

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

THÔNG TIN SỰ KIỆN | Vietnam Web Summit 2023

Hồ Chí Minh – 01.12.2023 – Grand Palace, 142/18 Cộng Hòa, P.4, Q.Tân Bình, TP.HCM

Hà Nội – 08.12.2023 – Vạn Hoa Thiên Sơn Plaza – 89 Lê Đức Thọ, Quận Nam Từ Liêm, Hà Nội

Thông tin chi tiết xem tại: https://vietnamwebsummit.comhttps://Topdev.vn/vws

________________________

Về TopDev – Đơn vị tổ chức sự kiện Vietnam Web Summit 2023:

TopDev hiện là một trong những nền tảng tuyển dụng chuyên về IT hàng đầu tại Việt Nam sở hữu hơn 300.000 profile lập trình viên và Cộng đồng Lập trình viên lớn nhất Việt Nam.  Ngoài ra, TopDev là một trong những đơn vị tiên phong ở lĩnh vực IT tại Việt Nam giúp xây dựng và phát triển thương hiệu tuyển dụng cho hàng trăm công ty công nghệ trong và ngoài nước. Hơn thế, TopDev còn là đơn vị chuyên khảo sát, phân tích và phát hành các báo cáo về thị trường và nhân lực IT tại Việt Nam cùng nhiều tính năng hữu ích cho cộng đồng Lập trình viên như Tạo CV online, Chuẩn hóa CV, Trách nghiệm tính cách, Quy đổi lương Gross-Net.

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

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

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

Hiện nay khi đi ứng tuyển công việc trên các trang TopDev, LinkedIn hay các tin tuyển dụng Facebook, chúng ta đều cần có CV. Khi chúng ta tìm việc, chắc chắn chúng ta không chỉ ứng tuyển cho một công việc hoặc một công ty duy nhất. Với việc ứng tuyển cho nhiều vị trí ở nhiều công ty khác nhau, nhiều bạn băn khoăn về việc nên viết một bản CV để rải đi nhiều nơi hay với mỗi nơi nên viết một bản khác nhau? Trong bài viết này mình sẽ giải đáp kỹ cho bạn phần này.

Câu trả lời nhanh là bạn nên có một bản “Master CV” hay “CV Chung” ghi lại tất cả những kỹ năng, kinh nghiệm, kiến thức bạn có – bản này dài bao nhiêu trang cũng được, không dùng bản này để ứng tuyển. Khi ứng tuyển, từ bản “CV Chung” ở trên, bạn chọn lọc thông tin sao cho phù hợp để thành một “CV Riêng”, dành riêng cho công việc bạn định nộp, cộng với việc thêm thắt một số từ khoá phù hợp (mình sẽ hướng dẫn bên dưới), bạn sẽ có một bản CV có cơ hội trúng tuyển cao. Cụ thể “CV Chung” và “CV Riêng” viết sao cho tốt bạn đọc tiếp ở dưới nhé.

1/ Cách viết bản Master CV – CV Chung

Gọi là “Master CV” tức là bạn có thể viết mọi thông tin có thể, giống như một “bách khoa toàn thư” giới thiệu về bản thân. Cụ thể các đề mục bạn có thể có trong một “CV Chung” đó là:

  • Thông tin cá nhân: Tên, Email, Số điện thoại. Địa chỉ LinkedIn với đa số chúng ta hoặc link Blog, Portfolio, Behance, Github với các bạn bên các mảng như Content, Thiết kế, IT.
  • Học vấn: Liệt kê từ học vấn đại học/cao đẳng, cho đến các khoá học ngắn hạn về kỹ năng mềm hoặc chuyên môn bạn học offline hoặc học online – không phân biệt kỹ năng gì hay ngành nghề gì.
  • Kỹ năng: Liệt kê tất cả các kỹ năng mềm (kiểu như giao tiếp, làm việc nhóm, thuyết trình) và kỹ năng cứng (ví dụ Marketing thì cần chạy quảng cáo Facebook, tổ chức sự kiện).
  • Kinh nghiệm & hoạt động ngoại khoá: Liệt kê hết các kinh nghiệm và hoạt động ngoại khoá bạn đã tham gia tại đây, với mỗi công việc cố gắng suy nghĩ 10-15 gạch đầu dòng khác nhau mô tả các đầu việc bạn đã làm (có kết quả công việc trong đó).
  • Thành tích & giải thưởng: Bất kỳ thành tích và giải thưởng nào từ trong trường học cho đến chỗ làm hoặc trong CLB, bạn nêu hết tại đây.
  • Người giới thiệu: Ghi ra tên, email, số điện thoại, chức vụ và công ty của bất kỳ người nào có khả năng nói tốt về bạn vào phần này.

“CV Chung” là nơi dùng để tổng hợp thông tin, vì vậy bạn không cần phải “suy nghĩ nhiều” để chọn lọc cái gì nên ghi cái gì không nên ghi. Khi nghĩ ra bất kỳ thông tin nào, cứ ghi hết vào bản CV này. CV này có thể dài nhiều trang, không nộp cho người khác nên không sao cả. Với bản CV này, mình gợi ý bạn nên dùng Google Doc hoặc Word để tạo, vì bản CV này không cần đẹp, chủ yếu để lưu trữ thông tin.

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

2/ Cách viết “CV Riêng” – cho riêng từng công việc bạn nộp

Nếu như ở trên bạn có thể viết “xả láng”, với CV dùng để nộp cho công ty, bạn nên chắt lọc trong khoảng tối đa 2 trang đổ lại. Các đề mục trong CV vẫn giống như ở trên, nhưng thông tin cần cắt gọn lại, cụ thể theo hướng dẫn dưới đây:

  • Thông tin cá nhân: viết và trình bày sao cho gọn gàng nhất trong khoảng 1-2 dòng. Đừng để địa chỉ dài (chỉ nên để Quận/Thành phố), đừng để link dài ngoằng kiểu https://www.linkedin.com/in/anhtuanle234/ mà hãy dùng tính năng hyperlink để chèn link (ví dụ: LinkedIn).
  • Kỹ năng: Bạn nên chọn lọc khoảng 6-7 kỹ năng cốt lõi liên quan nhất đến công việc, cố gắng sử dụng nhiều các kỹ năng cứng. Kỹ năng mềm thường ai cũng có, khó làm bạn ấn tượng với người khác. Ví dụ một người làm Content có bộ kỹ năng “Tìm kiếm thông tin”, “Thiết kế hình minh hoạ”, “Viết bài chuẩn SEO” sẽ hay hơn là “Giao tiếp”, “Làm việc nhóm”. Bạn có thể xem chi tiết hướng dẫn viết kỹ năng trong CV tại đây.
  • Kinh nghiệm: Mỗi công việc cũng chỉ nên tập trung khoảng 6-8 gạch đầu dòng. Mỗi gạch đầu dòng phải làm sao để có số liệu kết quả và chứng minh cho một kỹ năng đã viết ở kỹ năng.
  • Học vấn: Ngoài học vấn chính quy, bạn chọn ra 2-3 học vấn phụ bổ sung, đừng nên viết quá nhiều.
  • Thành tích & giải thưởng: có thể cân nhắc gộp chung nếu đó là thành tích của học vấn hoặc thành tích của kinh nghiệm làm việc.

  CV chuẩn ATS là gì? Bí kíp đậu phỏng vấn với CV chuẩn ATS

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

Sau khi đã hoàn thành việc cắt gọt ở trên, bạn có thể dành chút thời gian phân tích JD và website công ty để chọn ra những từ khoá hay, đặc trưng của công ty đó để đưa vào CV. Việc này giúp cho CV của bạn thu hút người đọc hơn và tăng cơ hội trúng tuyển hơn.

Chúc các bạn có một bản CV chỉn chu.

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

Xem thêm:

Sự khác biệt giữa Flexbox với Grid

Sự khác biệt giữa Flexbox với Grid

Khi nhắc đến bố cục layout trong Website thì các lập trình viên Frontend luôn có hai công cụ trợ giúp đắc lực là Flexbox và Grid. Cả hai đều có những đặc điểm riêng dành cho từng mục đích sử dụng khác nhau giúp tạo nên giao diện ứng dụng Web thống nhất trên nhiều kích thước màn hình. Bài viết hôm nay chúng ta cùng nhau tìm hiểu về sự khác biệt giữa Flexbox với Grid để xem khi nào nên sử dụng mỗi loại layout này nhé.

Xây dựng layout cho Website

Khái niệm layout được sử dụng để chỉ bố cục, cách sắp xếp, trình bày các thành phần trên một sản phẩm thiết kế, bao gồm cả tỷ lệ, khoảng cách và việc lựa chọn vị trí của từng phần tử. Với một Website, layout chính là cách dàn trang, sắp xếp vị trí các phần tử hiển thị lên trang.

Sự khác biệt giữa Flexbox với Grid

2 công cụ chính giúp chúng ta xây dựng layout cho một Website là Flexbox và Grid. Flexbox giúp bạn tạo ra layout 1 chiều (chiều ngang hoặc chiều dọc) và bạn sẽ thường được thấy và sử dụng nó trong những phần như header của trang chứa các nút (button) điều hướng. Nếu bạn muốn tạo ra một layout ở cả 2 chiều (chiều dọc và chiều ngang) thì lúc này Grid sẽ giúp bạn thực hiện.

Chúng ta cùng đi sâu hơn vào từng loại trên nhé.

Sự khác biệt giữa Flexbox với Grid

Flexbox

Ý tưởng chính của Flexbox là cung cấp một container có khả năng thay đổi các phần tử bên trong nó về mặt chiều rộng, chiều cao, thứ tự hiển thị để lấp đầy không gian có sẵn. Điều này sẽ giúp việc đối ứng trên các loại thiết bị hiển thị và kích thước màn hình trở nên linh hoạt và hiệu quả hơn.

Flexbox

Để triển khai Flexbox, chúng ta khai báo thuộc tính display: flex cho phần tử HTML trở thành flex container, các phần tử bên trong container được gọi là flex item. Trục chính sẽ là trục cùng chiều sắp xếp của các flex item được gọi là main axis, trục vuông góc với trục chính được gọi là cross axis.

Như hình dưới thì main axis là trục nằm ngang còn cross axis là trục dọc. Nếu chúng ta khai báo hướng của flexbox là nằm dọc (flex-direction: columns) thì sẽ ngược lại. Hướng của flex sẽ là từ trái sang phải và trên xuống dưới tương ứng với các thuộc tính startend.

Flexbox

Flexbox sẽ rất hữu ích đối với các thành phần như menu dọc, thanh điều hướng,… và rất thích hợp cho việc xử lý giao diện responsive.

  Hướng dẫn học CSS Grid toàn tập phần 1

  Vài vấn đề thường gặp khi làm việc với Flexbox

Grid

Nếu như Flex chỉ cho phép bố trí layout 1 chiều thì Grid là dạng bố cục 2 chiều, nghĩa là nó có thể quản lý cả cột và hàng – tương tự khi khi làm việc với bảng (Tables). Grid sinh ra nhằm xử lý nhiều giao diện phức tạp và giúp đi sâu vào tùy chỉnh từng vùng của giao diện. 

Grid

Để triển khai Grid chúng ta khai báo thuộc tính display: grid hoặc display: grid-inline cho phần tử HTML trở thành container. Các phần tử con trong container gọi là grid items, mỗi một hàng hay một cột bên trong nó được gọi là grid track. Hai bên lề trái phải, trên dưới của một grid tracks được gọi là grid line, nó sẽ được đánh số từ 1 đến n theo chiều trái sang phải và trên xuống dưới. Mỗi ô trong grid được gọi là grid cell, tập hợp nhiều ô tạo thành các hình vuông hay hình chữ nhật được gọi là grid area. Các khái niệm này khá thân thuộc và tương tự như các ô trong một bảng (Table).

Nhờ có thể tùy chỉnh giao diện theo cả 2 chiều khiến Grid được lựa chọn để giải quyết các giao diện phức tạp đặc biệt là dành cho những container có chứa rất nhiều items. Grid cũng đáp ứng được việc đối ứng trên nhiều loại màn hình khác nhau thông qua các thuộc tính repeat, mimax hay sử dụng đơn vị fr

Sự khác biệt giữa Flexbox với Grid

Điểm khác nhau cơ bản trước nhất giữa Flexbox và Grid là tư duy dựng layout, Flexbox sẽ lấy nội dung (content) làm nền tảng (content-first), từ đó bố trí các phần nội dung theo 1 trật tự để hiển thị lên màn hình; trong khi đó, Grid tạo ra layout trước (layout-first), sau đó xác định vị trí mà các phần tử được đặt vào rồi sẽ hiển thị lên.

Sự khác biệt giữa Flexbox với Grid

Cả 2 đều có ưu điểm trong việc dựng layout dành cho Website nhờ khả năng quản lý, kiểm soát tốt các phần tử con bằng cách phân chia không gian thích hợp, đáp ứng được responsive trên nhiều loại màn hình. Điểm khác biệt giữa Flexbox và Grid bao gồm:

  • Mục tiêu sử dụng: Flexbox thường dùng cho việc tạo ra các cấu trúc giao diện đơn giản, bố cục một chiều. Trong khi đó Grid có khả năng tạo ra những cấu trúc phức tạp với bố cục 2 chiều.
  • Trường hợp nên sử dụng: để sử dụng Grid, chúng ta thường phải xác định vị trí của các phần tử từ trước một các chính xác, chặt chẽ. Flexbox thì có thể sử dụng khi các phần tử con có kích thước không cố định.
  • Hỗ trợ trình duyệt: Cả 2 hầu như được hỗ trợ tốt trên các trình duyệt phổ biến, hiện đại hiện nay. Tuy nhiên nếu sử dụng Grid bạn có thể gặp phải vấn đề liên quan đến một vài tính năng sẽ thực hiện khác nhau trên các trình duyệt khác nhau.

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

Kết hợp giữa Flex và Grid

Trên một Website, để tận dụng được ưu điểm của cả 2 layout trên thì chúng ta thường kết hợp chúng với nhau và áp dụng vào tùy từng vị trí hay phần tử trên trang. Ví dụ như hình dưới đây, grid được sử dụng để dựng layout cho toàn trang còn flex được sử dụng cho việc tạo ra thanh header của trang.

Kết hợp giữa Flex và Grid

Việc kết hợp giữa Grid và Flex không chỉ giúp chúng ta tận dụng được ưu điểm của cả 2 layout trên mà đồng thời còn giúp khả năng đối ứng đa màn hình cho website trở nên linh hoạt và cải thiện trải nghiệm của người dùng lên rất nhiều.

Kết bài

Như vậy qua bài viết này chúng ta đã cùng nhau hiểu rõ hơn về 2 công cụ Flexbox và Grid cũng như cách sử dụng của chúng. Nắm rõ và kết hợp chúng với nhau giúp anh em Frontend Developer có thể linh hoạt xây dựng các Website theo đúng yêu cầu người dùng. Hy vọng bài viết hữu ích dành cho bạn và hẹn gặp lại trong các bài viết tiếp theo của mình.

Tác giả: Phạm Minh Khoa

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

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

IoB (Internet of Behavior) là gì? – Xu hướng của thời đại mới

IoB (Internet of Behavior) là gì?

Lại là IO, IO này chắc chắn không phải là input output hồi mới nghe khi lững thững bước chân vào nghề lập trình rồi, IOB là gì thì nghe còn mới. Chứ còn IoT (Internet Of Thing), IoV (Internet Of Vehicle) thì hẳn anh em đã quá quen.

Đoán bừa thế chứ nếu anh em không quen thì ghé đây đọc qua về IoT và IoV nha.

IoB là gì?Công nhận là công nghệ thay đổi cực nhanh, kéo theo đó là sự phát triển của các giao thức truyền thông mới. Xin mời anh em cùng đón đọc để hiểu thêm về IOB.

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

1. IoB là gì?

Luôn bắt đầu với định nghĩa, nhưng lần này có vẻ như không quá khó hiểu để làm với IOB

IoB offers a revolutionary way to monitor, control and model human behavior. As tech leaders in this ever-evolving industry, we must stay ahead of upcoming trends so that we can take advantage of its many benefits. IoB cung cấp một phương pháp mang tính cách mạng để giám sát, kiểm soát và mô hình hóa hành vi của con người. Với tư cách là những người dẫn đầu về công nghệ trong ngành không ngừng phát triển này, chúng ta phải đón đầu các xu hướng sắp tới để có thể tận dụng nhiều lợi ích của nó.

Vẫn hơi khó hiểu, sorry anh em. Để làm rõ hơn.

IoB là gì?
IOB nói chung là hệ thống các cảm biến, cũng có thể có một số công nghệ khác như camera, nhưng mục đích chung là sử dụng để theo dõi, phân tích và dự đoán hành vi của con người. Tất nhiên IOB không chỉ có mỗi IOB là thành được, bản thân trong đó còn có kết hợp AI (trí tuệ nhân tạo), ML (học máy), phân tích dữ liệu lớn, điện toán đám mây, thiết bị Internet Of Things (IoT), Mobile app,…

Cả một đống thứ trong đó nhưng tựu chung đều liên quan tới Behavior (hành vi của con người).

Vậy thu thập data để làm gì?

  Cập nhật công nghệ hiện tại và xu hướng mới trong tương lai
  Digital Twins – xu hướng công nghệ cho ngành IoT

2. Ứng dụng của IOB (Internet of behavior)

Sau khi đã có toàn bộ dữ liệu phân tích hành vi của con người. Dữ liệu được thu thập sau đó có thể được sử dụng cho nhiều mục đích khác nhau như phân tích dự đoán hoặc quy trình ra quyết định tự động.

Lợi ích chính của việc sử dụng công nghệ IoB là cải thiện hiệu quả và tăng năng suất nhờ tự động hóa được kích hoạt bằng phân tích dự đoán. Giờ đây, khi mà AI phát triển mạnh như anh em đã biết. Ta có thể kết hợp AI để phân tích mô hình hành vi trong thời gian thực. Cái này giúp cho mấy ông công ty đưa ra quyết định tốt hơn, nhanh hơn đồng thời giảm chi phí liên quan đến lao động thủ công hoặc mấy cái quy trình không hiệu quả.

Ứng dụng của IOB
Mà cái này chỉ là ví dụ nhỏ, còn từ hành vi có thể ứng dụng ti tỉ thứ, như phân tích hành vi mua sắm của khách hàng. Nếu nắm được hành vi thì rõ ràng có thể kích thích mua hàng nhiều hơn. Nghe thôi đã thấy IOB có vô vàn hiệu quả, chắc không không thua IOT đâu anh em!

Xem thêm các việc làm IoT tại TopDev

3. IOB hoạt động như thế nào?

IoB là một công nghệ mang tính cách mạng cho phép giám sát, kiểm soát và mô hình hóa hành vi của con người. Nó kết hợp sức mạnh của các công nghệ đã nói ở trên cho anh em ở trên. IoB đã được sử dụng trong nhiều ngành công nghiệp khác nhau như chăm sóc sức khỏe, bán lẻ, tài chính, giáo dục, giao thông vận tải, v.v.

3.1 Protocols và Ecosystem

Để hiểu IOB hoạt động như thế nào, anh em cùng xem qua một số protocols (giao thức) và ecosystem (hệ sinh thái) thường sẽ có mặt trong IOB.

Như ta đã biết thì IoB hoạt động bằng cách kết nối các thiết bị với nhau thông qua mạng hoặc giao thức như Bluetooth Low Energy (BLE). Loại kết nối BLE này cho phép trao đổi dữ liệu theo thời gian thực giữa các hệ thống khác nhau, sau đó có thể được phân tích bằng thuật toán AI. Hơn nữa mấy loại kết nối kiểu này thường được bảo mật bằng các kỹ thuật mã hóa như (TLS) để đảm bảo bảo vệ quyền riêng tư.

Protocols và Ecosystem
Hơn nữa, hệ sinh thái này cũng bao gồm các nền tảng cloud anh em thường biết như Amazon Web Services hoặc Microsoft Azure. Mà việc sử dụng hoặc đem cloud vào ứng dụng thì chắc chắn sẽ hỗ trợ tốt cho anh em lưu trữ lượng lớn dữ liệu một cách an toàn trên đám mây, khả năng mở rộng (scale) cũng tốt.

3.2 Công nghệ sử dụng

Để hệ thống IoB hoạt động hiệu quả, chắc chắn anh em phải áp dụng một số công nghệ.

Đã là theo dõi behavior thì không thể thiếu những cảm biến phát hiện những thay đổi của con người. Kế đến là giao thức truyền tải thông tin như Wi-Fi hoặc BLE, khả năng tính toán biên cho phép xử lý cục bộ, thuật toán ML phân tích dữ liệu được thu thập, cơ sở dữ liệu để lưu trữ thông tin và API hỗ trợ tích hợp với các ứng dụng hoặc dịch vụ khác.

IOB
Cả đống này kết hợp chung với nhau để tạo ra một hệ thống thông minh có khả năng hiểu các kiểu hành vi của người dùng theo thời gian. Sau khi đã hiểu rồi, bản thân hệ thống anh em buidl lên có thể đưa ra dự đoán về các hành động trong tương lai dựa trên các hành vi trong quá khứ.

3.3 Thách thức trong quá trình xây dựng IOB

Cái khó nhất mà cũng xem như là quan trọng nhất khi anh em xây dựng hệ thống IOB là anh em phải hiểu phải hiểu các giao thức và hệ sinh thái liên quan đến IoB.

Không những bản thân IOB, các công nghệ được sử dụng để triển khai nó anh em cũng cần phải có lượng kiến thức nhất định. Đơn cử như Cloud, AI, ML, nếu chỉ có data behavior mà không có các công nghệ đi kèm này thì không có ý nghĩa gì.

4. Tương lại rộng mở cho IOB

Không ra đời sớm như IoT, cũng không đang phát triển nóng như IOV (internet of vehicle), tuy nhiên sự phát triển và sử dụng công nghệ IoB đang phát triển nhanh chóng, với những xu hướng mới đang nổi lên trong ngành.

Như năm nay, theo trend và sự phát triển và sử dụng AI ngày càng trở nên phổ biến để phân tích hành vi tự động được hỗ trợ bởi AI. Những giải pháp này có thể giúp xác định các mẫu hành vi của người dùng mà khó có thể phát hiện theo cách thủ công truyền thống.

Còn đối với thu thập dữ liệu, trước đây thì cũng khó chứ không phải dễ đâu anh em, nhưng giờ đây các thiết bị đeo cũng đang được chú ý như một giải pháp thay thế cho các cảm biến truyền thống để thu thập dữ liệu hành vi. Đầy thiết bị thông mình anh em có thể đeo bên người.

IOV (internet of vehicle)
Loại đeo này thì thuận tiện hơn để thu thập thông tin về hoạt động của người dùng mà không cần phải cài đặt thêm các thành phần phần cứng hoặc phần mềm gì. Các tiêu chuẩn về khả năng tương tác cũng đang được phát triển với sự tập trung ngày càng tăng, cho phép các nền tảng khác nhau sử dụng công nghệ IoB tích hợp với nhiều các hệ thống và mạng khác nhau.

Loại này thì vừa giúp bảo mật, vừa giúp người dùng theo dõi theo thời gian thực mà vẫn có tính bảo mật và quyền riêng tư. Lợi hại lợi hại

5. Tham khảo về IOB

IOB hứa hẹn sẽ phát triển trong những năm tiếp theo, anh em có thể tham khảo thêm tại.

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

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

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

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

Những đoạn code tùy biến cho VSCode cực đẹp (Phần 2)

Những đoạn code tùy biến cho VSCode cực đẹp

Tác giả: Trần Anh Tuấn

Từ trước tới giờ mình tùy biến VSCode rất nhiều và cũng có nhiều người hỏi về các đoạn code tùy biến đó, người này hỏi, người kia hỏi cho nên mình viết luôn bài này tổng hợp code những cái tùy biến đấy cho các bạn luôn!

VSCode

Trước khi mà các bạn có thể áp dụng được những đoạn code này vào thì các bạn cần xem video này trên kênh Youtube của mình để có thể hiểu cách làm nhé.

Tùy biến active tab 4 góc

:root{
--size: 5px;
}
.monaco-workbench
  .part.editor
  > .content
  .editor-group-container
  > .title
  .tabs-container
  > .tab.active.tab-border-top
  > .tab-border-top-container {
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  background-color: transparent;
}
.monaco-workbench
  .part.editor
  > .content
  .editor-group-container
  > .title
  .tabs-container
  > .tab.active.tab-border-top
  > .tab-border-top-container:before,
.monaco-workbench
  .part.editor
  > .content
  .editor-group-container
  > .title
  .tabs-container
  > .tab.active.tab-border-top
  > .tab-border-top-container:after {
  content: "";
  width: var(--size);
  height: var(--size);
  position: absolute;
  border: 2px solid;
  border-image-slice: 1;
}
.monaco-workbench
  .part.editor
  > .content
  .editor-group-container
  > .title
  .tabs-container
  > .tab.active.tab-border-top
  > .tab-border-top-container:before {
  top: 0;
  left: 0;
  border-right: 0;
  border-bottom: 0;
  border-image-source: linear-gradient(-45deg, #4dd78a, #20e3b2);
}

.monaco-workbench
  .part.editor
  > .content
  .editor-group-container
  > .title
  .tabs-container
  > .tab.active.tab-border-top
  > .tab-border-top-container:after {
  right: 0;
  bottom: 0;
  border-top: 0;
  border-left: 0;
  border-image-source: linear-gradient(-45deg, #6a5af9, #d66efd);
}
.monaco-workbench
  .part.editor
  > .content
  .editor-group-container
  > .title
  .tabs-container
  > .tab.active:before,
 .monaco-workbench
  .part.editor
  > .content
  .editor-group-container
  > .title
  .tabs-container
  > .tab.active:after {
  content: "";
  width: var(--size);
  height: var(--size);
  position: absolute;
  border: 2px solid;
  border-image-slice: 1;
}
.monaco-workbench
  .part.editor
  > .content
  .editor-group-container
  > .title
  .tabs-container
  > .tab.active:before {
  left: 0;
  bottom: 0;
  border-top: 0;
  border-right: 0;
  border-image-source: linear-gradient(-45deg, #fc6c8f, #ffb86c);
}

.monaco-workbench
  .part.editor
  > .content
  .editor-group-container
  > .title
  .tabs-container
  > .tab.active:after {
  top: 0;
  right: 0;
  border-left: 0;
  border-bottom: 0;
  border-image-source: linear-gradient(-45deg, #098dff, #2cccff);
}

Lưu ý: Ở đoạn code trên các bạn sẽ thấy đoạn .tab-border-top thì tùy vào theme, ví dụ theme Dracula sẽ có border-top nhưng một số theme khác thì lại có border-bottom nên class của theme khác có thể là .tab-border-bottom. Cho nên các bạn linh động thay class phù hợp là chạy ổn áp nha.

  9 VSCode extension hay ho

  Những đoạn code tùy biến cho VSCode cực đẹp bởi Evondev (Phần 1)

Tùy biến active tab line gradient

Sử dụng đoạn code này thì khi active tab sẽ có một đường line ở trên cái tab khi mà nó active trong VSCode và nó sẽ chạy qua chạy lại với nhiều màu sắc cho các bạn.

Lưu ý: Cũng tương tự như ở trên thì tùy thuộc vào theme thì sẽ có .tab-border-top hoặc .tab-border-bottom. Các bạn chỉ cần thay vào là chạy đúng kết quả các bạn muốn thôi nhé.

.monaco-workbench
  .part.editor
  > .content
  .editor-group-container
  > .title
  .tabs-container
  > .tab.active.tab-border-top
  > .tab-border-top-container {
  background-size: 400% 400%;
  background-image: linear-gradient(
    -45deg,
    #fc6c8f,
    #ff2ced,
    #ffb86c,
    #2cccff,
    #20e3b2,
    #ffcc70,
    #c850c0,
    #4158d0
  );
  animation: gradient 5s ease alternate infinite;
  height: 3px;
}
@keyframes gradient {
  0% {
    background-position: 0% 50%;
  }
  50% {
    background-position: 100% 50%;
  }
  100% {
    background-position: 0% 50%;
  }
}

Tùy biến font chữ cho các class

Tùy biến font chữ cho các class

Nhiều bạn hỏi mình sao làm cho chỗ này nó có font chữ khác thì mình cũng chia sẻ cho các bạn luôn. Đầu tiên các bạn cần tải font Dank Mono và cài đặt cho máy tính của các bạn tại đây

Sau khi tải và cài đặt xong cho máy tính rồi thì áp dụng đoạn code này vào là được

.mtk5,
.mtk26 {
  -webkit-font-smoothing: auto;
  font-family: "Dank mono", monospace;
}
.mtk26 {
  font-style: italic;
}

Hãy lưu ý rằng hai class .mtk5 và .mtk26 là tương ứng cho theme mình đang xài(Evondev Dracula), nếu các bạn xài theme khác thì tự tìm class nhé vì mỗi theme thì class nó khác nhau. Tìm như thế nào thì coi video ở trên cùng. Mình đã chỉ tận răng rồi cho nên mấy vấn đề này mình không có hỗ trợ riêng đâu nhé.

Nếu làm theo vẫn chưa được thì có thể tham khảo thêm đoạn code dưới đây, đoạn này bỏ vào trong file settings.json của các bạn nhé. Trong đó Evondev Dracula Normal Contrast là tên theme của các bạn

"[Evondev Dracula Normal Constrast]": {
  "textMateRules": [
    {
      "scope": [
        "entity.other.attribute-name.js",
        "entity.other.attribute-name.jsx",
        "entity.other.attribute-name.ts",
        "entity.other.attribute-name.tsx",
        "entity.other.attribute-name.html",
        "entity.other.attribute-name.pug"
      ],
      "settings": {
        "foreground": "#20e4b2"
      }
    }
  ]
}

Đoạn tùy chỉnh JSON ở trên mục đích là tách cái thuộc tính(attribute) trong thẻ HTML thành một scope riêng biệt để nó sinh ra một class mới như .mtk26 chẳng hạn rồi dựa vào class đó tùy biến màu khác, in nghiêng… tùy vào mục đích mỗi người.

Tùy biến con trỏ

.cursors-layer .cursor {
  background-image: linear-gradient(
    245deg,
    #fcb564,
    #ff65f2,
    #d66efd
  ) !important;
}

Bo góc Tab

.tabs-container > .tab {
  border-right: 0 !important;
}
.tabs-and-actions-container {
  padding: 4px !important;
}

.tabs-container {
  gap: 8px !important;
}
.tabs-container > .tab.active.tab-border-top > .tab-border-top-container {
  --general-gradient-secondary: #fcb564, #ff65f2, #ff69cf;
  height: 0.5px !important;
  background-image: linear-gradient(
    to right,
    var(--general-gradient-secondary)
  );
  width: 50% !important;
  left: 50% !important;
  transform: translate3d(-50%, 0%, 0) !important;
  top: -1px !important;
}
.tabs-container > .tab {
  border-radius: 100px;
  border-color: rgba(255, 255, 255, 0.12) rgb(25, 26, 33)
    rgba(255, 255, 255, 0.12) rgba(255, 255, 255, 0.12);
  border-style: solid;
  border-width: 1px 0 0 0;
}

Border gradient

.monaco-workbench
  .part.editor
  > .content
  .editor-group-container
  > .title
  .tabs-container {
  padding: 8px;
  gap: 8px;
}
.monaco-workbench
  .part.editor
  > .content
  .editor-group-container
  > .title
  .tabs-container
  > .tab.sizing-fit {
  background-color: #21222c !important;
  border-radius: 4px;
}
.tab.tab-actions-right.sizing-fit.has-icon.tab-border-top.active .tab-label {
  position: relative;
}
.tab.tab-actions-right.sizing-fit.has-icon.tab-border-top.active:before {
  content: "";
  position: absolute;
  background: #21222c;
  top: 50%;
  left: 50%;
  width: calc(100% - 2px);
  height: calc(100% - 2px);
  border-radius: inherit;
  transform: translate(-50.1%, -50.1%);
  border-radius: inherit;
}
.monaco-workbench
  .part.editor
  > .content
  .editor-group-container
  > .title
  .tabs-container
  > .tab.sizing-fit.active {
  background-image: linear-gradient(
    45deg,
    #fcb564,
    #ff65f2,
    #d66efd,
    #6a5af9,
    #2cccff,
    #20e3b2
  );
}
/* hide border top */
.monaco-workbench
  .part.editor
  > .content
  .editor-group-container
  > .title
  .tabs-container
  > .tab.active.tab-border-top
  > .tab-border-top-container {
 display: none !important;
 }

Dành cho ai dùng theme Evondev Dracula

Đây là toàn bộ code tùy biến hiện tại của mình, nếu bạn thích thì có thể copy vào hết là y hệt mình, tuy nhiên nếu bạn đang dùng máy có độ phân giải cao thì nó sẽ đẹp hơn nhé, ví dụ như Macbook chẳng hạn

:root {
 --gradient-dir1: to top right;
 --gradient-dir2: to bottom left;
 --gradient-dir3: to right top;
 --gradient-dir4: to left bottom;
 --gradient-dir5: to top left;
 --size: 5px;
}
.mtk10,
.mtk15 {
 color: transparent;
 background-image: linear-gradient(var(--gradient-dir4), #fc806c, #ff1bd1);
 -webkit-background-clip: text;
 background-clip: text;
 -webkit-text-fill-color: transparent;
}

.mtk5,
.mtk26 {
 color: transparent;
 background-image: linear-gradient(
   var(--gradient-dir1),
   #4dd78a,
   #20e3b2,
   #a2de6a
 );
 background-clip: text;
 -webkit-text-fill-color: transparent;
 -webkit-background-clip: text;
 -webkit-font-smoothing: auto;
 font-family: "Dank mono", monospace;
 font-size: 14px;
}
.mtk26 {
 background-image: linear-gradient(
   var(--gradient-dir5),
   #4dd78a,
   #20e3b2,
   #a2de6a
 );
 font-style: italic;
}
.mtk23,
.mtk16 {
 color: transparent;
 background-image: linear-gradient(var(--gradient-dir1), #d66efd, #6a5af9);
 background-clip: text;
 -webkit-text-fill-color: transparent;
 -webkit-background-clip: text;
}
.mtk9,
.mtk17 {
 color: transparent;
 background-image: linear-gradient(
   var(--gradient-dir2),
   #098dff,
   #2cccff,
   #2979ff
 );
 background-clip: text;
 -webkit-text-fill-color: transparent;
 -webkit-background-clip: text;
}
.mtk18 {
 color: transparent;
 background-image: linear-gradient(var(--gradient-dir2), #b0beff, #fed9ff);
 background-clip: text;
 -webkit-text-fill-color: transparent;
 -webkit-background-clip: text;
 font-style: normal;
}
.mtk3 {
 color: transparent;
 /* background-image: linear-gradient(
   var(--gradient-dir1),
   #c29ffd,
   #ffb4dc,
   #e39bf7
 ); */
 background-image: linear-gradient(to top, #fce1d0, #ffadd6, #e39bf7);
 background-clip: text;
 -webkit-text-fill-color: transparent;
 -webkit-background-clip: text;
}
.mtk7 {
 color: transparent;
 background-image: linear-gradient(var(--gradient-dir2), #fc6c8f, #ffb86c);
 -webkit-background-clip: text;
 background-clip: text;
 -webkit-text-fill-color: transparent;
}
.mtk8,
.mtk14 {
 color: transparent;
 background-image: linear-gradient(to right, #ffb88c, #eac394);
 -webkit-background-clip: text;
 background-clip: text;
 -webkit-text-fill-color: transparent;
}
.monaco-workbench
 .activitybar
 > .content
 :not(.monaco-menu)
 > .monaco-action-bar
 .action-item.checked
 .active-item-indicator:before {
 border: 0;
 width: 3px;
 height: 100%;
 position: absolute;
 top: 0;
 left: 0;
 background-image: linear-gradient(45deg, #fc6c8f, #ff2ced);
}

.monaco-workbench
 .activitybar
 > .content
 :not(.monaco-menu)
 > .monaco-action-bar
 .badge
 .badge-content {
 background-image: linear-gradient(45deg, #fc6c8f, #ff2ced);
}
.monaco-editor .cursors-layer .cursor {
 background-image: linear-gradient(to top, #6a5af9, #d66efd, #fc6c8f, #ff2ced);
}

.mtki {
 font-style: normal;
}

.monaco-workbench
 .part.editor
 > .content
 .editor-group-container
 > .title
 .tabs-container
 > .tab.active.tab-border-top
 > .tab-border-top-container {
 width: 100%;
 height: 100%;
 top: 0;
 left: 0;
 background-color: transparent;
}
.monaco-workbench
 .part.editor
 > .content
 .editor-group-container
 > .title
 .tabs-container
 > .tab.active.tab-border-top
 > .tab-border-top-container:before,
.monaco-workbench
 .part.editor
 > .conten
 .editor-group-container
 > .title
 .tabs-container
 > .tab.active.tab-border-top
 > .tab-border-top-container:after {
 content: "";
 width: var(--size);
 height: var(--size);
 position: absolute;
 border: 2px solid;
 border-image-slice: 1;
}
.monaco-workbench
 .part.editor
 > .content
 .editor-group-container
 > .title
 .tabs-container
 > .tab.active.tab-border-top
 > .tab-border-top-container:before {
 top: 0;
 left: 0;
 border-right: 0;
 border-bottom: 0;
 border-image-source: linear-gradient(-45deg, #4dd78a, #20e3b2);
}
.monaco-workbench
 .part.editor
 > .content
 .editor-group-container
 > .title
 .tabs-container
 > .tab.active.tab-border-top
 > .tab-border-top-container:after {
 right: 0;
 bottom: 0;
 border-top: 0;
 border-left: 0;
 border-image-source: linear-gradient(-45deg, #6a5af9, #d66efd);
}
.monaco-workbench
 .part.editor
 > .content
 .editor-group-container
 > .title
 .tabs-container
 > .tab.active:before,
.monaco-workbench
 .part.editor
 > .content
 .editor-group-container
 > .title
 .tabs-container
 > .tab.active:after {
 content: "";
 width: var(--size);
 height: var(--size);
 position: absolute;
 border: 2px solid;
 border-image-slice: 1;
}
.monaco-workbench
 .part.editor
 > .content
 .editor-group-container
 > .title
 .tabs-container
 > .tab.active:before {
 left: 0;
 bottom: 0;
 border-top: 0;
 border-right: 0;
 border-image-source: linear-gradient(-45deg, #fc6c8f, #ffb86c);
}

.monaco-workbench
 .part.editor
 > .content
 .editor-group-container
 > .title
 .tabs-container
 > .tab.active:after {
 top: 0;
 right: 0;
 border-left: 0;
 border-bottom: 0;
 border-image-source: linear-gradient(-45deg, #098dff, #2cccff);
}

Tạm kết

Trên đây là toàn bộ source code tùy biến hiện tại của mình. Hi vọng bài viết ngắn gọn súc tích này sẽ có ích cho các bạn. Giúp các bạn có cảm hứng khi coding hơn.

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

Xem thêm:

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

GW2790QT – Màn hình 2K tốt nhất dành cho lập trình viên

Màn hình 2K tốt nhất dành cho lập trình viên

BenQ – Tập đoàn hàng đầu thế giới về màn hình công thái học và thiết bị thông minh vừa cho ra mắt màn hình lập trình 2K QHD đầu tiên trên thế giới GW2790QT & GW3290QT, với kích cỡ tương ứng 27 inch và 32 inch.

GW2790QT & GW3290QT có chế độ Coding giúp tối ưu hóa độ tương phản hạn chế mỏi mắt, chế độ M-book giảm khác biệt màu sắc so với Macbook, bộ chia cổng USB-C cho phép sạc ngược cùng kết nối đa thiết bị Daisy Chain, và thiết kế công thái học giúp thoải mái sử dụng trong thời gian dài.

Chế độ Coding đầu tiên trên thế giới cùng khả năng đa nhiệm vượt trội

Với màn hình GW90QT, chế độ Coding được thiết kế cho khả năng tối ưu hóa độ tương phản và độ bão hòa, giúp nền đen trở nên tối hơn. Từ đó, dòng code sẽ được hiển thị sắc nét hơn so với màn hình thông thường, giảm thiểu nhức mỏi mắt trong suốt thời gian làm việc.

Màn hình 2K dành cho lập trình viên

Nhằm hỗ trợ các lập trình viên nâng cao hiệu quả công việc, màn hình bảo vệ mắt GW90QT có các tùy chọn độ phân giải FHD và QHD để đọc kí tự tốt hơn. Đặc biệt, độ phân giải 2K QHD hiển thị nhiều không gian cho nội dung trên màn hình, đồng thời cung cấp các chi tiết tuyệt đẹp ngay cả ở các phông chữ nhỏ hơn. Dù làm việc hay giải trí, GW90QT đều dễ dàng thể hiện độ tương phản sắc nét và hình ảnh sống động như thật.

Ngoài ra, với người dùng Macbook, chế độ M-book chuyên dụng giúp giảm thiểu sự khác biệt về màu sắc giữa hai màn hình, từ đó hạn chế mức độ sai lệch khi ra sản phẩm cuối cùng.

mac mode

Kết nối Daisy Chain cho không gian làm việc gọn gàng

GW90QT được trang bị tính năng Daisy Chain với bộ chia cổng USB-C dành riêng cho việc truyền dữ liệu và tích hợp sạc pin với công suất lên tới 65W, đem lại tiện ích 5 trong 1: HDMI, cổng hiển thị DisplayPort, USB và cổng âm thanh (audio port) cho phép chuyển đổi nhanh giữa các thiết bị ngoại vi và thiết bị thông minh khác.

Daisy Chain cho phép kết nối thông thường hoặc kết nối Daisy của 2 – 4 màn hình thông qua cổng DisplayPort. Đồng thời, màn hình còn hỗ trợ cổng USB-C với công suất 60W, cho phép bạn không chỉ dễ dàng kết nối với các thiết bị như máy tính xách tay, máy tính bảng hoặc MacBook mà còn có thể sạc pin cùng lúc, giúp không gian làm việc trở nên gọn gàng.

thiet lap da man hinh

Ngoài ra, GW90QT còn tích hợp loa lọc tiếng ồn cùng micro khử tiếng ồn đảm bảo chất lượng đàm thoại từ xa rõ ràng hơn, từ đó tăng khả năng linh hoạt và tối ưu hóa năng suất làm việc nhóm.

Chức năng công thái học và công nghệ Eye-CareU bảo vệ mắt

Với thiết kế công thái học đặc biệt, GW90QT hỗ trợ tính năng điều chỉnh độ cao và trục xoay linh hoạt nhằm tối ưu khả năng sắp xếp nhiều màn hình nối tiếp theo các hướng khác nhau giúp tối đa năng suất thực hiện. Bên cạnh đó, màn hình còn được thiết kế để xoay được cả 2 chiều, giúp màn hình dọc có thể được đặt ở bên trái hoặc bên phải, tùy thuộc vào sở thích của bạn!

chan ghe dieu chinh do cao

BenQ cũng là tập đoàn đi đầu trong công nghệ bảo vệ mắt BenQ Eye-Care bao gồm Công nghệ giảm tối thiểu ánh sáng xanh (Low Blue Light Technologies), Khử nhấp nháy TUV Rheinland-certified Flicker-Free và Điều chỉnh độ sáng thông minh thế hệ 2 (Brightness Intelligence Gen2), hỗ trợ tùy chỉnh tự động mức sáng màn hình theo nhu cầu. Ngoài ra, chế độ bù hiển thị màu yếu và mô phỏng đọc sách giấy cũng được tích hợp bằng phần mềm BenQ Eye-CareU giúp bảo vệ thị giác trong thời gian làm việc dài.

che do thong minh

Thông qua phần mềm BenQ Eye-CareU, tất cả các tính năng của Eye-Care có thể được điều chỉnh trực tiếp trên màn hình máy tính chỉ bằng một cú nhấp chuột đơn giản. Bạn cũng có thể đặt hẹn giờ hoặc nhận thông báo khi ánh sáng xung quanh không đủ.
Với tất cả những tính năng đặc biệt này, GW2790QT và GW3290QT xứng đáng là màn hình tốt nhất dành cho lập trình viên, nhằm nâng cao hiệu suất làm việc và bảo vệ sức khỏe đôi mắt lâu dài!

Tìm hiểu thêm về màn hình BenQ, vui lòng truy cập: https://www.benq.com/vi-
vn/monitor/home/gw2790qt.html

Mua ngay sản phẩm tại đây: https://shopee.vn/product/276976573/16898015048/

Truy cập ngay việc làm IT đãi ngộ tốt trên TopDev

Prompt Engineer là gì? Cách viết Prompt Engineer đúng chuẩn

Prompt Engineer là gì?

Chà, Prompt Engineer là gì, lại vừa mới đảo cánh ra một vị trí mới trong năm 2023 khi mà AI bùng nổ. Đi kèm với sự phát triển vượt bậc của AI thì prompt engineer cũng trở nên hot hơn bao giờ hết

Vậy prompt engineer là gì? Những công việc nào được Prompt Engineer phụ trách!

Tất cả sẽ được giải thích cụ thể và tường tận qua bài viết dưới đây.

1. Định nghĩa về Prompt Engineer

Prompt engineering is the practice of designing inputs for generative AI tools that will produce optimal outputs. Prompt engineer là phương pháp thiết kế đầu vào cho các công cụ AI tổng hợp để tạo ra kết quả tối ưu.

Nói công cụ đầu vào thì hơi mơ hồ, chi bằng cho anh em một ví dụ cụ thể. Ví dụ anh em nấu bún bò, làm bát cho ấm bụng ngày đông. Nếu bò ở nhà có sẵn trong tủ lạnh, cắt lát đem nấu, ok hơi dai tí nhưng ít nhất bún còn có bò. Còn hơn bún không.

Prompt Engineer là gì?
Nguồn ảnh / Source: zaper.com

Vậy còn nếu ra chợ mua được bò thăn nội, chà bát phở lúc này còn ngon gấp mấy lần. Cao hơn tí nếu có bò wagyu, xương thì đem đi nấu nước, bò thì cắt lát bỏ thêm vào phở. Lúc này thì tuyệt cú mèo.

Ví dụ về bò cho ta thấy nguyên liệu đầu vào ảnh hưởng như thế nào tới kết quả đầu ra. Prompt Engineer cũng vậy, họ là người đem đầu vào tốt hơn cho các công cụ AI. Mà đầu vào tốt hơn sẽ có kết quả tốt hơn.

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

  5 công cụ AI hữu ích trong năm 2024 dành cho Developer

2. Đầu vào tốt hơn

Về cơ bản, công việc của Prompt Engineer đúng như mục đích anh em mình đã xem ở trên. Hằng ngày họ sẽ thiết kế, tối ưu đầu vào cho các công cụ AI, mục đích đem lại hiểu quả cao hơn khi sử dụng các công cụ AI.

Prompt Engineer là gì?
Một đoạn mô tả về cách mà prompt engineer sử dụng Midjourney để tạo ra hình ảnh tốt hơn. Nguồn ảnh: wikipedia.com

Một đầu vào tốt sẽ đem lại một đầu ra tốt từ các công cụ AI được phát triển ngày nay. Một số đầu ra thường được giao việc cho prompt engineer bao gồm

    • Viết email tiếp thị, quảng cáo
    • Phân tích và tổng hợp văn bản
    • Tương tác với khách hàng thông qua chatbot
    • Tạo ra tác phẩm nghệ thuật kĩ thuật số
    • Sáng tác nhạc

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

    3. Một số ví dụ

    Để hiểu hơn về thứ mà prompt engineer thực sự làm. Ví dụ anh em đang muốn một mô hình AI, xây dựng để quảng bá hội thảo lập kế hoạch tài chính của ông sếp CFO sắp tới. Thời nào rồi mà còn ngồi làm tay.

    Tất nhiên luôn cần sự hỗ trợ của ChatGPT. Nếu không có prompt engineer, đơn giản anh em chỉ viết “Write a social post advertising a class.” Chỉ đơn giản và viết một bài viết trên mạng xã hội quảng cáo cho một lớp. Kết quả anh em nhận được sẽ là:

    **Elevate Your Skills: Join Our Class!**
    Unlock new knowledge, connect with experts, and embrace growth. Limited spots available—reserve yours now!
    #LearnWithUs #SkillBuilding #ClassTime

    Viết thì cũng được, nhưng dạng văn bản như thế này khá là chung chung

    Nếu qua tay mọt ông Prompt Engineer, câu prompt truyền lại cho ChatGPT sẽ được sửa lại “Write a short social post advertising a financial-planning workshop with the CFO of Acme, Inc.”. Lần này ông engineer define rõ ràng social post để quảng cáo topic của nó là financial và có cả tên của CFO của Acme

    Rõ ràng đầu vào lần này tốt hơn hẳn, mà đầu vào tốt thì kết quả của AI đem ra cũng tốt hơn.

    **Master Your Finances with the CFO of Acme, Inc.!**
    Get ready to take charge of your financial future! Join our upcoming Financial Planning Workshop featuring the CFO of Acme, Inc. Gain insights, strategies, and expert advice to secure your financial success.
    Limited spots available—don't miss this exclusive opportunity. Reserve your seat today and pave the way to financial freedom!
    #FinancialPlanning #ExpertAdvice #SecureYourFuture

    Câu cú lần này khác hẳn, phấn khích hơn, thu hút được nhiều người hơn khi đăng lên nền tảng mạng xã hội.

    Ví dụ trên đây cho ta thấy tầm quan trọng của Prompt Engineer, người cung cấp những đầu vào tốt hơn cho AI, giúp kết quả từ AI cũng trở nên tốt hơn, phục vụ được nhiều nhu cầu và mục đích hơn.

    Prompt Engineer là gì?
    Khoá học về prompt engineer – Nguồn ảnh / Source: promptengineering.org

    4. Tham khảo

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

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

    Xem thêm:

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

    So sánh Golang và NodeJS: Nên chọn nền tảng nào cho dự án của bạn?

    So sánh Golang và NodeJS

    Hiện nay anh em Dev có rất nhiều sự lựa chọn ngôn ngữ lập trình để phát triển Web, 2 trong số đó là NodeJSGolang. Cùng được giới thiệu vào năm 2009, một thời gian dài trước đây, NodeJS luôn tỏ ra vượt trội về thị phần hơn so với Golang. Tuy nhiên những năm gần đây, với sự thay đổi về công nghệ thì Golang đang cho thấy nhiều ưu điểm hơn nhất là về hiệu năng. Bài viết này chúng ta cùng nhau so sánh Golang và NodeJS xem đâu sẽ là lựa chọn của bạn cho dự án Web sắp tới nhé.

    Golang là gì?

    Golang, còn được gọi là Go, là ngôn ngữ lập trình mã nguồn mở được phát triển bởi Google. Go là một ngôn ngữ strongy typed (kiểu mạnh) và có cú pháp giống với ngôn ngữ lập trình C, tập trung vào sự đơn giản và dễ đọc. Được thiết kế với sự đơn giản, hiệu quả và đáng tin cậy giúp nó trở thành lựa chọn phổ biến để xây dựng các hệ thống hiệu suất cao, quy mô lớn.

    Golang là gì?

    Các nhà phát triển khuyên sử dụng Golang trong những dự án bao gồm:

    • Xây dựng các hệ thống có tính đồng bộ cao
    • Phát triển ứng dụng mạng (network applications)
    • Xây dựng các công cụ dòng lệnh (command-line tools)

    Ưu điểm của Golang

    • Tính đồng thời (concurrency): Go hỗ trợ tích hợp đồng thời, có thể tận dụng được tối đa khả năng của các CPU đa lõi
    • Hiệu suất cao: Go là ngôn ngữ biên dịch cùng với nhiều công cụ theo dõi tích hợp giúp tối ưu hóa hiệu suất
    • Cú pháp đơn giản: cú pháp của Go đơn giản giúp dễ học và sử dụng
    • Bộ thư viện chuẩn lớn: Bộ thư viện chuẩn của Golang rất lớn, ngoài ra bạn cũng dễ dàng tích hợp các thư viện của bên thứ 3 để sử dụng một cách nhanh chóng
    • Khả năng mở rộng tốt: mô hình đồng thời và sử dụng bộ nhớ hiệu quả giúp Go dễ dàng mở rộng

      7 sai lầm thường gặp khi học Nodejs

      Thủ thuật xử lý lỗi trong Golang

    Nhược điểm của Golang

    • Không dễ để thành thạo: Mô hình đồng thời và cách thức xử lý lỗi trong Go khác biệt so với các ngôn ngữ lập trình khác, vì thế sẽ gây khó khăn cho các lập trình viên lúc ban đầu
    • Bộ thu gom rác: Mặc dù Go có bộ thu gom rác riêng giúp quản lý bộ nhớ, nhưng ngược lại cũng có thể là nguyên nhân gây ra ảnh hưởng hiệu năng trong một số trường hợp
    • Hạn chế trong việc hỗ trợ GUI: Go tập trung vào hiệu năng, và ngược lại thì nó hỗ trợ về phần giao diện khá hạn chế so với các ngôn ngữ khác
    • Hệ sinh thái đang phát triển: Rõ ràng so với các ngôn ngữ khác thì Go chưa thực sự phổ biến, cũng vì thế mà cộng đồng lập trình viên hỗ trợ còn hạn chế.

    NodeJS là gì?

    NodeJS là một môi trường thực thi đa nền tảng mã nguồn mở được xây dựng trên V8 JavaScript Engine của Chrome. Một trong những tính năng chính của NodeJS là mô hình I/O không chặn, hướng sự kiện giúp cho phép nó xử lý số lượng lớn kết nối đồng thời mà không ảnh hưởng đến luồng chính.

    NodeJS là gì?

    Lý do mà NodeJS được ưu chuộng là khả năng sử dụng JavaScript cho cả phía client và server, giúp lập trình viên trở thành một Fullstack Web Developer chỉ với một ngôn ngữ lập trình. NodeJS thường được sử dụng cho việc xây dựng các ứng dụng phía server (máy chủ), phù hợp với các bài toán xây dựng và phát triển ứng dụng thời gian thực như:

    • Ứng dụng chat
    • Game online
    • Ứng dụng chứng khoán

    NodeJS cũng được lựa chọn để xây dựng APIs, cho phép các ứng dụng giao tiếp với nhau qua Internet. Ngoài ra, nó còn có thể được dùng để xây dựng các ứng dụng dòng lệnh (command-line tools), hay viết các ứng dụng dành cho việc kết nối với các thiết bị IoT hoặc ứng dụng dành cho desktop.

    Tuyển NodeJS lương cao hấp dẫn cho bạn

    Ưu điểm của NodeJS

    • Hiệu suất cao: NodeJS được xây dựng trên V8 Engine với khả năng xử lý nhanh trên một lượng lớn các truy cập, đồng thời không tiêu tốn quá nhiều tài nguyên
    • I/O hướng sự kiện và không bị chặn: khả năng xử lý số lượng lớn kết nối
    • Dễ học: JavaScript là một ngôn ngữ dễ học, dễ hiểu và được sử dụng rộng rãi
    • Cộng đồng hỗ trợ lớn: NodeJS có cộng đồng hỗ trợ rất lớn mạnh với đông đảo thành viên tham gia

    Nhược điểm của NodeJS

    • Single-Threaded: NodeJS chỉ sử dụng một luồng duy nhất để xử lý tất cả các yêu cầu đến, mặc dù có những cải thiện nhưng việc này vẫn gây khó khăn cho các hoạt động I/O bị chặn hoặc yêu cầu mạng
    • Callback Hell: cơ chế xử lý của NodeJS khiến nó phải sử dụng rất nhiều callback, điều này có thể khiến source code trở nên khó đọc mà nếu quản lý không tốt sẽ dễ sinh ra các vòng lặp callback.
    • Hỗ trợ hạn chế đa lõi: NodeJS không được tối ưu hóa để xử lý đa lõi dẫn đến hạn chế khả năng xử lý trên các hệ thống đa lõi

    So sánh giữa Golang và NodeJS

    Golang và NodeJS là 2 công nghệ giúp phát triển ứng dụng ở phía máy chủ (server-side); vậy đâu là lý do để bạn lựa chọn một trong 2 công cụ trên cho dự án tiếp theo của bạn:

    So sánh giữa Golang và NodeJS

    • Về ngôn ngữ và cú pháp: Golang là ngôn ngữ kiểu tĩnh (statically-typed) với cú pháp kiểu C; trong khi JavaScript là ngôn ngữ kiểu động với cú pháp linh hoạt hơn.
    • Tính đồng thời (Concurrency): Golang được thiết kế là một ngôn ngữ đồng thời, hỗ trợ tích hợp các tính năng xử lý đồng thời như Goroutines. Còn NodeJS sử dụng mô hình đơn luồng, mô hình hướng sự kiện với I/O non-blocking.
    • Về mặt hiệu năng: Cả 2 đều được đánh giá cao với hiệu năng tốt; tuy nhiên đối với những tác vụ liên quan đến CPU như tính toán nặng thì Golang tỏ ra hoạt động tốt hơn NodeJS. NodeJS sẽ phù hợp hơn cho việc xử lý số lượng lớn kết nối đồng thời.
    • Môi trường phát triển: Golang yêu cầu một trình biên dịch và một bước build để tạo tệp thực thi; trong khi đó NodeJS là sử dụng ngôn ngữ thông dịch có thể chạy trực tiếp từ dòng lệnh.
    • Quản lý gói: Golang có hệ thống quản lý gói tích hợp cho phép bạn dễ dàng quản lý các phần phụ thuộc và đảm bảo rằng mã nguồn của chúng luôn được cập nhật. NodeJS sử dụng NPM (Node Package Manager), một công cụ riêng biệt được cài đặt và cấu hình.
    • Cộng đồng: cả Golang và NodeJS đều có cộng đồng phát triển lớn, với sự hỗ trợ nhiệt tình. Mặc dù vậy thì NodeJS với sự phổ biến hơn vẫn có cộng đồng lớn hơn so với Golang.

    Tổng kết

    Việc lựa chọn giữa Golang hay NodeJS phụ thuộc rất nhiều vào bài toán mà bạn đang cần phải giải quyết cùng với chuyên môn từng thành viên trong nhóm của bạn. Golang cung cấp hiệu năng mạnh mẽ cho các tác vụ liên quan đến CPU, trong khi đó NodeJS phù hợp với các tác vụ liên quan đến I/O; cả 2 đều là sự lựa chọn tốt cho việc xây dựng ứng dụng web phía server của bạn. Bằng cách nắm được những ưu và nhược điểm của từng công nghệ, bạn sẽ có thể đưa ra quyết định sáng suốt và xây dựng được ứng dụng chất lượng cao đáp ứng nhu cầu của mình. 

    Tác giả: Phạm Minh Khoa

    Xem thêm:

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

    So sánh Laravel và Phalcon – Framework nào tốt hơn?

    So sánh Laravel và Phalcon - Framework nào tốt hơn?

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

    Gần đây mới xin được việc, công ty làm về Phalcon nên mình cũng dành khá nhiều thời gian để tìm hiểu về nó. Dù trước kia học Laravel là chủ yếu (nhưng xin việc mấy chỗ đó lại từ chối) nên mình dịch bài này để tìm hiểu và so sánh giữa 2 framework chút chơi. Bài viết này so sánh Laravel và Phalcon, khi so sánh cuối mối phần so sánh sẽ có tổng điểm để dễ phân biệt.

    1. Cài đặt và khởi đầu

    Cài đặt và bắt đầu với Laravel rất dễ, bạn chỉ cần dùng composer để cài đặt các gói và sau đó có thể bắt đầu một dự án mới. Bạn cũng có thể copy các file Laravel rồi sau đó bắt đầu chỉnh sửa, code…

    Cài đặt Phalcon khó hơn, thực tế mình đã không thể cài đặt thành công Phalcon 4 và phải nhờ mới cài được Phalcon 3.4. Đó là vì Phalcon không được viết bằng PHP (dù bạn sẽ code bằng php 100%). Nó là một phần mở rộng của C, bạn sẽ cần cài nó trên server hoặc local server đẻ có thể dùng nó yêu cầu biên dịch hoặc tải các bản biên dịch sẵn và kich hoạt thủ công trên web server của bạn.

    Điều này sẽ gây nhiều khó khăn nếu không thành thạo. Phalcon cũng cung cấp một công cụ là Phalcon devtools để giúp bạn tạo dự án và chỉnh sửa code.

    Phải nói thêm là khi tạo dự án, Phalcon thường nhanh hơn Laravel.

    Dó cài đặt Phalcon phức tạp hơn nên phần này Laravel thắng.
    Laravel : 1
    Phalcon: 0

    2. Cấu trúc file

    Đây là phần rất quan trọng với các lập trinh viên.

    Laravel thực sự tổ chức khá tốt, nhưng có một số vấn đề đó là phần model được đặt trong folder gốc app, model được dùng trong một số folder khác như controller… Nó không thực sự clean lắm. Ngoài ra, cấu trúc file có thể tổ trức tốt hơn ở một số phần nữa. Và Laravel là một framework rất nặng do có nhiều file mặc định.

    Phalcon có một chút khác biệt, nó được cài đặt như một phân mở rộng của C trên máy chủ, nên không có file nào của Phalcon trong dự án của bạn, điều này khiến cho cấu trúc thư mục thật sự clean và đơn giản. Bạn có thể dùng các kỹ thuật design pattern của bạn với Phalcon hoặc dùng các các cấu trúc mặc định do Phalcon devtools cung cấp. Vì bạn chỉ có các file bạn cần trong dự án của bạn nên việc upload hay copy, di chuyển nó sẽ rất đơn giản. Bên dưới là cấu trúc thư mục của Phalcon.

    So sánh giữa Laravel và Phalcon

    Cấu trúc thư muc của Laravel dài hơn rất nhiều.

    So sánh giữa Laravel và Phalcon

    Dù vậy cấu trúc này có thể không ảnh hưởng nhiều do ta thường chỉ làm việc với một vài folder, file chứ không dùng hết. Điểm cho phần này là Phalcon nhỉnh hơn:

    Laravel: 1 — Phalcon: 1

    3. Tốc độ và hiệu suất

    So sánh một cách đơn giản. PHP là ngôn ngữ được viết bằng C, một vài phần là C++, nó rất nhanh nhưng PHP tự nó sẽ chậm hơn C/C++ một chút. Laravel được viết bằng PHP, còn Phalcon viết bằng C, nên có thể nói Phalcon nhanh hơn.

    Điểm cho phần này: Laravel : 1 — Phalcon: 2

      Những tính năng cao cấp trong Laravel mà có thể bạn chưa biết

      Cấu hình Laravel Queue trên môi trường production

    4. Độ phức tạp

    Mất bao lâu để có thể học và xây dựng một ứng dụng là vấn đề quan trọng. Laravel thực sự rất dễ học, các tài liệu của Laravel và hướng dẫn của nó thất sự rất dầy đủ, chi tiết, dễ tiếp cận. Laravel rất dễ hiểu ngay cả với người mới.

    Phalcon cũng có các tài liệu tốt trên web của nó. Nhưng thực sự nó khá phức tap cả với người dùng đã có nền tảng chứ chưa nói đến người mới. Phalcon cũng có video hướng dẫn nhưng không nhiều như Laravel.

    Phần này Laravel được đánh giá cao hơn. Tuy nhiên nếu đã thành thạo, Laravel hay framework nào đó dùng MCV thì việc chuyển qua Phalcon sẽ dễ hơn hẳn.

    Laravel: 2 — Phalcon: 2

    5. Kiến trúc

    Hầu hết các framework hiện nay đều dùng kiến trúc MVC (model – view – controller) vì nó dễ sử dụng và được chấp nhận rộng rãi trong cộng đồng lập trình.

    Laravel cũng sử dụng MVC và sử dụng nó rất tốt. Tuy nhiên khi ứng dụng của bạn ngày càng phát triển lớn hơn và bạn gặp vấn đề với MVC, lúc này sẽ cần tới HMVC (Hỉearchical MVC), đây là một mô hình mạnh mẽ, được cải tiến từ MVC để chuyên dùng cho các hệ thống lớn. Gải sử bạn có một trang web với 2 phần blog và diễn đàn, HMVC cho phép chia 2 phần này thành các thành phần MVC để bạn có thể phát triển riêng nhưng vẫn dùng đươc chung với nhau.

    Phalcon cho phép triển khau kiến trúc như vậy trong nó còn Laravel thì hạn chế hơn. Nên phần này Phalcon thắng.

    Laravel : 2 — Phalcon: 3.

    Xem thêm nhiều chương trình tuyển dụng Laravel hấp dẫn trên TopDev

    6. Kết nối cơ sở dữ liệu

    Cơ sở dữ liệu là một phần quan trọng của mọi ứng dụng. Và cả Laravel và Phalcon đều cung cấp các giải pháp rất tốt. Cũng dùng ORM (Object relarional mapping) để tải hoặc lưu dữ liệu dễ dàng.

    Tuy nhiên Laravel có Eloquent để tận dụng các model khi làm việc với cơ sở dữ liệu, Phalcon cũng có công cụ tương tự nhưng thực sự Eloquent dễ dùng hơn.

    Có một công cụ tương tự ORM là ODM (Object document maping) thường dùng cho các CSDL NoSQL như MongoDB. Tiếc là Laravel không hộ trợ nó, để dùng, bạn cần cài them các gói mở rộng. Phalcon thì có hỗ trợ. Vậy nên điểm sau phần này là:

    Laravel : 3 — Phalcon: 4.

    7. Routing và Controller

    Với web app thì mọi vấn đề điều liên quan đến routing. Cả 2 frameworks đều cung cấp các phương thức định tuyến và có khả năng xử lý các HTTP method phổ biến như POST, GET,….

    Định tuyến trong Laravel rất đơn giản, có thể nói Laravel biết nhưng gì bạn muốn và cung cấp cho bạn những gì cần thiết để định tuyến trở nên dễ dàng. Phalcon thì khó định tuyến hơn, một vấn đề thường gặp với định tuyến với Phalcon là thiếu các tham số tùy chọn, nên đôi khi bạn cần định tuyến 2 lần, một với tham số và 1 không có nó.

    Cả hai tham số đều hỗ trợ các tiền tố và nhóm route. Tuy nhiên Laravel hỗ trợ định tuyến cả với tên miền phụ, còn Phalcon thì không.

    Nên về phần định tuyến thì Laravel đã thắng. Điểm sau các phần là: Laravel: 4 — Phalcon: 4

    8. Template engines

    Khi nói tới một ứng dụng thì phần front-end là một trong những phần quan trọng nhất.
    Template engines là các công cụ giúp hỗ trợ bạn kết nói back-end với HTML/CSS và đối khi cả JS để nâng cao trải nghiệm cho ứng dụng của bạn.

    Laravel cung cấp một công cụ mạnh mẽ là Blade, còn Phalcon sử dụng Volt, một phát triển từ Twig( từ Symfony) nhưng đơn giản hơn và được biên dịch trước. Cả Blade và Volt đều tốt nhưng Blade tiện dụng hơn do các chức năng và phương thức có sẵn. Còn Volt thì nhanh hơn do có được biên dịch trước. Blade cũng có thể lưu trong cache để nhanh hơn nhưng bạn cần thiết lập để Laravel làm nó.

    Thật ta tất cả những gì ta cần từ template engines là giúp chúng ta xây dựng front-ent nhanh chóng và cả volt và blade đều làm tốt nhưng volt thì cleaner hơn blade. Điểm phần này cho Phalcon:

    Tổng điểm: Laravel: 4 — Phalcon: 5.

    9. i18n

    Một ứng dụng có thể cần quốc tế hóa, hỗ trợ nhiều ngôn ngữ và nếu không có công cụ rất khó để làm điều đó. Nhiều ứng dụng có thể không cần nhưng với frameworks vẫn rất cần hỗ trợ. Và cả hai đều hỗ trợ tốt việc này.

    Tổng điểm: Laravel: 5 — Phalcon: 6.

    10. Security

    Bảo mật là thứ sẽ thay đổi cuộc sống của bạn, tùy vào việc bạn làm nó tốt hay tệ. Khi viết một ứng dụng, bạn cần có trách nhiệm đảm bảo không ai có thể gian lận và sử dụng chức năng của ứng dụng theo những cách ngoài dự định.

    Cả Laravel và Phalcon đều làm rất tốt việc này, chúng đều có thể giúp phòng thủ trước hầu hết các cuộc tấn công, đặc biệt là các loại tấn công phổ biến như XSS và tiêm SQL. Tuy nhiên, Laravel cung cấp một cách tốt hơn để dùng CSRF token còn Phalcon sẽ khó hơn và cần thiết lập nó. Nên Laravel được điểm lần này.

    Tổng điểm: Laravel: 6 — Phalcon: 6

    11. Middleware

    Bạn cần làm gì khi bạn muốn chạy một công việc nào đó mỗi khi người dùng thực hiện một request nào đó tới ứng dụng của bạn? Dĩ nhiên đó là Middleware. Middleware rất quan trọng trong các ứng dụng phức tạp. Và phần này Laravel thắng vì Phalcon không hỗ trợ middleware. Nếu muốn dùng, bạn cần thiết lập nó trong phương thức __contruct() của controller.

    Tổng điểm: Laravel: 7 — Phalcon: 6.

    12. API Restful

    Một số lập trình viên sử dụng back-end chỉ để dùng cho các API và để thiết kế các hệ thống Restful API. Laravel hỗ trợ việc này, và cung cấp các công cụ để làm tố giúp bạn thực hiện nó bao gồm cả axios và hỗ trợ SCRF.

    Với Phalcon bạn cần thiết lập respone của API controller, chuyển đổi nó thành dạng JSON (Laravel mặc định làm điều đó) và cập nhật CSRF token để request sau không bị lỗi. Nên điểm phần này cho Laravel:

    Tổng điểm: Laravel: 8 — Phalcon: 6.

    13. Tùy biến

    Khi mọi thứ phát triển phức tạp hơn, cao hơn và bạn muốn tùy biến framework của bạn. Điều này thì Phalcon hỗ trợ tốt hơn với Zephir, một ngôn ngữ lập trình cấp cao để viết các phần mở rộng cho PHP cho các lập trình viên PHP mà không cần kiến thức về C.

    Nên khi bạn tùy biến Phalcon bạn vẫn có thể đảm bảo tốc độ của nó, còn khi bạn tùy biến Laravel, bạn cần dùng PHP, điều này khiến cho có thêm nhiều tác vụ được chạy trong ứng dụng và làm tốc độ giảm. Phalcon thắng trong việc tùy biến.

    Tổng điểm: Laravel: 8 — Phalcon: 7.

    14. Cộng đồng

    Điều gì xảy ra khi bạn gặp khó khăn với ứng dụng của bạn, bạn tìm kiếm trên google và thường thì kết quả sẽ dẫn đến Stack overflow. Đó là lúc cộng đồng quan trọng. Một cộng đồng lớn sẽ làm vấn đề của bạn trở lên nhỏ hơn. Khi có cộng đồng lớn, nhiều khả năng vấn đề của bạn đã có người gặp trước đây và khi đó có thể sẽ có lời giải. Rõ ràng cộng đồng Laravel lớn hơn. Nên Laravel thắng.

    Tổng điểm: Laravel: 9 — Phalcon: 7.

    15. Dễ sử dụng

    Một lần nữa đây là điều hay được nhắc đến về Laravel. Rất dễ bắt đầu với Laravel, nó hỗ trợ những cách code hay, đơn giản và dễ học. Phalcon thì yêu cầu lập trình viên cấp cao hơn và họ cảm thấy Laravel quá magic với họ (magic là thuật ngữ dùng khi môt tả việc người dùng không thấy những việc framework làm cho họ ). Nên một lần nữa Laravel thắng.

    Tổng điểm: Laravel: 10 — Phalcon: 7.

    16. Coding style

    Đây là quan điểm khác cá nhân nhưng mình thấy cách code của Phalcon thường “clean” hơn Laravel. Và cách code của Phalcon cũng giúp người khác dễ đọc hơn khi lần đầu đọc code của bạn. Các pattern Phalcon cung cấp cũng cleaner hơn trong các file config và cả các thứ khác.

    Tổng điểm: Laravel: 10 — Phalcon: 8.

    17. Deployment

    Điều cuối cùng cần làm với một ứng dụng là làm cho nó hoạt động, nếu bạn không làm nó thì giống như là bạn không làm gì cả. Đây là một trong những bước quan trọng nhất.

    Laravel được hỗ trợ bởi 90% các hosting service , nên bạn không cần thực hiện nhiều tùy chỉnh và thực hiện những việc khi bạn cài đặt ứng dụng trên hosting service. Bạn chỉ cần tải nó lên.

    Deploy một ứng dụng Phalcon không khó hơn Laravel , đôi khi có thể dễ dàng hơn nếu bạn có thể tìm thấy một vào máy chủ có hỗ trợ cài đặt vài tiện ích mở rông của Phalcon trừ khi bạn cần dùng VPS để triển khai ứng dụng của bạn, bao gồm cả việc cài đặt , thiết lập tùy chỉnh cần thiết và biên dịch.

    Nhìn chung Deploy ứng dụng Phalcon khiến bạn mất nhiều thời gian và tiền bạc hơn Laravel. Nên Laravel được điểm.

    Tổng điểm: Laravel: 11 — Phalcon: 8.

    18. Tài nguyên Front-end

    Phần này không thực sự là một phần của framework nhưng cũng nên nhắc tới. Dùng Laravel rất dễ chịu khi có nhiều hỗ trợ như Webpack . Laravel cũng hỗ trợ Vue và React cùng với việc có thể dùng ngay Bootstrap.

    Phalcon thì hầu như chẳng có mấy tài nguyên về front-end ☹. Nên dù không tính điểm thì Laravel vẫn thắng lần này.

    Kết luận

    Tổng kết lại với điểm số Laravel: 11 — Phalcon: 8. Laravel đã thắng. Nhưng sự khác biệt điểm số không quá lớn. Rõ ràng cả Laravel và Phalcon có ưu điểm riêng, tuy nhiên với một chút ít trải nghiệm cả 2 framework này, mình nhận thấy nếu biết về 1 framework thì việc chuyển qua framework kia khá dễ dàng trường hợp của mình là từ Laravel sang Phalcon).

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

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

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

    Time to hire là gì? Mẹo cải thiện chỉ số Time to hire cho HR

    Time to hire là gì? Mẹo cải thiện chỉ số Time to hire cho HR

    Time to hire là một thuật ngữ đóng vai trò quan trọng trong việc quản lý và đánh giá quy trình tuyển dụng. Hiện nay, đa phần các công ty IT đều chú trọng đến chỉ số này để đánh giá và tối ưu hiệu suất tuyển dụng. Vậy Time to hire là gì? Và làm thế nào để tối ưu được chỉ số Time to hire? Hãy cùng TopDev tìm hiểu chi tiết về chủ đề này trong bài viết dưới đây nhé!

    Time to hire là gì? Vì sao lại quan trọng với ngành HR?

    Time to hire (Thời gian tuyển dụng) là một chỉ số quan trọng trong hoạt động tuyển dụng nhân sự. Chỉ số này thể hiện khoảng thời gian từ khi một vị trí tuyển dụng được mở đến khi ứng viên trúng tuyển và bắt đầu làm việc.

    Time to hire là gì

    Thời gian tuyển dụng ngắn giúp doanh nghiệp tiết kiệm chi phí, tăng hiệu quả hoạt động và giữ chân nhân tài. Ngược lại, thời gian tuyển dụng dài sẽ khiến doanh nghiệp gặp nhiều khó khăn, như:

    • Tăng chi phí tuyển dụng: Doanh nghiệp phải trả lương cho các vị trí tuyển dụng đang trống, chi phí cho các công cụ tuyển dụng, chi phí cho các buổi phỏng vấn,…
    • Giảm hiệu quả hoạt động: Doanh nghiệp phải tạm thời ngừng hoạt động của các vị trí tuyển dụng đang trống, dẫn đến giảm hiệu quả hoạt động của doanh nghiệp.
    • Mất cơ hội tuyển dụng nhân tài: Các ứng viên tiềm năng có thể tìm được cơ hội việc làm khác nếu thời gian tuyển dụng quá lâu.

    Vì vậy, time to hire là một chỉ số quan trọng mà các nhà tuyển dụng nhân sự (HR) cần quan tâm. HR cần tìm cách để cải thiện chỉ số này, giúp doanh nghiệp tiết kiệm chi phí, tăng hiệu quả hoạt động và giữ chân nhân tài.

      7 chỉ số đo lường trải nghiệm ứng viên cực quan trọng với doanh nghiệp

      Giải mã bí quyết quản lý nhân viên IT là Gen Z thành công

    Công thức tính Time to hire

    Time to hire được tính theo công thức sau:

    Time to hire = Số ngày kể từ khi đăng tin tuyển dụng đến khi ứng viên chấp nhận thư mời làm việc (Offer) hoặc đến khi ứng viên đi làm (Onboard)

    Công thức tính Time to hire

    Tùy thuộc vào mục tiêu của doanh nghiệp, Time to hire có thể được tính theo một trong hai cách sau:

    Tính từ khi đăng tin tuyển dụng đến khi ứng viên chấp nhận thư mời làm việc (Offer): Cách tính này thường được sử dụng bởi các doanh nghiệp có quy trình tuyển dụng ngắn gọn, không có nhiều vòng phỏng vấn.

    Tính từ khi đăng tin tuyển dụng đến khi ứng viên đi làm (Onboard): Cách tính này thường được sử dụng bởi các doanh nghiệp có quy trình tuyển dụng dài, có nhiều vòng phỏng vấn hoặc cần thời gian để hoàn thiện các thủ tục onboarding.

    Ngoài ra, Time to hire cũng có thể được tính theo từng vị trí tuyển dụng, từng nhóm ứng viên hoặc theo từng kênh tuyển dụng. Điều này giúp doanh nghiệp có cái nhìn tổng quan hơn về tình hình tuyển dụng và có những biện pháp cải thiện phù hợp.

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

    Những yếu tố nào ảnh hưởng đến Time to hire?

    Dưới đây là một số yếu tố có thể ảnh hưởng đến chỉ số Time to hire:

    • Quy trình tuyển dụng phức tạp: Khi quy trình có quá nhiều bước, kiểm tra chi tiết và thủ tục phê duyệt phức tạp, thì tự động thời gian tuyển dụng sẽ tăng lên. Việc cân nhắc giữa đảm bảo chất lượng tuyển dụng và giảm bớt các bước không cần thiết trở nên quan trọng để tối ưu hóa Time to Hire.
    • Cạnh tranh từ thị trường: Mức độ cạnh tranh từ thị trường lao động cũng đóng góp lớn vào Time to Hire. Trong một môi trường cạnh tranh, doanh nghiệp cần phải nhanh chóng đưa ra quyết định để chiếm ưu thế trong cuộc đua tuyển dụng.
    • Số lượng và chất lượng ứng viên ứng tuyển: Nếu có nhiều ứng viên tốt và phù hợp, thì quá trình lựa chọn có thể diễn ra nhanh chóng. Ngược lại, khi có ít ứng viên hoặc chúng không đáp ứng yêu cầu, thời gian tuyển dụng có thể kéo dài.
    • Năng lực của nhà tuyển dụng (HR): Sự hiệu quả của việc tìm kiếm, đánh giá và chọn lọc ứng viên phụ thuộc lớn vào kinh nghiệm và chuyên môn của Recruiters.
    • Vị trí tuyển dụng: Các vị trí có nhu cầu đặc biệt về kỹ năng hoặc kinh nghiệm có thể đòi hỏi thêm thời gian để tìm kiếm và thu hút ứng viên phù hợp.
    • Công cụ tuyển dụng: Các công cụ tuyển dụng hiệu quả như ATS (Apply Tracking System) có thể giúp doanh nghiệp tiết kiệm thời gian và công sức trong quá trình tuyển dụng, rút ngắn thời gian tuyển dụng.

    Mẹo cải thiện chỉ số Time to hire hiệu quả cho HR

    Mẹo cải thiện chỉ số Time to hire

    Cải thiện chỉ số Time to Hire là một bài toán mà nhiều doanh nghiệp cần phải giải để tăng cường hiệu suất tuyển dụng. Dưới đây là một số bí quyết giúp cải thiện chỉ số Time to Hire hiệu quả:

    • Xác định nhu cầu tuyển dụng chính xác: HR cần xác định rõ nhu cầu tuyển dụng IT của doanh nghiệp, bao gồm vị trí, số lượng, yêu cầu công việc,… Điều này giúp HR lựa chọn được kênh tuyển dụng phù hợp và tiết kiệm thời gian.
    • Sử dụng các kênh tuyển dụng hiệu quả: Cần đa dạng hóa các kênh tuyển dụng để tiếp cận được nhiều ứng viên tiềm năng. Một số kênh tuyển dụng hiệu quả bao gồm: mạng xã hội, trang web tuyển dụng, sự kiện tuyển dụng,…
    • Tối ưu hóa quy trình tuyển dụng: HR cần tối ưu hóa quy trình tuyển dụng để loại bỏ những bước không cần thiết, giúp rút ngắn thời gian tuyển dụng. Ví dụ, doanh nghiệp có thể giảm số lượng vòng phỏng vấn, sử dụng các công cụ đánh giá trực tuyến để tiết kiệm thời gian cho cả ứng viên và nhà tuyển dụng.
    • Sử dụng các công cụ hỗ trợ tuyển dụng: Các công cụ hỗ trợ tuyển dụng có thể giúp HR tiết kiệm thời gian và công sức trong quá trình tuyển dụng. Ví dụ, doanh nghiệp có thể sử dụng các công cụ sàng lọc hồ sơ, đánh giá ứng viên trực tuyến hoặc các công cụ quản lý tuyển dụng để tiết kiệm thời gian và công sức.

    Tóm lại, quy trình tuyển dụng được tối ưu hóa, sự linh hoạt trong chiến lược tuyển dụng IT, chất lượng công việc hấp dẫn và khả năng sáng tạo của đội ngũ nhân sự đều đóng vai trò quan trọng trong việc đạt được một Time to Hire lý tưởng. Hy vọng rằng bài viết này đã giúp bạn hiểu được Time to Hire là gì và cách để tối ưu chỉ số quan trọng này. Theo dõi TopDev để cập nhật thêm các bài viết về HR và kiến thức lập trình hữu ích nhé!

    Xem thêm:

    Xem thêm việc làm ngành IT hàng đầu tại TopDev

    Sử dụng thuật toán quay lui giải bài toán phân tích số bằng JavaScript

    Sử dụng thuật toán quay lui giải bài toán phân tích số bằng JavaScript

    Thuật toán quay lui là một trong những câu hỏi thường gặp nhất khi phỏng vấn liên quan đến giải thuật trong lập trình. Trong đó bài toán phân tích số là một ví dụ thường được sử dụng để xem các ứng viên hiểu và triển khai kỹ thuật này như thế nào. Bài viết hôm nay chúng ta cùng nhau tìm hiểu về cách giải bài toán này sử dụng thuật toán quay lui với ngôn ngữ lập trình JavaScript nhé.

    Bài toán phân tích số

    Bài toán: Ở một quốc gia có n loại tiền gồm các mệnh giá a1, a2, …, an. Có những cách nào để lấy các tờ tiền sao cho tổng tiền của chúng là S. Trong đó mỗi mệnh giá có thể lấy được nhiều lần.

    Bài toán phân tích số

    Ví dụ chúng ta có 3 loại mệnh giá 10 đ, 20 đ và 50 đ, để lấy được ra số tiền 100 đ chúng ta có thể có một số cách như là :

    • 10 tờ 10 đ 
    • 2 tờ 50 đ 
    • 3 tờ 10 đ + 1 tờ 20 đ + 1 tờ 50 đ

      JavaScript có thể làm được nhiều hơn bạn nghĩ!

    Thuật toán quay lui

    Quay lui – Backtracking là một kỹ thuật thiết kế giải thuật dựa trên giải thuật đệ quy, ý tưởng của nó là việc tìm lời giải cho từng bước một, mỗi bước sẽ chọn ra một trong số các lựa chọn khả dĩ và đệ quy. Mục tiêu của thuật toán quay lui là sẽ liệt kê hết tất cả các cấu hình có thể có, với mỗi cấu hình được xây dựng bằng cách xây dựng từng phần tử, mỗi phần tử được chọn bằng cách thử tất cả các khả năng. Vì tính chất này mà thuật toán Backtracking còn được gọi tên là phương pháp vét cạn.

    Thuật toán quay lui

    Backtracking khi triển khai, liệt kê hết các cấu hình có thể sẽ cho chúng ta một đồ thị dạng cây với giá trị của mỗi node sẽ là giá trị đạt được khi ghép các phần tử ban đầu lại với nhau. Từ đó chúng ta cũng nhận ra được bản chất của thuật toán này là một quá trình tìm kiếm theo chiều sâu DFS (Depth-First Search).

    Áp dụng với bài toán phân tích số, để đưa ra được phương án đúng, chúng ta sẽ xây dựng một danh sách gồm tất cả các tập hợp có thể có khi ghép các mệnh giá tiền với nhau (lưu ý là các mệnh giá có thể lặp lại nhiều lần). Sử dụng đệ quy cho việc gọi xử lý tính toán và tạo tập hợp, điều kiện dừng đệ quy là khi tổng của tập hợp tạo ra lớn hơn hoặc bằng giá trị cần đạt. Trong mỗi lời gọi đệ quy, một vòng lặp sử dụng để duyệt qua một lượt tất cả các phần tử trong mảng mệnh giá tiền.

    Thuật toán quay lui

    Ưu điểm của thuật toán quay lui là việc chúng ta tạo ra được tổ hợp tất cả các phương án hoàn chỉnh có thể là một lời giải, giúp tránh việc phải thử nhiều trường hợp chưa hoàn chỉnh sẽ ảnh hưởng đến thời gian chạy. Trong trường hợp tập hợp đầu vào không đổi thì việc sử dụng đệ quy có nhớ sẽ giúp chương trình đưa ra được kết quả mà không cần chạy lại thuật toán.

    Tuy vậy thì nhược điểm của nó cũng chính là do sử dụng đệ quy tạo ra nhiều công việc dư thừa. Độ phức tạp của Backtracking sẽ ở cấp số mũ trong những trường hợp xấu nhất. Để cải tiến thuật toán, chúng ta có thể làm thêm một số tinh chỉnh đầu vào, ví dụ như nếu tập hợp số tất cả đều là số chẵn thì không thể cho ra tổng giá trị là lẻ; hay nếu tổng là một giá trị chẵn thì số phần tử lẻ luôn phải là mẫu số của 2,…

    Tham khảo việc làm JavaScript tại Hồ Chí Minh trên TopDev

    Triển khai code JavaScript

    Chúng ta sẽ tạo function combinationSumRecursive cho việc gọi đệ quy với các tham số đầu vào:

    • candidates: mảng số đầu vào tương ứng với các mệnh giá tiền
    • remainingSum: giá trị tổng tiền còn lại cần đạt được với mỗi vòng đệ quy. Ban đầu sẽ chính là tổng tiền cần đạt được S
    • finalCombinations, currentCombination: 2 mảng lưu các giá trị kết hợp giữa các mệnh giá
    • startFrom: lưu chỉ số trong mảng mệnh giá cho việc duyệt
      Sự khác biệt giữa encodeURI và encodeURIComponent trong JavaScript

    Giải thuật được triển khai với code JavaScript như dưới đây: 

    function combinationSumRecursive(
      candidates,
      remainingSum,
      finalCombinations = [],
      currentCombination = [],
      startFrom = 0
    ) {
      if (remainingSum < 0) {
        return finalCombinations;
      }
      if (remainingSum === 0) {
        finalCombinations.push(currentCombination.slice());
        return finalCombinations;
      }
      for (
        let candidateIndex = startFrom;
        candidateIndex < candidates.length;
        candidateIndex += 1
      ) {
        const currentCandidate = candidates[candidateIndex];
        currentCombination.push(currentCandidate);
        combinationSumRecursive(
          candidates,
          remainingSum - currentCandidate,
          finalCombinations,
          currentCombination,
          candidateIndex
        );
        currentCombination.pop();
      }
      return finalCombinations;
    }
    export default function combinationSum(candidates, target) {
      return combinationSumRecursive(candidates, target);
    }

    Dễ thấy việc gọi đệ quy sẽ được dừng lại khi remainingSum < 0 (phương án bị loại) hoặc = 0 (sẽ trả về kết quả là 1 phương án đúng). Thuật toán quay lui sẽ cho ra tất cả các tổng có thể có được nhỏ hơn S, vì thế trong trường hợp yêu cầu bài toán có nhiều giá trị S đầu vào, chúng ta có thể xử lý lại code để chỉ cần chạy một lượt đệ quy dành cho giá trị S lớn nhất hay sử dụng đệ quy có nhớ.

    Kết bài

    Như vậy chúng ta đã cùng nhau tìm hiểu về bài toán phân tích số, cách sử dụng giải thuật quay lui để giải quyết nó cũng như triển khai code bằng ngôn ngữ lập trình JavaScript. Hy vọng qua bài viết này các bạn có thể tự tin để trả lời nếu gặp câu hỏi giải thuật đến từ nhà tuyển dụng. Hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.

    Tác giả: Phạm Minh Khoa

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

    Hàng loạt việc làm IT hấp dẫn trên TopDev đang chờ bạn ứng tuyển..

    20+ nguồn tuyển dụng và chia sẻ kiến thức IT hiệu quả trên Facebook

    tuyển dụng

    Nhận thấy sự bùng nổ mạnh mẽ của Facebook tại Việt Nam, các nhà tuyển dụng IT đã áp dụng nhiều cách thức khác nhau trên nền tảng này nhằm thu hút nhân tài và thực hiện employing branding. 

    Facebook nhận được sự quan tâm lớn khi có nhiều cộng đồng được xây dựng và phát triển về nội dung nhằm tổng hợp, chia sẻ các kiến thức bổ ích về IT.

    Bài viết sau đây, TopDev sẽ chia sẻ với các bạn về những nguồn Recruitment và chia sẻ kiến thức IT tốt nhất.

    Danh sách các group/trang tuyển dụng trên nền tảng Facebook

    tuyển dụng IT Facebook

    (Số lượng thành viên được cập nhật đến ngày 22/11/2023)

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

    Danh sách các group/trang chia sẻ kiến thức lập trình trên nền tảng Facebook

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

    Xem thêm Top Việc làm Developer trên TopDev

    7 chỉ số đo lường trải nghiệm ứng viên cực quan trọng với doanh nghiệp

    7 chỉ số đo lường trải nghiệm ứng viên cực quan trọng với doanh nghiệp

    Trong thời đại ngày nay, khi mà sự cạnh tranh trên thị trường lao động ngày càng khốc liệt, việc tìm kiếm và giữ chân những ứng viên xuất sắc đã trở thành một thách thức đối với các doanh nghiệp. Do đó, để chiến thắng trong cuộc đua chiêu mộ nhân tài các doanh nghiệp phải tận dụng hiệu quả các “chỉ số đo lường trải nghiệm ứng viên”. Các chỉ số này sẽ giúp doanh nghiệp xác định được những điểm mạnh, điểm yếu của quy trình tuyển dụng hiện tại và có những cải thiện phù hợp để nâng cao trải nghiệm ứng viên.

    Vậy như thế nào là một trải nghiệm ứng viên hiệu quả? Các chỉ số để đo lường trải nghiệm này là gì? Cùng TopDev khám phá trong bài viết dưới đây nhé!

    Trải nghiệm ứng viên là gì? Vì sao cần phải đo lường?

    Trải nghiệm ứng viên (Candidate Experience – CX) là cảm nhận của ứng viên về quá trình ứng tuyển của họ tại công ty. Trải nghiệm ứng viên bao gồm tất cả các tương tác của ứng viên với công ty, từ khi họ biết đến công ty, tìm hiểu thông tin tuyển dụng, nộp đơn ứng tuyển, tham gia phỏng vấn, cho đến khi nhận được kết quả ứng tuyển. Những suy nghĩ và cảm nhận của ứng viên trong quá trình này, dù tích cực hay tiêu cực, đều có thể ảnh hưởng đến công ty.

    Một trải nghiệm ứng viên tích cực sẽ giúp doanh nghiệp thu hút được nhiều ứng viên tiềm năng, đặc biệt là những ứng viên có năng lực và kinh nghiệm. Ngoài ra nó còn thúc đẩy họ chia sẽ những trải nghiệm của mình đến người khác, giúp tăng độ uy tín cho thương hiệu tuyển dụng. Ngược lại, trải nghiệm tiêu cực có thể dẫn đến việc chia sẻ những trải nghiệm này với người khác, tạo ra ảnh hưởng không tốt đối với danh tiếng của công ty.

    Trải nghiệm ứng viên

    Vì vậy, các doanh nghiệp cần phải đo lường trải nghiệm ứng viên để xác định được những điểm mạnh, điểm yếu của quy trình tuyển dụng hiện tại và có những cải thiện phù hợp để nâng cao trải nghiệm ứng viên, từ đó thu hút và tuyển dụng được những ứng viên tài năng.

    5 cách đo lường trải nghiệm ứng viên hiệu quả

    Để đo lường trải nghiệm ứng viên, có nhiều chỉ số và phương pháp đánh giá khác nhau mà doanh nghiệp có thể sử dụng. Dưới đây là một số phương pháp phổ biến:

    1. Khảo sát trải nghiệm ứng viên

    Khảo sát trải nghiệm ứng viên là một công cụ hữu ích giúp các doanh nghiệp hiểu được cảm nhận của ứng viên về quá trình ứng tuyển của họ. Kết quả khảo sát sẽ giúp doanh nghiệp xác định được những điểm mạnh, điểm yếu của quy trình tuyển dụng hiện tại và có những cải thiện phù hợp để nâng cao trải nghiệm ứng viên.

    Khảo sát trải nghiệm ứng viên

    Để tổ chức khảo sát trải nghiệm ứng viên hiệu quả, các doanh nghiệp cần lưu ý những điều sau:

    • Độ dài của khảo sát vừa đủ: Khảo sát không nên quá dài, chỉ nên khoảng 10 câu hỏi để tránh gây khó chịu cho ứng viên.
    • Đa dạng khía cạnh của bảng hỏi: Bảng hỏi nên bao gồm các câu hỏi về nhiều khía cạnh khác nhau của trải nghiệm ứng tuyển, chẳng hạn như mức độ nhanh chóng của quy trình tuyển dụng, sự rõ ràng và đầy đủ về mặt thông tin, tần suất và tốc độ phản hồi, khả năng giới thiệu công ty với người khác hoặc ứng tuyển lại trong tương lai, v.v.
    • Đa dạng hình thức các câu hỏi: Bảng hỏi nên có cả câu hỏi đánh giá thang đo theo mức điểm và câu hỏi mở để thu thập được nhiều thông tin từ ứng viên.

    Dưới đây là một số mẫu câu hỏi khảo sát trải nghiệm ứng viên phổ biến:

    • Cảm nhận chung của bạn về trải nghiệm ứng tuyển của mình tại công ty này như thế nào?
    • Khả năng bạn sẽ giới thiệu công ty này với bạn bè hoặc đồng nghiệp là bao nhiêu?
    • Bạn có tin tưởng rằng quy trình tuyển dụng của công ty là công bằng và minh bạch không?
    • Bạn có thấy quy trình tuyển dụng của công ty là hiệu quả và phù hợp không?
    • Bạn có sẵn sàng ứng tuyển cho các vị trí khác của công ty trong tương lai không?

    Các doanh nghiệp có thể điều chỉnh các câu hỏi khảo sát này cho phù hợp với quy trình tuyển dụng và nhu cầu của mình.

      Phương pháp lập Kế hoạch tuyển dụng

      [Update] Bắt nhịp 8 xu hướng tuyển dụng IT nổi bật trong năm 2023 – 2025

    2. Đo lường trải nghiệm ứng viên bằng CNPS

    CNPS là gì? CNPS là chỉ số đo lường trải nghiệm ứng viên (Candidate Net Promoter Score), là một chỉ số tương tự như Net Promoter Score (NPS) được sử dụng để đo lường các yếu tố cảm xúc của ứng viên trong quá trình tuyển dụng.

    CNPS là câu trả lời điển hình cho câu hỏi: “Khả năng bạn sẽ giới thiệu công ty này với bạn bè hoặc đồng nghiệp của mình ở mức nào, trên thang điểm từ 0 đến 10?”

    Ứng viên sẽ đánh giá câu hỏi này trên thang điểm từ 0 đến 10, với 0 là “Không có khả năng giới thiệu” và 10 là “Rất có khả năng giới thiệu”.

    Câu trả lời sẽ được phân theo 3 nhóm:

    • Promoters (9-10): Những ứng viên này rất hài lòng với trải nghiệm ứng tuyển của họ và có khả năng giới thiệu công ty với người khác.
    • Passives (7-8): Những ứng viên này hài lòng với trải nghiệm ứng tuyển của họ nhưng không chắc chắn về khả năng giới thiệu công ty.
    • Detractors (0-6): Những ứng viên này không hài lòng với trải nghiệm ứng tuyển của họ và có khả năng không giới thiệu công ty.

    Cách tính CNPS: CNPS = %Promoters – %Detractors

    CNPS là gì?

    3. Thời gian tuyển dụng (Time-to-hire)

    Thời gian tuyển dụng là khoảng thời gian từ khi ứng viên nộp đơn đến khi nhận được kết quả tuyển dụng. Thời gian tuyển dụng quá dài có thể khiến ứng viên thất vọng và mất hứng thú với vị trí ứng tuyển, từ đó dẫn đến giảm tỷ lệ tuyển dụng thành công.

    Có nhiều cách để đo lường thời gian tuyển dụng, bao gồm:

    • Tính thời gian trung bình từ khi ứng viên nộp đơn đến khi nhận được kết quả tuyển dụng: Đây là cách đo lường thời gian tuyển dụng phổ biến nhất.
    • Tính thời gian trung bình cho từng giai đoạn của quy trình tuyển dụng: Cách đo lường này giúp các doanh nghiệp xác định được những giai đoạn nào trong quy trình tuyển dụng đang mất nhiều thời gian.
    • Tính thời gian tuyển dụng theo vị trí tuyển dụng: Cách đo lường này giúp các doanh nghiệp xác định được những vị trí tuyển dụng nào có thời gian tuyển dụng dài.

    4. Tỷ lệ chuyển đổi của trang web tuyển dụng (Career site conversion rate)

    Tỷ lệ chuyển đổi của trang web tuyển dụng (Career site conversion rate) là tỷ lệ phần trăm các lượt truy cập vào trang web tuyển dụng dẫn đến một hành động cụ thể, chẳng hạn như nộp đơn ứng tuyển, đăng ký nhận thông tin tuyển dụng, hoặc chia sẻ trang web tuyển dụng.

    Tỷ lệ chuyển đổi của trang web tuyển dụng là một chỉ số quan trọng giúp các doanh nghiệp đánh giá hiệu quả của trang web tuyển dụng. Một tỷ lệ chuyển đổi cao cho thấy rằng trang web tuyển dụng đang hiệu quả trong việc thu hút và chuyển đổi các lượt truy cập thành ứng viên.

    Tỷ lệ này thường được tính theo công thức:

    Career site conversion rate = (Số đơn ứng tuyển / Số lượng unique clicks) x 100

      10 Bí quyết tuyển dụng giúp bạn tăng tỉ lệ nhận offer tức thì!

      Applicant Tracking System là gì? ATS hoạt động ra sao

    5. Tỷ lệ bỏ qua đơn đăng ký (Application form abandon rate)

    Tỷ lệ bỏ qua đơn đăng ký (Application form abandon rate) là tỷ lệ phần trăm các ứng viên bắt đầu điền đơn đăng ký nhưng không hoàn thành quá trình đăng ký. Một tỷ lệ bỏ qua đơn đăng ký cao cho thấy rằng quy trình tuyển dụng đang có vấn đề khiến ứng viên không muốn hoàn thành quá trình đăng ký.

    Tỷ lệ này thường được tính theo công thức:

    Application form abandon rate = (Ứng viên bỏ qua đơn đăng ký / Tổng số ứng viên bắt đầu điền đơn đăng ký) x 100

    6. Tỷ lệ phản hồi email của ứng viên (Email response rate)

    Tỷ lệ phản hồi email của ứng viên (Email response rate) là tỷ lệ phần trăm các email được gửi đến ứng viên nhận được phản hồi. Có nhiều nguyên nhân khiến tỷ lệ phản hồi email của ứng viên cao, bao gồm: Nội dung email hấp dẫn và phù hợp với đối tượng nhận, chủ đề email rõ ràng và thu hút, lời kêu gọi hành động rõ ràng, tính chuyên nghiệp của email,…

    Tỷ lệ phản hồi email

    Tỷ lệ này thường được tính theo công thức:

    Email response rate = (Số email nhận được phản hồi / Số email được gửi đến ứng viên) x 100

    7. Tỷ lệ chấp nhận lời mời làm việc (Acceptance rate)

    Tỷ lệ chấp nhận lời mời làm việc (Acceptance rate) là tỷ lệ phần trăm các ứng viên được mời làm việc chấp nhận lời mời. Tỷ lệ chấp nhận lời mời làm việc cao cho thấy rằng quá trình tuyển dụng đang hiệu quả trong việc thu hút và tuyển dụng được những ứng viên phù hợp. Việc đo lường tỷ lệ chấp nhận lời mời làm việc giúp các doanh nghiệp xác định được hiệu quả của quá trình tuyển dụng hiện tại để có những cải thiện phù hợp.

    Tỷ lệ này thường được tính theo công thức:

    Acceptance rate = (Số ứng viên chấp nhận lời mời làm việc / Tổng số ứng viên được mời làm việc) x 100

    Việc đo lường và cải thiện trải nghiệm ứng viên là một quá trình liên tục. Các doanh nghiệp cần thường xuyên thu thập phản hồi từ ứng viên để có những cải thiện phù hợp. Hy vọng rằng với những chỉ số đo lường trải nghiệm ứng viên mà TopDev đã chia sẽ sẻ giúp các doanh nghiệp tối ưu được quy trình tuyển dụng sao cho hiệu quả nhất.

    Xem thêm:

    Xem thêm việc làm ngành IT hàng đầu tại TopDev