Welche Standards können von Diplom- / Nachwuchsingenieuren erwartet werden? [geschlossen]

38

Sind Pufferüberläufe für Diplom-Entwickler akzeptabel? Setzen wir die Messlatte zu hoch? Was sind die erwarteten Fähigkeiten von Diplom- / Nachwuchsingenieuren?

Kontext:

Derzeit suchen wir Junior-Entwickler, die hauptsächlich in C unter Linux arbeiten.

Als Teil des Prozesses verlangen wir von den Kandidaten, dass sie einen Code-Test nach Belieben in C absolvieren.

Bisher haben wir zwei Kandidaten mit der Begründung abgelehnt, dass ihr Code, obwohl lesbar und in einem Fall eher idiomatisch, aufgrund von unbegrenzten Pufferschreibvorgängen unter Pufferüberlauffehlern litt.

[Bearbeiten]:

  • Wir bitten ausdrücklich um einen fehlergeprüften Qualitätscode für die Produktion.
  • Wir bieten ein Test & Build-Framework für die Kandidaten

[Aktualisieren]:

Aufgrund dieses Themas und der persönlichen Gespräche mit anderen Entwicklern ändern wir die Art und Weise, wie wir Codetests durchführen und an wen wir uns bei unserer Personalbeschaffung wenden.

Wir sind zu dem Schluss gekommen, dass ein Kandidat, der einen Pufferüberlauf nicht beheben oder verstehen kann, für die von uns ausgeführte Arbeit ungeeignet ist, insbesondere mehr Mentoring in Anspruch nimmt, als wir vertragen. Wir werden daher weiterhin Kandidaten ablehnen, die letztendlich kein robustes Codebeispiel einreichen können.

Wir haben jedoch einige Maßnahmen ergriffen, um den Einstellungsprozess für uns und die Kandidaten produktiver zu gestalten.

Bestimmtes:

  • Wir machen unsere Erwartungen deutlicher, indem wir klar erläutern, was wir unter Produktionsqualität verstehen, und warnen, dass der Code in Bezug auf Eingaben und Fehler robust sein soll.
  • In der Beschreibung des Codetests verknüpfen wir Kandidaten nun mit Ressourcen zur defensiven Programmierung und der C-Standardbibliothek.
  • Wir haben unsere Zielgruppe von Junior-Entwicklern und Absolventen geändert, um Menschen mit relevanter Erfahrung anzusprechen.
  • Für den Fall, dass der eingereichte Code auf irgendeine Weise fehlschlägt, aber ansonsten akzeptiert würde, stellen wir jetzt einen minimalen Testfall bereit, der die Fehlerbedingung verursacht, und geben den Kandidaten die Möglichkeit, ihre Fehler zu korrigieren (es sei denn, der Code wird aus einem anderen Grund abgelehnt). Gegebenenfalls weisen wir auch auf problematische Linien / Funktionen hin.
  • Das Ziel der Tests selbst hat sich nun leicht von einem Front-End-Filter zu einer Chance gewandelt, ein besseres Bild des Kandidaten zu erstellen, insbesondere wird dies unsere Telefondiskussion informieren. Trotzdem sind wir immer noch bereit, nur auf der Basis von Code abzulehnen.

[Update 09.07.2015]: Andy Davis von Nujob hat einen interessanten und relevanten Artikel über die Verwendung eines Codetests aus Sicht des Kandidaten geschrieben, und der Artikel ist einen Blick wert. Finden Sie es hier .

