คิดให้ดีก่อน Re Write — ภาคหนึ่ง
นี่เป็นบทความแปลนะครับ ต้นฉบับมาจากโจเอล สโพลสกี้ Things You Should Never Do, Part I เค้าเขียนดีมากถึงข้อควรระวังก่อนการเริ่มโครงการเขียนโค๊ดใหม่แทนโค๊ดเก่า ลองอ่านกันดูครับ
ในที่สุดเน็ตสเคป 6.0 ก็ถูกเปิดตัวออกสู่สายตาประชาชนเป็นครั้งแรก น่าสังเกตว่ามันไม่มีเวอร์ชั่น 5.0 การรีลีสครั้งใหญ่ครั้งล่าสุดคือเวอร์ชั่น 4.0 และนั่นก็คือเมื่อสามปีก่อน สามปีนั้นถือว่าเป็นเวลาที่ยาวนานอย่างน่าเกลียดในโลกของอินเตอร์เน็ต ระหว่างนั้นเน็ตสเคปทำได้แค่นั่งนิ่งๆมองดูส่วนแบ่งการตลาดของตัวเองที่ตกฮวบลง
มันดูเหมือนเป็นการเยาะเย้ยจากผมที่ไปวิจารณ์พวกเค้าที่ใช้เวลานานแสนนานระหว่างรีลีส พวกเค้าไม่ได้อยากให้มันเป็นแบบนั้นหรอก — ใช่มั้ย?
อืมมม ใช่ เค้าตั้งใจให้เป็นแบบนั้น พวกเค้าตั้งใจใช้เวลานานระหว่างรีลีสด้วยการทำสิ่งเดียวที่เป็นความผิดพลาดทางกลยุทธ์ที่ยิ่งใหญ่ที่สุดที่บริษัทซอฟต์แวร์ซักบริษัทหนึ่งจะทำได้
พวกเค้าตัดสินใจเขียนโค๊ดใหม่ทั้งหมดตั้งแต่ต้น
เน็ตสเคปไม่ใช่บริษัทแรกที่ทำพลาดแบบนี้ บอร์แลนด์ก็พลาดเหมือนกันตอนที่ซื้ออราโก้มาแล้วพยายามทำให้มันเป็นดีเบสสำหรับวินโดวส์ โปรเจกต์นี้ยาวนานแสนนานจนไมโครซอฟต์แอ็กเซสออกมาไล่ฮุบตลาดไปหมด จากนั้นพวกเค้ายังทำผิดพลาดต่อไปด้วยการเขียนคว๊อตโต้ โปรใหม่แล้วทำให้ผู้ใช้งงงวยเพราะมีฟีเจอร์น้อยกว่าเดิม ไมโครซอฟต์เองก็เกือบจะพลาดด้วยการพยายามจะเขียนไมโครซอฟต์เวิร์ดใหม่ทั้งหมดด้วยโปรเจกต์ชื่อปิรามิดที่สุดท้ายถูกปิด โยนทิ้งไว้ใต้พรม โชคดีสำหรับไมโครซอฟต์ที่พวกเค้ายังคงลุยทำงานในโค๊ดชุดเก่าต่อไปนั่นทำให้เค้ามีของจะส่งมอบแบบไม่ขาดตอน
เราเป็นโปรแกรมเมอร์ โปรแกรมเมอร์ลึกลงไปในใจแล้วเป็นสถาปนิกและสิ่งแรกที่พวกเราอยากทำเมื่อมาถึงหน้างานคือไถกลบงานเก่าให้ราบแล้วสร้างอะไรที่ใหม่และยิ่งใหญ่ขึ้นมาแทน พวกเราไม่ตื่นเต้นกับการปรับแต่งอะไรทีละเล็กละน้อย: งานซ่อมแซม งานปรับปรุง งานปลูกต้นไม้
มันมีเหตุผลที่เข้าใจยากที่โปรแกรมเมอร์อยากจะโยนโค๊ดเก่าทิ้งแล้วเขียนใหม่ทั้งหมดอยู่ตลอดเวลา เหตุผลนั้นคือพวกเค้าคิดว่าโค๊ดเก่ามันยุ่งเหยิง และนี่คือข้อสังเกตที่น่าสนใจ: พวกเค้าอาจจะเข้าใจผิด เหตุผลที่พวกเค้าคิดว่าโค๊ดเก่ามันยุ่งเหยิงมันเป็นเพราะกฎพื้นฐานของการเขียนโปรแกรม
อ่านโค๊ดมันยากกว่าเขียนโค๊ด
นี่คือสาเหตุว่าทำไมการเอาโค๊ดมาใช้ใหม่มันเป็นเรื่องยากมาก นี่คือเหตุผลว่าทำไมทุกคนในทีมของคุณต่างคนต่างเขียนฟังก์ชั่นในการแบ่งสตริงไปใส่ในอะเรย์ พวกเค้าเขียนฟังก์ชั่นของตัวเองเพราะมันง่ายกว่าและสนุกกว่าการมานั่งศึกษาว่าโค๊ดเก่าที่มีอยู่แล้วมันทำงานยังไง
ผลที่ตามมากจากกฎความจริงข้อนี้คือคุณลองไปถามโปรแกรมเมอร์คนไหนก็ได้ดูถึงโค๊ดที่พวกเค้ากำลังเขียนอยู่ “มันโคตรยุ่งเหยิงเละเทะเลย” พวกเค้าจะตอบคุณแบบนี้ “ผมไม่อยากได้อะไรมากกว่าโยนมันทิ้งแล้วเขียนใหม่อีกแล้ว”
ทำไมมันถึงเละเทะยุ่งเหยิง?
“อืมมม ก็” พวกเค้าตอบคุณ “ลองดูที่ฟังก์ชั่นนี้สิ มันยาวสองหน้า!!! แล้วไม่มีโค๊ดส่วนไหนที่ควรอยู่ตรงนี้เลย มันผิดที่ผิดทางไปหมด หนูไม่รู้ด้วยซ้ำว่าครึ่งนึงของเอพีไอชุดนี้มีไว้เพื่ออะไร”
ก่อนที่โปรแกรมสเปรดชีทสำหรับวินโดวส์ของบอร์แลนด์ตัวใหม่จะรีลีส ฟิลิปเป้ คาห์น ผู้ก่อตั้งบอร์แลนด์กล่าวไว้อย่างอวดดีหลายครั้งว่าคว๊อตโต้ โปรตัวใหม่มันจะดีกว่าไมโครซอฟต์เอ็กเซลมากแค่ไหนเพราะมันถูกเขียนใหม่หมดตั้งแต่ต้น โค๊ดใหม่แบบ 100%
ความคิดที่ว่าโค๊ดใหม่จะดีกว่าโค๊ดเก่านั้นไร้สาระ โค๊ดเก่าถูกใช้ มันถูกเทส บั๊กมากมายถูกค้นพบและพวกมันถูกแก้ไข ไม่มีอะไรผิดสำหรับเรื่องนี้ โค๊ดมันไม่ได้หาบั๊กเจอได้ด้วยตัวเองได้ด้วยการถูกทิ้งไว้เฉยๆในฮาร์ดไดรฟ์ของคุณ ตรงกันข้ามเลยเด็กน้อย! ซอฟต์แวร์ควรจะเป็นเหมือนรถดอร์จที่ถูกทิ้งให้ขึ้นสนิมในโรงรถงั้นหรือ?
กลับมาที่เรื่องฟังก์ชั่นยาวสองหน้า ใช่ ผมรู้ มันเป็นแค่ฟังก์ชั่นง่ายๆที่ใช้แสดงหน้าต่างแต่มันก็เริ่มใหญ่โตขึ้นเรื่อยๆโดยที่ไม่มีใครรู้ว่าทำไม โอเค ผมจะบอกคุณเองว่าทำไม: นั่นมันคือการแก้บั๊กไง บั๊กตัวแรกที่แนนซี่เจอตอนที่เธอกำลังติดตั้งโปรแกรมในคอมพิวเตอร์ที่ไม่มีอินเตอร์เน็ต เอ็กพลอเรอร์ บั๊กอีกตัวถูกพบตอนหน่วยความจำเหลือน้อย อีกตัวเจอตอนไฟล์กำลังถูกอ่านจากฟลอปปี้ดิสก์แล้วผู้ใช้ดึงดิสก์ออกระหว่างกลาง และเอพีไอเหล่านั้นอาจจะดูน่าเกลียดแต่มันก็ทำให้โค๊ดนี้ใช้งานได้กับวินโดว์ 95 เวอร์ชั่นเก่าๆ
บั๊กแต่ละตัวต้องใช้เวลานานหลายสัปดาห์ในการใช้งานจริงถึงจะถูกค้นพบ โปรแกรมเมอร์อาจจะใช้เวลาสองสามวันในการรีโปรดิวส์มันในแลปและแก้ไข และถ้ามันเป็นเหมือนบั๊กทั่วไป การแก้ไขนั้นอาจจะแค่แก้โค๊ดหนึ่งบรรทัดหรืออาจจะเป็นแค่การเขียนโค๊ดเพิ่มแค่ไม่กี่ตัวอักษร แต่งานและเวลามากมายต้องใช้ไปในกระบวนก่อนหน้าการพิมพ์โค๊ดสองสามตัวอักษรนั้น: การค้นหาบั๊ก การวิเคราะห์บั๊ก และการหาแนวทางแก้บั๊ก
เมื่อคุณโยนโค๊ดพวกนี้ทิ้งไปแล้วเริ่มทำใหม่ คุณกำลังโยนความรู้ทั้งหมดนี้ทิ้งไปด้วย รวมถึงการแก้บั๊กทั้งหมด รวมถึงเวลาที่เสียไปหลายปีในการเขียนโปรแกรม
คุณกำลังโยนความเป็นผู้นำทางตลาดทิ้งไป คุณกำลังมอบของขวัญชิ้นใหญ่ก็คือเวลาสองถึงสามปีให้คู่แข่งของคุณและเชื่อผมเถอะนั่นมันเป็นเวลาที่ยาวนานมากในโลกของซอฟต์แวร์
คุณกำลังผลักตัวเองไปอยู่ในจุดที่เสี่ยงอย่างยิ่งเพราะระหว่างที่คุณลงแรงทำของใหม่คุณจะส่งมอบได้แต่โค๊ดชุดเก่า คุณไม่สามารถเปลี่ยนแปลงกลยุทธ์หรือสร้างฟีเจอร์ใหม่ที่ตอบสนองความต้องการของตลาดได้เลยเพราะโค๊ดชุดใหม่ยังไม่พร้อมจะรีลีส เรียกได้ว่าคุณแทบจะต้องปิดธุรกิจของคุณในช่วงนั้นไปเลย
คุณกำลังเสียเงินอย่างไม่สมควรไปกับการเขียนโค๊ดที่คุณมีอยู่แล้ว
มีทางเลือกอื่นมั้ย?
มีครับ ต่อพรุ่งนี้
ผมเขียนบทความนี้เพราะอยากเปลี่ยนแปลงสิ่งที่เป็นอยู่ในอุตสาหกรรมการผลิต ซอฟต์แวร์ให้ดีขึ้นตามความเชื่อและประสบการณ์ของผม ถ้าเพื่อนๆเชื่อในแนวทางเดียวกัน เรามาช่วยกันคนละไม้คนละมือทำให้สังคมของเราดีขึ้นครับ จะแชร์บทความนี้ผ่าน Social Network หรือจะแบ่งปันเรื่องราวนี้ให้คนที่นั่งข้างๆฟังบ้างก็ได้
The Future Has Arrived — It’s Just Not Evenly Distributed Yet, William Gibson
อนาคตอยู่ตรงนี้แล้ว เรามีหน้าที่ต้องถ่ายทอดมันออกไปให้คนอื่นได้สัมผัสสิ่งดีๆร่วมกันครับ