ทำเพื่อ ไม่ใช่ทำเผื่อ อนาคต

วันก่อนมีโพสหนึ่งใน agile66 ว่า

Nuttanart Pornprasitsakul
มีคำถามครับ ผมรู้สึกขัดแย้งในความคิดตัวเองนิดหน่อย

คือ Agile ต้องคอยบอกคนอื่นว่าอย่าคิด “เผื่ออนาคต” เยอะ (เวลาเค้าจะทำ Big up front design) เพราะสิ่งที่คิดเยอะนั้นมันมีโอกาสผิดสูง แต่

– เวลาเราเขียน test ทำ TDD เราบอกว่า ยอมเขียน production code ช้าวันนี้ “เพื่ออนาคต”
– เราทำ cross functional ทีมวันนี้ ทำให้งานเดินไปช้าลง “เพื่ออนาคต” จะได้มีคนช่วยงานกันได้มากขึ้น
– ฯลฯ

มันดูขัดแย้งกันมั้ยครับ พี่ๆ คิดยังไงครับ

มาฟังคำตอบจากผู้รู้กันก่อนครับ

Twin Roofimon Panichsombat มันเป็น อนาคต คนละมุมมองหรือป่าวครับ “เผื่อ” กับ “เพื่อ” นี่ไม่เหมือนกันนะ

Panupong Chantaklang อนาคตอันไกลที่ไม่รู้ว่าจะถึงไหม กับอนาคตอันใกล้ที่มันมาถึงแน่ๆ มั้งครับ อนาคตที่ agile หลีกเลี่ยงคือ อนาคตที่ไม่รุ้ว่าจะมาไหม แต่การทำ TDD,Cross Function อนาคตอันใกล้เราเจอแน่ไ

Twin Roofimon Panichsombat ‎”เผื่อ” เราพยายามทำนายอนาคตของโปรดัก ว่าเดี๋ยวอย่างนั้นอย่างนี้ อนาคตจะได้ไม่ต้องแก้ “นั่นไง” มันกลัวการแก้ไขในอนาคต บาปปปปปป แล้วสุดท้ายไอ้ที่เผื่อก็กลับมาพันขาตัวเองตาย

Arthit Hongchintakul Agile โดยสปิริต มีเป้าหมายเป็นความคล่องตัว สามารถปรับเปลี่ยนได้ การทำ big up front นั้น เมื่อทำไปแล้ว ถึงเวลาจริงๆ ก็ต้องเปลี่ยน มีความเป็นไปได้มากว่าต้องเปลี่ยน ถือเป็นการเปล่าประโยชน์
อีกด้านหนึ่ง TDD เป็นการรองรับความเปลี่ยนแปลงที่จะเกิดขึ้นเมื่อไรก็ได้ เมื่อเปลี่ยนแล้ว เรามั่นใจได้ว่า ของใหม่ ไม่ทำลายของเก่า
cross functional ก็เช่นเดียวกัน ทำไปเพื่อรองรับความเปลี่ยนแปลง ที่วันนึง คนอื่นๆ ก็สามารถเข้ามารับหน้าที่แทนเราได้ เมื่อมีเหตุให้ต้องเปลี่ยน
การมองไปข้างหน้านั้น ยังไง ก็ต้องมีครับ แต่จะมองไปแค่ไหน นี่คือคำถามสำคัญ คำตอบง่ายๆ จากประสบการณ์ คือ Simplest that makes sense ทำให้ง่ายที่สุด ที่จะทำให้ระบบของเราใช้งานได้ครับ

คุณ Nuttanart มีคำถามต่อว่า

Nuttanart Pornprasitsakul ขอบคุณครับ

ชัดเจน แต่ผมก็ยังรู้สึกว่าเหมือนต้องตอบให้คนเอนไปทาง Agile ฟังถึงจะเข้าใจ อยู่ดี

สงสัยเรื่องแบบนี้พูดไปคงไม่ได้อะไรเท่าไหร่ ต้องใช้ผลงานเอา

มีคำตอบต่อมาว่า

Nattanicha Rittammanart เก๋มองว่าเป็นอนาคตที่เราควบคุมได้ กับ ควบคุม ไม่ได้อ่ะค่ะ Agile เน้นให้เราทำเพื่ออนาคตที่เราควบคุมได้ มันจะได้มีประโยชน์จริงๆ