brice
quelle
29
Vielleicht...? In Anbetracht dessen, dass es den Anschein hat, dass viele Menschen in der Schule jetzt viel mehr Erfahrung in Java als in C haben. Wenn die Kandidaten frisch von der Schule sind und 2/3 ihrer Programmierkenntnisse Java sind, ist ihr C möglicherweise nicht stark genug, um Ihre zu bestehen Prüfung. ABER ... wenn sie offen und lernbereit sind, was würden Sie dann sagen? Immerhin ist dies eine Junior- Position ...
FrustratedWithFormsDesigner
4
Es ist auch Code, der in einem Interview geschrieben wurde, vielleicht verzeihlich, wenn es zeitliche Einschränkungen gibt. Ich möchte ihnen zumindest mitteilen, dass ihr Code nicht unter einem Pufferüberlauf leiden darf .
Mansfield
4
Ich zweiter @FrustratedWithFormsDesigner. Ich bin ein Junior-Entwickler, und das einzige Mal, dass ich mich mit C befassen musste, waren ein paar Aufgaben in einer Klasse für CPU-Architektur. In der Zwischenzeit sehe ich mich bei C #, Java und Ruby als ziemlich OK an.
Kevin - Reinstate Monica
4
Und enthält das Testframework einen Test, der einen Pufferüberlauf verursacht?
FrustratedWithFormsDesigner
44
Ich kann nicht sagen, dass Sie etwas falsch machen, aber nachdem ich in den letzten Jahren Dutzende von CS-Absolventen der großen Hochschulen befragt habe, habe ich festgestellt, dass die meisten keine Vorstellung davon haben, was unter "Produktionsqualitätscode" zu verstehen ist. Ich glaube nicht, dass es den meisten CS-Lehrern wichtig ist, Code für andere zu schreiben.
Jim In Texas

Antworten:

109

Ich denke nicht, dass Sie die Messlatte zu hoch gesetzt haben, ich denke, Sie brauchen vielleicht eine andere Messlatte.

Ich denke, Code-Tests sind nützlich, um die Kompetenz eines Kandidaten zu bestimmen, aber sie sollten nicht bestanden / nicht bestanden werden. Sie sollten die Ergebnisse des Codetests verwenden, um einen Dialog mit dem Kandidaten zu starten.

Wenn Sie Fehler sehen, die sie gemacht haben (insbesondere wenn sie Junior-Entwickler sind), machen Sie sie darauf aufmerksam und fragen Sie sie, was sie anders machen würden oder ob sie verstehen, warum es ein Problem gibt.

Tombatron
quelle
1
+1 das ist wahr, und es ist ein guter Vorschlag. Tatsächlich haben wir die Kandidaten gebeten, ihren Code auf Fehler zu überprüfen, was ihnen ausreichend Zeit ließ, aber sie kamen mit den falschen Korrekturen zurück, was in einigen Fällen den Code verschlimmerte, ohne die Fehler zu beheben, die die Überläufe verursachten an erster Stelle.
Brice
15
@brice Eine solide Demonstration, dass es sich tatsächlich um Junior-Entwickler handelt. Das Vermeiden von scheinbar offensichtlichen Fehlern hängt mit Übung und Erfahrung zusammen.
Tombatron
34
@brice: Er sagte, er solle die spezifischen Fehler mit ihnen besprechen. Sagen Sie nicht, dass Fehler aufgetreten sind, und bitten Sie sie, sich an Sie zu wenden. Besprechen Sie die Fehler in Echtzeit - geben Sie ihnen einen Hinweis (Zeilennummer oder vielleicht eine Beschreibung und Funktion und bitten Sie sie, die Zeilennummer anzugeben) und fragen Sie dann, wie dies hätte verhindert werden können. Das Ziel ist nicht fehlerfreier Testcode, sondern ein gutes Verständnis der Stärken und Schwächen des Bewerbers.
Jmoreno
6
Wenn der Junior-Entwickler das Problem sehen konnte, hätte er das Problem behoben. Wenn ich es wäre, würde ich ihre Fähigkeit testen, mit Ihnen zu arbeiten. Sagen Sie ihnen, was das Problem ist und wo es zu finden ist, und behandeln Sie sie genauso, wie Sie es Ihren tatsächlichen Kollegen geben würden, und sehen Sie, wie sie reagieren. Wenn es eine lästige Aufgabe ist, mit ihnen zu arbeiten, sind sie für die Position nicht geeignet. Wenn die Arbeit mit ihnen ein Vergnügen ist, dann stellen Sie sie ein.
zzzzBov
67

Ich denke, die Juniorenqualifikation macht hier den Unterschied. Jugendliche sollten nicht auf Kompetenz, sondern auf Lernfähigkeit, Neugierde, Leidenschaft, Ethik und auf jeden Fall Demut geprüft werden. Die Annahme mit einem Junior sollte sein, dass sie nicht kompetent sind , es ist Ihre Aufgabe als Senior, sie so zu machen.

