Logo
About Me

Tư duy như một lập trình viên

//Edit✏️

Nếu bạn quan tâm đến lập trình, bạn có thể đã thấy câu nói này trước đây:

Mọi người trên đất nước này nên học lập trình một máy tính, bởi vì nó dạy bạn cách tư duy. - Steve Jobs

Có lẽ bạn cũng đã tự hỏi, rằng tư duy như một lập trình viên là như thế nào. Và làm thế nào để bạn làm được điều đó ??

Về cơ bản, đây 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 mình là sẽ dạy bạn theo cách đó.

Đến cuối bài viết, bạn sẽ hiểu được cách để tư duy về một vấn đề.

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

Tất cả chúng ta đều có những vấn đề. Lớn hay nhỏ. Làm sao để đối mặt với chúng, khi mà đôi khi chúng sẽ xảy ra một cách bất chợt, không hề lường trước?

Nếu bạn không có một phương pháp, đây có lẽ là cách bạn "giải quyết" một vấn đề (đây chính xác là những gì mình đã làm khi bắt đầu code, thậm chí kể cả bây giờ):

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

Đôi khi bạn sẽ rất rất may mắn. Nhưng đó là cách tệ nhất để giải quyết vấn đề! Và đây là một sự lãng phí rất lớn về mặt thời gian.

Trong khi đó, đây là cách tốt nhất để giải quyết vấn đề a) làm một framework và b) luyện tập nó.

Hầu như tất cả các nhà tuyển dụng đều ưu tiên các kỹ năng giải quyết vấn đề trước tiên.

Các kỹ năng giải quyết vấn đề gần như là bằng cấp quan trọng nhất mà các nhà tuyển dụng tìm kiếm… nhiều hơn cả các kỹ năng về ngôn ngữ lập trình, debu và thiết kế hệ thống.

Chứng minh tư duy tính toán hoặc khả năng đột phá các vấn đề lớn, phức tạp cũng có giá trị (nếu không muốn nói là nhiều hơn) so với các kỹ năng kỹ thuật cơ bản cần thiết cho công việc. ”- HackerRank (2018 Developer Skills Report)

Có một framework (một cách thức chung để giải quyết vấn đề)

“Sai lầm lớn nhất mà tôi thấy các lập trình viên mới thường mắc phải là 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

Dưới đây là các bước thực hiện:

1. Hiểu rõ vấ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 bởi vì bạn không hiểu rõ ràng chúng (do đó đây là bước đầu tiên cần thực hiện).

Làm thế nào để biết được khi nào bạn hiểu một vấn đề? Đó là khi bạn có thể giải thích vấn đề đó một cách đơn giản mà thật rõ ràng.

Bạn có nhớ khi bạn bị mắc kẹt tại một vấn đề, bạn bắt đầu giải thích nó, và bạn ngay lập tức nhìn thấy lỗ hổng trong logic mà bạn khô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.

Đây là lý do tại sao bạn nên viết ra vấn đề của bạn, vẽ nguệch ngoạc một sơ đồ, hoặc nói với ai đó về nó (cũng có một số người sẽ dùng đến rubber duck).

"Nếu bạn không thể giải thích vấn đề một cách đơn giản, có nghĩa là bạn không hiểu rõ nó" - Richard Feynman

2. Kế hoạch

Đừng đi sâu vào việc giải quyết vấn đề mà không có trong tay một bản kế hoạch (và bằng cách nào đó hy vọng bạn có thể vượt qua nó nhờ một quy trình lộn xộn nào khác). Lên kế hoạch cho giải pháp của bạn!

Không gì có thể giúp bạn nếu bạn không viết ra các bước chính xác để giải quyết vấn đề của mình.

Trong lập trình, điều này có nghĩa là: Bạn sẽ không bắt đầu hack ngay lập tức. Dành thời gian để bộ não của bạn 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:

“Với input X, các bước cần thiết để trả về output Y là gì?”

3. Chia nhỏ vấn đề

Chú ý. Đây là bước quan trọng nhất của cả quá trình.

Đừng cố gắng giải quyết một vấn đề lớn. Bạn sẽ phải kêu trời đó!

