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 .
quelle
Antworten:
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.
quelle
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 ..)
quelle
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 .. catch
Anweisungen, 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.
quelle
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:
quelle
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).
quelle
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.
quelle
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?
quelle