Bài học về kỹ năng giải quyết vấn đề – Hãy tư duy như một Lập trình viên!

2374

Nếu bạn là một người yêu thích lập trình thì không thể không biết đến câu nói sau về kỹ năng mềm lập trình viên:

Mọi người đều nên học lập trình, bởi nó không chỉ dạy bạn code – nó dạy bạn cách tư duy – Steve Jobs”

Có bao giờ bạn tự hỏi rằng làm sao để có thể suy nghĩ như một lập trình viên?  Bất ngờ là, tất cả chỉ xoay quanh câu hỏi: Đâu là hướng giải quyết vấn đề hiệu quả hơn?

Mục đích của tôi khi thực hiện bài viết này là bật mí cho bạn các bí quyết để có thể suy nghĩ và giải quyết vấn đề một cách tốt hơn.

  Những nguyên tắc, định luật của lập trình mà chúng ta nên có sẵn trong đầu
  6 điều tôi vỡ lẻ khi tự học code (P1)

Vì sao điều này lại quan trọng?

Giải quyết vấn đề là một kỹ năng quan trọng.

Tất cả chúng ta đều có vấn đề, từ lớn cho đến nhỏ. Đôi khi cách mà chúng ta giải quyết vấn đề của chính mình khá là … ngẫu nhiên.

Trừ khi bạn đã có một hệ thống rõ ràng hơn thì có lẽ là cách mà bạn “giải quyết” một vấn đề (đây cũng là lộ trình tôi làm theo khi mới bắt đầu viết code ):

  1. Thử một giải pháp nào đó.
  2. Thử một cách khác nếu nó không hiệu quả.
  3. Nếu vẫn không hiệu quả, lặp lại bước 2 cho đến khi may mắn mỉm cười với bạn.

Đôi khi may mắn sẽ đến nhưng thực tế đây  là một cách tồi tệ nhất khi giải quyết một vấn đề, nó khiến bạn lãng phí thời gian của mình.

Theo ý kiến cá nhân của mình, cách tốt nhất để giải quyết vấn đề chính là:

  1. Có một phương pháp cụ thể
  2. Thực hành nó thật nhuần nhuyễn liên tục

Báo cáo Hacker Rank’s 2018 Developer Skill có chỉ ra :

“Kỹ năng giải quyết vấn đề ở ứng viên gần như là một tiêu chuẩn không thể thiếu mà các nhà tuyển dụng tìm kiếm… Nó còn được săn đón hơn cả việc thông thạo các ngôn ngữ lập trình, khả năng fix bug hay thiết kế hệ thống.

Điều này cũng có nghĩa là những kỹ năng mềm như giải quyết vấn đề cũng quan trọng không kém các kỹ năng kỹ thuật cơ bản cho công việc.

Có một khuôn khổ rõ ràng

Để có thể tìm được một khuôn phù hợp với bản thân, tôi đã tham khảo và làm theo lời khuyên từ quyển sách The 4-Hour Chef của Tim Ferriss.

Tôi thật may mắn khi có cơ hội được trò chuyện cùng với hai con người vô cùng đáng ngưỡng mộ  đó là C. Jordan Ball (xếp thứ nhất hoặc thứ hai trong số 65.000 người dùng trên Coderbyte) và V. Anton Spraul (tác giả của Think Like a Programmer: An Introduction to Creative Problem Solving).

Tôi đã l đặt cho cả hai các câu hỏi giống nhau, bạn thử đoán xem câu trả lời là gì? Surprise! Câu trả lời của họ đều khá giống nhau.

“Sai lầm lớn nhất mà tôi thấy ở các lập trình viên là chỉ biết tập trung vào việc học cú pháp (syntax) thay vì học cách giải quyết vấn đề  V. Anton Spraul

Vì thế nếu bạn gặp phải một vấn đề cần giải quyết ở lần tới hãy áp dụng các bước sau nhé:

1/ Hiểu rõ bản chất của sự việc

Bạn cần phải biết chính xác những việc mình đang gặp phải hay những gì được hỏi. Các vấn đề trở nên khó khăn là do bạn không hiểu rõ về chúng.

Vậy làm sao để biết rằng mình đã hiểu rõ một vấn đề? Chính là khi mà bạn có thể giải thích nó một cách đơn giản nhất.

