การเขียนโปรแกรม“ เหมาะสม” เมื่อไรจะไม่สำคัญอีกต่อไป?


49

ฉันกำลังสร้างเกม Android ในเวลาว่าง มันใช้ไลบรารีlibgdxดังนั้นการยกของหนักก็ทำได้สำหรับฉัน

ขณะที่กำลังพัฒนาฉันเลือกประเภทข้อมูลบางขั้นตอนอย่างไม่ระมัดระวัง ฉันใช้ hashtable เพราะฉันต้องการบางสิ่งบางอย่างใกล้เคียงกับอาเรย์ ค่าคีย์ที่มนุษย์อ่านได้ ในที่อื่น ๆ เพื่อให้ได้สิ่งที่คล้ายกันฉันใช้เวกเตอร์ ฉันรู้ว่า libgdx มีคลาส vector2 และ vector3 แต่ฉันไม่เคยใช้เลย

เมื่อฉันเจอปัญหาแปลก ๆ และค้นหา Stack Overflow เพื่อขอความช่วยเหลือฉันเห็นผู้คนจำนวนมากเพิ่งตั้งคำถามใหม่ที่ใช้ประเภทข้อมูลบางประเภทเมื่ออีกคนหนึ่งมีเทคนิค "เหมาะสม" เช่นเดียวกับการใช้ ArrayList เพราะมันไม่ต้องการขอบเขตที่กำหนดเมื่อเทียบกับการกำหนด int [] ใหม่ด้วยขอบเขตที่รู้จักกันใหม่ หรือแม้แต่เรื่องเล็กน้อยเช่นนี้

for(int i = 0; i < items.length; i ++)
{
    // do something
}

ฉันรู้ว่ามันประเมินรายการความยาวของการวนซ้ำทุกครั้ง อย่างไรก็ตามฉันก็รู้ว่าสิ่งของจะไม่เกิน 15 ถึง 20 รายการ ดังนั้นฉันควรสนใจถ้าฉันประเมินรายการความยาวของการวนซ้ำทุกครั้งหรือไม่

ฉันทำการทดสอบเพื่อดูว่าแอปทำงานอย่างไรโดยใช้วิธีที่ฉันเพิ่งอธิบายกับที่เหมาะสมทำตามบทช่วยสอนและใช้ประเภทข้อมูลที่แน่นอนที่ชุมชนแนะนำ ผลลัพธ์: สิ่งเดียวกัน เฉลี่ย 45 fps ฉันเปิดทุกแอปในโทรศัพท์และแท็บกาแล็กซี่ ไม่แตกต่าง.

ดังนั้นฉันคิดว่าคำถามของคุณคือ: มีเกณฑ์เมื่อมันไม่สำคัญอีกต่อไปหรือไม่? มันจะโอเคถ้าจะพูดว่า - "ตราบใดที่มันทำงานเสร็จฉันไม่สนหรอก"


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

8
หากภาษาของคุณมี FOR FOR จริงปัญหาการประเมินหลายอย่างจะไม่เกิดขึ้น น่าเสียดายที่ไวยากรณ์ C ต้องการเพราะไม่ใช่การวนซ้ำ FOR มันเป็นห่วงในขณะที่สวมวิกและแว่นตาจมูกใหญ่และต้องยอมรับเงื่อนไขใด ๆ (หรือไม่มีเลย) สำหรับการเลิกลูป
Mason Wheeler

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

17
คุณจะรู้ได้อย่างไรว่ารายการนี้ 'ประเมิน' ความยาวของการวนซ้ำทุกครั้ง? คอมไพเลอร์สมาร์ทสวย และแม้ว่ามันจะดึงรายการซ้ำ ๆ ความยาวแล้วอะไรล่ะ? ฉันเกลียดที่จะเห็นรหัสเช่น 'int itemsLength = items.length; สำหรับ (; i <itemsLength; ... ) 'เว้นแต่จะมีปัญหาเรื่องประสิทธิภาพที่วัดได้
วินไคลน์

6
รายการของคุณสิ่งที่มีความยาวไม่มีอะไรเกี่ยวข้องกับ "การเขียนโปรแกรมที่เหมาะสม" มันเป็นการเพิ่มประสิทธิภาพขนาดเล็กและโปรแกรมเมอร์ที่ดีก็รู้ดีกว่าเสียเวลาไปกับสิ่งเหล่านั้นจนกว่าพวกเขาจะเรียกใช้ตัวสร้างโปรไฟล์และรู้ว่าปัญหาด้านประสิทธิภาพที่แท้จริงอยู่ที่ไหน การเพิ่มประสิทธิภาพขนาดเล็กและรูปแบบการเขียนโปรแกรมที่ดีมักตรงกันข้ามกับสิ่งที่ไม่เหมือนกัน
Michael Borgwardt

