จะเป็นการดีกว่าหรือที่จะใช้วิธีปฏิบัติที่ไม่ดีที่มีอยู่แล้วหรือวิธีปฏิบัติที่ดีที่ไม่เหมาะสมกับรหัสเดิม


25

ฉันกำลังคิดเกี่ยวกับเรื่องนี้เพราะฉันพยายามที่จะเขียนส่วนขยายสำหรับซอฟต์แวร์ของบุคคลที่สามที่มีอยู่และฐานข้อมูลของพวกเขาถูกทำให้ผิดปกติอย่างน่ากลัว ฉันต้องการใช้ตารางที่มีอยู่และเพิ่มสาขาใหม่

ฉันมีตัวเลือกในการสร้างตารางใหม่ในสไตล์การออกแบบของพวกเขา (ซึ่งประกอบด้วยเกือบทั้งหมดเป็นอยู่ในตารางใหญ่หนึ่งตาราง) หรือสร้างชุดตารางใหม่ทั้งหมดพร้อมกันและใช้บางสิ่งที่พิเศษเช่น Triggers เพื่อซิงโครไนซ์ข้อมูลระหว่างใหม่และ โต๊ะเก่า

ฉันลงเอยด้วยตัวเลือกแรกของการใช้สไตล์การออกแบบที่ไม่ดีที่มีอยู่ แต่ฉันถูกทิ้งให้อยู่กับคำถามนี้: จะดีกว่าไหมถ้ามีแนวทางปฏิบัติที่ไม่ดีที่มีอยู่ก่อนหน้านี้หรือใช้แนวปฏิบัติที่ดีที่ไม่เล่นด้วย มีบางสถานการณ์ที่ฉันควรเลือกสถานการณ์อื่น

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



ขอบคุณ Peter ไม่เห็นคำถามนั้น มันคล้ายกับสิ่งที่ฉันขอยกเว้นดูเหมือนว่าคำตอบนั้นจะเกี่ยวข้องกับการสร้างรหัสที่มีอยู่ใหม่โดยไม่เพิ่มรหัสที่ไม่ดีที่มีอยู่ ฉันไม่สามารถ refactor รหัสที่มีอยู่ฉันสามารถสร้างได้
ราเชล

ขึ้นอยู่กับระยะเวลาที่คุณต้องการอยู่กับนายจ้างปัจจุบันของคุณ;)
งาน

คำตอบ:


21

คุณควรเลือกการออกแบบที่ดีกว่าถ้า:

  1. คุณจะได้รับส่วนใหญ่ของการเข้ารหัสในอนาคต

  2. การออกแบบที่ดีกว่าไม่ได้แพงไปสำหรับลูกค้าในระยะยาว ตัวอย่างเช่นฉันได้เห็น "refactorings" หลายเดือนสำหรับโครงการที่ถูกยกเลิกในช่วงปลายปี

คุณควรเลือก "สไตล์ที่ไม่ดีเหมือนกัน" ถ้า:

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

  2. การเสียสละการออกแบบที่ "ดีกว่า" จะทำให้คุณได้เปรียบทางธุรกิจที่จับต้องได้ เช่นเดียวกับการเพิ่มฟีเจอร์ X ไม่ดีจะทำให้คุณได้รับสัญญาจำนวนมาก แต่การไม่ทำตามกำหนดส่งผลให้คุณต้องเสียอะไร นี่คือที่ที่ความขัดแย้งทางประวัติศาสตร์ระหว่าง mgmt และทีมเทคนิคเข้ามาเช่นการปรับปรุงบ้านใครบางคนจะต้องตัดสินใจเมื่อจะจ่าย คุณสามารถชำระหนี้ในตอนแรกโดยอาศัยอยู่โดยไม่มีไฟฟ้าหรือประปาเป็นเวลาหนึ่งปี หรือคุณสามารถจ่ายได้มากถึง 3 เท่าด้วยข้อดีของการมีระบบสาธารณูปโภคเหล่านั้น


