ฉันควรให้คำตอบสำหรับแบบฝึกหัดการสัมภาษณ์ที่ล้มเหลวหรือไม่? [ปิด]


14

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

เขาเป่ามัน

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

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

คำถามของฉันคือฉันควรให้คำตอบสำหรับคำถามเชิงตรรกะหรือไม่

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

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

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

วิธีที่ถูกต้องในการจัดการกับสถานการณ์นั้นคืออะไร?


1 โอเคนั่นไม่ใช่ลิงก์ไปยังคำถาม FizzBuzz จริง ๆ แต่เป็นการอภิปราย P.SE ที่ดีเกี่ยวกับ FizzBuzz และลิงก์ไปยังแง่มุมต่าง ๆ ของคำถาม

2 เพื่อช่วยชี้แจงนี้เป็นความแตกต่างของฟอง-Buzz ที่ฉันถามและก็มาจากปัญหาแรกโครงการออยเลอร์ แทนการพิมพ์ Fizz | Buzz สำหรับการรวมตัวเลขและคุณมีคำถามพื้นฐานเดียวกัน
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Write a function that finds the sum of all the multiples of 3 or 5 below 1000.

3 คำถามนี้ดึงดูดความสนใจมากกว่าที่ฉันคาดไว้และฉันซาบซึ้งกับคำตอบทั้งหมด คำตอบในภายหลังบางข้อได้รับความสำคัญของคำถามของฉันดังนั้นฉันจะอนุญาตให้ชุมชนตรวจสอบและลงคะแนนก่อนที่จะกำหนดคำตอบ ""

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


34
ตัดพวกเขาหลวมและขึ้นกับวันของคุณ เท่าที่ฉันกังวลการล้มเหลวของ FizzBuzz ใน "ระดับอาวุโส" เป็นการจงใจและเสียเวลาโดยไม่เจตนา
Steven Evers

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

6
@JoelEtherton - สิ่งเดียวกันที่นี่ ฉันผลักหน้าจอโทรศัพท์ทุกที่ที่ไป หากคุณสมัครเป็นผู้อาวุโสโดยใช้ C # และไม่สามารถบอกความแตกต่างระหว่างประเภทค่าและประเภทอ้างอิงได้คุณจะไม่ได้รับการสัมภาษณ์
Telastyn

3
@ 0A0D นำทีมเป็นที่แตกต่างกันชนิดของทักษะจากการเป็นนักพัฒนาที่ดี ฉันเคยเห็นทีมที่นำไปสู่การเป็นนักพัฒนาที่ไม่ดีเช่นกัน
Kyralessa

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

คำตอบ:


15

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

ฉันมีความสนใจอย่างมากและเปิดเผยการสนทนากับผู้สมัครที่เริ่มต้นด้วยการเปรียบเทียบวิธีการที่แตกต่างกันของเราในการแก้ปัญหาเดียวกัน หลังจากที่ในขณะที่ฉันคาดหวังข้อผิดพลาดบางอย่างเพียงแค่ตรวจสอบโรงเรียนที่ผู้สมัครเข้าเรียน ("อาจารย์" บางคนเป็น ... morons) และในบางกรณีที่ผู้สมัครไม่สามารถหาวิธีแก้ปัญหาใด ๆ ได้ฉันได้ให้หนึ่งครั้งต่อไป


มีเหตุผล; ฉันกำลังมองหางานใหม่เมื่อเร็ว ๆ นี้และฉันพบว่าผู้สัมภาษณ์ส่วนใหญ่ทำสิ่งเดียวกันเมื่อฉันให้คำตอบที่ผิด (หรือ "ปิดคำตอบเล็กน้อย") กับคำถามของพวกเขา นี่เป็นวิธีปฏิบัติที่ดีจริงๆ ส่วนใหญ่เป็นเพราะมันเปิดขึ้นผู้สมัคร (ฉันเช่น.) และทำให้การสัมภาษณ์ตัวเองมีส่วนร่วมมากขึ้นจากทั้งสองฝ่าย แต่แน่นอนเรากำลังพูดถึงเทมเพลต RAII และมัลติเธรดใน C ++ คำถามคือสิ่งที่คุณพูดกับคนที่ไม่สามารถแก้ปัญหา fizzbuzz?
Chani

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

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

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

15

ให้คำตอบ

ฉันจะบอกว่าถ้าผู้สมัครไม่สนใจพอที่จะถามฉันจะไม่เสียลมหายใจ แต่ คำตอบ @Yannis_Rizosดีกว่ามาก

