18/10/2018, 00:20

Học cách suy nghĩ và giải quyết vấn đề như một lập trình viên chân chính !

Nếu bạn quan tâm đến lập trình thì hẳn đã từng nghe qua câu nói này: 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 Bạn cũng có thể tự hỏi rằng làm cách nào để suy nghĩ như một lập trình viên. Về cơ bản, đó là một cách ...

Nếu bạn quan tâm đến lập trình thì hẳn đã từng nghe qua câu nói này:

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

Bạn cũng có thể tự hỏi rằng làm cách nào để suy nghĩ như một lập trình viên. Về cơ bản, đó là một cách hiệu quả hơn để giải quyết vấn đề.

Trong bài viết này, mục tiêu của tôi là hướng dẫn cho bạn các bước chính xác để trở thành người giải quyết vấn đề tốt hơn.

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

  Về MindSet và ToolSet trong phát triển phần mềm - muốn thành công, lập trình viên không nên bỏ qua
  5 mẹo giúp cải thiện tư duy cho lập trình viên

Tại sao nó lại quan trọng?

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

Trừ khi bạn có một hệ thống rõ ràng thì thường có lẽ đây sẽ là cách bạn “giải quyết” một vấn đề:

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

Nhưng đây là cách tồi tệ nhất để giải quyết vấn đề và lại vô cùng lãng phí thời gian.

Theo tôi, cách tốt nhất để giải quyết một vấn đề chính là phải

a) Có một khuôn khổ 

b) Thực hành nó thật nhuần nhuyễn. Theo báo cáo Hacker Rank’s 2018 Developer Skill:

Các kỹ năng giải quyết vấn đề gần như là tiêu chuẩn quan trọng nhất mà các nhà tuyển dụng tìm kiếm … quan trọng 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. Nói cách khác, những kỹ năng mềm như giải quyết vấn đề luôn quan trọng không kém gì các kỹ năng kỹ thuật cơ bản cần thiết cho công việc.

Cần có một khuôn khổ

Để tìm được khuôn khổ phù hợp, tôi đã làm theo lời khuyên từ cuốn sách của Tim Ferriss, The 4-Hour Chef.

Tôi có cơ hội được trò chuyện với hai con người thực sự ấn tượng: 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 đã hỏi họ những câu hỏi tương tự và đoán xem? 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 thay vì học cách giải quyết vấn đề –V. Anton Spraul

Vì vậy, bạn nên làm gì khi gặp phải một vấn đề mới? Hãy làm theo các bước dưới đây:

1. Hiểu rõ bản chất của nó

Biết chính xác những gì đang được hỏi. Hầu hết các vấn đề khó khăn là bởi vì bạn không hiểu chúng.

Làm thế nào bạn biết mình đã hiểu một vấn đề? Khi bạn có thể giải thích nó một cách đơn giản. Richard Feynman 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ó.”

Khi bạn bắt đầu giải thích nó, và ngay lập tức nhìn thấy các lỗ hổng trong logic mà bạn chưa từng thấy trước đây. Hầu hết các lập trình viên đều biết cảm giác này. Và đó 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 cao su cũng được).

2. Lập ra kế hoạch rõ ràng

Đừng đi sâu vào việc giải quyết mà không có một kế hoạch và chỉ biết dựa vào may rủi. Thay vào đó, hãy lên kế hoạch cho giải pháp của bạn và viết ra các bước chính xác.

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

Để có được một kế hoạch tốt, hãy trả lời câu hỏi này: Cho đầu vào X, các bước cần thiết để trả về Y đầu ra là gì?

3. Phân chia

Hãy chú ý vì đây là bước quan trọng nhất.

Đừng cố gắng giải quyết một vấn đề lớn vì bạn sẽ khóc thét lên đấy. Thay vào đó, hãy chia nhỏ thành các vấn đề phụ, dễ giải quyết hơn nhiều.

Sau đó, hãy giải quyết từng vấn đề một với từ cái đơn giản nhất. Trong đó, đơn giản nhất có nghĩa là bạn biết câu trả lời và không phải phụ thuộc vào những người khác để giải quyết.

Kỹ thuật này là nền tảng của quá trình giải quyết vấn đề, vì vậy hãy nhớ nó (đọc bước này một lần nữa nếu cần thiết). Spraul nói:

   “Nếu tôi có thể dạy cho lập trình viên về 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 đề”. Giả sử bạn là một lập trình viên được yêu cầu viết một chương trình đọc 10 con số và chữ. Vậy con số nào sẽ cao thứ ba? Đối với một lập trình viên mới vào nghề, đó có thể là một nhiệm vụ khó, mặc dù nó chỉ yêu cầu cú pháp lập trình cơ bản.

Khi bạn gặp khó khăn, hãy giảm vấn đề xuống 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ách 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.

4. Khi bế tắc thì ta nên làm gì?

“Hey Richard, thật tuyệt vời và tất cả, nhưng nếu tôi bị kẹt và thậm chí không thể phân biệt được hướng giải quyết cho vấn đề thì sao?”

Trước hết, hít một hơi thật sâu. Thứ hai, đó là điều bình thường mà ai cũng sẽ mắc phải.

Vì thế đừng lo lắng. Điều này xảy ra với tất cả mọi người! Sự khác biệt là những người lập trình / giải quyết vấn đề tốt sẽ cảm thấy tò mò hơn về lỗi chứ không bị chùn bước.

Trong thực tế, đây là ba điều bạn cần sẽ 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 bạn đã đi sai. Các lập trình viên gọi đó là gỡ lỗi.
  • Đánh giá lại: Nhìn vào vấn đề từ góc nhìn khác. Có điều gì có thể được tóm tắt theo cách tiếp cận 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 với góc nhìn mới. Tôi nghiêm túc đấy! Bạn sẽ chết lặng khi thấy được mức độ hiệu quả của việc này.
  • Nghiên cứu: Đây chính là lúc Google tỏa sáng. 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.

Một lần nữa, đừng tìm một giải pháp cho vấn đề lớn. Chỉ tìm giải pháp cho các vấn đề phụ. Tại sao? Bởi vì trừ khi bạn gặp phải khó khăn (thậm chí một chút), bạn sẽ không học được gì cả. 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

Đừng hy vọng rằng mọi thứ sẽ tuyệt vời chỉ sau một tuần. Nếu bạn muốn trở thành người giải quyết vấn đề tốt, hãy giải quyết rất nhiều vấn đề. Thực hành. Nó sẽ chỉ là vấn đề thời gian trước khi bạn nhận ra rằng “vấn đề này có thể dễ dàng được giải quyết với một cách vô cùng nhanh gọn”

Làm thế nào để thực hành? Cờ vua, các vấn đề toán học, sudoku, trò chơi điện tử, cryptokitties, v.v.

Trong thực tế, một mô hình chung giữa những người thành công là thói quen thực hành “giải quyết vấn đề vi mô”. Ví dụ, Peter Thiel chơi cờ vua, và Elon Musk chơi trò chơi điện tử.

Điều này có nghĩa là bạn chỉ nên chơi trò chơi điện tử? 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. Ví dụ, 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 “nghĩ 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.

Techtalk via techinasia

0