Pam Suebvisai ชอบที่พี่ Roofimon ตอบอ่ะ คือ ต้องถามว่า ทำไปเพื่อ!
ถ้าจากประสบการณ์ ส่วนใหญ่ developer ที่ over engineer ชอบใช้ความกลัวในการ design… อาจจะต้อง define ให้ได้ ว่าเค้ากลัวอะไร แล้วดูว่ามันมีอยู่จริงมั้ย มันจะเกิดขึ้นเร็วๆนี้มั้ย บางทีอาจจะมีอยู่จริง แต่อาจจะไกลมาก ก็ต้องดูว่า แล้วถ้าจัดการกับมันทีหลัง cost มันจะเยอะมากแค่ไหน เช่น สมมติ release แรกลูกค้าบอกยังไม่ต้อง support IE ก็ได้ แล้ว release ถัดไปค่อย support เราก็ดูว่า ถ้าไม่คิดถึงเรื่อง IE ใน design วันนี้ แล้วไปแก้ที่หลัง cost มันต่างกันมากมั้ย
แต่ในบาง case ความกลัวนั้นไม่มีอยู่จริง เคยเจอคน design database เป็น text field ทั้งหมด เพราะกลัวว่า เราจะไม่มีทางรู้ขนาด data ที่จะเป็นไปได้ทั้งหมด [ใส่หน้า shock ตรงนี้]

Kulawat Wongsaroj ทำเผื่อ คือทำแล้วไม่ได้ใช้ เสียของ
ทำเพื่อ คือทำเพราะมีจุดหมาย
มันคนละเรื่องเดียวกันเลยนะ

Somkiat Puisungnoen ผมขอมองในแง่ TDD นะครับ
จากที่บอกว่าช้านั้น ผมเถียงคอขาด เพราะว่าก่อนที่คุณจะเขียน TDD ได้ หรือทำพวก unit test + functional หรือ integration test ได้นั้น คุณต้องรู้เรื่อง condition ต่างๆ ข้อจำกัดต่างๆ ความสัมพันธ์ของระบบต่างๆ และ case ต่างๆ มาครบหรือครอบคลุมมากที่สุดแล้ว จึงจะสามารถเขียนได้
ดังนั้น ถ้าเขียนหรือทำโดยไม่มีการวางแผน มาถึงก็เข้ามาเขียน code เลย มันจะทำให้งานช้า ยิ่งต้องเขียน Test ไปอีก ก็โบ้ยไปว่า มีงานเพิ่มเข้ามาอีก
แต่ถ้าคิดใหม่ทำใหม่ ว่า เราทำการวางแผนไว้แล้ว รู้ว่าจะต้องทำอะไรบ้าง รู้ว่าจะต้องทดสอบอะไรบ้าง มันก้จะทำให้เรารู้ขอบเขตของงานที่จะทำ วึ่งสังเกตไหมว่าการเขียน Test มันรวมเข้าไปกับการ develop หรือ coding แล้วแบบเนียนๆ

Somkiat Puisungnoen คำถามที่ developer/programmer มักจะโดนมากๆ คือ คุณจะทดสอบสิ่งที่คุณเขียนไปยังไง แล้วจะรู้ได้ยังไงว่ามันถูกหรือครอบคลุม
แต่ถ้ามาที่ TDD จะมีถามเพิ่มเติมคือ การทกสอบนั้นสามารถทำซ้ำหรือ repeat ได้ไหม แล้วมันทำงานแบบอตโนมัติได้ไหม แล้วมันมี report ของผลการทดสอบแต่ละครั้งไหม
โดยรวมมันก็คือเอกสารดีๆ ของกระบวนการพัฒนาแบบปกตินี่เอง แต่มันถูกผนวกรวมไปในแต่ละ process แบบเนียนๆ

ความรู้สึกแรกตอนที่ผมอ่านโพสนี้คือ รู้สึกดีใจที่มีคนถามคำถามแบบนี้ มันเป็นเป้าหมายที่สร้างกลุ่มนี้ขึ้นมาตั้งแต่แรก เพราะรู้จากประสบการณ์ตัวเองว่าเมื่อเราเริ่มศึกษาอไจล์ จะเกิดคำถามประมาณนี้ขึ้นมากมาย แล้วก็เสียเวลามากมายในการค้นหาคำตอบ การที่มีคนมาช่วยตอบให้นั้นจะช่วยร่นเวลามากมายทีเดียว อย่างที่สองผมรู้สึกดีใจเป็นสองเท่าที่พวกมีคนที่มีความเข้าใจในตัวตนของอไจล์อยู่มาก ซึ่งดูได้จากคำตอบของแต่ละคนแล้วพุ่งเข้าตรงเป้าทีเดียว

สิ่งที่ผมอยากจะเสริมเข้าไปในเรื่องนี้คือ เวลาที่เรามีคำถามแบบนี้เกิดขึ้นในหัวแล้วเราควรทำอย่างไร สำหรับผม ผมจะกลับไปอ่าน อไจล์แมนนิเฟสโต เสมอ คำตอบมันอยู่ตรงนั้นตลอด ไม่เคยไม่มีเลย ทุกอย่างมันฝังอยู่ในประโยคแค่ 4 ประโยคนั่นแหละ อย่างคำถามนี้ มันอยู่ใน ข้อสี่ที่ว่า

