Tư duy lập trình qua một ví dụ đơn giản? Và Bạn đang ở đâu?

Nội dung bài viết

Lập trình là một khái niệm rộng cho tất cả những ai đang đi theo con đường lập trình viên. Tư duy lập trình cũng bao gồm trong đó, bởi thế những nhà tuyển dụng họ thường đánh giá cao khả năng tư duy của các ứng viên.

Bạn để ý mà xem, những công ty Nhật luôn có những bài test cho những ứng viên ở vòng đầu tiên, không quá khó, nhưng trong bài test có những câu hỏi mà họ đang sử dụng để test tư duy của chúng ta. Cụ thể đó là những bài toán dài, và họ muốn ứng viên tìm ra những phương pháp ngắn gọn nhất để giải quyết những vấn đề trong ứng dụng.

Có một ý tưởng nhỏ cho các bạn đọc bài viết này ở dưới cuối bài viết. Mong rằng chúng tôi sẽ gặp các bạn ở đó. Ở đó chúng tôi chỉ lấy chất lượng, và không lấy số lượng.

Vì sao họ muốn vậy, bạn có biết lúc trước tôi được làm những module cho bên công ty Nhật. Tôi làm partime thôi, và công ty mẹ ở Nhật. Họ bắt buộc những người như tôi tạo ra những module và đóng gói làm sao, không quá 10kb. Nếu quá, trả lại, làm lại. Và họ sẽ không cho tôi hoặc bất kỳ ai có thể get full code đó. Nghĩa là mỗi người một modules và giao cho họ. Giống như việc sản xuất ô tô vậy, nước này thì lốp, nước kia là da bọc ghế... Và bây giờ cũng vậy, trong bài viết này tôi sẽ show cho các bạn một bài toán, nó đơn giản nhưng bạn nào mà có tu duy thì có thể làm code ngắn gọn lại một cách có thể nhất.

Tips: Kinh nghiệm của một Lập trình Viên 

Tư duy lập trình

Bài toán

Bạn nào chuyên làm về API thì có lợi thế hơn về bài toán này, đó là, một api có rất nhiều code return. 

Ví dụ như lỗi update return -2, lỗi insert return -3... vậy bài toán thế này:

Dựa vào status và return về cho Clients.

Có bạn nào không hiểu không trời. Đừng nói với tôi là bạn không hiểu bài toán tương đương với đoạn code dưới kia chứ.

const returnElements = (status) => {
  if(status === 1) {
    sendToLog('processing')
   
  } else if(status === 2) {
    sendToLog('fail')

  } else if(status === 3) {
    sendToLog('fail')
 
  } else if(status === 4) {
    sendToLog('success')
 
  } else if(status === 5) {
    sendToLog('cancel')
  
  } else {
    sendToLog('other')
   
  }
}

Trên đó là một ví dụ rất cụ thể, và đó là cách một dev thông thường có thể làm. Và cách đó hầu như ai cũng có thể làm điều tương tự. Bạn thì sao? Bạn có lối đi riêng không? Và nếu có bạn làm thế nào? Đó là những câu hỏi hôm nay tôi và các bạn sẽ giải quyết. Đoạn code trên kia cứ cho là Cách 1 đi, vậy có một bạn nữa sẽ làm cách 2, hay xem cách 2

Cách 2:

const returnElements = (status) => {
  switch (status) {
    case 1:
      sendToLog('processing')
      break
    case 2:
    case 3:
      sendToLog('fail')
      break
    case 4:
      sendToLog('success')
      break
    case 5:
      sendToLog('cancel')
      break
    default:
      sendToLog('other')
  }
}

Notes: case 2 với 3 tương đương nhau, đừng nhầm lẫn là thiếu code nha mấy bạn.

Việc sử dụng switch case để thay thể cho if else là một cách cũng thường thấy trong cách giải quyết của những devopers. Có thể code tương đương nhau, nhưng bạn nào thật sự hiểu được khi nào nên dùng switch và khi nào nên dùng if else chưa? Còn riêng về performance thì tôi chắc chắn là switch case nhanh hơn if else nhiều hơn đấy. Cuối bài viết này tôi sẽ viết một Unit test case về check performance cho các bạn có thể thấy switch nhanh hơn if else thế nào.

Qua lại với chủ đề hôm nay, để xem ngoài 2 cách trên chúng ta sẽ có cách nào hơn nữa không? À có, bạn nào còn nhớ việc sử dụng Object Literal

Cách 3:

const actions = {
  '1': ['processing'],
  '2': ['fail'],
  '3': ['fail'],
  '4': ['success'],
  '5': ['cancel'],
  'default': ['other']
}
const returnElements = (status) => {
  let action = actions[status] || actions['default'], LogName = action[0];
  sendLog(LogName)
}

??? Ở đây tôi có một vấn đề??? Chúng ta tìm xem còn cách nào nữa không, ồ tôi còn nhớ còn một cách nữa đó là sử dụng ternary operators trong bài viết này không? Thì bạn cũng có thể áp dụng nó trong hoàn cảnh này.

Cách 4:

const distinguish = status =>
  status === '1'
    ? 'processing'
    : status === '2'
    ? 'fail'
    : status === '3'
    ? 'fail'
    : status === '4'
    ? 'success'
    : status === '5'
    ? 'cancel'
    : 'other';

console.log(senLog(distinguish('1')))

Tôi có thể kết thúc bài viết này tại đây, nhưng tôi sẽ bonus cho các bạn thêm một cách nữa đó là việc sử dụng new Map(). Để tôi muốn các bạn hình dung ra rằng, rất nhiều cách để giải quyết, chẳng qua chúng ta chưa cô gắng or chúng ta chưa chịu suy nghĩ thêm.

Cách 5:

const actions = new Map([
  ['1', ['processing']],
  ['2', ['fail']],
  ['3', ['fail']],
  ['4', ['success']],
  ['5', ['cancel']],
  ['default', ['other']]
])

const clickHandler = (status) => {
  let action = actions.get(status) || actions.get('default')
  sendLog(action[0])
}

Qua bài viết này, tôi và các bạn cũng là một developers giống nhau, nhưng tất nhiên là cách suy nghĩ khác nhau, chính vì vậy để có một tư duy tốt trong lập trình thì không những bạn phải trải qua nhiều kinh nghiệm trong các dự án, mà còn bạn phải thảo luận và trau dồi những kiến thức với những người lập trình khác. Tôi sẽ có một bài viết cho các bạn tham khảo là làm sao có được tu duy tốt trong lập trình.

Tips: Kinh nghiệm của một Lập trình Viên



Ngoài ra, tôi mong muốn những bạn nào đọc xong bài này và đã tới được đây thì hãy tham gia nhóm này, nhóm có tên là "My Code For Developers". Nhóm "My Code For Developers"  tôi mới ý tưởng ra và đã thay đổi nhóm vì mục đích của nhóm sẽ là đưa ra những bài toán, những vấn đề, những rắc rối, những thuật toán mà ở đó, mỗi người sẽ có một cách để giải quyết. Sẽ có nhiều cách giải quyết và một câu hỏi chúng ta sẽ có nhiều đáp án do các thành viên đem lại. Đó cũng là một cách học thêm về "Tư duy của lập trình".
Những bạn tuyển dụng, xin vui lòng không tham gia or có tham gia thì không post bài trên nhóm này. Cảm ơn!

Hẹn các bạn vào một bài viết khác. Nếu các bạn cảm thấy bài viết này giúp ích cho bạn, thì hãy chia sẻ nó, biết đâu ngoài bạn, còn rất nhiều sẽ cần những bài viết thế này.



Thanks for reading!