Thay vào đó, hãy chia nhỏ nó thành các vấn đề nhỏ hơn. Các vấn đề nhỏ hơn này dễ giải quyết hơn nhiều.

Sau đó, giải quyết từng vấn đề nhỏ một. Bắt đầu với thứ đơn giản nhất. Thứ đơn giản nhất là thứ mà bạn đã biết câu trả lời (hoặc gần hơn với câu trả lời đó).

Sau đó, thứ đơn giản nhất có nghĩa là vấn đề nhỏ hơn này đang được giải quyết mà không phụ thuộc vào những vấn đề đang được giải quyết khác.

Khi bạn đã giải quyết mọi vấn đề nhỏ hơn, hãy kết nối các tiểu tiết.

Việc kết nối tất cả các "giải pháp cho các vấn đề nhỏ"của bạn sẽ mang tới cho bạn giải pháp cho vấn đề ban đầu. Xin chúc mừng!

Kỹ thuật này là nền tảng của giải quyết vấn đề. Hãy nhớ nó (đọc lại bước này một lần nữa, nếu bạn thấy cần thiết).

Nếu tôi có thể dạy cho mỗi lập trình viên một kỹ năng giải quyết vấn đề, nó sẽ là ‘làm giảm nhẹ vấn đề kỹ thuật của vấn đề.'

Ví dụ, giả sử bạn là một lập trình viên mới và bạn được yêu cầu viết một chương trình đọc mười con số và tìm ra con số nào là con số lớn thứ ba. Đối với một lập trình viên hoàn toàn mới, đó có thể là một nhiệm vụ khó khăn, mặc dù nó chỉ yêu cầu cú pháp lập trình cơ bản.

Nếu bạn bị mắc kẹt, bạn nên giảm vấn đề xuống một cái gì đó đơn giản hơn. Thay vì tìm số lớn nhất thứ ba, tại sao không thử tìm kiếm số lớn nhất? Vẫn còn quá khó khăn? Vậy thì hãy tìm số lớn nhất trong ba số đã cho? Hoặc tìm số lớn hơn trong hai số đã biết?

Giảm nhẹ vấn đề xuống điểm mà bạn biết cách giải quyết và viết giải pháp. Sau đó mở rộng vấn đề một chút và viết lại các giải pháp để phù hợp, và tiếp tục đi cho đến khi bạn trở lại nơi bạn bắt đầu. ”-  V. Anton Spraul

4. Bị mắc kẹt?

Bây giờ, có lẽ bạn đang ngồi đó suy nghĩ

Này… Điều này thật tuyệt, nhưng nếu tôi vẫn bị mắc kẹt và thậm chí không thể giải quyết được vấn đề phụ thì sao?

Trước hết, hít một hơi thật sâu. Sau đó, mọi việc sẽ tốt hơn thôi.

Đừng lo lắng, bạn tôi ơi. Điều này xảy ra với tất cả mọi người!

Sự khác biệt ở đây là những người lập trình viên hay những người giải quyết vấn đề cừ khôi nhất, họ bị tò mò bởi bug /error thay vì tức tối.

Trong thực tế, đây là ba điều cần thử khi đối mặt với một vấn đề nan giải:

• Debug: Xem lại từng bước trong giải pháp của bạn để tìm ra bạn đã sai tại đâu. Các lập trình viên gọi điều này là debug (trên thực tế, đây là tất cả những gì debugger làm).

Nghệ thuật của debug là tìm ra những gì bạn thực sự nói chương trình của bạn có thể làm được, hơn là những gì bạn nghĩ rằng bạn nói nó có thể làm. - Andrew Singer

• Đánh giá lại: Nhìn lại một chút. Xem xét vấn đề từ những 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?

Đôi khi chúng ta bị lạc trong các chi tiết của một vấn đề mà chúng ta bỏ qua các nguyên tắc chung sẽ giải quyết vấn đề ở một mức độ tổng quát hơn. […]