คำตอบ:


65

คุณเขียนโปรแกรมเพื่อแก้ไขปัญหา ปัญหานั้นมาพร้อมกับข้อกำหนดเฉพาะสำหรับการแก้ไข หากตรงตามข้อกำหนดเหล่านั้นปัญหาจะได้รับการแก้ไขและบรรลุตามวัตถุประสงค์

แค่นั้นแหละ.

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

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

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

ดังนั้นเช่นเดียวกับหลายสิ่งหลายอย่างในการพัฒนาซอฟต์แวร์ขึ้นอยู่กับ


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

21
หนึ่งสามารถทำให้กรณีที่ถูกลงโทษทางวินัยตลอดเวลาทำให้ง่ายต่อการถูกลงโทษทางวินัยเมื่อคุณต้องเป็น บางคนถามคำถามเกี่ยวกับ Stack Overflow โดยไม่ต้องกดปุ่ม Shift โดยใช้เหตุผลที่พวกเขาสามารถถ่ายทอดความคิดของพวกเขาได้อย่างเพียงพอและภาษาอังกฤษเป็นสิ่งที่ลื่นไหลและมีการพัฒนาอยู่ดี ฉันไม่พบสิ่งใดที่น่าโมโหนอกจากผู้เขียนโปรแกรมไวรัสที่คิดว่าเวลา CPU ของฉันฟรี
Robert Harvey

2
@KaiQing ใครบางคนต้องการมอบแอปพลิเคชั่น 5mloc แบบดั้งเดิมซึ่งถือกำเนิดในปาสคาลและส่งต่อไปเรื่อย ๆ ตั้งแต่ครั้งแรกที่คุณเพิ่มหรือเปลี่ยนแปลงการทำงานใด ๆ ในแอปพลิเคชันนี้คุณจะรู้ได้ทันทีว่าทำไม
Jimmy Hoffa

5
@KaiQing, Angry Birds ต้องทำงานบนหลาย ๆ แพลตฟอร์มและถ้าเกมแฮงค์เป็นเวลา 2 วินาที x% ของผู้ชมจะยอมแพ้ในเกมนี้ซึ่งแปลว่าพวกมันจะได้เงินน้อยลงสำหรับคน Angry Birds ฉันพนันว่าคุณถูกเขียนอย่างระมัดระวังมาก บางทีนี่อาจตอบคำถามของคุณ หากรหัสนี้เหมาะสำหรับคุณใครจะสนใจสิ่งที่คุณทำ หากมีเงินหรือคนอื่นอยู่ในภาวะเสี่ยงคุณควรระวังให้มาก
Charles E. Grant

2
@KaiQing ไม่มีใครสามารถบอกคุณถึงเกณฑ์สำหรับสิ่งนั้นมันเป็นตัวแปรจากโปรเจ็กต์ไปยังโปรเจ็กต์และในแต่ละโปรเจ็กต์เมื่อเวลาผ่านไป จำนวนตัวแปรที่ส่งผลกระทบต่อขีด จำกัด ระหว่างระบบที่สามารถบำรุงรักษาได้และไม่ต้องพึ่งพา: LOC, ฐานผู้ใช้, ฐานผู้พัฒนา, ประเภทของแอปพลิเคชัน (การเข้ารหัสลับกับ crud เทียบกับไดรเวอร์), ความทนทานของคุณลักษณะ, ความซ้ำซ้อนซอฟต์แวร์ อุปกรณ์ช่วยชีวิตเทียบกับวิดเจ็ตนาฬิกา) แพลตฟอร์มที่รองรับสแต็คเทคโนโลยีจำนวนข้อมูลที่ถูกทำธุรกรรมหรือวิเคราะห์ข้อ จำกัด การตรวจสอบประวัติและผลกระทบอื่น ๆ อีกมากมายที่มีผลกระทบต่อรหัสที่ไม่ดี
Jimmy Hoffa

18

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

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

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

การเขียนโปรแกรมที่เหมาะสมอย่างแท้จริงนั้นเกี่ยวกับการปฏิบัติตามกฎเกณฑ์ที่ดีซึ่งมีเหตุผลอย่างชาญฉลาด


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

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

1
ถ้าฟังดูเหมือนว่าฉันกำลังบอกคุณว่าทำผิดกติกา ไม่มีสิ่งที่คุณพูดคุยเกี่ยวกับการทำคือสิ่งที่ฉันจะคัดค้าน ฉันพยายามที่จะชี้ให้เห็นว่า "วิญญาณของกฎหมาย" มีความสำคัญมากกว่า "จดหมายของกฎหมาย"
Michael Shaw

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

