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


11

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

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

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

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

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

เรื่องนี้ทำให้ฉันสงสัยว่าในความเป็นจริงมันเป็นเรื่องสำคัญจริง ๆ ไหมที่ฉันใช้เวลานานขนาดนั้น? ฉันหมายถึงนี่เป็นสัญญาณว่าฉันจะไม่สามารถหางานในสถานที่เช่นนี้ (ไม่ใช่แค่ Facebook, Google, Fog Creek, ฯลฯ ) และต้องการลดแรงบันดาลใจของฉันลงหรือทำตามความเป็นจริงที่ผ่านมา ในความพยายามครั้งแรกของฉันแม้ว่าจะใช้เวลานานเกินไปจะดีไหม?


12
มันสำคัญที่นี่ - มันเพียงพอสำหรับคุณหรือไม่

2
ทำไมคุณถึงเชื่อว่าการไม่ทำงานกับชื่อ. com ที่มีนัยใหญ่หมายความว่าคุณลดความปรารถนาลง
mouviciel

@mouviciel ฉันไม่ได้ตั้งใจลดความตั้งใจในการทำงานกับชื่อ. com ขนาดใหญ่ แต่ชอบทำงานกับ บริษัท ที่การเขียนโปรแกรมเป็นบทบาทหลักเทียบกับการทำงานใน บริษัท ที่ทำสิ่งอื่นเช่นการค้าปลีกซึ่งไม่มีใครเข้าใจสิ่งที่คุณทำ
JD Isaacks

5
LOL ที่ซอฟต์แวร์ Fog Creek รวมอยู่ใน Facebook และ Google
georgiecasey

คำตอบ:


42

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

ที่กล่าวว่าคุณไม่ได้พูดว่าทำไมคุณใช้เวลาสี่ชั่วโมงในการแก้ปัญหานี้

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

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


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

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

@ ThorbjørnRavnAndersenฉันไม่ได้เรียนรู้การเขียนโปรแกรมใด ๆ ในโรงเรียน ฉันสอนตัวเองฉันได้เรียนรู้จากงานหนังสือการทดลอง ฯลฯ ฉันไม่คุ้นเคยกับเกม (ยกเว้นการจดจำเกมที่คล้ายกันที่เล่นในโลกของลิง) ฉันต้องใช้ Google เพื่อให้รู้ว่ามันเป็น เรียกว่า "หอคอยแห่งฮานอย" ฉันเข้าใจการเรียกซ้ำ (อย่างน้อยฉันคิดว่าฉันทำ) และฉันใช้มันที่นี่ แต่การไขปริศนาจะง่ายขึ้นมากสำหรับฉันส่วนที่ยากขึ้นคือ "รูปแบบใดที่จะทำให้เกิดการเคลื่อนไหวน้อยที่สุดเท่าที่จะทำได้ทุกครั้ง"
JD Isaacks

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

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

13

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

ฉันนึกถึงตัวแก้ปัญหาห้าแบบแตกต่างกัน:

ผู้ที่...

  1. ... สามารถแก้ปัญหาได้อย่างรวดเร็วด้วยวิธีการที่สะอาดและมีประสิทธิภาพ
  2. ... สามารถแก้ปัญหาได้อย่างรวดเร็วแต่ด้วยวิธีการที่สกปรกและไม่มีประสิทธิภาพ
  3. ... สามารถแก้ปัญหาได้ช้าแต่จบลงด้วยวิธีการที่สะอาดและมีประสิทธิภาพ
  4. ... สามารถแก้ปัญหาได้อย่างช้าๆแต่จบลงด้วยวิธีที่สกปรกและไม่มีประสิทธิภาพ
  5. ... ไม่สามารถแก้ปัญหาได้อย่างรวดเร็วหรือช้า

การทดสอบสไตล์ Facebook ระบุผู้สมัคร # 3, # 4 และ # 5 อย่างชัดเจนเนื่องจากมีข้อ จำกัด ด้านเวลาดังนั้นเราจึงรู้ว่าการทดสอบนี้สำหรับนายจ้างที่พิจารณาแล้วว่าควรจ้างผู้สมัคร # 1 หรือ # 2 ที่เป็นไปได้เท่านั้น ( ขึ้นอยู่กับการตรวจคัดกรองเพิ่มเติม)

ตัวอย่างบางส่วน:

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

5

หอคอยแห่งฮานอย นั่นเป็นหนึ่งในการมอบหมายการเขียนโปรแกรมครั้งแรกที่ฉันมีในหลักสูตรน้องใหม่ของฉันที่มหาวิทยาลัย (หลังจาก Fibonacci - ใช่ฉันได้เรียนกับหนึ่งในการเขียนโปรแกรมฟังก์ชั่นประหลาดเหล่านั้น :) และฉันไม่ได้เกี่ยวกับวิทยาศาสตร์คอมพิวเตอร์ฉันยังอยู่ในสาขาวิศวกรรมคอมพิวเตอร์

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

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

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

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


3

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

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


0

