ฟังก์ชั่นรับประกันว่าจะไม่ส่งคืนค่าเดิมสองครั้ง [ปิด]


23

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

ความคิดของฉันคือการกำหนดรหัสเฉพาะให้แต่ละเครื่องแล้วส่งค่านั้นไปยังฟังก์ชันตัวสร้างค่าที่ไม่ซ้ำกัน:

var i = 0;
function uniq(process_id, machine_id) {
   return (i += 1).toString() + machine_id + "-" + process_id;
}

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

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


31
รับประกันในความหมายที่เข้มงวดของคำ? ฉันหมายถึงแม้แต่ Guids ก็จะเริ่มพูดซ้ำอีกครั้ง เราอาจจะไม่ได้มีชีวิตอยู่อีกต่อไป แต่การค้ำประกัน .. และโดยวิธีการกระบวนการ ID เป็นห่างไกลจากการที่ไม่ซ้ำกัน
JensG

7
@CodesInChaos - นั่นเป็นข้อสันนิษฐานที่แย่มากเพราะมันเป็นเรื่องไม่สำคัญในบางระบบปฏิบัติการที่จะเปลี่ยนที่อยู่ mac ของคุณ
Telastyn

7
"สมมติว่าฟังก์ชั่นนี้สามารถเข้าถึงได้โดยเครื่องหลายเครื่องพร้อมกัน" - โดยสุจริตนี่อาจหมายถึง "โค้ดที่รันบนเครื่องแต่ละเครื่องโดยไม่มีการสื่อสารระหว่างเครื่อง" หรือ "มีเครื่องกลาง / ฐานข้อมูลกลางที่ฟังก์ชัน มีไว้สำหรับเครื่องอื่นที่มีอยู่ในเครือข่าย " คุณควรเริ่มชี้แจงให้ชัดเจนก่อน
Doc Brown

28
มันเป็นคำถามที่หลอกลวงหรือไม่? ยกตัวอย่างเช่นฟังก์ชั่นที่มีวง จำกัด จะไม่กลับค่าเดียวกันสองครั้ง ..
เบรนแดน

8
บางทีพวกเขากำลังมองหาโปรแกรมเมอร์ที่ถามคำถามเกี่ยวกับความต้องการพิรุธแทนที่จะทำให้สมมติฐานและทำงานกับมัน :)
theMayer

คำตอบ:


60

อย่าเพิ่งแฟนซีเพียงแค่โยนเคาน์เตอร์ (threadsafe) ที่เรียบง่ายไว้ด้านหลังจุดปลายทางการสื่อสาร (WCF, บริการเว็บ, อะไรก็ตาม):

   long x = long.MinValue;
   public long ID(){
       return Interlocked.Increment(ref x);
   }

ใช่มันจะล้นในที่สุด ใช่มันไม่รองรับการรีบู๊ต ใช่มันไม่ใช่การสุ่ม ใช่บางคนสามารถเรียกใช้สิ่งนี้ได้บนเซิร์ฟเวอร์หลายเครื่อง

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


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

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

7
@DocBrown "เข้าถึงได้โดยหลาย Machines concurrecntly" ดูเหมือนจะบอกเป็นนัย ๆ ว่าหลาย ๆ เครื่องเข้าถึงฟังก์ชั่นเดียวบนเซิร์ฟเวอร์เดียว มิฉะนั้นจะต้องใช้คำว่า "เครื่องหลายเครื่องจะเรียกใช้ฟังก์ชั่นนี้ในเวลาเดียวกัน"
Falco

3
@LightnessRacesinOrbit: ฉันคิดว่านี่น่าจะเป็น C # และSystem.Threading.Interlockedคลาสที่ให้การเพิ่มขึ้นของอะตอม แต่สิ่งนี้คุณสามารถอ่านได้ด้วยรหัสหลอกบางชนิด
Doc Brown

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

25

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


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

โดยเฉพาะอย่างยิ่งหากกลไกมาตรฐาน GUID ไม่เป็นไปตามข้อกำหนดของผู้สัมภาษณ์ดังนั้นจึงต้องระบุความแตกต่างระหว่างผู้สัมภาษณ์และผู้ใช้ทั่วไปของ GUID ผู้สัมภาษณ์ที่มีเหตุผลถามคำถามแบบนี้ ("คุณจะทำอย่างไร <บางสิ่งที่เป็นมาตรฐานที่รู้จักกันโดยทั่วไปบางทีอาจจะมีการเปลี่ยนแปลงเล็กน้อยจากข้อกำหนดปกติ>") ควรคาดหวังคำตอบที่แตกต่างกันมากจากผู้สมัครที่รู้เกี่ยวกับศิลปะ สำหรับ GUID และผู้สมัครที่กำลังประดิษฐ์บางสิ่งบางอย่างตั้งแต่เริ่มต้น
Steve Jessop

นี่อาจเป็นคำตอบที่ง่ายที่สุดโดยสมมติว่าความต้องการที่ยืดหยุ่น
theMayer