Responding to change over following a plan

ตอบสนองต่อความเปลี่ยนแปลง มากกว่า จะทำตามแต่แผนงาน

ประโยคนี้มันตอบคำถามด้วยตัวของมันเอง กล่าวคือ ถ้าเราทำอะไรเพื่อทำให้เราสามารถจะปรับเปลี่ยน(โค้ด)ตามความเปลี่ยนแปลง(ของรีไควเม้นต์)ในอนาคตได้ นั่นเป็นอไจล์ อะไรที่เราทำเพื่อให้ในอนาคตมีความเปลี่ยนแปลงแล้วเราไม่ต้องเปลี่ยน(โค้ด) อันนี้ไม่ใช่อไจล์

เหตุผลที่อไจล์ต้องบอกอย่างนี้เพราะ โลกนี้ไม่มีอะไรแน่นอน (อนิจจัง) คือ แม้แต่ความไม่แน่นอนเองก็ยังไม่แน่นอน เพราะฉะนั้นเราจึงไม่สามารถคาดเดาอะไรได้ แต่คงมีคนแย้งว่า มีเวลาทำเผื่อเอาไว้ ก็ไม่เสียหายอะไรนี่ คำตอบคือ การที่เราเผื่อ มันคือการเพิ่มภาระในการดูแล เพราะเมื่อทำเผื่อแล้วจะมีปริมาณโค้ดมากขึ้น มีความซับซ้อนมากขึ้น มีส่วนที่ต้องคิดถึง ต้องทดสอบ ต้องอะไรอีกหลายอย่างมากขึ้น เมื่อเป็นอย่างนี้แล้วการที่เราจะพัฒนาซอฟแวร์ต่อไป มันก็เกิดผลให้มีค่าใช้จ่ายที่มากขึ้นเป็นเงาตามตัว และอย่างที่บอก เราไม่ได้ทำการกุศลแต่ทำธุรกิจ การที่ต้นทุนสูงขึนมันก็หมายถึง กำไรที่ลดลง ธุรกิจของลูกค้าเราก็อยู่ไม่ได้ แล้วเราก็อยู่ไม่ได้ด้วย มันเชื่อมกันเป็นลูกโซ่อย่างนี้

เพราะฉะนั้นการทำเผื่อ เลยเป็นการทุบหม้อข้าว เป็นการขุดหลุมฝังศพตัวเองไปเลยทีเดียว

อีกประการหนึ่ง ถึงแม้ว่าบางครั้งการทำเผื่อไว้จะบังเอิญตรงกับความเปลี่ยนแปลงที่เกิดขึ้นในอนาคตพอดี ถามว่า มันแตกต่างกันอย่างไรกับไปเปลี่ยนทีหลัง ถ้าเรามีความเป็นอไจล์มากพอ มันจะแทบไม่ต่างกันเลย กล่าวคือ การทำเผื่อคือการเอาค่าใช้จ่ายในอนาคตมาจ่ายในวันนี้พร้อมดอกเบี้ย ที่บอกว่าเป็นดอกเบี้ยเพราะ ถ้าเราไปเพิ่มในวันหน้า ระหว่างนี้เราก็ไม่ต้องคอยดูแลเจ้าส่วนเกินที่ทำเผื่อไว้ แต่พอทำไปก่อนเราก็ต้องดูแลมัน เหมือนเราไปกู้เงินมาแล้วต้องจ่ายดอกเบี้ยจนกว่าที่เราลงทุนไปจะคืนกำไรกลับมา แต่ บังเอิญการลงทุนทำเผื่อนี้โอกาสถูก มันพอๆ กับถูกหวย เลยไม่ค่อยได้ทุนคืนกันเท่าไหร่ ลงท้าย ก็เห็นขาดทุนกันทุกคน คือ ที่ทำไว้มันไม่พอกับที่เปลี่ยนเลยต้องแก้เพิ่ม ส่วนไอ้ที่ทำเผื่อไว้กลับเป็นปัญหาให้แก้ยากขึ้นไปอีก

การจะอธิบายเรื่องนี้ให้คนอื่นฟังนั้น ผมว่า วิธีที่ง่ายที่สุดคือ อธิบายเป็นเงิน คือ ถ้า จะให้เผื่อเรื่องนี้ จะต้องจ่ายเพิ่มเท่าไหร่ แต่ถ้าไม่ทำแล้ววันหลังต้องแก้ ต้องจ่ายเพิ่มเท่าไหร่ ส่วนใหญ่แล้ว มันจะถูกกว่า เพราะ ค่าดูแล แต่ที่คนส่วนใหญ่เลือกอย่างแรก เพราะเค้าลืมบวกค่าดูแลไปเท่านั้นเอง

Advertisements

ใส่ความเห็น

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out /  เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out /  เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out /  เปลี่ยนแปลง )

w

Connecting to %s