คือผมคิดว่าเราจำเป็นจะต้องเข้าใจว่า
1. Design กับ Problem solving มันเป็นโจทย์คนละแบบ การเลือกปัญหาที่ใช่ กับการแก้ปัญหาที่เลือกมาแล้ว มันคือโจทย์คนละอย่างกันเลย ถ้าไม่เข้าใจว่ามันคนละเรื่องก็จะมองหรืออ่าน Solution แบบผิดเพี้ยนไปหมด ยังไม่ต้องพูดถึงการวิจารณ์
2. การเลือกปัญหาให้มันทำผ่านการเข้าใจว่ามนุษย์เรามี Unmet need อะไรบ้างที่เป็นไปได้
3. ความสามารถในการเข้าใจ Empathize กับ Unmet need ที่ "ตัวฉัน" รู้สึกเฉยๆ เป็นทักษะสำคัญที่ต้องมีในการทำงาน Design Software, Solution and Architecture มากกกก มากกว่าที่หลายคนอาจจะตระหนักรู้ (อย่างเช่นหลายคนที่ทำงาน low-level ก็มีที่มองว่าไอ้พวกที่มันโอดร้องว่าอยากได้เครื่องมือที่ช่วยทำงานง่ายขึ้น ต้องการ Garbage collector มันก็แค่คนขี้เกียจไม่มีทักษะในการจัดการเมมโมรี่! เราต้องทำของที่ไวสิวะแล้วต้องเข้าใกล้ Machine level ให้มากที่สุดสิวะ! อันนี้ก็คือขาดสามารถในการ Empathize ไปเลย)
เลือกปัญหามาแก้ถูก บางทีทำงานไม่ตรงเป๊ะลูกค้ายังเซ็นผ่านเลย เลือกปัญหาผิดมาแก้ ตรงตามสโคปในสัญญาทุกตัวอักษรยังไฝว้กันได้เลย (ผมไม่ตัดสินละกันว่าอันนี้ดีหรือไม่ดี แต่เป็นเรื่องที่เกิดขึ้นจริง)
นั่นแหละที่สอน Humanistic architecture ก็คือตั้งใจจะ Address เรืองนี้ เป็นคอร์สที่ผมอยากสอนที่สุด คิดเอาเองว่ามีประโยชน์กับโปรแกรมเมอร์ที่พร้อมรับ อย่างน้อยผมก็พบว่าสำหรับตัวเองมันเป็นแกนกลางการทำงานของผมเลย
บางคนอ่านคอร์สและอ่านรีวิวอาจจะงงว่าเรื่องแบบจิตวิทยา การเข้าใจตัวเอง การเข้าใจคุณค่าและพื้นฐานของความต้องการมนุษย์ มันเกี่ยวข้องกับ Software architecture design ยังไง งาน Software Architecture มันน่าจะเรียนเรื่องแบบ Distributed system, database, horizontal scaling, idempotency, design pattern อะไรพวกนี้ไม่ใช่เหรอ
ผมคิดว่ามันเกี่ยวอย่างที่สุดแล้ว เกี่ยวแบบคือ Step 0 ในระดับรากฐานที่สุดเลย คุณเลือกปัญหาอะไรมาแก้ก่อนล่ะ ปัญหาระบบล่ม? ปัญหาต้นทุน? ปัญหาฟีเจอร์ออกช้า? หรือไม่เลือกอะไรเลยออกแบบไปเรื่อยเปื่อย? ถัดมา คุณ Trade อะไรทิ้งไป ลดความสำคัญของปัญหาอะไรลงไปบ้าง
นี่อ่ะคือแกนกลางของงานออกแบบ Architecture ชัดๆ
ทั้งทักษะการ Problem solving และทักษะการ Design มันสำคัญทั้งคู่ แต่ที่สำคัญเลย มันเป็นคนละทักษะกันครับ และถ้าไม่เข้าใจ คิดว่าโลกซอฟต์แวร์มีชุดปัญหาชุดเดียวเท่านั้นที่สำคัญ (เช่นระบบไม่ล่มบ้างล่ะ ความมี Resource efficient บ้าง ต้นทุนการรันอินฟรา ความปลอดภัยขั้นเทพบ้าง) คุณจะไม่สามารถเห็นคุณค่าของ Solution หรืองานออกแบบที่ออกแบบมาแก้ปัญหาที่คุณไม่ได้เลือกได้เลย
ในประเทศไทยผมยกและซูฮกให้พี่เดฟไปแล้วเรื่องการสอนทักษะ Problem solving ผมว่าผมสอนได้ทั้งไม่ดีและไม่ลึกเท่าแกหรอก ให้แกดีกว่า
(ถ้าพี่ผ่านมาอ่านแล้วอยากให้ Tag บอกได้ เผื่อให้คนตามไปดูพี่ออกคอร์ส)
ผมอยากเสริมจุดที่ผมว่านักพัฒนาหลายคนมองข้ามคือจุดของงาน Design เวลามีคนความต้องการขมุกขมัวที่อึดอัดไปหมดจนพร้อมจ่างเงินมากมาย เราจะออกแบบว่า Concrete problem ที่ช่วยเยียวยาความต้องการนั้นได้คืออะไรนะ
แล้วจากจุดนั้น จึงทำการ Problem solving ต่อไป
(นี่เริ่มมาจากฟังคลิปใหม่ของ Theo ที่นั่ง Defend web development จากพวก "ปรมาจารย์ด้าน Performance" ต่างๆ ที่นั่งด่าว่าทำเว็บสมัยนี้มัน Bloat มัน Complex ช้าไปหมดมีแต่เครื่องมือไร้สาระแก้ปัญหาไร้สาระ ก็แบบ..... ของขึ้นอ่ะนะ เข้าอกเข้าใจในโจทย์กันก่อนดีมั้ยคะ)
มันมีหลายภาษาและหลาย Solution design ที่ผมกล้าพูดว่ามันออกแบบมาโคตรดีและงดงามจัดๆ แต่ผมไม่ชอบ เพราะมันไม่ได้แก้ชุดของ Problem ที่ผมคิดว่า Matter ในประสบการณ์ส่วนตัว ผมก็สามารถซาบซึ้งในความสวยงามของมันได้ และเลือกใช้มันได้เวลาที่ต้องการอ่ะครับ