Đa số các lập trình viên đều hiểu  cảm giác khi bản thân bắt đầu giải thích một thứ và ngay lập tức nhìn ra được các lỗ hổng trong logic mà mình chưa bắt gặp trước đây. Đó là lý do tại sao bạn nên viết ra vấn đề của mình, vẽ một sơ đồ, hoặc nói với ai đó về nó ( thậm chí là với một con vịt đồ chơi cũng được).

Richard Feynman từng nói, “Nếu bạn không thể giải thích điều gì đó một cách đơn giản thì có nghĩa là bạn không hiểu nó.”

2/ Lên kế hoạch rõ ràng

Đừng đâm đầu vào giải quyết một vấn đề nào nó một cách may rủi mà không có kế hoạch. Sẽ không ai có thể giúp bạn nếu bạn không lập kế hoạch rõ ràng cho các giải pháp và viết ra chính xác từng bước cần thực hiện.

Trong lập trình, điều có nghĩa là họ dành thời gian để não bộ phân tích vấn đề và xử lý thông tin thay vì bắt đầu hack ngay lập tức.

Để có một kế hoạch hoàn hảo hãy trả lời câu hỏi sau:

“Cho đầu vào X, các bước cần thiết để trả về Y đầu ra là gì?”

3/ Phân chia

Đây là bước quan trọng nhất hãy chú ý thật kỹ nhé!

Đừng cố giải quyết 1 vấn đề to bự! Bạn sẽ vã ra mất.

Bạn sẽ “khóc thét” khi cố gắng giải quyết một vấn đề lớn đấy. Thay vào đó hãy chia nhỏ nó ra thành các vấn đề phụ để có thể giải quyết một các dễ dàng hơn.

Sau đó hãy giải quyết từng vấn đề theo thứ tự ưu tiên từ đơn giản cho đến phức tạp. Đơn giản có nghĩa là bạn có thể giải quyết vấn đề này một mình mà không cần sự trợ giúp hay phụ thuộc vào những người khác.

Khi đã giải quyết các vấn đề phụ hãy kết nối chúng lại với nhau. Congratulations, bạn đã tìm ra cách giải quyết cho vấn đề ban đầu rồi đấy.

Hãy nhớ thật kỹ vì kỹ thuật này chính là nền tảng của quá trình giải quyết vấn đề (Có thể đọc bước này một lần nữa nếu cần thiết).

Theo V. Anton Spraul:

“Nếu tôi có thể dạy cho lập trình viên một  kỹ năng giải quyết vấn đề, thì đó sẽ là làm giảm tính phức tạp của vấn đề”. Ví dụ như bạn là một lập trình viên nhận được yêu cầu viết một chương trình đọc 10 số và tìm ra đâu là con số lớn thứ ba. Đây là một nhiệm vụ khó khăn dành cho một lập trình viên mới vào nghề cho dù nó chỉ yêu cầu cú pháp lập trình cơ bản.

Nếu bạn gặp khó khăn hãy giải quyết vấn đề ở mức độ đơn giản hơn.  Thay vì số thứ ba cao nhất, hãy tìm số cao nhất? Vẫn còn quá khó khăn? vậy kiếm số lớn nhất trong 3 số thì sao? Hãy giảm vấn đề xuống mức mà bạn biết có thể giải quyết. Sau đó, mở rộng vấn đề một chút và viết lại giải pháp cho phù hợp. Tiếp tục cho đến khi bạn quay lại nơi bạn đã bắt đầu.”

Video: Google Update 2019 – Youtube Update 2019

4/ Khi bế tắc nên giải quyết như thế nào?

Đến giờ nếu bạn đang có suy nghĩ  “Hey Richard, nghe có vẻ cool đấy, nhưng nếu tôi vẫn bị bí và thậm chí còn không thể giải quyết được những vấn đề phụ đã chia thì sao ?”

Trước tiên hãy hít một hơi thật sâu. Thứ hai, đây là điều vô cùng bình thường mà ai cũng sẽ mắc phải nên đừng lo lắng nhé!

Điều làm nên khác biệt giữa người lập trình viên và người giải quyết vấn đề giỏi nằm ở việc họ sẽ cảm thấy thắc mắc hơn về lỗi chứ không bị nản chí.

Thực tế, đây là 3 điều bạn cần phải thử qua:

  • Gỡ lỗi: Kiểm tra lại lần lượt các giải pháp của bạn để tìm ra nơi mình đã đi sai hướng. Các lập trình viên gọi đó là debug

