คำถามที่เกี่ยวข้องกับการออกแบบ OO ในการสัมภาษณ์ทางเทคนิค [ปิด]


14

เมื่อไม่นานมานี้ฉันได้เข้ารับการสัมภาษณ์ไม่กี่ครั้งและ บริษัท ได้รับการขอให้ตอบคำถาม "ออกแบบ [แบบจำลองการแทรก]" มากกว่าสองสามครั้ง

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

* แก้ไขเพื่อการตอบสนองของ Kevin *

ตัวอย่างเช่น: คำถามที่สมบูรณ์อาจเป็น "ออกแบบระบบการจัดการที่จอดรถที่สามารถใช้เพื่อค้นหาช่องว่าง"

ฉันสามารถทำได้มี 2 ชั้นParkingLotและSlotหรือฉันจะไปบนเพื่อเพิ่มIVehicleและVehicleและCarและMotorcycleชั้นเรียน ฉันจะวาดเส้นที่ไหน?

public class ParkingLot
{
   IVehicle Vehicle {set; get;}

   List<Slot> GetEmptySlots() { };
}

public class Vehicle : IVehicle
{
  Slot SlotNum {set; get;}
}

public class Slot
{
  int Row {set; get;}
  int Column {set; get; }
}

ปัญหา "การออกแบบอะไรก็ตาม " ย้อนกลับไปหลายทศวรรษ
Blrfl

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

คำตอบ:


10
  1. ในระดับหนึ่งใช่ ทุกคนสามารถท่องไวยากรณ์หรือคัดลอก / วางผ่านทางโซลูชัน เราต้องการจ้างคนที่สามารถแก้ปัญหาได้

  2. พวกเขาคาดหวังให้คุณจัดทำเอกสารการออกแบบอย่างเพียงพอที่พวกเขาสามารถเข้าใจได้ (และไม่มากไปกว่านั้น)

  3. ฉันถามผู้คนว่าพวกเขาจะแก้ปัญหา XYZ ได้อย่างไร พวกเขามักจะอธิบายด้วยวาจา ฉันต้องการดูว่าพวกเขาถามคำถามเพื่อชี้แจงข้อกำหนดหรือไม่ ฉันต้องการดูว่าพวกเขาสื่อสารกับโปรแกรมเมอร์อื่น ๆ อย่างไร ฉันต้องการดูว่าพวกเขาสามารถคิดด้วยเท้าของพวกเขา

มันมีประโยชน์สำหรับฉัน ฉันไม่ต้องการรหัสลิงฉันต้องการวิศวกรซอฟต์แวร์


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

1
@nick - ดันโน การทดสอบออนไลน์เป็นประโยชน์ที่น่าสงสัยในตอนแรก โดยส่วนตัวแล้วมันให้ข้อมูลเชิงลึกเกี่ยวกับทักษะการออกแบบ
Telastyn

6

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

class ParkingLot {
 boolean isFull();
 void carEntered();
 void carExited();
}

มันตรงกับกรณีการใช้ที่ชัดเจนหนึ่งกรณี


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

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

1
นั่นไม่ได้ทำให้มันเป็นคำถามที่โง่ ในทางตรงกันข้ามมันช่วยในการค้นหาว่าผู้สมัครมีความสามารถในการชี้แจงข้อกำหนดที่คลุมเครือ นั่นเป็นทักษะที่สำคัญ
Cameron Skinner

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

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

5

คุณแสดงให้เห็นถึงการใช้คำถามนี้ในการแก้ไขซึ่งคุณไม่สามารถออกแบบแบบจำลองที่ใช้การได้

public class ParkingLot
{
   IVehicle Vehicle {set; get;}

   List<Slot> GetEmptySlots() { };
}

public class Vehicle : IVehicle
{
  Slot SlotNum {set; get;}
}

public class Slot
{
  int Row {set; get;}
  int Column {set; get; }
}

var parkingLot = new ParkingLot();
var v1 = new Vehicle();
v1.Slot = parkingLot.GetEmptySlots()[0];
parkingLot.Vehicle = v1; // WHAT!??

นอกจากนี้คุณยังพูดถึงการสร้างCarและMotorcycleชั้นเรียนซึ่งไม่สมเหตุสมผลโดยไม่ต้องพิจารณาเพิ่มเติม การออกแบบของคุณจะไม่ได้รับประโยชน์ใด ๆ จากการมี Vehiclesubclassed หากคุณแนะนำMotorcycleโดยไม่มีความแตกต่างด้านพฤติกรรมใด ๆVehicleฉันก็ถือว่ามันล้มเหลว

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

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

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


3

ฉันเคยถามสิ่งเหล่านี้ - ย้อนกลับไปเมื่อเราสร้างไดอะแกรมระดับสำหรับการสร้างรหัส ฉันยังคงทำในบางโอกาส แต่ไม่ได้ทำเป็นประจำ ฉันชอบคำถามเพราะมันทำให้ฉันเห็นคนที่คิด

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


"ฉันชอบคำถามเพราะมันทำให้ฉันเห็นคนที่คิดว่า" -> สิ่งที่คุณมองหาเมื่อคุณประเมินทักษะการคิดของบุคคลนั้น มันเป็นความเร็วที่พวกเขาแก้ปัญหาได้หรือไม่? มันเป็นทางออกสุดท้ายหรือไม่? มันลึกแค่ไหนในการสร้างคลาสอินเทอร์เฟซ มันเป็นวิธีที่พวกเขาแสดงให้เห็นว่าพวกเขารู้แนวคิดของ OOP มากน้อยเพียงใด (การสืบทอดความหลากหลายรูปแบบ ฯลฯ )
Nick

พวกเขามีระเบียบหรือไม่? พวกเขาคิดถึงสิ่งที่อาจผิดพลาดหรือไม่? พวกเขาคิดทางเลือกอื่นหรือไม่? พวกเขาประกาศเอาชนะคำถามแปลก ๆ อย่างรวดเร็วหรือไม่? (ฉันมักจะถามอะไรบางอย่างเช่นโทรศัพท์ไม่ใช่วัตถุที่คนส่วนใหญ่ออกแบบมาก่อน?) ฉันไม่ได้มองหาความเร็ว (ยกเว้นบางคนใช้เวลา 15 นาทีก่อนที่จะเริ่มพูดอะไร!)
Jeanne Boyarsky

3
  1. ฉันได้เห็นการสัมภาษณ์ประเภทนี้อย่างน้อย 12 ปีที่แล้ว มันเป็นวิธีการที่ฉันใช้ในช่วง 6 ปีที่ผ่านมา ประสบการณ์แสดงให้เห็นว่ามันเลือกผู้สมัครที่ดีกว่าสำหรับงานมากกว่าคำถาม 20 ข้อและให้คะแนนจาก 20 วิธี

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

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


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

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

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

2

การออกแบบระบบขนาดเล็กนั้นเป็นแบบฝึกหัดที่มีความเกี่ยวข้องมากในการสัมภาษณ์ มันแสดงให้เห็นทักษะของคุณที่มากับโซลูชันซอฟต์แวร์ที่ดีในการแก้ไขปัญหาโดเมน

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

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

ในการสัมภาษณ์สดขั้นตอนในอุดมคติที่ฉันคาดหวังว่าผู้สมัครจะเป็น:

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

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


0

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

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


-1

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


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