9
+1 เพราะนี่เป็นปัญหาที่ guids แก้ การสร้าง Guid ที่ซ้ำกันไม่ว่ารูปแบบของมันจะเป็นลอตเตอรี่ที่ยากที่สุดในโลก เห็นได้ชัดว่าหลายคนไม่รู้สึกถึงความไม่ชอบมาพากลของการชน
usr

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

22

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

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

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

หากคุณกังวลเกี่ยวกับการตั้งนาฬิกาเพื่อประหยัดเวลากลางวัน (พบ 1 ครั้งสองครั้ง) ให้เพิ่มค่าคงที่เป็นครั้งที่สองที่คุณพบมัน


12
หรือเพียงแค่ส่งคืนเวลา UTC โดยไม่คำนึงถึงเขตเวลาของผู้ร้องขอ เนื่องจาก UTC ไม่ได้แปลเป็นภาษาท้องถิ่นดังนั้นจึงไม่ได้รับผลกระทบจากการเปลี่ยนแปลง DST
Mauro

1
System.currentTimeNanos () :-)
Falco

1
หากคุณไม่ส่งคืนวันที่ & เวลาในรูปแบบที่มนุษย์สามารถอ่านได้ค่าของคุณไม่ควรมีข้อมูลเขตเวลาใด ๆ อยู่ข้างใน
การแข่งขัน Lightness กับโมนิก้า

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

1
สร้างสรรค์มากอย่างน้อย อาศัยนาฬิกาที่กำลังจะถูกปรับทุก ๆ คราวแล้วยังไม่เป็นความคิดที่ดีเช่นนี้ IMHO ออฟเซ็ตจะไม่บันทึกคุณจากการชน
JensG

15

ประการแรกคุณจะต้องถามผู้สัมภาษณ์สองคำถาม


คำถามที่ 1.

ไม่ว่าผู้สัมภาษณ์คาดว่าจะใช้ "เครื่องส่วนกลาง" หนึ่งเครื่องหรือมากกว่านั้นเพื่อใช้ในการกำหนดหมายเลขเฉพาะหรือบล็อกหมายเลขเฉพาะ


คำถามที่ 2

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

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


มีคำถามโดยนัย 3 คือ ...

แต่มันเป็นสิ่งที่คุณจะต้องประเมินตัวเองโดยไม่ต้องถามเพราะมันไม่สุภาพอย่างยิ่งที่จะถามผู้สัมภาษณ์ของคุณ

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

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

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


ทำไมต้องถาม

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

เหตุผลที่ลึกลงไปคือบางคนไม่ชอบความคิดที่พูด1.0e-20โอกาสที่จะล้มเหลว (ฉันจะพยายามไม่ปลุกปั่นปรัชญาหรือข้อโต้แย้งทางศาสนาที่นี่)


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

วิธีการรวมศูนย์อาศัยหน่วยงานกลางบางแห่งเพื่อกำหนดบิตระดับแรกโดยไม่ซ้ำกัน จากนั้นเครื่องอื่นสามารถเติมบิตที่เหลือ

มีวิธีการกระจายอำนาจหลายวิธี:

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

ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุด ส่วนอื่น ๆ เป็นโซลูชันที่ไม่มีข้อกำหนด
Jack Aidley

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

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

12

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

สิ่งที่ผู้สัมภาษณ์ถาม:

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

สิ่งที่ผู้สัมภาษณ์ต้องการ:

ผู้สมัครคนนี้ประเมินความต้องการได้อย่างมีประสิทธิภาพและแสวงหาข้อมูลเพิ่มเติมเมื่อจำเป็นหรือไม่?

ไม่เคยคิด

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

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

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

ถามคำถามทำไม

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

เกิดอะไรขึ้นเมื่อคุณคิดว่า

จากภูมิหลังของฉันในอุตสาหกรรมการบินและเนื่องจากความล้มเหลวของการบินและอวกาศที่มองเห็นได้อย่างชัดเจนฉันจึงต้องการยกตัวอย่างจากโดเมนนี้เพื่อแสดงจุดสำคัญ เรามาตรวจสอบภารกิจของดาวอังคารที่ล้มเหลว - Mars Climate Orbiter และ Mars Polar Lander ภารกิจทั้งสองล้มเหลวเนื่องจากปัญหาซอฟต์แวร์ - เนื่องจากวิศวกรทำข้อสันนิษฐานที่ไม่ถูกต้องเนื่องจากบางส่วนมีข้อกำหนดที่ไม่ชัดเจนและสื่อสารไม่ดี

Mars Climate Orbiter - กรณีนี้มักถูกอ้างถึงว่าเกิดอะไรขึ้นเมื่อ NASA พยายามแปลงภาษาอังกฤษเป็นหน่วยเมตริก อย่างไรก็ตามนั่นคือการเป็นตัวแทนที่ง่ายเกินไปและน่าสงสารของสิ่งที่เกิดขึ้นจริง ๆ จริงมีปัญหาการแปลง แต่เป็นเพราะความต้องการสื่อสารไม่ดีในขั้นตอนการออกแบบและรูปแบบการตรวจสอบ / ตรวจสอบความถูกต้องที่ไม่เหมาะสม นอกจากนี้เมื่อวิศวกรสองคนสังเกตเห็นปัญหาเนื่องจากเห็นได้ชัดจากข้อมูลวิถีการบินพวกเขาไม่ได้ยกระดับไปสู่ระดับที่เหมาะสมเพราะพวกเขาคิดว่ามันเป็นข้อผิดพลาดในการส่งสัญญาณ ทีม ops ภารกิจได้รับการตระหนักถึงปัญหาหรือไม่มีเวลาเพียงพอในการแก้ไขและบันทึกภารกิจ ในกรณีนี้มีเงื่อนไขทางตรรกะที่เป็นไปไม่ได้ซึ่งไม่ได้รับการยอมรับสำหรับสิ่งที่มันนำไปสู่ความล้มเหลวของภารกิจที่มีราคาแพง

