เราควรระวังเรื่องการโกหกหรือไม่?


9

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

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


1
คุณช่วยอธิบายความหมายของคำว่า "โกหก" ได้ไหม? เราไม่ควรอ้างถึงความคิดเห็นในคำถามอื่นเพื่อให้เข้าใจบริบทของคุณ
user16764

@ user16764 โดยไม่ดูที่หัวข้ออื่น ๆ สิ่งแรกที่ควรคำนึงถึงคือการประกวด C
อันเดอร์กราด

หากเอกสารระบุว่ารหัสควรเป็น foo และรหัสนั้นเป็นแถบหมายความว่าแถบนั้นเป็นรหัสที่ควรทำหรือไม่ หรือเราสมมติว่าแถบนั้นเป็นการกระทำที่ถูกต้องเพราะเราไม่เคยอ่านเอกสารเพราะรหัสถูกต้องเสมอ?
วันพฤหัสบดีที่

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

คำตอบ:


9

ในคำพูดของคนธรรมดา:

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

มีหลายวิธีที่รหัสสามารถโกหกซึ่งฉันจะพูดถึงเพียงไม่กี่:

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

ยิ่งสั้นก็ยิ่งน้อย มันชัดเจนด้วยตนเอง

รหัสที่ซับซ้อนน้อยกว่าคือยิ่งโปร่งใส ดังนั้นมันจึงอยู่น้อย

เทคนิคการใช้ซินแทกซ์ของอาร์เคนอยู่มาก ชอบอัลกอริทึมที่ชัดเจนทีละขั้นตอน พวกเขาโกหกน้อยลง

เครื่องมือวิเคราะห์รหัสคงที่ที่ดีสามารถช่วยคุณค้นหารหัสที่อยู่

นอกจากนี้แบตเตอรี่ทดสอบอัตโนมัติที่ดีจะบังคับให้โค้ดบอกความจริงด้วย


4
The shorter and terser the code is, the less it lies. It's self evident. ฉันแทบจะไม่พูดอย่างนั้น จากประสบการณ์ของฉันยิ่งรหัสสั้นลงและยิ่งมีโอกาสมากขึ้นที่จะต้องกวาดไปอยู่ใต้พรมทั่วไปโดยซ่อนไว้ในการเรียกฟังก์ชั่นหลอกลวง
Mason Wheeler

@MasonWheeler คุณพูดถูก ฉันแก้ไขส่วน "terse"
Tulains Córdova

ฉันไม่เชื่อโดย "รหัสที่ไม่มีการตั้งชื่อการประชุมหลอกลวง" แน่นอนมันไม่ดี แต่มันจะโกหกถ้าไม่บอกอะไรคุณได้อย่างไร "ฉันไม่ได้บอกคุณ!" เป็นสิ่งดื้อรั้นขัดขวางและไม่เป็นประโยชน์ แต่ไม่หลอกลวง แน่นอนว่า "การโกหก" คือเมื่อมีการตั้งชื่อการประชุม แต่ใช้ในวิธีที่ไม่ตรงกับสิ่งที่รหัสทำจริง - ตัวอย่างเช่นถ้าคุณใช้ภาษาฮังการี (yuck!) แต่บางครั้งก็มีคำนำหน้าpสำหรับตัวแปรที่ ไม่ใช่ตัวชี้
Steve314

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

อีกตัวอย่างหนึ่ง: รหัสที่เปลี่ยนภาษาหรือคุณสมบัติรันไทม์เช่นการกำหนดใหม่หรือปิดบังพฤติกรรมดั้งเดิม
JustinC

6

รหัสไม่สามารถโกหกได้

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

รหัสแน่นอนอาจจะไม่ถูกต้อง มันอาจทำให้เข้าใจผิดในการตั้งชื่อหรือองค์กร มันไม่สามารถอ่านได้อย่างแน่นอน

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


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

ขออภัยที่พูดว่า "แต่มันถูกต้องอย่างคนอวดรู้" ไม่ได้หมายความว่าคุณไม่สามารถเรียกคนโกหกว่า - แม้ว่าคนอื่นจะไม่โต้กลับพวกเขาก็ยังรู้
Steve314

@ steve314 - pssh คำถามเดิมอยู่รอบความคิดเห็น การสร้างหุ่นฟางสำหรับสถานการณ์ที่หายากเหล่านี้ซึ่งมีการตั้งชื่อรหัสที่ทำให้เข้าใจผิดเพื่อให้เหตุผลในการแสดงความคิดเห็น
Telastyn

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

@Telastyn ฉันเดาว่าคุณไม่เคยมีตัวกรองทำการเปลี่ยนเส้นทางที่ทำให้เกิดขั้นตอนการทำงานจริงบน whitespace จากนั้นไปที่โค้ดที่ไม่ถูกเรียกจากวิธีการนั้นไม่เคยกลับมาใช่ไหม พระเจ้าฉันเกลียด! @ # $ Java devs ทำกับ Java
Erik Reppen

0

คุณถามคำถามหลายข้อ

เราควรที่จะมองหารหัสโกหกหรือเปล่า?

แน่นอน!

เราควรจะเปรียบเทียบ [code] กับเอกสารที่มีอยู่หรือไม่?

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

หรือ [รหัส] มักจะเป็นแหล่งที่ดีที่สุดสำหรับสิ่งที่จำเป็นต้องทำ?

มันมักจะเป็นแหล่งที่ดีที่สุดสำหรับสิ่งที่มันจะทำ แหล่งที่ดีที่สุดสำหรับสิ่งที่รหัสควรทำอาจเป็น (การรวมกันของ) สิ่งต่าง ๆ แม้ว่าที่สำคัญคือ:

  • รหัสตัวเอง;
  • รหัสโทร;
  • ความคิดเห็นในรหัสนั้น
  • เอกสาร;
  • การทดสอบหน่วย
  • การทดสอบการรวมและการถดถอย
  • โปรแกรมเมอร์
  • ผู้ใช้ปลายทาง;

แหล่งที่มา "ดีที่สุด" (หรือชุดค่าผสม) นั้นขึ้นอยู่กับสถานการณ์ของคุณ

หากเป็นรหัสที่คล่องแคล่วมีแนวโน้มที่จะโกหกน้อยลงหรือรหัสนั้นไม่สามารถโกหกได้ทั้งหมดหรือไม่

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


เชิงอรรถ
ทั้งหมดข้างต้นอยู่ภายใต้สมมติฐานที่ว่าโค้ดสามารถโกหกได้และนี่เป็นตัวอย่างพื้นฐาน

public int DivideByTwo(int input) 
{
    return input / 3;
}

นี่เป็นเพียงตัวอย่างเดียวที่ฉันพูดว่า "code โกหก", @ user61852 มีอีกไม่กี่ (รหัสที่ไม่สามารถเข้าถึงได้ความซับซ้อนของรหัสไม่ตรงกับความซับซ้อนของปัญหาการตั้งชื่อไม่ดี) และฉันคิดว่ามีอีกมากมาย Wikipedia มีข้อสรุปที่ค่อนข้างดีเกี่ยวกับการโกหกซึ่งส่วนใหญ่สามารถพบรหัสได้

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


0
if (x > 5) {
  doSomething();
} else {
  doADifferentThing();
}

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

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

doSomething()

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

หากภาษาของคุณรองรับassertบางชนิดซึ่งถูกปิดในการสร้างการผลิตแต่ละassertคำสั่งอาจเป็นเรื่องโกหก typecast เป็นคำยืนยันอื่นซึ่งอาจเป็นเรื่องโกหก

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