Lần đầu up bài lên Spiderum, nhằm trúng hôm trang bị lỗi, sau một ngày mở ra không thấy bài đâu nữa :(. 
Kỳ cụi up lại, bài này mình đọc trên Medium thấy khá hay. Mình có học theo và thấy hiệu quả với mình. Hy vọng cũng giúp được một số bạn.
Bài dịch còn sơ sài, mong mọi người góp ý thêm. 

Nếu như bạn hứng thú với lập trình, bạn có thể đã nhìn thấy câu này trước đây
“Mỗi người ở đất nước này nên học để lập trình một chiếc máy tính, bởi vì việc đó dạy bạn cách suy nghĩ" – Steve Jobs
Chăc hẳn bạn đang thắc mắc suy nghĩ như một lập trình viên, một cách cụ thể, có nghĩa là gì? Và làm thế nào bạn làm như vậy được?
Về bản chất, nó nói về cách giải quyết vấn đề hiệu quả hơn.
Mục tiêu của tôi trong bài này là dạy bạn cách đó.
Đến cuối bài, bạn sẽ biết chính xác các bước cần có để trở thành một người giải quyết vấn đề tốt hơn.
Tại sao điều này lại quan trọng?
Giải quyết vấn đề là một siêu kỹ năng.
Chúng ta đều có vấn đề. To và nhỏ. Cách chúng ta giải quyết chúng thỉnh thoảng khá là … ngẫu nhiên.
Trừ khi bạn có một hệ thống, dưới đây khá chắn là cách bạn “giải quyết” vấn đề (cách mà tôi làm khi tôi bắt đầu lập trình):
  • Thử một giải pháp
  • Nếu giải pháp đó không hiệu quả, thử một cái khác
  • Nếu vẫn không hiệu quả, lặp lại bước 2 cho đến khi gặp may mắn
Thi thoảng bạn cũng gặp may. Nhưng đấy là cách tệ nhất để giải quyết vấn đề. Và rất, rất lãng phí thời gian.
Cách tốt nhất bao gồm a) có một khung chương trình và b) thực hành nó.
“Hầu hết các nhà tuyển dụng ưu tiên kỹ năng giải quyết vấn đề.
Kỳ năng giải quyết vấn đề hầu như được nhất trí là phẩm chất quan trọng nhất mà các nhà tuyển dụng tìm kiếm … nhiều hơn cả sự thành thạo ngôn ngữ lập trình, sửa lỗi và thiết kế hệ thống.
Mô tả suy nghĩ điện toán hoặc khả năng chia nhỏ các vấn đề to lớn và phức tạp chỉ có giá trị như kỹ năng chuyên môn cơ bản được yêu cầu cho 1 nghề” – Hacker Rank (Báo cáo phát triển kỹ năng 2018)
Có một chương trình khung
Để tìm ra chương trình khung đúng, tôi làm theo lời khuyên trong cuốn sách “Bếp trưởng 4 giờ”của Tim Ferris.
Nó giúp tôi phỏng vấn hai người thực sự xuất sắc: C.Jordan Ball (xếp hạng 1 hoặc thứ 2 trong số hơn 65,000 người dùng trên Coderbyte) và V.Antion Spraul (tác giả của cuốn sách “Suy nghĩ như một lập trình viên: giới thiệu về giải quyết vấn đề một cách sáng tạo”).
Tôi hỏi họ những câu hỏi giống nhau và đoán xem? Câu trả lời của họ khá tương quan.
Nhanh thôi, các bạn sẽ biết câu trả lời của họ.
Lưu ý: điều đó không có nghĩa là họ làm mọi việc theo cùng một cách. Mỗi người đều khác biệt. Bạn cũng khác biệt. Nhưng nếu bạn khởi đầu với những nguyên tắc chúng ta đều đồng ý là tốt, bạn sẽ tiến xa hơn và nhanh hơn.
“Lỗi lớn nhất tôi thấy các lập trình viên mới hay mắc phải là quá chú ý vào học câu lệnh thay vì học cách giải quyết vấn đề” – V.Anton Spraul
Vậy bạn nên làm gì khi gặp một vấn đề mới.
Dưới đây là các bước
1. Thấu hiểu
Hiểu một cách chính xác câu hỏi. Hầu hết các vấn đề khó khăn khó bởi vì bạn không hiểu chúng (điều đó giải thích vì sao đây là bước đầu tiên)
Làm thế nào để biết khi bạn hiểu một vấn đề? Khi bạn có thể giải thích nó một cách đơn giản.
Bạn có nhớ khi bạn mắc kẹt trong một vấn đề, bạn bắt đầu giải thích nó, và bạn ngay lập tức thấy lỗ hổng về mặt logic mà bạn không hề nhận ra trước đó?
Phần lớn lập trình viên hiểu cảm giác này.
Đó là lý do vì sao bạn nên viết vấn đề của mình ra, vẽ một biểu đồ, hoặc nói với ai đó (hoặc cái gì đó … một số người sử dụng một con vịt cao su).
“Nếu như bạn không thể giải thích cái gì đó với các từ ngữ đơn giản, bạn không hiểu nó” – Richard Feynman
2. Lập kế hoạch 
Đừng nhảy ngày vào giải quyết mà không có một kế hoạch (và hy vọng bằng cách nào đó bạn có thể loanh quanh mãi rồi cũng làm được). Lên kế hoạch phương án của mình.
Không gì có thể giúp bạn nếu bạn không thể viết ra các bước chính xác.
Trong lập trình, điều này có nghĩa là đừng bắt đầu xâm nhập ngay. Hãy để cho não bạn có thời gian phân tích vấn đề và xử lý thông tin.
Để có kế hoạch, hãy trả lời câu hỏi dưới đây:
“Cho đầu vào X, các bước cần thiết để có đầu ra Y là bước nào?”
Lưu ý: lập trình viên có một công cụ tuyệt vời giúp họ với câu hỏi này …. Chú giải!
3. Chia nhỏ 
Tập trung chú ý. Đây là bước quan trọng nhất.
Đừng cố giải quyết cả một vấn đề to lớn. Bạn sẽ khóc đó.
Thay vào đó, hãy chia chúng thành các vấn đề nhỏ - tiểu vấn đề. Các tiểu vấn đề này dễ giải quyết hơn nhiều.
Sau đó, giải quyết các tiểu vấn đề từng cái một. Bắt đầu với cái đơn giản nhất. Đơn giản nhất có nghĩa là bạn biết câu trả lời (hoặc gần như câu trả lời).
Sau đó, đơn giản nhất có nghĩa là tiểu vấn đề được giải quyết không phải dựa trên giải quyết các vấn đề khác.
Một khi bạn giải quyết mọi tiểu vấn đề, kết nối chúng lại.
Kết nối các tiểu vấn đề sẽ đưa ra giải pháp cho vấn đề ban đầu. Chúc mừng!
Kỹ năng này là nền móng của giải quyết vấn đề. Ghi nhớ nó (đọc lại bước này, nếu bạn thấy cần thiết)
“Nếu như tôi có thể dạy mỗi lập trình viên mới một kỹ năng giải quyết vấn đề, nó sẽ là “kỹ năng đơn giản hóa vấn đề”.
Giả như 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 10 số và tìm ra số nào là số lớn thứ 3. Đối với một lập trình viên mới toanh, đây có thể là một phần việc khó nhằn, mặc dù nó chỉ yêu cầu các câu lệnh cơ bản.
Nếu như bạn bị mắc kẹt, bạn nên đơn giản hóa vấn đề. Thay vì tìm số lớn thứ 3, bạn nghĩ sao về tìm số lớn nhất? Vẫn khó? Thế còn tìm số lớn nhất trong 3 số? hay lớn hơn trong 2 số?
Đơn giản hóa vấn đề đến điểm mà bạn biết cách giải quyết chúng và viết ra giải pháp. Sau đó mở rộng vấn đề từ từ và viết lại giải pháp để kết nối chúng, và tiếp tục như vậy cho đến khi bạn quay trở lại điểm xuất phát". – V. Anton Spraul
4. Mắc kẹt 
Bây giờ, bạn có lẽ đang ngồi đó và nghĩ “này Richard… Điều đó tuyệt đấy, nhưng nếu như tôi bị mắc kẹt và không thể giải quyết được dù chỉ một tiểu vấn đề?”
Đầu tiên, hít một hơi thật sâu. Thứ hai, đó điều là bình thường.
Đừng lo lắng, anh bạn. Điều đó xảy ra với mọi người.
Điều khác biệt là lập trình viên/ người giải quyết vấn đề tốt nhất thường tò mò nhiều hơn bực tức khi gặp lỗi.
Thực tế, dưới đây là 3 điều nên thử khi phải đối mặt với khó khăn:
  • Sửa lỗi: đi từng bước qua giải pháp của bạn cố gắng tìm ra chỗ sai. Lập trình viên gọi việc này là sửa lỗi
