Pamiętając o tym, że jest to pytanie do rozmowy kwalifikacyjnej, a nie rzeczywisty scenariusz, uważam, że właściwym podejściem (i prawdopodobnie tego, czego szuka ankieter) jest postawienie pytania wyjaśniającego lub napisanie: „Nie może być gotowe ”i przejść dalej. Dlatego.
O co pyta ankieter:
Napisz funkcję, która gwarantuje, że nigdy nie zwróci dwukrotnie tej samej wartości. Załóżmy, że ta funkcja będzie dostępna dla wielu komputerów jednocześnie.
Czego potrzebuje ankieter:
Czy ten kandydat skutecznie ocenia wymagania i w razie potrzeby szuka dodatkowych informacji?
Nigdy nie zakładaj.
Kiedy inżynier otrzymuje wymagania (poprzez SOW lub specyfikację lub inny dokument wymagań), niektóre są oczywiste, a inne zupełnie niejasne. To doskonały przykład tego ostatniego. Jak pokazały poprzednie odpowiedzi, nie ma sposobu, aby odpowiedzieć na to wymaganie bez przyjęcia kilku głównych założeń (a) co do charakteru pytania lub (b) co do charakteru systemu, ponieważ wymaganie to nie może być spełnione jak napisano (jest to niemożliwe).
Większość odpowiedzi podejmuje próbę rozwiązania problemu za pomocą szeregu założeń. Jeden szczególnie zaleca, aby zrobić to szybko i pozwolić klientowi się tym martwić, jeśli jest to źle.
To naprawdę złe podejście. Jako klient, jeśli podam niejasne wymagania, a inżynier odejdzie i zbuduje mi rozwiązanie, które nie działa, będę zmartwiony, że poszli do pracy i wydali moje pieniądze, nie zawracając sobie głowy pytaniem mnie najpierw. Tego rodzaju nonszalanckie podejmowanie decyzji świadczy o braku pracy zespołowej, niezdolności do krytycznego myślenia i złej ocenie sytuacji. Może to prowadzić do wszelkiego rodzaju negatywnych konsekwencji, w tym utraty życia w systemie o krytycznym znaczeniu dla bezpieczeństwa.
Po co zadawać pytanie?
Chodzi o to, że ćwiczenie to jest kosztowne i czasochłonne w budowaniu według niejednoznacznych wymagań. W przypadku PO otrzymałeś niemożliwe zadanie. Twoim pierwszym działaniem powinno być poproszenie o wyjaśnienie - czego potrzeba? Jaki stopień wyjątkowości jest potrzebny? Co się stanie, jeśli wartość nie jest unikalna? Odpowiedzią na te pytania może być różnica między kilkoma tygodniami a kilkoma minutami. W prawdziwym świecie jednym z największych czynników napędzających koszty w złożonych systemach (w tym w wielu systemach oprogramowania) są niejasne i źle zrozumiane wymagania. Prowadzi to do kosztownych i czasochłonnych błędów, przeprojektowywania, frustracji klientów i zespołu oraz żenujących relacji z mediów, jeśli projekt jest wystarczająco duży.
Co się dzieje, kiedy zakładasz?
Biorąc pod uwagę moje doświadczenie w branży lotniczej i kosmicznej oraz ze względu na bardzo widoczny charakter awarii lotniczych, chciałbym przytoczyć przykłady z tej dziedziny, aby zilustrować ważne punkty. Przeanalizujmy parę nieudanych misji Marsa - Mars Climate Orbiter i Mars Polar Lander. Obie misje zakończyły się niepowodzeniem z powodu problemów z oprogramowaniem - ponieważ inżynierowie przyjęli nieprawidłowe założenia, częściowo z powodu niejasnych i źle zakomunikowanych wymagań.
Mars Climate Orbiter - ten przypadek jest zwykle cytowany jako to, co dzieje się, gdy NASA próbuje przekonwertować język angielski na jednostki metryczne. Jest to jednak zbyt uproszczone i słabe przedstawienie tego, co naprawdę się wydarzyło. To prawda, że wystąpił problem z konwersją, ale wynikał on z nieprawidłowo zakomunikowanych wymagań na etapie projektowania i niewłaściwego schematu weryfikacji / weryfikacji. Ponadto, gdy dwóch różnych inżynierów zauważyło problem, ponieważ było to oczywiste na podstawie danych trajektorii lotu, nie podnieśli problemu do właściwego poziomu, ponieważ przyjęli, że to błąd transmisji. Gdyby zespół operacyjny misji został poinformowany o problemie, byłby odpowiedni czas, aby go naprawić i uratować misję. W tym przypadku istniał niemożliwy warunek logiczny, który nie został rozpoznany, co doprowadziło do kosztownego niepowodzenia misji.
Mars Polar Lander- ten przypadek jest nieco mniej znany, ale być może bardziej krępujący ze względu na jego czasową bliskość do awarii Mars Orbitera. W tej misji oprogramowanie kontrolowało wspomagane pędem opuszczanie rakiety na powierzchnię Marsa. W punkcie 40 metrów nad powierzchnią nogi lądownika rozłożyły się w ramach przygotowań do lądowania. Na nogach znajdował się także czujnik wykrywający ruch (sygnalizujący uderzenie) informujący oprogramowanie o wyłączeniu silnika. Najlepszym przypuszczeniem NASA co do tego, co się stało (ponieważ istnieje wiele możliwych awarii i niekompletnych danych) jest to, że przypadkowe wibracje w nogach z powodu ich jednoczesnego rozmieszczenia i nieprawidłowo uruchomiły mechanizm wyłączający 40 m nad powierzchnią, powodując awarię i zniszczenie 110 USD Statek kosmiczny M. Możliwość ta została podniesiona podczas opracowywania, ale nigdy nie został skierowany. Ostatecznie zespół programowy dokonał nieprawidłowych założeń dotyczących tego, jak ten kod musi działać (jednym z takich założeń jest to, że fałszywy sygnał byłby zbyt krótki, aby go wykryć, pomimo testów wykazujących inaczej), i te założenia zostały zakwestionowane dopiero po fakt.
Dodatkowe uwagi
Wywiady i ocena ludzi to trudna sprawa. Kandydat może zbadać kilka wymiarów kandydata, ale jednym z najważniejszych jest umiejętność krytycznego myślenia danej osoby. Z różnych powodów, między innymi dlatego, że krytyczne myślenie jest źle zdefiniowane, bardzo trudno jest nam ocenić umiejętności krytycznego myślenia.
Jako instruktor inżynierii jednym z moich ulubionych sposobów oceny zdolności studenta do krytycznego myślenia było zadanie nieco dwuznacznego pytania. Ostrzejsi uczniowie wychwyciliby błędne przesłanie pytania, odnotowali je i albo odpowiedzieli na to przesłanie, albo odmówili odpowiedzi. Zazwyczaj zadałbym pytanie podobne do następującego:
Odbierasz rysunek ze stosu pracy. Rysunek zawiera wiele różnych objaśnień, ale najważniejsze punkty wskazują na poziomą powierzchnię i mówią „Idealnie płaski”. Powierzchnia ma szerokość 5 na 16 cali, a część wykonana jest z aluminium. Jak obrobisz część, aby utworzyć tę funkcję?
(Nawiasem mówiąc, byłbyś zszokowany tym, jak często taka słaba specyfikacja pojawia się w miejscu pracy).
Oczekuję, że uczniowie uznają, że nie można stworzyć idealnej funkcji i podadzą to w swojej odpowiedzi. Zazwyczaj przyznawałbym punkt bonusowy, jeśli powiedzą, że wrócą do projektanta i poproszą o wyjaśnienie przed wykonaniem części. Jeśli uczeń powie mi, w jaki sposób osiągnie płaskość 0,001 lub jakąś inną wymyśloną wartość, przyznam zero punktów. To pomaga mi wskazać moim uczniom, że muszą myśleć o szerszym obrazie.
Dolna linia
Jeśli przeprowadzam wywiad z inżynierem (lub podobnym zawodem), szukam kogoś, kto może myśleć krytycznie i kwestionować to, co zostało przed nim postawione. Chcę kogoś, kto zadaje pytanie „Czy to ma sens?” .
Nie ma sensu prosić o idealnie płaską część, ponieważ nie ma czegoś takiego jak idealny. Nie ma sensu prosić o funkcję, która nigdy nie zwraca zduplikowanej wartości, ponieważ nie można uzyskać takiej gwarancji. W programowaniu często słyszymy zwrot „śmieci, śmieci”. Jeśli otrzymujesz śmieci w celu spełnienia wymagań, Twoim etycznym obowiązkiem jest zatrzymać się i zadać pytanie, które pomoże ci wywołać prawdziwy zamiar. Jeśli przeprowadzam wywiad z kandydatem i stawiam mu niejasny wymóg, spodziewam się pytań wyjaśniających.