Tìm kiếm giải pháp hay là giải pháp và thuật toán tìm kiếm
Khi những thuật toán thời đầu đi học nó vẫn vận vào cuộc sống đến cả chục năm sau
Note: bài viết trước của mình cũng nhận được nhiều sự ủng hộ từ mọi người, cũng là 2nd most viewed article của mình. Cám ơn sự đón nhận từ mọi người, cũng là một động lực để mình chăm chỉ viết bài thêm một chút. Nếu mọi người có mình nói thêm về cái gì thì cứ thoải mái contact mình nhé :)
Problem and Solution
Để tóm tắt về cuộc đời của một con người thì đó là mỗi chuỗi liên miên của vấn đề và giải quyết vấn đề. Có thể là vấn đề trong công việc, cuộc sống, hay là những hoài bão bao la như là trồng cây gì nuôi con gì; bạn lúc nào cũng đang có một (vài) vấn đề nào đó mà bạn đang cần tìm giải pháp cho nó. Đấy, làm con người cũng vất vả lắm…
Đối diện với những vấn đề tràn lan này, con người tự thiết lập ra những tư duy, về cách giải quyết vấn đề, về problem solving. Không có kỹ năng problem solving, mà nó là tổng hợp của nhiều kỹ năng khác nhau, gộp lại để tìm cách phân tích và giải quyết vấn đề trước mắt. Có những công ty consulting lớn (như big 3 MBB) dành cả thanh xuân của họ để giải quyết vấn đề, lập ra những frameworks để có thể tiếp cận và giải quyết một vấn đề một cách tường tận, cặn kẽ. Nhiều các practices trong Product Management, trong Engineering, cũng nằm từ các phương pháp giải quyết vấn đề mà ra.
Hôm nay thì mình lại muốn viết về một hướng khác của giải quyết vấn đề, đó là về cách mọi người đi sâu vào việc giải quyết vấn đề. Cái này lại liên quan đến hai giải thuật khá là tiêu biểu, mà các bạn học code hoặc software engineering chắc chắn đều đã phải trải qua, đó là DFS (Depth-First Search) và BFS (Breadth-First Search). Hai thuật toán tiêu biểu cho bài toán tìm đường, là cách để tìm đường đến kết quả từ A đến B; nó cũng khá giống với việc bạn đi tìm đường để giải quyết vấn đề vậy.
Tìm kiếm giải pháp và khi bạn đi vào ngõ cụt
DFS và BFS, đúng như cái tên của giải thuật, hai phương thức tìm đường nhưng mà sử dụng 2 heuristics khác nhau: DFS ưu tiên về hướng là đi sâu, còn BFS thì lại ưu tiên về hướng mở rộng tất cả các hướng đi.
Khi bạn tư duy đi theo chiều sâu, bạn chọn một hướng suy nghĩ và tiếp tục đi mãi đi mãi trên con đường đó; kết thúc là bạn sẽ tìm được đường ra, hoặc là bạn sẽ đi vào ngõ cụt và bạn phải lùi lại vài bước, để xem là ở điểm đó bạn có thể rẽ theo hướng khác được không. Ví dụ đơn giản như là bạn muốn nhảy việc sang một công việc lương cao hơn nhưng mà trái với ngành bạn đang học. Bạn thấy cần phải đi học thạc sỹ, mà phải học ở nước ngoài mới đủ uy tín; thế là bạn lao đầu vào vừa học vừa làm, vừa chuẩn bị tài chính vừa nghiên cứu apply. Sức khoẻ của bạn thì giảm sút, công việc đang làm thì kém hiệu quả, nhưng mà bạn lại không thể mất công việc vì đây cũng là nguồn tài chính cần có.. vân vân và mây mây.
Đương nhiên, đó chỉ là một ví dụ hơi negative khi bạn đi tư duy theo chiều sâu, dễ dẫn đến bị đi vào ngõ cụt và khó có thể vòng lại được. Vấn đề hay gặp nhất của hướng suy nghĩ này, đó là đi vào X-Y problem, nôm na như sau:
Bạn muốn làm việc X, sau khi suy nghĩ thì bạn thấy là cần phải làm Y
Bạn không biết làm Y, nên là bạn đi hỏi mọi người cách để làm Y
Tuy nhiên, có cách đơn giản hơn để giải quyết được thẳng X, tuy nhiên bởi vì bạn đang bị vướng vào suy nghĩ về Y, nên là bạn sẽ tiếp tục giải quyết Y, chứ ko tìm hiểu ra cách đơn giản nhất để tìm X
Điều này cũng hay được thấy khi các bạn junior hỏi bài những senior có kinh nghiệm hơn, khi các bạn đã đi vào Y và hỏi cách để làm Y, mà không giải thích về X. Nhìn thì vậy thôi, nhưng mà lại xảy ra rất nhiều trong cuộc sống.
Còn tư duy đi theo hướng chiều rộng là sao? Đó là khi bạn mở ra rất nhiều hướng đi cùng một lúc, liệt kê ra tất cả các lựa chọn có thể. Khi bạn chắc chắn là bạn đã có hết những lựa chọn trước mắt, thì bạn mới đi sâu thêm về vấn đề thêm 1 bước nữa, và lại tiếp tục mở hết các options, cho đến khi đi về đích. Giả sử bạn muốn mua một cái xe ô tô để đi lại, bạn sẽ có rất nhiều hướng để giải quyết: gom góp làm việc để trả hết, xin tiền gia đình, hoặc là vay ngân hàng (có thể vay 1/2, 1/4 hay là gì đó). Với việc gom góp làm ăn, thì bạn lại có hướng là xin tăng lương, xin nhảy việc, đi làm thêm một việc gì đó; còn vay ngân hàng thì bạn lại có ngân hàng lãi suất tốt, ngân hàng uy tín, ngân hàng có người quen…
Chắc các bạn có thể thấy ngay vấn đề của tư duy theo chiều rộng này, đó chính là dễ dẫn vào overthinking. Khi bạn thấy tất cả các options trước mặt đều đang mở rộng, và có quá nhiều hướng để giải quyết cùng một vấn đề, bạn sẽ phải đối mặt với quá nhiều lựa chọn, dẫn đến việc cân nhắc đong đếm giữa cùng các ý tưởng trở nên đau đầu hơn rất là nhiều. Một trong những ý kiến chủ quan của mình, đó là overthinking chính là vấn đề lớn nhất mọi người gặp trong thế giới hiện nay: có quá nhiều thông tin trước mắt, có quá nhiều người đưa ra ý kiến hoặc lời khuyên, tất cả dẫn đến một sự ngộp thở cho những bạn trẻ đang loay hoay với việc làm người lớn.
Chỉ nghĩ thôi cũng mệt
Mình có nhắc đến hai hướng tư duy cũng như các vấn đề của nó ở phía trên, tuy nhiên trong thực tế thì không ai làm như thế, mà nó luôn là một sự kết hợp của cả hai. Mọi người có thể để mở options ban đầu để đi rộng ra, nhưng khi đã có hướng giải quyết rồi thì có thể đi và suy nghĩ thật ra sâu về nó. Mỗi người đều có balance của riêng mình, chỉ là mình cũng nên chú ý về cách mình suy nghĩ, liệu có dễ đâm vào ngõ cụt hay là không.
Cũng nói về chuyện thuật toán, một cách hay được dùng để tối ưu những thuật toán tìm đường, thì đó là early termination: xây dựng ra những ý tưởng để mình hạn chế lại bài toán, không bị dễ đi quá sâu hoặc là đi quá rộng. Đó có thể là những giới hạn mà bạn tự đặt ra, những kinh nghiệm của chính bạn, sự hướng dẫn và lời khuyên từ những support system (gia đình, bạn bè, mentor) của bạn. Đây là những thứ bạn sẽ xây dựng trong suốt cuộc đời của mình, cho quá trình quyết định trong cả cuộc sống. Đó là kiến thức, kinh nghiệm, trải nghiệm.
Để nói dài hơn về việc quyết định, mình nhận định cuộc đời là một bài toán Multi-armed bandit. Con người luôn có những lựa chọn trước mặt mình, và luôn có những lựa chọn giữa explore (tìm hiểu và khám phá thêm về cuộc sống) hoặc exploit (khai thác những gì mình đã biết). Một phần vì đây là bài toán data science khá là kinh điển, và mình cũng có niềm đam mê với xác suất. Đây chắc là một chủ đề dài hơn, chắc lúc nào đó mình sẽ viết về nó.
Hy vọng những gì mình viết có thể giúp bạn suy nghĩ tốt hơn. That’s all for today :)