“Nghệ thuật debug chính là tìm ra những gì bạn đã nói với chương trình của mình để hơn là những gì bạn đã nói nó làm” – Andrew Singer

  • Tiếp cận lại vấn đề: Nhìn vào vấn đề từ một khía cạnh khác. Bạn có thể tiếp cận điều gì một cách tổng quát hơn không? Một cách đánh giá lại khác là bắt đầu lại. Hãy xóa mọi thứ và bắt đầu lại ở khía cạnh mới. Tôi nghiêm túc đấy! Bạn sẽ bất ngờ khi thấy được mức độ hiệu quả của việc này.

“Đôi khi chúng ta chỉ tập trung vào các chi tiết của một vấn đề mà quên đi các nguyên tắc chung có thể giải quyết chúng ở cấp độ tổng quát hơn.

Một ví dụ cơ bản cho vấn đề này chính là tập hợp các số nguyên liên tiếp, 1 + 2 + 3 + … +n, mà Gauss từ rất trẻ đã nhận ra từ rất sớm đó chỉ đơn giản là n (n + 1) / 2, tránh được việc phải nỗ lực làm thêm.” C. Jordan Ball

  • Nghiên cứu: Đây chính là lúc tỏa sáng của Google. Dù bạn có vấn đề gì đi nữa, ai đó có thể đã giải quyết nó, vì vậy hãy tìm người / giải pháp đó. Thực tế, hãy làm điều này ngay cả khi bạn đã giải quyết được vấn đề bởi vì bạn có thể học được rất nhiều từ các giải pháp của người khác.

Đừng tìm giải pháp cho một vấn đề lớn hãy tìm kiếm giải pháp cho những vấn đề phụ. Vì sao nên làm như vậy? Bởi vì bạn sẽ gặp phải khó khăn mà không học được gì. Nếu bạn không học được gì, thì bạn đang lãng phí thời gian của mình.

Thực hành

Bạn đừng hy vọng rằng mọi thứ sẽ trở nên tuyệt vời chỉ sau một tuần. Nếu bạn muốn trở thành một “bậc thầy” trong việc giải quyết tốt các vấn đề hãy thực hành giải quyết nhiều vấn đề. Sẽ chỉ còn là vấn đề thời gian đến khi bạn gặp phải một vấn đề và tự động nghĩ rằng “cái này chỉ cần giải quyết bằng cách <cách thức>.

Làm sao để thực hành? Cờ vua, các vấn đề toán học, sudoku, trò chơi điện tử, cryptokitties… có rất nhiều sự lựa chọn dành cho bạn.

Đơn giản là bạn chỉ việc ngồi chơi trò chơi điện tử? Dĩ nhiên là không. Những gì bạn nên làm là tìm một lối thoát để thực hành giải quyết nhiều vấn đề vi mô, lý tưởng nhất là những hoạt động mà bạn thích. Giống như tôi thích những thử thách code, mỗi ngày tôi cố gắng giải quyết ít nhất một thử thách (thường là trên Coderbyte).

Kết luận

Giờ đây, bạn đã biết rõ hơn ý nghĩa của việc “suy nghĩ và giải quyết vấn đề như một Lập Trình Viên.” Bạn cũng biết rằng giải quyết vấn đề là một kỹ năng đáng kinh ngạc cần được trau dồi. Và điều tuyệt vời hơn nữa đó là bạn cũng biết phải làm gì để thực hành kỹ năng giải quyết vấn đề của mình rồi.

“Ngay khi bạn nghĩ rằng bạn đã thành công vượt qua một chướng ngại vật, thì một điều khác lại xuất hiện. Nhưng điều đó lại mang đến điều thú vị cho cuộc sống.

Cuộc sống là một quá trình liên tục vượt khó vượt qua những trở ngại này – một loạt hàng rào kiên cố mà chúng ta phải vượt qua.

Mỗi lần, bạn sẽ học được điều gì đó.

Mỗi lần, bạn sẽ phát triển sức mạnh, trí tuệ và quan điểm.

Mỗi lần, một chút nữa của cuộc thi sẽ biến mất. Cho đến khi tất cả những gì còn lại là bạn: phiên bản tốt nhất của bạn.” – Ryan Holiday (The Obstacle is the Way)

Bây giờ hãy đi giải quyết vấn đề của mình đi nào!

Và chúc bạn may mắn.

TopDev via Medium