Ví dụ điển hình cho điều này, là tổng kết của một danh sách dài các số nguyên liên tiếp, 1 + 2 + 3 +… + n, mà Gauss nhanh chóng nhận thấy chỉ đơn giản là n(n + 1)/2, nhờ đó giúp ta giảm bớt thời gian giải quyết vấn đề. ”-  C. Jordan Ball

Một cách đánh giá lại khác là bắt đầu lại từ đầu. Xóa mọi thứ và bắt đầu lại với một tư duy mới. Bạn sẽ chết lặng bởi mức độ hiệu quả của nó.

• Nghiên cứu vấn đề: Ahh, Google. Bạn đọc đúng rồi đó! Cho dù bạn có đang gặp vấn đề gì đi chăng nữa, chắc chắn đã có ai đó có thể đã giải quyết được nó. Hãy tìm kiếm người/giải pháp đó. Trong thực tế, bạn vẫn nên thực hiện điều này kể cả khi bạn đã giải quyết được nó! (Bạn có thể học được rất nhiều từ các giải pháp của người khác).

Caveat: Đừng tìm một giải pháp cho một vấn đề lớn. Chỉ tìm giải pháp cho các vấn đề nhỏ. Tại sao? Bởi vì trừ khi bạn cực kì nỗ lực, bạn sẽ không học được gì cả. Nếu bạn không học được bất cứ điều gì, bạn quả thật đang lãng phí thời gian của mình.

Thực hành

Đừng hy vọng mọi thứ sẽ thật tuyệt vời chỉ sau một tuần. Nếu bạn muốn trở thành một người giải quyết vấn đề tốt, hãy giải quyết thật nhiều vấn đề!

Thực hành, thực hành, thực hành. 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 ."

Làm sao để thực hành? Có rất nhiều lựa chọn dành cho bạn!

Câu đố, cờ vua, giải toán, Sudoku, Go, Monopoly, trò chơi điện tử, cryptokitties, bla… bla… bla….

Trong thực tế, có 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ử.

Byron Reeves nói 'Nếu bạn muốn xem lãnh đạo doanh nghiệp có thể trông như thế nào trong vòng ba đến năm năm, hãy nhìn vào những gì đang xảy ra trong các game online.

Nhìn vào thực tại! Elon [Musk], Reid [Hoffman], Mark Zuckerberg và nhiều người khác đã nói rằng, game đã trở thành yếu tố nền tảng cho sự thành công của họ trong việc xây dựng công ty của mình. ”- Mary Meeker (báo cáo xu hướng internet 2017)

Điều này chỉ có nghĩa là bạn nên chơi điện tử? Không hẳn!

Vậy trò chơi điện tử nói về cái gì? Đúng vậy, chính là giải quyết vấn đề!

Vì vậy, những gì bạn nên làm là tìm một lối thoát để thực hành. Một cái gì đó cho phép bạn giải quyết nhiều vấn đề vi mô (lý tưởng nhất một cái gì đó bạn thích).

Tất cả các vấn đề đều có cùng một mô thức.

Kết luận

Bây giờ, bạn đã biết rõ hơn ý nghĩa của việc “suy nghĩ như một lập trình viên” rồi đấy.

Bạn cũng biết rằng giải quyết vấn đề là một kỹ năng đáng kinh ngạc để trau dồi.

Như thể điều đó là không đủ, hãy chú ý đến cách để thực hành những giải pháp mà bạ đã tìm ra để giải quyết vấn đề.

Chỉ khi bạn nghĩ bạn giải quyết thành công một vấn đề, một vấn đề khác sẽ nổi lên. Nhưng đó là điều khiến cuộc sống trở nên thú vị. […]

Cuộc sống là một quá trình đột phá qua những trở ngại này - một loạt các dòng củng cố mà chúng ta phải vượt qua.

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

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

Sẽ có nhiều thứ hơn là sự cạnh tranh sẽ đến với bạn. Cho đến cuối cùng, điều còn lại sẽ là bạn: một phiên bản tốt hơn của chính mình. ”- Ryan Holiday (The Obstacle is the Way)

Nguồn: https://medium.freecodecamp.org/how-to-think-like-a-programmer-lessons-in-problem-solving-d1d8bf1de7d2

Patreon