Offensichtlich sollten sie in der Lage sein, grundlegenden Code wie Fizzbuzz zu schreiben und über allgemeine Kenntnisse der Konzepte zu verfügen. wenn man es ihnen aufgezeigt und sie wußte nicht einmal, was ein Pufferüberlauf war, dann würde ich sagen , es ist ein no go, aber ich erwarte nicht , ein Junior ohne einen Fehler von mehr als 5 Zeilen Code zu schreiben.

Der Tag, an dem Sie der Kompetenz Ihres Nachwuchses vertrauen, ist der Tag, an dem Sie befragt werden sollten. Nachwuchskräfte sollten mit viel Mentoring und einer Portion "Vertrauen, aber Verifizieren" behandelt werden. Ich war einmal Junior, und allen, die damals dort waren: Es tut mir leid. Erinnerst du dich an die schrecklichen Dinge, die du als Junior getan hast? (Bitte sag mir nicht, dass es nur ich war; du gibst mir einen Komplex ..)

Jimmy Hoffa
quelle
1
Ich bin offiziell immer noch ein "Junior Software Engineer" mit 2 Jahren Erfahrung! Ich habe weder einen CS- noch einen SW-Hintergrund (Physik). Ich würde nicht bereitwillig Code einreichen, der bei Eingaben fehlerhaft ist, oder wenn ich eingestellt wurde.
Brice
31
Korrektur, würden Sie nicht wissentlich Code einreichen, der auf jeder Eingabe segfaults. Wenn Sie nur behauptet haben, dass Sie niemals Bugs schreiben, dann tut es Ihnen leid, John Carmack zu stören.
Jimmy Hoffa
Harg! Rückenpedal! Das ist sicherlich nicht die Behauptung, die ich mache. Ich habe Buggy-Code veröffentlicht, einige schlimmer als andere. Aber keine, die wie das erste Beispiel dafür aussah, was nicht zu tun ist, wenn Sie nach "Pufferüberlauf"
googeln
Wir stellen sogar ein Test-Framework für den Code zur Verfügung, einschließlich Tests, die den Überlauf ausgelöst haben!
Brice
@brice Als Sie sagten, Sie hätten ein Testframework bereitgestellt, haben Sie ein Tool wie valgrind zum Testen auf Speicherprobleme bereitgestellt?
BЈовић
15

Ich sehe hier ein paar Probleme.

Die erste ist die Annahme, dass ein durchschnittlicher Absolvent der Informatik alles weiß. Sie tun es nicht. Ehrlich gesagt bin ich angenehm überrascht, wenn ich einen Absolventen der Informatik sehe, der weiß, wie man Visual Studio installiert und einrichtet . Ich habe vor kurzem mit einem Mann zusammengearbeitet, der behauptet, mehr als fünf Jahre Erfahrung mit dem Schreiben von .NET- Code auf dem Microsoft-Stack zu haben , ohne herauszufinden, was TFS ist oder wie man eine Verbindung herstellt.

Der zweite ist Ihr sehr begrenzter Pool. Wir lassen auch Kandidaten einen Programmiertest machen. Es gibt fünf separate "Programme", die sie schreiben müssen. Sie machen es zu Hause und versenden den Code. Die Tests sind äußerst einfach (keine Datenbank, keine externen Abhängigkeiten) und können problemlos mit der Express-Version von Visual Studio durchgeführt werden. Die Tests selbst werden von einem erfahrenen Mann in ca. 30 Minuten erledigt. Beachten Sie, dass wir diese in der Regel nur für Absolventen mit einer nachweisbaren Berufserfahrung von bis zu drei Jahren durchführen.

Was wir quantifiziert haben, ist, dass ungefähr 70% derjenigen, die den Test erhalten, einfach nie zu uns zurückkehren. Ungefähr 15% liefern Sachen, die normalerweise aufgrund von offensichtlichen Syntaxfehlern (z. B. fehlende ;) nicht kompiliert werden können . Weitere 10% werden kompiliert, führen jedoch die erforderlichen Aktionen nicht aus.