10

วิธีที่เหมาะสมในการดูสิ่งนี้คือลดผลตอบแทน: เปรียบเทียบผลประโยชน์เพิ่มเติมของการพัฒนาโปรแกรมกับต้นทุนของการพัฒนาเพิ่มเติม

การลดลงของผลตอบแทนจะเกิดขึ้นเมื่อผลประโยชน์ส่วนรวมน้อยกว่าเวลา / ความพยายามเล็กน้อย

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

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

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

แต่บางครั้งก็ชัดเจนเมื่อไม่ทำอะไร หากการพัฒนาบางส่วนดูเหมือนว่าจะต้องมีปาฏิหาริย์ทางเศรษฐกิจเกิดขึ้นเพียงเพื่อจ่ายค่าใช้จ่ายในการพัฒนา (คุ้มทุน) มันอาจเป็นความคิดที่ไม่ดี


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

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

คำสองคำที่มีประโยชน์ในการเพิ่มคำตอบที่เขียนเป็นอย่างดีของคุณ - "การลงทุนเพื่อเก็งกำไร" - คุณทำเพราะคุณคาดเดาว่าจะมีผลตอบแทนในอนาคต
mattnz

@ mattnz - สิ่งที่คุณพูดนั้นเป็นความจริงเพราะไม่มีใครทำอะไรที่ไม่ส่งคืนแม้ว่าการกลับมาจะเป็นเรื่องที่ดี เกือบทุกโครงการส่วนตัวของฉันทำเพื่ออารมณ์ขัน เกือบทั้งหมดทำเพียงพอที่จะพิสูจน์ความต้องการของตน พวกเขาไม่ได้ทำให้ฉันสามารถออกจาก
Kai Qing

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

3

เมื่อใดที่คุณไม่ควรสนใจรหัสของคุณว่า "เหมาะสม"

  • หากคุณจัดการเพื่อตอบสนองเป้าหมายทางธุรกิจและเก็บไว้ในช่วงเวลาที่มีค่าใช้จ่ายต่ำ (ผู้ใช้ไม่ได้ดูแหล่งข้อมูลก่อนที่จะจ่ายเงินให้คุณ)
  • MVP / POC - หากการเขียนโค้ดที่ถูกต้องหมายถึงการเสียเวลากับแนวคิดก่อนที่คุณจะรู้วิธีการทำเงินจากมัน (ถ้าคุณใช้เวลาหลายปี 45 ล้านดอลลาร์ในการเขียนแอปและท้ายร้านปิดเพราะไม่มีตลาด เหมาะสมคือรหัส)
  • เมื่อมีสถานการณ์ที่คุกคามชีวิต (เช่น Iron Man Prototype 1 เป็นแฮ็คสกปรก แต่มันทำให้เขาออกจากถ้ำใช่มั้ย)
  • หรือถ้าคุณไม่รู้วิธีการเขียนรหัสที่ถูกต้อง (ถ้า somene จัดการเพื่อให้การใช้ชีวิตการเขียนรหัสไม่ถูกต้องในการว่างงานวันนี้ฉันพูดว่าเขียนรหัสที่ไม่ดีได้ดีกว่าไม่มีที่อยู่อาศัย)
  • หากคุณเพียงแค่รู้ว่าสิ่งที่คุณทำหรือคิดว่าคุณสามารถออกไปกับมันทำท่าที่คุณทำ

ควรเขียนรหัสที่ถูกต้องเมื่อใด

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

1
น่าเศร้าที่มีคนอีกคนหนึ่งที่ไม่ใส่ใจที่จะเป็นคนที่ไม่เหมาะสมที่คนจำนวนมากได้รับพรที่ไม่รู้ว่า: เมื่อลูกค้าอาเจียนระบบเก่าเข้ามาในการดูแลของคุณและบอกคุณว่าพวกเขาต้องการในสัปดาห์เดียว บางครั้งเวลาและ / หรืองบประมาณไม่ให้ยืมเพื่อการเขียนโค้ดที่เหมาะสมและความสนใจของคุณในโครงการนั้นมีความสง่างามมากกว่าธุรกรรมทางธุรกิจ ตัวอย่างเช่นหากรหัสของพวกเขาใช้วิธีการที่เลิกใช้ส่วนใหญ่ แต่ต้องการการแก้ไขบางอย่าง (พูดในสถานการณ์สมมติทางเว็บ) ไม่สามารถแก้ไขปัญหาทั้งหมดได้ ต้องสกปรก
Kai Qing

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

2