เวลาผ่านไป แต่ไม่ได้รับความคิดที่ว่าคุณโง่ถ้ามันใช้เวลานาน ผู้คนจำนวนมากมีสิ่งที่ "จดจำ" พวกเขาฝึกการใช้เทคนิคต่าง ๆ เช่นการเรียกซ้ำจนกลายเป็นธรรมชาติ 2cd ไม่ใช่ว่าพวกเขาฉลาดกว่าพวกเขาเพิ่งฝึกฝนมาจนถึงจุดที่ 2cd และคุณก็ทำได้เช่นกัน!

ลองพิจารณาปัญหาทางคณิตศาสตร์ต่อไปนี้: 2 + 2 =?

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


-1

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


7
ดังนั้นเมื่อกำหนดเวลาสิ้นสุดคือ "45 นาทีจากนี้" และคุณเสร็จสี่ชั่วโมงต่อมาผู้คนจะสนใจ

1
ความหมายของ Mehrdad คือคุณสามารถทำงานล่วงเวลาเพื่อให้ตรงตามกำหนดเวลา: D
quant_dev

1
หากคุณต้องทำงานล่วงเวลาเพื่อทำสิ่งต่าง ๆ ผู้พัฒนาไม่จำเป็นต้องทำงานล่วงเวลา - คุณไม่มีทางหยุดที่จะดึงออกมาเมื่อผู้คนนิยมแฟน ๆ จริงๆ ...
occulus

-1

มันค่อนข้างเครียดฉันต้องอ่านว่าอะไรคือหอคอยแห่งฮานอย -15 นาทีเริ่มต้น IDE สร้างวิธีแก้ปัญหาเปล่า ๆ -5 นาทีนั่นคือ 25 นาทีเพื่อแก้ปัญหา เพียงเขียนโค้ดด้วยระบบประปาทั้งหมดเช่นคลาสที่ปลอดภัยด้วยการออกแบบส่วนต่อประสานที่ดีจะต้องใช้เวลาเช่นกัน - 10 นาทีจึงเหลือเวลาอีก 15 นาทีสำหรับแนวคิดที่แท้จริง ขึ้นอยู่กับว่าหอคอยในฮานอยนั้นน่าจะเพียงพอ แต่อาจไม่พอ และบางครั้งฉันก็แค่ต้องปล่อยให้ปัญหาแก้ตัวเองในขณะที่ฉันกำลังทำงานกับปัญหาอื่น ๆ เพราะฉันไม่เห็นวิธีแก้ปัญหาตรงจุดนั้น ดังนั้นจะได้รับการแก้ไขฟรีในเธรดแบบขนาน แต่จะไม่เกิดขึ้นในทันที

อย่างไรก็ตามเป็นหนึ่งใน บริษัท ที่ใหญ่ที่สุดเพื่อให้พวกเขาสามารถทำสิ่งที่พวกเขาต้องการ แต่การ จำกัด เวลาเป็นหนึ่งในปัจจัยที่เลวร้ายที่สุดในการสัมภาษณ์ IMHO ฉันรู้สึกกดดันเร่งรีบทำทุกอย่างให้สะอาดไม่ได้และไม่สามารถจดจ่อกับรายละเอียดทั้งหมดซึ่งสำคัญมากเมื่อใช้งานจริง :) แน่นอนว่าคุณสามารถแก้ปัญหาได้อย่างรวดเร็วเช่นตั้งค่าการเข้าถึงผู้ดูแลระบบเพื่อให้ทุกอย่างทำงานได้ + 'SELECT * FROM pass WHERE usr == ' + user_inputแต่สำหรับงานที่ปลอดภัยและเป็นลายลักษณ์อักษรที่ฉันภูมิใจฉันจะต้องใช้เวลาสักครู่และ 45 นาทีค่อนข้างรุนแรง


1
ฉันคิดว่าพวกเขาต้องการคนที่เพียงแค่จำว่าปัญหาหอคอยแห่งฮานอยคืออะไร
quant_dev

การเริ่มต้น IDE ของคุณและสร้างโครงการเปล่าใช้เวลาห้านาที? หากคุณยังไม่รู้จักหอคอยแห่งฮานอยอย่างน้อยก็ทำตามลำดับตรงกันข้ามดังนั้น IDE กำลังโหลด (จาก VM ผ่านทางอินเทอร์เน็ต) ในขณะที่คุณกำลังค้นคว้าอยู่!
ไบรอัน Boettcher

ในการทดสอบเช่นนี้พวกเขาไม่จำเป็นต้องมองหา "การออกแบบอินเตอร์เฟสที่ดี" และ "การประปา" - ฉันคาดหวังว่าพวกเขาต้องการเห็นความเข้าใจของคุณเกี่ยวกับปัญหาและความสามารถในการสร้างอัลกอริทึมเพื่อแก้ปัญหา หากภาษาไม่ได้เป็นข้อ จำกัด การใช้บางอย่างเช่น Java และ Eclipse เป็นสิ่งสุดท้ายที่ฉันจะทำ ฉันจะใช้ Python และ text editor / compact IDE ขั้นต่ำ (ไม่ได้บอกว่าคุณจะใช้ Java ด้วยตัวเองเพียงแค่บอกว่า ... )
occulus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.