Das sind satte 5%. Zu diesem Zeitpunkt berücksichtigen wir nicht einmal Bedingungen wie die Eingabe eines Buchstaben als Eingabe, wenn eine numerische Eingabe erforderlich ist. Bei einer sehr begrenzten Menge von X als Eingabe führt die Anwendung lediglich die entsprechende Ausgabe aus. Auch diese Zahlen stammen von ungefähr 500 Kandidaten in den letzten vier Jahren: Wir haben Statistiken geführt, weil wir es wissen wollten.

Wenn wir uns mehr mit der Codestruktur und den defensiven Codierungstechniken befassen würden, wie z. B. die ordnungsgemäße Entsorgung nicht verwalteter Ressourcen oder die Verwendung von try .. catchAnweisungen, würde fast niemand passen.

Die Frage ist natürlich, warum?

Warum kann ein Kind mit einem Abschluss in diesem Bereich von einer vierjährigen Universität keine einfachen Programmieraufgaben erfüllen? Die Antwort ist, dass die Hochschulen nicht mit den Geschäftsanforderungen vertraut sind und viele Jahre hinter dem zurückbleiben, was wir als Stand der Technik betrachten. Vor 10 Jahren waren die Codierungsstandards so, dass die Sicherheit etwas war, was Sie nachträglich getan haben. und Unit-Tests waren noch nicht einmal in Mode. Während heutzutage die Sicherheit bei jeder Funktion oder Verbesserung im Vordergrund steht. Denken Sie daran: Die meisten Professoren haben entweder noch nie auf diesem Gebiet gearbeitet oder schon lange nicht mehr. Sobald Sie das wissen, beginnen Sie zu verstehen, warum sie so weit zurückliegen. Schlimmer noch, einige dieser Professoren verbringen zu viel Zeit mit einer bestimmten Technologie ( Java , PHP, was auch immer) und nicht ernsthafte grundlegende Probleme wie die Codestruktur oder akzeptable Ansätze (und WARUM!) zu diskutieren.

Nur ein Nebenbeispiel. Ein Absolvent erzählte mir von einigen seiner Erfahrungen beim Schreiben eines mobilen Betriebssystems für eine seiner Klassen, aber er konnte nicht einmal grundlegend erklären, wie ein Webserver funktionierte. Er wusste es einfach nicht. Vor 15 oder 20 Jahren war wahrscheinlich der richtige Zeitpunkt, um zu verstehen, wie man ein Betriebssystem erstellt. Heute ... nicht so sehr. Dies war jedoch eine Pflichtklasse, wenn eine Klasse für defensives Programmieren für sie UND die Außenwelt so viel nützlicher wäre.

Also, was machen wir?

Von diesen 5% werden wir ein bisschen weiter interviewen, um eine Vorstellung von ihrer Persönlichkeit und ihrer Passform zu bekommen. Dann wählen wir die "besten" aus, die wir in vollem Wissen rund sechs Monate lang "umprogrammieren" werden, um den Mist loszuwerden, mit dem ihre Professoren sie gefüllt haben.

Nicht ich
quelle
2
Ich stimme voll und ganz zu, ich habe in meinen zweieinhalb Jahren in der Branche mehr gelernt, als ich je auf dem College gelernt habe. Das habe ich schmerzhaft gelernt, nachdem ich in der Schule mein erstes Praktikum als Webentwickler absolviert hatte.
Ryan
5
Jetzt möchte ich Ihren Programmiertest ausprobieren.
Akash
1
"Ja wirklich?" Erleben Sie die Installation bestimmter Software-Komponenten und die Fähigkeit, eine vereinfachte Version der Funktionen eines Webservers bereitzustellen, nach der Sie suchen? Wenn jemand mit dem Schreiben eines mobilen Betriebssystems umgehen kann, kann er lernen, wie Webserver funktionieren.
Michael Shaw
@MichaelShaw: Wenn jemand ein Betriebssystem schreibt, dem jedoch die Grundfunktionen des gängigsten Servertyps noch nicht beigebracht wurden, zeigt dies, dass seine Schule große (und äußerst relevante) Bereiche seiner Ausbildung übersprungen hat. Die Frage wird dann, was sonst noch übersprungen wurde?
NotMe
2
@ ChrisLively: Ich verstehe nicht, wie eines dieser Probleme ein großes Problem ist. Es ist nicht so, als hätten wir ein winziges Feld, das sich langsam bewegt. Lernen am Arbeitsplatz wird passieren. Ich denke, dass Sie hier einen im Wesentlichen guten Punkt haben, aber die Beispiele überzeugen nicht. Wenn es ein Problem mit dem CS-Lehrplan gibt, können Sie es nicht beheben, indem Sie "Wie installiere ich Visual Studio 101?" Und "Grundlagen von Webservern 101?" Hinzufügen. (Ich mag die Idee einer "Defensive Programming" -Klasse.)
Michael Shaw
5