การสัมภาษณ์เป็นไปอย่างรวดเร็ว ฉันรู้ว่าฉันมักจะมองหาสิ่งต่าง ๆ หลังจากวันสัมภาษณ์

คนที่ไม่สามารถรหัส FizzBuzz Classic ได้

ฉันจินตนาการว่าจุดเกาะติดขนาดใหญ่กำลังตระหนักถึงตัวดำเนินการ% คุณหวังว่าจะมีคนคิดเปรียบเทียบกัน(myInt / 3) == (myDouble / 3.0)แต่อาจจะมีความเครียดจากการสัมภาษณ์ ... ถึงกระนั้น FizzBuzz Classic บังคับให้มีวิธีการที่โหดร้ายวางไว้ในหมวดของปัญหาอัลกอริทึมที่ง่ายที่สุดในการแก้ปัญหา คุณลองขอให้ผู้คนเขียนโค้ดครึ่งหนึ่งเป็น "เครดิตครึ่งเครดิต" และอาจเพิ่ม "Buzz" ในภายหลังเพื่อเพิ่มประสิทธิภาพหรือไม่

ฉันคิดว่าคำตอบที่ดีที่สุดสำหรับคำถามของคุณคือมันยากมากที่จะหาผู้สมัครที่ดี

คำถามสัมภาษณ์ทั่วไป

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

อาจจะเป็นคำถามที่คิดว่าอัลกอริทึมของรถถังนั้นมีความจำเป็นเช่นกัน แต่ฉันก็ทิ้งมันไว้ในคำถาม "โปรเจ็กต์สุดโปรด"

ผลรวม (ลูกชาย) ของ FizzBuzz

คำถามสัมภาษณ์ของคุณไม่เทียบเท่ากับ FizzBuzz:

ถ้าเราแสดงจำนวนธรรมชาติทั้งหมดต่ำกว่า 10 ที่เป็นทวีคูณของ 3 หรือ 5 เราจะได้ 3, 5, 6 และ 9 ผลรวมของทวีคูณเหล่านี้คือ 23. เขียนฟังก์ชันที่ค้นหาผลรวมของทวีคูณทั้งหมดของ 3 หรือ 5 ต่ำกว่า 1,000

ที่ FizzBuzz Classic บังคับให้คุณผ่านการทำซ้ำn (เพื่อพิมพ์ทุกหมายเลขหรือ Fizz / Buzz) ปัญหาของคุณสามารถทำได้ในการทำซ้ำn / 5 + n / 3 + n / 15 หรือแม้กระทั่งไม่มีการทำซ้ำ - การแก้ไขโดยตรง - การคำนวณคะแนนเป็นไปได้ โปรแกรมต่อไปนี้เปรียบเทียบวิธีการทั้งสามนี้:

public static void main(String[] args) {
  long n = Long.valueOf(args[0]).longValue();
  long sum = 0;
  long ms = System.currentTimeMillis();
  // Brute force method  Performance: cn
  for (long i = 1; i <= n; i++) {
    if ((i % 3) == 0) { sum += i;
    } else if ((i % 5) == 0) { sum += i; }
  }
  System.out.print("Brute force sum:    " + sum);
  System.out.println(" time: " + (System.currentTimeMillis() - ms));
  ms = System.currentTimeMillis();

  // Second solution: iterate through only numbers we are
  // interested in.  Performance: c * (n/3 + n/5 + n/15)
  // We counted multiples of 15 twice, so subtract one of them
  sum = countSum(n, 3) + countSum(n, 5) - countSum(n, 15);
  System.out.print("Only multiples sum: " + sum);
  System.out.println(" time: " + (System.currentTimeMillis() - ms));
  ms = System.currentTimeMillis();

  // Third solution: Use high school algebra.  Performance: c
  sum = sumSeries(n, 3) + sumSeries(n, 5) - sumSeries(n, 15);
  System.out.print("Sum of series:      " + sum);
  System.out.println(" time: " + (System.currentTimeMillis() - ms));
}

// Iteravely sum all multiples of skip
private static long countSum(long n, long skip) {
  long skipTotal = skip;
  long grandTotal = 0;
  while (skipTotal <= n) {
    grandTotal += skipTotal; skipTotal += skip;
  }
  return grandTotal;
}

// Thanks to @Caleb for pointing this out!  High school algebra
// tells us that the sum of a series is: (n * (a1 + an)) / 2
// where a1 is the first term and an is the nth term.  E.g. The
// sum of a series of 3 is: (n/3 * (3 + n - (n % 3))) / 2
// Since we are thinking about performance here, we'll shift
// right one instead of dividing by 2 for style points.  ;-D
private static long sumSeries(long n, long skip) {
  return (n/skip * (skip + n - (n % skip))) >> 1;
}