ความกังวลหลักของคุณคือประสิทธิภาพหรือไม่? นั่นคือสิ่งที่คุณพยายามที่จะเพิ่มหรือไม่

ถ้าเป็นเช่นนั้นมีบทเรียนพื้นฐานในการเรียนรู้และถ้าคุณทำคุณจะเป็นหนึ่งในไม่กี่คน

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

นั่นเป็นการคาดเดา ทุกคนทำ แต่ไม่ได้ผล

ให้โปรแกรมบอกตัวเองว่าปัญหาคืออะไร นี่คือตัวอย่างโดยละเอียด

คุณเห็นความแตกต่างหรือไม่


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

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

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

2

คำถามของคุณคือ "ตราบใดที่มันทำงานเสร็จฉันไม่สนใจเหรอ?"

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

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

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


1

คำตอบก็คือมันไม่สำคัญและมันก็สำคัญ ...

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

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

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

โดยทั่วไปแล้วเครื่องมือปิดจะทำอย่างรวดเร็วและสกปรกเท่าที่จะทำได้โดยไม่มีการตรวจสอบข้อผิดพลาดเล็กน้อยหรือการตรวจสอบอื่น ๆ ไม่มีการบันทึกข้อยกเว้นรหัส cut-n-paste ที่มีการเปลี่ยนแปลงเล็กน้อยหรือแม้แต่ไม่มีการเปลี่ยนแปลงแทนฟังก์ชั่นทั่วไป .

แค่ระวัง: บางครั้งแอพที่รวดเร็วและสกปรกเหล่านั้นก็มีความเป็นตัวของตัวเองซึ่งหมายความว่าช็อตคัทสั้น ๆ จะกัดคุณใน ...


1
"ไม่เคย" และ "เสมอ" ยกเลิกซึ่งกันและกัน ทำให้คำตอบของคุณทั้งดีและไม่ดี
Tulains Córdova

@ user1598390: การยกเลิกซึ่งกันและกันคือประเด็น ยกเลิกความเชื่อและคุณจะเหลือเพราะมันมีประโยชน์ และคุณจะเข้าใจผิดและเรียนรู้จากสิ่งนั้น
jmoreno

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

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

1

หรือแม้แต่เรื่องเล็กน้อยเช่นนี้

for(int i = 0; i < items.length;i ++) {
     // do something 
}

ฉันรู้ว่ามันประเมินรายการความยาวของการวนซ้ำทุกครั้ง อย่างไรก็ตามฉันก็รู้ว่าสิ่งของจะไม่เกิน 15 ถึง 20 รายการ ดังนั้นฉันควรสนใจถ้าฉันประเมินรายการความยาวของการวนซ้ำทุกครั้งหรือไม่

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

ดังนั้นฉันคิดว่าคำถามของคุณคือ: มีเกณฑ์เมื่อมันไม่สำคัญอีกต่อไปหรือไม่? มันจะโอเคถ้าจะพูดว่า - "ตราบใดที่มันทำงานเสร็จฉัน> ไม่แคร์?"

มันขึ้นอยู่กับสิ่งที่คุณคาดหวังจากผลิตภัณฑ์ขั้นสุดท้ายของคุณ ความแตกต่างระหว่างผลิตภัณฑ์ทั่วไปกับผลิตภัณฑ์ที่ยอดเยี่ยมต้องอาศัยรายละเอียด รถอย่างทาทานาโนและรถอย่างเมอร์เซเดสเอส "ทำงานให้สำเร็จ" - มันจะพาคุณจากที่หนึ่งไปอีกที่หนึ่ง ความแตกต่างนั้นขึ้นอยู่กับรายละเอียด: กำลังเครื่องยนต์ความสะดวกสบายความปลอดภัยและอื่น ๆ เหมือนกันกับผลิตภัณฑ์ใด ๆ ที่มีอยู่รวมถึงผลิตภัณฑ์ซอฟต์แวร์ เช่นทำไมทุกคนจะจ่ายเงินให้ Oracle, IBM หรือ Microsoft สำหรับฐานข้อมูล Oracle, DB2 หรือ MS SQL Server ตั้งแต่ MySQL และ Postgre ฟรี

หากคุณต้องการใส่ใจกับรายละเอียดและรับผลิตภัณฑ์คุณภาพสูงคุณควรใส่ใจกับสิ่งนี้ (และสิ่งอื่น ๆ อย่างชัดเจน)


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

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

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

1

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

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

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

ดูด้านดีแม้ว่า คุณเคยถามเกี่ยวกับเรื่องนี้ดังนั้นบางทีคุณอาจจะทราบจุดที่ฉันทำอยู่แล้ว


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

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

1

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

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

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


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

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

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