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.
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 ):
Đô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à:
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ó 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é:
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ó.”
Đừ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ì?”
Đâ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.”
Đế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:
“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
“Đô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
Đừ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.
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).
“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.
Devmaster Academy via Medium