ผลลัพธ์ (ผลรวมของ FizzBuzz <1,000):

$JDK_HOME/bin/java FizzBuzzNot 999
Brute force sum:    233168 time: 0
Only multiples sum: 233168 time: 0
Sum of series:      233168 time: 0

ด้วย n ที่ใหญ่กว่าสำหรับการเปรียบเทียบประสิทธิภาพ:

$JDK_HOME/bin/java FizzBuzzNot 1000000000
Brute force sum:    233333334166666668 time: 4744
Only multiples sum: 233333334166666668 time: 818
Sum of series:      233333334166666668 time: 0

หมายเหตุสำหรับผู้ที่ลงคะแนนให้เป็นนอกหัวข้อ

จุดประสงค์ของการนำเสนอวิธีแก้ปัญหาสำหรับคำถามนี้คือการแสดงให้เห็นว่าในขณะที่วิธีการแก้ปัญหาแบบ brute force สำหรับ Sum of FizzBuzz นั้นคล้ายคลึงกับ FizzBuzz Classic แต่การแก้ปัญหาแบบ Sum นั้นมีปัญหาที่ดีกว่าทำให้เป็นปัญหาที่แตกต่างกัน ผลรวมของ FizzBuzz นั้นยากมากถ้าคุณจำสูตรที่ไม่เหมาะสมสำหรับผลรวมของอนุกรมหรือไม่ทราบว่ามันใช้กับการก้าวเป็น 3 หรือ 5

หากคุณได้รับสูตรซ้ำสำหรับผลรวมของอนุกรมโดยแบ่งอนุกรมออกเป็นครึ่งย้อนกลับครึ่งหนึ่งและจับคู่คุณจะได้รับ (n + 1) (n / 2) ซึ่งจะพาคุณไปสู่เส้นทางที่ยุ่งเหยิงจริงๆ ตราบใดที่มีการหารจำนวนเต็มและส่วนที่เหลือที่ถูกตัดทอน สูตรนี้ (n (a1 + an)) / 2 มีความสำคัญอย่างยิ่งสำหรับคำตอบง่ายๆสำหรับค่าทั้งหมดของ n


3
สามารถคำนวณได้โดยตรง (Ruby): t = { |i| (i * (i+1)) / 2 }; fizzbuzz = { |n| 3 * t((n-1)/3) + 5 * t((n-1)/5) }
kevin cline


1
@ GlenH7 ใช่ฉันลบความคิดเห็นของฉันเพราะเป็น buzzkill เกลนสมควรได้รับอุปกรณ์ประกอบฉากสำหรับการวิเคราะห์ของเขาแม้ว่ามันจะไม่ได้ตอบคำถามที่ทั้งหมด: D (นอกจากนี้ฉันเขียนรหัสทั้งหมดและลองใช้วิธีแก้ปัญหาของตัวเองเมื่อไม่นานมานี้)
Andres F.