“Nghệ thuật của sửa lỗi là tìm ra điều gì bạn thực sự yêu cầu chương trình của bạn làm hơn là điều gì bạn nghĩ là bạn yêu cầu nó làm” – Andrew Singer
  • Đánh giá lại: Lùi lại một bước. Xem xét vấn đề từ khía cạnh khác. Có điểm nào có thể chuyển sang một cách tiếp cận bao quát hơn không?
“Thi thoảng, chúng ta lạc lối trong chi tiết của vấn đề, chúng ta không chú ý tới các nguyên tắc chung mà có thể giải quyết vấn đề ở mức độ tổng quát hơn.
Ví dụ kinh điển của vấn đề trên, đương nhiên, là tổng của một dãy dài các số nguyên liên tiếp, 1+2+3+…+n, cái mà Gauss nhanh chóng nhận ra chỉ đơn giản là n(n+1)/2, do đó tránh phải mất công làm phép cộng” – C.Jordan Ball
Lưu ý: Một cách khác để đánh giá lại là bắt đầu một cái mới. Xóa mọi thứ và bắt đầy với cái nhìn tươi mới. Tôi nghiêm túc đó. Bạn sẽ sững sờ khi biết nó hiệu quả như thế nào.
  • Nghiên cứu: ah, Google thần thánh. Bạn đọc đúng rồi đó. Không cần biết vấn đề của bạn là gì, một ai khác chắc đã xử lý nó. Tìm người đó/ giải pháp đó. Thực tế, làm cách này kể cả khi bạn đã giải quyết được vấn đề (Bạn có thể học được nhiều điều từ giải pháp của người khác).