Ich denke, Sie sehen das Problem falsch. Was Sie sich fragen sollten, ist Folgendes: Was benötigen wir von einem Kandidaten, damit er die Arbeit erledigen kann? Sie sollten die Position und ihre Folgen richtig einschätzen. Im Folgenden finden Sie einige Vorschläge, wann Sie einen Junior-Entwickler einstellen sollten und wann nicht.

Wann sollte ein Junior-Entwickler eingestellt werden? - Wenn ein Überangebot an einfacher Arbeit besteht, wäre dies eine Zeitverschwendung für einen Senior-Entwickler. - Wenn Sie bereit sind, diese Person in den nächsten Jahren zu betreuen und auszubilden. - Wenn Sie versuchen, das Unternehmen zu vergrößern und jemanden suchen, der für eine lange Zeit bleibt. Ein Junior-Entwickler, der nur ein Jahr bleibt, wäre eine Verschwendung von Unternehmensressourcen, er würde wenig tun, um etwas zu produzieren, und die meisten Ergebnisse würden in seinem eigenen persönlichen Wachstum liegen. - Wenn Sie Lust haben, Geld für das Wachstum einer Person auszugeben. Seitdem werden die meisten Vorteile das sein, was sie lernen.

Wann sollte man keinen Junior-Entwickler einstellen? - Wenn die Arbeit zu kompliziert ist. In diesem Fall ist es einfach nicht in der Liga. - Wenn Sie Geld sparen wollen. Ein leitender Entwickler sollte die gleichen Aufgaben in einem Bruchteil der Zeit mit besseren Ergebnissen erledigen und daher immer billiger sein. - Wenn die Arbeit ausgelagert werden kann oder nicht ausreicht, um einen Mitarbeiter zu beschäftigen. In solchen Fällen ist es besser, einen Teil der Arbeit einem privaten Auftragnehmer zu überlassen.

Ein letzter wichtiger Punkt. Stellen Sie keine Nachwuchsentwickler ein, weil "das ist alles, was wir uns leisten können" oder "das ist alles, was wir bereit sind auszugeben", wenn sie nicht für den Job geeignet sind. Am Ende müssen Sie nur noch Geld in die Toilette spülen. Außerdem werden sie, sobald sie diese Fähigkeiten erworben haben, sowieso das große Geld verlangen.

Über mich:

  • Abschluss in Physik mit fast keiner formalen Ausbildung.
  • Zwei Jahre Berufserfahrung. Ich weiß also, worum es beim Lernprozess geht.
  • Starten Sie den Softwareentwickler. Ich habe sehr anspruchsvolle Arbeit geleistet und alle unterschiedlichen Fähigkeitsstufen von verschiedenen Personen gesehen. Viele von ihnen können nicht viel damit anfangen, was ich tue.
Matthew Ouellette
quelle
4

Wie bereits erwähnt, haben Nachwuchskräfte möglicherweise nur wenig Erfahrung mit C. Ich persönlich wurde nur kurz über Pufferüberläufe in C unterrichtet, und selbst wenn ich auf sie aufpassen könnte, würde ich wahrscheinlich noch einige vorstellen (insbesondere, wenn ich einen Auftrag erhalten würde, der mir etwas verleiht) sich auf Pufferüberläufe zu schaffen). Wahrscheinlich sind viele Nachwuchsentwickler mit einer ähnlichen Situation konfrontiert, in der sie möglicherweise von Pufferüberläufen Kenntnis haben, jedoch nicht darauf vorbereitet waren, diese in umfassender Weise zu identifizieren und zu behandeln.