2
คุณกำลังมองหาผลรวมของซีรีส์เนื่องจากชุดนี้มีโมดูโล = 0 จึงสามารถใช้สูตร n / 2 * (m + nm) ได้ โดยที่ m = หมายเลขโมดูโลและ n = จำนวนองค์ประกอบในซีรีส์ (หรือที่รู้จักว่าพื้น (x / m) หลังจากนั้นมันง่าย S (3) + S (5) - S (3 * 5) [เพื่อให้ตัวเลขบางตัว อย่านับเป็นสองเท่า]
jmoreno

3
เหตุผลหนึ่งที่คุณอาจมีปัญหาคือคุณกำลังนับจำนวนสองครั้ง (หารด้วย 15) สำหรับโปรแกรมตัวอย่างดูideone.com/clone/oNWrhJ
jmoreno

8

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

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

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

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

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


1
ทำไม? คุณสามารถ Google ได้เพียงคำตอบในภายหลัง FizzBuzz เป็นที่นิยมมาก ฉันจะเป็นห่วงหากใครไม่รู้จักการแบ่งโมดูลัส
ไบรอัน

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

ฉันได้รับความเห็นจริงเกี่ยวกับ FizzBuzz ... แต่นี่เป็นคำตอบที่ถูกต้อง หากผู้สมัครไม่ได้ขอคำตอบอย่ามอบมันให้กับพวกเขา
James P. Wright

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

1
@ 0A0D "คณิตศาสตร์" ที่เกี่ยวข้องกับ FizzBuzz เพียงตรวจสอบว่าตัวแปรที่กำหนดสามารถหารด้วย 3 และ / หรือ 5 ได้หรือไม่โดยระดับของคณิตศาสตร์นั้นมีอยู่ในแอพทุกตัวที่คุณเขียน แม้แต่ "นักพัฒนาธุรกิจ" อย่างฉันที่เพิ่งทำโครงการประเภทเดียวกันซ้ำไปซ้ำมาใช้คณิตศาสตร์ในระดับนี้ GlenH7, ฉันไม่แน่ใจด้วยซ้ำว่าการใช้การเรียกซ้ำใน FizzBuzz จะทำให้ฉันประทับใจหรือทำให้ฉันกลัว .... ดูเหมือนว่าจะเป็นอันตรายเกินจริง
เกรแฮม

4

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

ไม่มีการกู้คืนจากการที่ไม่สามารถทำเช่นนั้นได้ เป็นหนึ่งในสิ่งที่จำเป็นที่คุณต้องหลีกทางให้ได้

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


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

7
เมื่อรหัสตัวอย่างที่ให้ไว้ไม่ตรงกับความรู้ที่แสดงในการสัมภาษณ์สมองของฉันจะสงสัยรหัสตัวอย่างทันที
เกรแฮม

@Graham: จ้างเขาเป็นชั่วคราวเป็นเวลา 6 เดือน ..
ไบรอัน

@ 0A0D น่าเสียดายที่ฉันไม่เคยทำงานในสถานที่ที่ให้ความยืดหยุ่นแบบนั้น หากตำแหน่งที่โฆษณานั้นเป็นงานเต็มเวลานั่นคือทั้งหมดที่เราสามารถเสนอได้
เกรแฮม

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

4

ฉันยังเป็นโค้ชให้เขาคิดเรื่องการใช้ลูปและ 3 และ 5 นั้นมีค่ามากเมื่อพิจารณาเป็นกรณีพิเศษ

เป็นที่น่าสนใจที่จะรู้ว่าคุณคิดอย่างไรคำตอบที่ถูกต้องสำหรับ FizzBuzz-ish ของคุณคือ จากที่ฉันนั่งอยู่สิ่งที่ดี (ใน C) เขียนถึงจดหมายคำถามของคุณคือ:

int f(void) {
    // sum the multiples of 3 and of 5 and subtract multiples of 15 so we don't count them twice
    return ((1000/3)/2)*(999+3) + ((1000/5)/2)*(995+5) - ((1000/15)/2)*(990+15);
}

หนึ่งที่ดีกว่าอาจเป็น:

ทำไม heck คุณถึงเขียนโปรแกรมให้ทำเมื่อคุณสามารถคำนวณได้โดยตรง

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

คำถามของฉันคือฉันควรให้คำตอบสำหรับคำถามเชิงตรรกะหรือไม่

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


+1 สำหรับคำตอบที่มั่นคงในย่อหน้าสุดท้ายของคุณ และคุณยกประเด็นที่ดีในเรื่องที่ฉันควรจะพูดว่า "คำตอบ" แทนที่จะเป็น "คำตอบ" มีหลายวิธีในการแก้ปัญหาเฉพาะที่ ในฐานะที่เป็นdiscuss the problemองค์ประกอบที่ขึ้นมามีคำถามอื่น ๆ ในระหว่างการสัมภาษณ์ น่าเสียดายที่ผู้สมัครคือ ... น้อยกว่าการเตรียมพร้อมในการตอบกลับ ฉันไม่ได้เพิ่มมุมมองนั้นลงในคำถามเดิมเนื่องจากฉันพยายามเก็บไว้ในแนวทางของ P.SE สำหรับ "ตัวตนที่ดี"

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

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

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

2

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

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

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

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


2

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

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

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


+1 สำหรับความคิดเห็นของhow they work to arrive at the answer is a critical factor. ในขณะที่ฉันคาดว่าจะใช้ตัวดำเนินการโมดูลัสนั่นเป็นเพียงเพราะนั่นคือวิธีที่ฉันจะแก้ไขมัน ฉันเปิดกว้างมากที่จะเห็นวิธีการอื่น ๆ ที่แก้ไขปัญหาโดยไม่สร้างข้อผิดพลาดเกี่ยวกับเงื่อนไขขอบเขตที่เห็นได้ชัด

2

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

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

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


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


2

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

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

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

สัปดาห์ที่สองที่ผ่านมาคำถามที่ถูกถาม"เมื่อคุณควรเรียกตัวเองว่าเป็นนักพัฒนาอาวุโส" ฉันยังเขียนบล็อกโพสต์ในหัวข้อ


คุณช่วยแก้ไขลิงก์บล็อกของคุณได้ไหม
André

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