ตัวอย่างที่ดีเมื่อไปกับการออกแบบที่ดีกว่าการออกแบบที่ไม่ดีและในทางกลับกัน :) ขอบคุณ
ราเชล

11

ในระยะยาวจะเป็นการดีกว่าหากใช้แนวปฏิบัติที่ดี มันจะประหยัดเวลาและความพยายามในการเปลี่ยนแปลงจะใช้เวลาน้อยลงในการดำเนินการ

ถ้าเป็นไปได้ให้ทำตามขั้นตอนเล็กน้อยเพื่อ refactor สู่แนวปฏิบัติที่ดี (ตัวอย่างเช่น: ใน SQL ที่จะแบ่งตาราง denoramlized ให้เป็นมาตรฐานหนึ่งและใช้มุมมองที่มีชื่อตารางเก่า)

คุณจะทราบว่าฉันบอกว่าในระยะยาว - สามเหลี่ยม "คุณภาพเวลาเงิน" ใช้ที่นี่เช่นกัน (เช่น - เลือกสอง) หากคุณไม่มีเวลาคุณอาจต้องฝึกหัดแบบเก่า แต่นั่นหมายความว่าคุณกำลังเพิ่มปัญหาและการออกแบบของคุณจะต้องได้รับการแก้ไขด้วย

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


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

1
@Rachel - หากคุณอยู่ในการควบคุมของตารางใหม่ให้ใช้การออกแบบที่ดีสำหรับพวกเขา (ฉันสมมติว่าการปรับปรุงการออกแบบเก่าจะไม่ส่งผลกระทบต่อตารางใหม่) เมื่อคุณต้องการเปลี่ยนรหัสของคุณค่าบำรุงรักษาจะลดลง
Oded

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

1

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

ตอนนี้ลูกค้าของคุณจะไม่เห็นว่าคุณใช้การออกแบบที่ดีกว่าเขาจะเห็นว่าโซลูชันของคุณทำให้ระบบของเขาช้าลง การตัดสินใจประเภทนี้ควรทำเป็นกรณี ๆ ไปและคุณควรใช้ประสบการณ์และเกณฑ์ในการตัดสินใจ

ฉันคิดว่าคุณอาจเลือกถูก


1

มากที่สุดคุณควรแยกรหัสแอปพลิเคชันของคุณออกจากการออกแบบข้อมูลที่ไม่ดี

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

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


1

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

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

รหัสบางอย่างสามารถทิ้งไว้คนเดียว; เราไม่ได้มีความหรูหราเสมอไป


-1

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

เวลาของผู้พัฒนาจะต้องเสียค่าใช้จ่ายดังนั้นหนี้ทางเทคนิคสามารถเห็นได้เช่นเดียวกับหนี้จริงและใช้เงินจริง

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

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

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

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

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

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

คุณอาจสนใจวิธีการในการพัฒนาฐานข้อมูลและปรับใช้วิวัฒนาการเหล่านี้: http://richarddingwall.name/2011/02/09/the-road-to-automated-database-deployment

โดยวิธีการที่เป็นงานที่ยากโชคดีมาก มันคุ้มค่า !


-1

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

อย่างไรก็ตามปัญหาของคุณทำให้เกิดคำถามที่น่าสนใจ:

การปรับเปลี่ยนรหัสโดยอัตโนมัติทำให้มีความก้าวหน้าเพียงพอหรือไม่

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

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

หากเครื่องมือดังกล่าวมีอยู่จริง (ฉันไม่แปลกใจเลยที่มันมีอยู่แล้ว) มันจะเป็นการดีที่จะนำมาพิจารณาเมื่อทำการตัดสินใจ


-2

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


ในฐานะนักพัฒนาคุณควรทราบถึงอันตรายของข้อความที่แน่นอน
whatsisname

ฉันยังรู้ถึงอันตรายของการจัดการกับการปฏิบัติที่ไม่ดีและการเขียนรหัสไม่ถูกต้องและ IMO นั้นเป็นอันตรายที่เลวร้ายที่สุดของทั้งหมด
Wayne Molina
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.