In Anbetracht dessen würde ich denken, dass die angemessene Antwort darin besteht, das Problem in der nächsten möglichen Interaktion zur Sprache zu bringen und sie zu fragen, was sie über Pufferüberläufe wissen, um ihr Gesamtwissen zu testen. Danach teilen Sie ihnen mit, dass Sie einen in ihrem vermeintlichen Seriencode gefunden haben. Dies gibt Ihnen ein gutes Fenster, um zu beurteilen, wie sie auf Korrekturen und Anweisungen reagieren würden.

Ist nicht der allgemeine Gedanke, dass ein Nachwuchsentwickler, der weniger weiß, aber willens und fähig ist, zu lernen und sich zu verbessern, wertvoller als ein Nachwuchsentwickler, der mehr weiß, sich aber nicht verbessern kann oder wird?

Abgesehen davon haben Sie in einem Ihrer Kommentare Tests übergeben, die auf den Pufferüberlauf in ihrem Code hingewiesen hätten, wenn sie diese verwendet hätten. Die größere Frage ist also vielleicht, warum sie die Tests nicht durchgeführt haben (oder warum sie Buggy-Code eingereicht haben).

Lawtonfogle
quelle
3

Ein Pufferüberlauf ist ein absolutes No-Go. Sie könnten eine entsprechende Code-Frage haben. In einem Fall, in dem alles falsch ist (was schief gehen kann), sollte der Kandidat in der Lage sein, das Problem genau zu bestimmen. Die Frage ist, ob das Problem irrelevant ist, da Sie sowieso Clint ausführen.

In einem künstlichen Freiform-Code-Test wäre ich jedoch bei einer Verletzung wie Sprintf mild. Zu wenig Zeit (vorausgesetzt), Gedanken hyperaktiv, zu großer Drang, etwas Funktionierendes zu präsentieren.

Joop Eggen
quelle
10
Ich habe fast genau dieselbe Antwort geschrieben, bis ich bemerkte, dass er sich auf einen "Junior" bezieht. Denken Sie daran. Ich habe einige scharfe Junioren gesehen, aber selbst wenn sie dumme Dinge tun, ohne es zu merken, kann ein Großteil des Software-Engineerings nur gelehrt werden aus Erfahrung
Jimmy Hoffa
@JimmyHoffa ja gerade die erste zeile von dir gelesen, mein "absolutes no-go" korrigiert. Ihr Punkt ist eine Überlegung wert. Bis jetzt konnte ich jeden Programmierer benutzen und schätzen, aber einen psychischen Fall und einen "Lügner".
Joop Eggen
@JoopEggen: Ich bin mir ziemlich sicher, dass "Hellseher" nicht das gesuchte Wort war. Sonst hätten sie deine Gedanken lesen können ...;)
NotMe
2

Ich denke, Sie stellen die falsche Frage. Es gibt keine objektive Barriere, um ein professioneller Programmierer zu sein. Wenn ja, gäbe es eine Standard-Programmierprüfung, aber keine. Ihre individuelle Messlatte muss nur danach festgelegt werden, wie wählerisch Sie es sich leisten können, wie viel Sie sich leisten können, wie viel Fehler Ihre Software zu akzeptieren vermag und wie viel Zeit Sie sich leisten können, um zu unterrichten.

In diesem Fall schätze ich, dass ein Pufferüberlauf wahrscheinlich bedeutet, dass dieser Code, den der Kandidat als Beispiel für eine beispielhafte Arbeit präsentiert hat, mit einem Segmentierungsfehler abstürzt, anstatt das zu tun, was Sie gefragt haben. Sollten Sie also einen Codierer akzeptieren, der Code schreibt, der mit einem Segmentierungsfehler abstürzt, anstatt das zu tun, wonach Sie gefragt haben? Fragen:

  • Ist Ihre Organisation in der Lage, alle anzuziehen, die Arbeitscode schreiben können ?

  • Ist Ihr Entwicklungsprozess robust genug, dass jemand, der fast Code schreiben kann, mithilfe von Peer-Review und Testunterstützung Arbeitscode schreiben kann?

  • Sind Sie in der Lage, Programmierern beizubringen, wie man ein Programmierer ist, und sind Sie bereit, diese Anstrengung aufzuwenden und vielleicht ein paar Jahre zu warten und zu hoffen, dass das innere Talent des Kandidaten zum Tragen kommt?

Christopher Martin
quelle