Ursprüngliche Frage
Ich habe bereits einige Interviews für mein Unternehmen geführt, hauptsächlich Informatiker für Entwicklerpositionen, aber auch einige Tester und Projektmanager. Jetzt muss ich eine Stelle in unserer Forschungsgruppe innerhalb der F & E-Abteilung besetzen (Randnotiz: "Forschung" bedeutet, dass wir versuchen, Probleme in unserem Berufsfeld / Marktnische mithilfe von Software in Forschungsprojekten zusammen mit Universitäten, anderen Unternehmen, Forschungszentren zu lösen und Endbenutzerorganisationen. Es ist keine Informatikforschung, wir werden das P = NP-Problem nicht lösen.
Jetzt haben wir jemanden eingeladen, der einen MSc in Chemie hat (mit viel Physik auch in seinem Lebenslauf), der nie Informatikunterricht hatte. Ich habe bereits eine halbe Stunde an den Karrieretagen einer Universität mit ihm gesprochen und es besteht kein Zweifel, dass der Typ schlau ist. Auch seine Noten sind ausgezeichnet und er schloss mit Auszeichnung ab. Für seinen BSc musste er sich in Mathematica selbst Programmieren beibringen und sagte mir glaubhaft, dass er gerne programmiere. Außerdem hat er ein physikalisch-chemisches Problem gelöst, das ich mit seiner in Mathematica implementierten Software für seine Masterarbeit wahrscheinlich nicht verstehe. Es enthält eine grafische Benutzeroberfläche und eine bemerkenswerte Größe von 8.000 LoC. Er scheint sehr angetan von dem, was wir in unserer Forschungsgruppe tun, und ehrlich gesagt ist es für ein KMU wie uns ziemlich schwierig, gute Leute zu finden. Ich bin auch sehr daran interessiert, ihn einzustellen, da er mir beim Verfassen von Projektvorschlägen, Berichten, Präsentationen usw. behilflich sein könnte. Er würde wahrscheinlich auch in unser Team passen.
Die einzige Frage, die noch offen ist, lautet: Wie kann ich prüfen, ob er die Programmierkenntnisse hat, die er für die Implementierung von Software in unseren Projekten benötigt, da dies ein wichtiger Teil der Arbeit sein wird?
Natürlich werde ich ihn fragen, was ihn am Programmieren fasziniert. Ich werde auch fragen, wie er seine naturwissenschaftliche Software geschrieben und wie er sie strukturiert hat. Ich werde fragen, wie er es geschafft hat, die Fähigkeiten und Informationen über die Softwareentwicklung zu erhalten, die er brauchte. Aber gibt es noch etwas, was ich fragen könnte? Etwas konkreteres vielleicht? Soll ich ihn bitten, seine Mathematica-Lösung zu erklären?
Um es klar auszudrücken: Ich suche kein Wissen in einer bestimmten Sprache oder Technologie. Wir sind ein .NET-Shop in der Produktentwicklung, aber ich möchte eine freie Wahl für unsere Forschungsprojekte haben. Ich bin also daran interessiert, dass die Metakompetenz alles lernen kann, was tatsächlich benötigt wird.
Ich hoffe , diese Frage beantwortbar ist und nicht mit offenem Ende , da ich wie wirklich wissen , ob es eine Standardmethode ist für die Fähigkeit zu überprüfen , um zu bekommen , weitere Programmierkenntnisse am Arbeitsplatz. Wenn Ihnen etwas nicht klar ist, geben Sie mir bitte einige Kommentare und lassen Sie mich meine Frage verbessern.
Aktualisieren Sie, um die bis zum 01.12.2011 gegebenen Antworten wiederzugeben
Welche Antwort habe ich akzeptiert und warum
Ich danke Ihnen allen für Ihre Antworten, die meisten von ihnen sind sehr hilfreich, deshalb habe ich viel dafür gestimmt! Obwohl die Antwort von Tom Squires die meisten Stimmen erhielt, werde ich die Antwort von Prinz Gulasch akzeptieren . Natürlich ist Tom objektiv korrekt, aber die Antwort von Prince ist nur hilfreicher für mich und ich habe die FAQ zweimal überprüft, dass dies das Kriterium ist, um eine Antwort zu akzeptieren.
Was ich ihn während des Interviews fragen werde
Ich werde ihn einige einfache Aufgaben erklären lassen, wie das Beispiel in Das Kamel hat zwei Höcker, das von Chris Burt-Brown erwähnt wurde
Ich werde ihn bitten, einige erweiterte Kontrollabläufe zu erläutern, möglicherweise in grafischer Notation.
Ich werde sein Verständnis der Rekursion anhand eines mathematischen Beispiels überprüfen.
Ich werde ihn einen Algorithmus seiner Wahl in natürlicher Sprache erklären lassen.
Ich werde ihn seine Mathematica-Lösung erläutern lassen, insbesondere sein Vorgehensmodell, die Verwendung von Werkzeugen, die Strukturierung von Code und Software im Allgemeinen sowie verschiedene Abstraktionsebenen.
Um seine Motivation zu überprüfen, werde ich nach seiner Faszination für Softwareentwicklung fragen.
Ich werde ihn fragen, ob er weiß, was er über die Entwicklung von Unternehmenssoftware lernen muss. Insbesondere möchte ich die Diskussion in die Richtung lenken, in Teams, Pair Programming und TDD zu arbeiten, da ich erwarte, dass er nach der Arbeit an seinem MSc alleine nicht viel darüber weiß.
Klingt nach einem langen Interview;)
Update nach dem Interview 09.12.2011
Nochmals vielen Dank für Ihre guten Antworten. Er bestand das Interview mit Bravour. Mit einem Bewerber war ich nie zufriedener. Seine Mathematica-Lösung scheint recht gut strukturiert zu sein. Er konnte erklären, wo er Funktionen höherer Ordnung verwendete, obwohl er nicht wusste, dass diese so bezeichnet werden. Er beantwortete meine mathematischen Fragen zu Rekursionen sowie einfache Aufgaben und Kontrollabläufe in The Camel Has Two Humps. Als er einige Algorithmen erklärte, lernte ich viel über nichtlineare Anpassung;) Außerdem sagte er ehrlich, dass er natürlich nicht garantieren kann, dass er in der Lage sein wird, Dinge über professionelle Softwareentwicklung zu lernen, die er bisher nicht kennt. Aber er ist davon überzeugt, dass er immer gut darin war, neue Konzepte zu lernen - auch von sich aus - und sich wirklich für Softwareentwicklung interessiert. Er fragte auch nach dem Technologie-Stack des Projekts, auf den er sich zuerst beziehen würde, um es sich zu Hause anzusehen. Er war auch neugierig auf Paarprogrammierung und Teamarbeit. Jetzt hoffe ich, dass der Arbeitsvertrag geschlossen wird.
Antworten:
Ich bin hier sehr verärgert, weil ich vor ein paar Jahren als Softwareentwickler mit einem Doktortitel in Physik angefangen habe, aber mit sehr wenig Erfahrung im Programmieren (was einem Grundstudium in Fortran entspricht). Das hängt natürlich von der Art der Software ab, die Sie entwickeln, aber meiner Ansicht nach sind Codierfähigkeiten für jeden mit halbwegs guten Kenntnissen in Wissenschaft und Problemlösung sehr einfach zu erlernen. Ich beabsichtige das nicht als Beleidigung für lebenslange Programmierer, die Informatik studiert haben: Natürlich gibt es technische Aspekte, für deren Beherrschung eine ernsthafte Schulung erforderlich ist (z. B. Multithreading und Architektur auf sehr niedriger Ebene), aber ich gehe davon aus, dass dies der Fall ist nicht die Position, die Sie zu besetzen versuchen.
Für mein technisches Interview für meine aktuelle Position wurde ich mit einem ziemlich komplexen mathematischen Problem konfrontiert und gebeten, ein Programm zu entwerfen, um es zu lösen. Der Schwerpunkt lag auf dem Schreiben eines Algorithmus, der nach seiner Implementierung das Problem lösen würde. Ich konnte eine Antwort nur mit Worten schreiben, um meine Lösung zu beschreiben, aber ich durfte Code in einer Sprache meiner Wahl schreiben, wenn ich dies wünschte. Bei dem Test ging es mehr um die Fähigkeit zur Problemlösung und darum, ob ich in der Lage war, "wie ein Programmierer zu denken". Wenn es Kandidaten mit den gleichen Fähigkeiten gäbe und einer direktere Programmiererfahrung hätte, hätte er sich natürlich durchgesetzt, aber das scheint mir fair genug zu sein.
Das Fazit lautet: Untersuchen Sie den Kandidaten auf die Fähigkeiten, für die Sie ihn einstellen, und nicht auf Ideale, die er hoffentlich erreichen wird.
quelle
Das kannst du nicht . Es ist unmöglich, eine Fähigkeit, die er noch nicht besitzt, genau zu testen. Sie müssen ein Urteil aufgrund seiner Intelligenz und Einstellung fällen. Es wird letztendlich immer ein Risiko sein.
Aus persönlicher Erfahrung kann ich sagen, dass es sehr gut möglich ist, von der Wissenschaft zur Programmierung überzugehen. Sie beide laufen im Grunde darauf hinaus, Ihr Gehirn zum Lösen komplexer Rätsel zu verwenden.
quelle
Ich habe keine sekundären Quellen, die dieses Papier bestätigen, daher kann ich nicht dafür bürgen, aber:
Das Kamel hat zwei Buckel
http://www.eis.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf
quelle
Wie kann ich prüfen, ob er die Programmierkenntnisse hat, die er benötigt?
Es ist sehr einfach. Gib ihm die Fähigkeiten.
Nun, das ist keine sehr befriedigende Antwort, aber lassen Sie mich näher darauf eingehen.
Ich bin nach 3 Jahren im Bauingenieurwesen zum Programmieren gekommen. Das ist ein ziemlich solider Hintergrund in angewandter Physik und Mathematik. Es ist nicht die theoretische Mathematik, die ein CS-Abschluss geben würde, aber es ist etwas wert. Was ich aus den technischen Erfahrungen gezogen habe, war ein solider Hintergrund für die Problemlösung . Wer einen mathematischen Hintergrund hat, weiß das Konzept der Eleganz bereits zu schätzen, wenn er über eine Lösung für ein Problem spricht. Sie haben bereits eine Ausbildung in Refactoring, da sie sechs Seiten Hühnerkratzer genommen und in einen eleganten halbseitigen Proof für die Einreichung umgewandelt haben.
Jeder, der Physik studiert hat, hat einen intuitiven Ansatz entwickelt, um eine Lösung aus den Grundgerüsten zusammenzusetzen.
Und was ist Programmieren außerhalb dieser Fähigkeiten? - Sprache, Ausdrucksweise, Muster und Rahmenbedingungen. Diese sind leicht zu unterrichten. Es ist eine Problemlösung, die Sie nicht können. Wenn Sie in diesen Bereichen Anweisungen geben können, haben Sie einen guten Entwickler.
Die Frage lautet dann: "Wie lange kannst du warten, bis er auf Touren gekommen ist?"
tl; dr; Sie können das Schreiben unterrichten. Sie können nicht klug unterrichten.
quelle
Ich habe einen BSc in Materialwissenschaften, habe aber meine ganze Karriere in der Softwareentwicklung verbracht.
Ich würde vorschlagen, dass Ihr Kandidat wahrscheinlich keine Probleme mit der Grundprogrammierung und den Algorithmen hat, aber wenn es um die eher "technischen" Anforderungen geht, braucht er möglicherweise eine Anleitung. Damit meine ich, seinen Code gut zu strukturieren, keine 500 Zeilenfunktionen zu haben, effektiv zu testen, auf Effizienz zu entwerfen ...
Das meiste davon kann unterrichtet werden, aber Sie können einige Fragen entwerfen, um dies herauszufinden.
quelle
Klingt für mich so, als wüsste der Kandidat bereits, wie man programmiert, vorausgesetzt, er hat möglicherweise nicht so viel Erfahrung wie ein engagierter Entwickler, aber er hat ein nachweisbares Projekt abgeschlossen, für das ein nicht unbedeutender Arbeitsaufwand erforderlich ist. Daher können Sie den Kandidaten möglicherweise auf dieselbe Weise interviewen wie einen Entwickler, der eine andere Sprache als die von Ihnen verwendete verwendet:
Die Sprache, die Mathematica verwendet, ist ziemlich fortgeschritten, und jemand, der gut in der Erstellung von Software für Mathematica ist, sollte in anderen Bereichen ziemlich kompetent sein. Wenn Sie sich also auf diese Erfahrung konzentrieren und diese als Grundlage für die Codierungserfahrung verwenden, ist dies eine gute Möglichkeit, sich dem Interview zu nähern.
quelle
Als diplomierter Programmierer für Luft- und Raumfahrttechnik ist es sicherlich möglich, den Sprung von den Naturwissenschaften zur Programmierung zu wagen. Seien Sie jedoch gewarnt, dass die Fähigkeit, Probleme zu lösen, nicht immer mit der Fähigkeit korreliert, Code zu schreiben. Du scheinst dies zu erkennen und das ist eine gute Sache.
Für mich sind die wichtigsten Konzepte, um sicherzustellen, dass er die Kontrolle über den Fluss hat und Rekursion (und das Schleifen im Allgemeinen als Teilmenge davon). Vor der Einstellung eines Kandidaten muss auch jemand, der eindeutig sehr intelligent ist, sicher sein, dass er einen Algorithmus mit einfachen Worten schreiben kann, um Probleme zu lösen. Stellen Sie sicher, dass er diesen Klartext-Algorithmus verwenden und ihn zumindest in Pseudocode umwandeln kann. Sie können sogar prüfen, ob er das Konzept des Polymorphismus zumindest verstehen kann, obwohl ich nicht sicher bin, ob dies unter diesen Umständen das erforderliche Wissen ist.
Beachten Sie auch die Fähigkeit, wissenschaftliche Probleme in Mathematica / MatLab / Whatever zu lösen, was nicht bedeutet, dass er guten Code schreiben kann. Es bedeutet lediglich, dass er in der Lage ist, grundlegende (manchmal extrem grundlegende) Programmierprinzipien anzuwenden, normalerweise if / else-Anweisungen. Wenn Sie lernen, ein guter Programmierer zu sein, ist dies in der Regel eine persönliche und arbeitgeberbezogene Verpflichtung. Warnung: Ich habe sehr intelligente Leute getroffen, die gute Ingenieure waren / sind, die sich nicht aus einer Papiertüte heraus programmieren konnten und ehrlich gesagt die grundlegenden sprachlichen Grundlagen nicht verstehen konnten.
Persönliche Erfahrung
Ich habe die Schule mit einem Ingenieurabschluss und ein wenig Programmiererfahrung abgeschlossen. Ich hatte mit einer sehr kleinen Menge C gearbeitet, ziemlich viel MatLab und etwas VB + Access. Es dauerte ungefähr 3 Monate, bis ich als Programmierer in einem VB.NET-Shop wirklich nützlich war. Es dauerte weitere 9 Monate, bis ich mich voll auskannte. Mit einigem Vertrauen kann ich jedoch sagen, dass meine Fähigkeiten zur Problemlösung 99% derjenigen anderer Programmierer überlegen sind, die ich in meinem Job kennengelernt habe. Meine Arbeitgeber haben mich durchweg als eines ihrer wertvollsten Vermögenswerte angesehen.
Fazit
Es ist ein Risiko- / Gewinn-Vorschlag, aber oftmals zahlt es sich auf lange Sicht aus, jemanden mit reinen Problemlösungsfähigkeiten zu beschäftigen, solange er in der Lage ist, die Programmierkonzepte zu erlernen, und Sie beide bereit sind, die Zeit in die Erweiterung seines Programms zu investieren Wissen. Ich bin jedoch der festen Überzeugung, dass er zumindest ein grundlegendes Verständnis der Grundlagen der Programmierung besitzen muss, bevor Sie ihm einen Job anbieten. Nach meiner Erfahrung können Sie an diesem Punkt noch viel weiter gehen.
quelle
Ich würde mit einigen grundlegenden Algorithmusfragen und -grundlagen beginnen, um zu sehen, ob er mit der Logik von Algorithmen und Programmierung vertraut ist. Wenn er in der Lage ist zu verstehen, was ein Algorithmus ist, kann er schließlich die Fähigkeiten entwickeln, die erforderlich sind, um danach konkrete Dinge zu tun.
quelle
Ehrlich gesagt, ich bin mir ziemlich sicher, dass Sie diese Informationen nicht aus einem ein- oder zweistündigen Interview erhalten werden. Geben Sie ihm einen Programmierauftrag in C # (nicht zu technisch) und ein oder zwei Wochen, um ihn zu lösen. Das sollte genug Zeit sein, um die Grundlagen der Sprache für jemanden zu erlernen, der bereits Programmieren mit Mathematica gelernt hat. Machen Sie dann eine Codeüberprüfung mit ihm und entscheiden Sie sich für diese Basis.
quelle
Sie könnten sich Praktiken für das Programmieren in einem wissenschaftlichen Umfeld ansehen ? (auf Stack Overflow), um sich ein Bild von der Programmierkultur der Naturwissenschaften zu machen. Auf diese Weise sind Sie in der Lage, seine Vorbereitung mit der seiner Kollegen zu vergleichen.
In diesem Fall können Sie ihn bitten, die Programmierpraktiken zu beschreiben, die er gewohnt ist, um zu erfahren, ob er weiß, dass es andere Möglichkeiten gibt, dies zu tun .
Es gibt viele "gute Programmierer" in meinem Unternehmen, deren Qualifikation in der Lage ist, genügend Status im Kopf zu behalten, um einen Arbeitscode zusammenzufügen, deren Arbeit jedoch eher unstrukturiert und schwierig zu warten ist. Im Allgemeinen können sie unterrichtet werden, aber ... sie müssen unterrichtet werden.
quelle
Eine andere Abteilung, in der ich arbeite, verwendet eine Variation unseres Standardtests. Die erste Aufgabe besteht darin, die Wörter in einer Zeichenfolge umzukehren. Verwenden Sie dann diesen Code, um die Reihenfolge der Wörter in der Zeichenfolge umzukehren, die noch vorhanden sind. Anstatt eine Programmiersprache zu verwenden, lassen sie die Algorithmen von den Kandidaten auf Papier entwerfen und mit einem Scrabble-Board ausführen.
quelle
Ich würde darum bitten, einen Algorithmus zur Berechnung von etwas aus der Physik (in natürlicher Sprache) zu beschreiben. Etwas etwas komplizierter als eine einfache Formel und dann würde ich fragen, wie er seine Berechnung in Objekte eingekapselt sehen würde (keine OOP-Kenntnisse erforderlich, Sie könnten erklären, was Sie von einem Objekt erwarten). Auf diese Weise können Sie sein logisches Denken sehen. Dies ist wichtiger als alle Programmierkenntnisse.
quelle
Erstens sind sie wahrscheinlich ziemlich schlau, sodass sie im schlimmsten Fall lernen können, ein guter Programmierer mit Anleitung zu sein. Wenn Sie sie jedoch benötigen, um von Anfang an ein anständiger Programmierer zu sein, lassen Sie sie einen von ihnen geschriebenen Beispielcode einschicken.
Handelt es sich um eine oder zwei riesige Mehrzweckfunktionen, oder haben sie die Funktionalität auf den entsprechenden Abstraktionsebenen zusammengefasst? Sind magische Zahlen durchgehend fest codiert? Ist der Code TROCKEN? Haben sie Variablen sinnvolle Namen gegeben oder ist alles eine nicht entzifferbare Abkürzung oder eine Variable mit einem Buchstaben? Kannst du meistens der Logik ihres Codes folgen? Verstehen sie die OO-Grundlagen?
Fragen Sie, was sie für die Versionskontrolle verwenden (git / hg / svn / cvs / bzr usw.). Haben sie jemals Code profiliert oder einen Debugger verwendet, und wenn ja, welche oder wie lautet ihre generische Debugstrategie?
Wenn sie diesen Test nicht bestehen und Sie von Anfang an einen guten Codierer benötigen, überspringen Sie diese Person. Stellen Sie sie ansonsten ein und schlagen Sie vor, dass sie zusätzlich zu allgemeinen Programmier- / CS-Büchern einige Software-Entwicklungsbücher (z. B. Code Complete) lesen.
(Ich bin natürlich auch Physiker und Programmierer.)
quelle
Da er noch an einer Universität ist oder erst kürzlich seinen Abschluss gemacht hat, ist er an das Studium gewöhnt. Lassen Sie ihn das Design Patterns-Buch lesen und verstehen und diskutieren Sie nach (oder während) eines Monats gründlich mit ihm über die Themen. (Ich denke das.) Dies kann Ihnen viel über seine Fähigkeiten erzählen (nicht nur die (auch die), sondern auch darüber, wie er mit dem Erfassen neuer Konzepte, dem Verstehen ihrer Verwendung, dem Sehen von Vor- und Nachteilen usw. umgeht. Aber es kostet dich einen Monat Zeit.
quelle