Mars Polar Lander- กรณีนี้เป็นที่รู้จักกันน้อยกว่าเล็กน้อย แต่อาจเป็นเรื่องน่าอายมากกว่าเนื่องจากความใกล้ชิดชั่วคราวกับความล้มเหลวของยานอวกาศ Climate Mars ในภารกิจนี้ซอฟท์แวร์ควบคุมการสืบเชื้อสายจากจรวดทรัสเตอร์เข้าสู่พื้นผิวดาวอังคาร ที่จุด 40 เมตรเหนือพื้นผิวขาของคนงานนำไปใช้ในการเตรียมการลงจอด นอกจากนี้ยังมีเซ็นเซอร์ที่ขาที่ตรวจจับการเคลื่อนไหว (เพื่อส่งสัญญาณเมื่อพวกเขาได้รับผลกระทบ) เพื่อบอกให้ซอฟต์แวร์ปิดเครื่องยนต์ การคาดเดาที่ดีที่สุดของนาซ่าเกี่ยวกับสิ่งที่เกิดขึ้น (เนื่องจากมีความล้มเหลวหลายอย่างและข้อมูลไม่สมบูรณ์) คือการสั่นสะเทือนแบบสุ่มที่ขาเนื่องจากการติดตั้งพร้อมกันและก่อให้เกิดกลไกการปิด 40m เหนือพื้นผิวอย่างไม่ถูกต้อง ยานอวกาศ M ความเป็นไปได้นี้เพิ่มขึ้นในการพัฒนา แต่ไม่เคยพูด ในที่สุดทีมงานซอฟต์แวร์ได้ตั้งสมมติฐานที่ไม่ถูกต้องเกี่ยวกับวิธีการเรียกใช้รหัสนี้ (ข้อสันนิษฐานหนึ่งข้อคือสัญญาณปลอมจะสั้นเกินไปที่จะหยิบขึ้นมาแม้ว่าจะมีการทดสอบที่แสดงตรงกันข้าม) และสมมติฐานเหล่านั้นไม่เคยถูกถามจนกระทั่งหลังจาก ข้อเท็จจริง.

ข้อควรพิจารณาเพิ่มเติม

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

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

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

(โดยวิธีการที่คุณจะตกใจที่ความถี่เช่นคุณสมบัติไม่ดีปรากฏขึ้นในที่ทำงาน)

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

บรรทัดล่าง

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

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


5

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

วิธีที่ฉันเห็นมันมีสองปัญหาที่นี่และทั้งสองมีวิธีแก้ไขปัญหาที่ดีขึ้น

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

นี่คือทางออกของฉันใน Java:

public class Foo {
  private static BigInteger value = BigInteger.ZERO;
  private static final Lock lock = new ReentrantLock();

  public static BigInteger nextValue() {
    try {
      lock.lock();
      value = value.add(BigInteger.ONE);
      return value;
    }
    finally {
      lock.unlock();
    }
  }
}

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


ฉันคิดว่าการสันนิษฐานว่ารหัสจะใช้งานได้ไม่ถึงห้าร้อยปีเป็นข้อสันนิษฐานที่ถูกต้อง ถ้าคุณเพียงแค่คืนค่าที่เพิ่มขึ้นในที่เก็บข้อมูลแบบ 64 บิตคุณก็ทำได้ไม่นาน ที่ 1 สายต่อเราใน 584555 ปี
Mooing Duck

1
อย่างน้อยใน Java นั่นคือค่า 2 ^ 63 (ยาวครึ่งหนึ่ง) อีกนานกว่าเผ่าพันธุ์มนุษย์น่าจะมีอยู่เพราะเรามีแนวโน้มที่จะฆ่าซึ่งกันและกัน โดยไม่คำนึงถึงฉันใช้วิธีการทางทฤษฎีมากขึ้น ในความเป็นจริง 64 (หรือ 63) บิตควรเพียงพอ

1
@Snowman: อะไรนะ?! โซลูชันของคุณใช้ได้กับ 250K ปีเท่านั้น?!?!? สมัครต่อไป !!!!!! :-)
Bob Jarvis - Reinstate Monica

0

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

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


-1
string uniq(string machine_id) 
{
   static long u = long.MinValue;
   Interlocked.Increment(ref u);

   //Time stamp with millisecond precison
   string timestamp = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff",
                                            CultureInfo.InvariantCulture);

   return machine_id + "-" + timestamp + "-" + u;
}

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


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

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