Cánh báo: Đừng tìm giải pháp cho cả vấn đề lớn. Chỉ nên tìm giải pháp cho các tiểu vấn đề. Tại sao? Bời vì trừ khi bạn vật lộn (dù chỉ là một chút), bạn sẽ không học được gì cả. Nếu bạn không học được gì, bạn đã lãng phí thời gian của bạn.
5. Thực hành 
 Đừng kỳ vọng sẽ trở nên giỏi giang chỉ trong 1 tuần. Nếu như bạn muốn trở thành một người giải quyết vấn đề tốt, giải quyết thật nhiều vấn đề!
Thực hành. Thực hành. Thực hành. Chỉ cần thời gian trước khi bạn nhận ra “vấn đề này có thể được giải quyết một cách đơn giản với ”.
Làm thế nào để thực hành? Có rất nhiều lựa chọn.
Cờ vua, giải toán, Sudoku, Go, Monopoly, Trò chơi điện tử, ….
Thật ra, một khuôn mẫu chung giữa những người thành công là thói quen thực hành “giải quyết các tiểu vấn đề”. 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 thấy lãnh đạo kinh doanh sẽ như thế nào trong 3 đến 5 năm tới, hãy xem chuyện gì đang xảy ra trong trò chơi điện tử”
Tua nhanh tới ngày nay, Elon Musk, Reid Hoffman, Mark Zuckerberg và nhiều người khác nói rằng trò chơi điện tử là nền tảng cho thành công trong việc xây dựng công ty của họ.” – Mary Meeker (Báo cáo xu hướng internet 2017)
Điều đó có phải là bạn chỉ nên chơi trò chơi điện tử hay không? Không đâu.
Nhưng trò chơi điện tử là về cái gì? Đúng vậy, chính là giải quyết vấn đề!
Vậy, cái bạn nên làm là tìm cái gì đó để thực hành. Cái cho phép bạn giải quyết nhiều tiểu vấn đề (một cách lý tưởng, cái gì mà bạn thấy thích thú).
Ví dụ, tôi thích các thử thách lập trình. Mỗi ngày, tôi cố giải ít nhất một thách thức (thường trên Coderbyte).
Như tôi nói, tất cả các vấn đề đều có hình mẫu tương tự
Kết luận 
Tất cả có nhiêu đó thôi các bạn!
Bây giờ, bạn đã hiểu rõ hơn “suy nghĩ như một lập trình viên” có nghĩ thế nào rồi.
Bạn cũng biết kỹ năng giải quyết vấn đề là một kỹ năng tuyệt vời để nuôi dưỡng (Siêu kỹ năng).
Nếu như thế vẫn chưa đủ, lưu ý rằng bạn luôn biết làm thế nào để thực hành kỹ năng giải quyết vấn đề.
Phù… khá ngầu ha?
Cuối cùng, tôi hy vọng các bạn sẽ gặp thật nhiều vấn đề.
Đúng như bạn đọc đó. Ít nhất bạn biết cách giải quyết chúng (và, bạn sẽ học được rằng với mỗi giải pháp, bạn sẽ tiến bộ).
“Ngay khi bạn nghĩ bạn thành công định vị một chướng ngại vật, cái khác sẽ xuất hiện. Nhưng đó là điều khiến cho cuộc sống thú vị.[…]
Cuộc sống là một chu trình vượt qua các chướng ngại vật – một chuỗi các phòng tuyến kiên cố mà chúng ta cần vượt qua.
Mỗi lần, bạn sẽ học được cái gì đó.
Mỗi lần, bạn sẽ phát triển sức mạnh, sự thông thái và tầm nhìn.
Mỗi lần, một chút cạnh tranh sẽ giảm xuống. 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 (Sự trở ngại là con đường).
Còn bây giờ, hãy đi giải quyết các vấn đề!
Và chúc bạn may mắn!