Wie gehe ich mit verschiedenen Programmierstilen im Team um?

14

Wir haben ein kleines Entwicklerteam (nur 3 Entwickler) und vor kurzem ein neues Teammitglied. Obwohl er ein intelligenter Kodierer ist, unterscheidet sich sein Kodierungsstil völlig von unserem. Unsere vorhandene Codebasis enthält hauptsächlich lesbaren, sauberen und wartbaren Code, aber das neue Teammitglied ändert schnell viele Dateien, führt hässliche Hacks und Verknüpfungen ein, verwendet überall Definitionen und fügt Funktionen an den falschen Stellen hinzu usw.

Meine Frage ist, ob andere schon so etwas erlebt haben und ob jemand Tipps hat, wie man mit ihm spricht.

user3287
quelle
2
Erwogen, Peer Review zu verwenden, um die hässlichen Hacks und Shortcuts zu fangen, bevor sie das Repository erreichen?
Verwenden Sie gute, unvoreingenommene automatisierte Tools, wann immer Sie können.
Job
Codierungsstandards können heutzutage weitgehend automatisiert werden. Wenn Sie vor dem Einchecken der Datei festlegen, dass die Benutzer jede Quelldatei mit dem von Ihnen verwendeten Tool ausführen müssen, können Sie die meisten Verstöße gegen Codierungsstandards weitgehend verhindern. Ich denke, was die Werkzeuge nicht fangen werden, sind die Hacker mit wirklich hässlichen Praktiken, wie es sich für die neue Person des OP anhört. Scheint, als ob Codeüberprüfungen und das Zurückweisen unerwünschter Stile die einzige Möglichkeit sind, einen Hacker zu reparieren.
Eintauchen

Antworten:

22

Ich arbeite mit einem Team, das in weniger als einem Jahr von 2 Entwicklern auf 10 gewachsen ist. Ich war Nummer 3 und der erste, der ein Problem mit den Codierungsstandards ansprach. Die beiden ursprünglichen Entwickler hatten einige Jahre lang Seite an Seite gearbeitet und einen gemeinsamen Standard angenommen, der mir fremd vorkam. Wir hatten genau dieselben Probleme, die Sie beschreiben.

Was wir gemacht haben war:

Forschungscodierungsstandards

Wir haben ein paar Tage damit verbracht, etablierte Open-Source-Projekte auszuprobieren. Wir wussten, dass das Team schnell wachsen würde und wir suchten nach echten Lösungen, die auf echten Projekten basierten und nicht auf allgemeinen Richtlinien. Wir haben uns auch nicht um die optimalen Codierungsstandards gekümmert, sondern um eine Reihe von Regeln und Richtlinien, die sinnvoll sind und nicht das Refactoring unserer gesamten Codebasis erfordern. Wir haben nach einem Hack für Codierungsstandards gesucht, wenn Sie so wollen.

Wir drei entschieden, dass die besten Codierungsstandards für ein etabliertes PHP-Projekt die von Zend Framework befolgten sind. Glücklicherweise stellen die Zend Framework-Mitarbeiter ein sehr umfassendes Dokument mit Codierungsstandards zur Verfügung .

Erstellen eigener Codierungsstandards

Natürlich hat es keinen Sinn ergeben, die Codierungsstandards eines anderen Projekts auf unser Projekt anzuwenden. Wir verwenden das Zend Framework Dokument als Vorlage:

  • Zuerst haben wir alles entfernt, was für unser Projekt nicht zutraf
  • Dann haben wir alles, was wir als eine Frage des Stils wahrgenommen haben, in unseren Stil geändert
  • Und zum Schluss haben wir alles aufgeschrieben

Wir hatten also ein ziemlich großes Dokument zur Hand, das in unserem schicken Wiki gespeichert war. Es war eine nette Lektüre, der wir uns alle einig waren. Und für sich genommen völlig nutzlos.

Bleiben Sie unserem Versprechen treu

Unsere Codebasis war zu dieser Zeit ungefähr 1 * 10 ^ 6 sloc. Wir wussten, dass wir, seit wir formale Codierungsstandards verabschiedet hatten, damit beginnen mussten, unseren Code umzugestalten, aber zu der Zeit waren wir mit anderen Problemen konfrontiert. Deshalb haben wir uns entschlossen, nur unsere Kernbibliotheken umzugestalten, nur 5 * 10 ^ 3 sloc.

Wir haben einen von uns zum Kodierungsstandard-Master ernannt (wir haben anstelle des Masters lokale Profanität verwendet ), der für die Überprüfung und Durchsetzung der Standards verantwortlich ist. Wir recyceln die Rolle alle paar Sprints. Ich war der Erste und es war eine Menge Arbeit, da ich fast jedes Commit überwachen musste.

Während meiner Amtszeit hatten wir einige neue Diskussionen und kleine Ergänzungen zum Originaldokument, und schließlich hatten wir ein etwas stabiles Dokument. Wir ändern es von Zeit zu Zeit, aber die meisten dieser Änderungen betreffen neue Funktionen der Sprache, da PHP 5.3 bis auf den Namen eine Hauptversion war.

Umgang mit dem Neuen

Als der nächste Neuzugang kam, war es an der Zeit, unsere Codierungsstandards auf den Prüfstand zu stellen. Nach einer kleinen Einführung in unsere Codebasis haben wir ihn gebeten, unser Codierungsstandards-Dokument zu bewerten. Er hätte fast geweint. Es schien, dass er alles anders machte.

Da ich zu dieser Zeit der Meister der Kodierungsstandards war, war es an mir, seine Eingaben zu bewerten und das Dokument entsprechend zu überarbeiten. Seine Vorschläge waren:

  • Fragen des persönlichen Stils (kurzerhand abgewiesen)
  • Standards, die für seinen Java-Hintergrund Sinn machten, aber mit PHP nicht so viel (verworfen)
  • Konventionen, die er aus seiner kurzen Erfahrung mit PHP mitbrachte (einige wurden abgewiesen, aber viele erwiesen sich als beliebte Konventionen, an die wir in unseren ersten Nachforschungen nie gedacht oder sie nicht entdeckt hatten)

Für die nächsten Wochen wurde ihm eine einfache Aufgabe übertragen: Einige Teile unserer Codebasis mit den Standards auf den neuesten Stand zu bringen. Ich musste diese Teile sorgfältig anhand einiger Regeln auswählen:

  • Code sollte für jemanden, der mit unserer Codebasis (und PHP im Allgemeinen) nicht vertraut ist, relativ einfach sein
  • Code sollte auf dem stehen, wofür er angeheuert wurde

Ich habe seinen Prozess überwacht und er hat gute Arbeit geleistet. Wir haben verschiedene Codeteile identifiziert, die nicht in unser Dokument passen, und entsprechend überarbeitet (Code und / oder Standards, je nachdem, was sinnvoller ist).

Und dann kam ein anderer neuer Typ. Wir haben den Vorgang wiederholt (diesmal ein anderer Meister) und es hat wieder funktioniert. Und wieder.

Abschließend

  1. Erstellen Sie ein Dokument mit Codierungsstandards, stellen Sie jedoch sicher, dass Ihre Standards nicht ausschließlich Ihre eigenen sind, sondern die allgemeinen Standards in der breiteren Community Ihrer Plattform widerspiegeln.
  2. Weisen Sie unserem Kodierungsstandard-Master eine ähnliche Rolle zu. Jemand, der zumindest neuen Code überwacht, insbesondere neuen Code von neuen Mitgliedern. Bereite die Rolle auf, da es extrem langweilig ist.
  3. Bewerten Sie immer die Eingaben eines neuen Mitglieds. Überarbeiten Sie Ihre Standards immer, wenn es Sinn macht. Das Dokument mit den Kodierungsstandards sollte sich langsam weiterentwickeln. Sie möchten Ihre Codebasis nicht bei jeder Iteration umgestalten.
  4. Warten Sie eine Weile, bis sich jedes neue Mitglied an Ihre Standards und Konventionen gewöhnt hat. Learn by Doing funktioniert am besten in diesen Situationen.
  5. Wiki wirkt Wunder für solche Dokumente.
  6. Code Reviews wirken Wunder für jede Situation!

Zu einem bestimmten Zeitpunkt wurde vorgeschlagen, einen Pre-Commit-Hook zu verwenden, um die Überprüfung der Standards zu automatisieren. Wir haben uns aus verschiedenen Gründen dagegen entschieden. Es gibt einige interessante Diskussionen zu StackOverflow zu diesem Thema:

Einige sind PHP-spezifisch, aber die Antworten gelten für alle Plattformen.

yannis
quelle
Wenn nur alle Praktiken des Entwicklungsmanagements so gut beantwortet werden könnten ... danke!
Jleach
3

Ja, das habe ich schon einmal erlebt. Wenn Sie in einem Team arbeiten, müssen sich die Teammitglieder auf bestimmte Regeln und Konventionen einigen. Dazu gehört auch der Stil.

Sie sollten Ihr Team zusammensetzen und eine Reihe von Regeln und Kodierungsstandards entwerfen lassen, für deren Einhaltung Sie jeden Teil des eingecheckten Codes benötigen würden.

Höchstwahrscheinlich ist der vorhandene Code die Grundlage für Ihr Regelwerk, zumindest für das Styling. Sobald dies erledigt ist, muss jeder die Anforderungen erfüllen und es sollte im Rahmen der Codeüberprüfung überprüft werden . Code, der nicht den Standards entspricht, sollte nicht eingecheckt werden dürfen.

Übrigens muss es keine demokratische Abstimmung sein, es ist eines der Dinge, bei denen der Teamleiter tatsächlich eine Autorität ausüben kann. Ich denke jedoch nicht, dass Sie Standards auferlegen können, die die Mehrheit des Teams ablehnt. Sie können Standards auferlegen, die eine einzelne Person, insbesondere eine neue, ablehnt.

Wie man mit ihm spricht ... Jeder erfahrene Programmierer weiß, dass jeder Ort und jedes Team seine eigenen Konventionen und Stile haben, die befolgt werden sollten. Sie können ihm sagen, dass er gerne Verbesserungen vorschlägt, sich aber an die Regeln des Teams halten muss. Er sollte den Stil des vorhandenen Codes nicht ändern, sondern denselben Stil verwenden, wenn er neuen Code hinzufügt.

Sie können dieser Person auch mitteilen (wenn Sie der Manager sind oder mit Ihrem Manager darüber sprechen), bestimmte Dinge nicht zu tun, die Sie für unangemessen halten (Sie haben Definitionen, Reihenfolge, Hacks und Verknüpfungen usw. erwähnt).

littleadv
quelle
So haben wir es in unserem Team gemacht: Wir haben ein Kodierungsstandarddokument besprochen und genehmigt und verwenden bei jedem Check-in Kodierungsprüfungen. Es funktioniert ziemlich gut
Giorgio,
3
  1. Jemand ist verantwortlich - sie müssen so handeln.
  2. Wenn der Codierungsstil so wichtig ist, warum wurde dies dieser Person nicht erklärt, und lassen Sie sie wissen, dass sie keinen Zugriff auf Code haben, bis sie die Regeln kennen.
  3. Code Review - anscheinend haben Sie keine oder es ist sehr schwach. Siehe # 1.

Notieren Sie sich in Ihrem Einstellungsprozess, dass das Befolgen der akzeptierten Codierungsstile eine Voraussetzung für die Beschäftigung ist. Was machen Sie nun mit denen, die sich nicht an die Regeln halten? Entfernen Sie zunächst den Zugriff auf Live-Code, bis Sie mit dem Programm fertig sind.

.

JeffO
quelle
1

Folgendes kann getan werden:

  1. Schreiben Sie ein Dokument, in dem der erforderliche Codierungsstil erläutert wird, und bringen Sie alle im Team dazu, dies zu lernen. Sammeln Sie Informationen von jedem Teammitglied.
  2. Teilen Sie die Aufgaben so auf, dass jedes Teammitglied für sein eigenes Teil verantwortlich ist und die Konventionen für diesen Teil des Codes festlegen kann. Wenn irgendwelche Probleme gefunden werden, wird derjenige, der sie geschrieben hat, die Probleme beheben.
  3. Fügen Sie der Versionskontrolle ein automatisches Tool hinzu, mit dem Einrückungen und andere Probleme jedes Mal behoben werden, wenn Code für die Versionskontrolle übernommen wird
  4. Verschiedene Programmierer haben immer unterschiedliche Programmierstile, und später kann es schwierig sein, diese zu ändern. Der beste Weg, damit umzugehen, besteht darin, Informationen zwischen Teammitgliedern auszutauschen, damit jeder erfährt, welche Stile die Leute verwendet haben. Wenn Sie ein Teammitglied haben, das anderen Code schreibt, können Ihre vorhandenen Teammitglieder den neuen Stil erlernen.
  5. Ein guter Trick ist, niemals vorhandenen Code zu ändern. Schreiben Sie neuen Code, indem Sie leere Zeilen durch neuen Code ersetzen, anstatt den Code zu ändern. Sobald der Code fertig ist, müssen Sie nur noch geringfügige Änderungen am vorhandenen System vornehmen, um den neuen Code in Betrieb zu nehmen. Auf diese Weise wird vermieden, dass vorhandener Code geändert wird und möglicherweise das fehlerhafte Ergebnis beeinträchtigt wird.

Folgendes sollten Sie vermeiden:

  1. Entscheiden, dass der Code einer Person besser oder schlechter ist als der anderer Teammitglieder. Es funktioniert einfach nicht so - jeder kennt eine bestimmte Teilmenge der Sprache gut genug, um sie im Code zu verwenden. Jeder Programmierer hat eine andere Teilmenge zum Lernen ausgewählt, und wenn sie es nicht zusammen gelernt haben, wird es anders aussehen.
  2. Ändern, wie jemand Code schreibt. Alles, was Sie tun, wenn Sie Leute dazu zwingen, ungewohnten Stil zu schreiben, ist, dass Sie eine große Anzahl von Fehlern im Code bekommen. Die Leute wissen einfach nicht genug Details über etwas, das sie beim ersten Mal benutzen. Programmierer wählen immer eine Teilmenge der Sprache und verwenden diese alleine. Wenn Ihre Programmierer Tausende von Codezeilen geschrieben haben, die mit GOTOS gefüllt sind, werden GOTOS Ihnen Code geben, der die geringste Anzahl von Fehlern aufweist.
  3. Sie sollten auch nicht denken, dass Ihre vorhandene Codebasis nett, sauber und wartbar ist. Es gibt immer etwas zu verbessern. Aber auch jede Änderung verwischt die ursprüngliche Designidee, die darauf geschrieben wurde. Versuchen Sie beim ersten Mal, perfekten Code zu schreiben, damit die Änderungen später nicht mehr benötigt werden. (Der Neue müsste Ihren perfekten Code nicht "knacken", wenn er das erste Mal richtig gemacht würde.)
tp1
quelle
Um Ihre Antwort im ursprünglichen Kontext von OP zu verwenden, gibt es einen Programmierer, der Hacks einfügt, Makros verwendet und andere schlechte Codierungsgewohnheiten hat. Sie schlagen also vor, einen Teil des Produkts herauszuschneiden, ihm zu geben und statt dessen zu nennen Code "schlecht", nennen Sie es "anders". Ich konnte dem nicht mehr widersprechen. Wenn Sie als Team arbeiten, sind ständige Kommunikation, Design- / Kodierungsdiskussionen und Überprüfungen ein wichtiger Teil. Wenn das Team reift, werden alle Ihre Teammitglieder ihre Fähigkeiten ERHÖHEN, da Sie, wie Sie betont haben, alle mit einer unterschiedlichen Teilmenge beginnen, aber indem wir miteinander reden, ...
DXM
... unterrichten sich gegenseitig, so dass die Fähigkeiten und Kompetenzen Ihres gesamten Teams steigen. Andernfalls werden Sie Teile des Produkts haben, die gut sind, aber Sie werden viel mehr Teile haben, die zu nicht mehr zu wartenden Schlamasseln werden, und Ihre "Besitzer" dieser Schlamasseln werden einfach weiter hacken, um diese Fehler zu beheben, sobald sie eintreffen. Mit diesem Isolationsmodell Ich habe gesehen, wie Menschen Jahre an der gleichen Komponente gearbeitet haben, die nie richtig gemacht wurde.
DXM
1
Nein, das Problem hier ist nicht, dass jemand schlechte Codierungsgewohnheiten verwendet. Das eigentliche Problem ist, dass sie bereits beschlossen haben, die Art und Weise zu ändern, in der eine Person Code schreibt, während der Rest des Teams den eigenen Code für perfekt hält. Die Leute werden ihren Codierungsstil verbessern, wenn Sie ihnen die Chance geben, aber diese Leute haben beschlossen, jemanden zu zwingen, sich schnell zu verbessern, während sie sich nie die Mühe machen, dasselbe zu tun.
tp1
@DXM Viele großartige Sprachfunktionen werden von Leuten, die sie noch nie gesehen oder benutzt haben, als "hässliche Hacks und Shortcuts" bezeichnet. Das Beste ist, über die Standards zu sprechen und nicht nur zu entscheiden, dass der Neue ein Hacker ist.
Kirk Broadhurst
Wir könnten unsere Antworten auf verschiedene Erfahrungen stützen. Unter anderem sagte OP "mit definiert überall". Wenn das statt getippter Konstanten ist, ist das nicht so schlimm, könnte aber verbessert werden. Aber ich habe Leute gesehen, die einen Teil des Codes definiert haben, weil sie zu faul waren (oder keine Fertigkeiten besaßen), um die Klasse richtig umzugestalten und allgemeinen Code in eine Funktion zu integrieren, die sich debuggen ließ. Auf keinen Fall würde ich das jemals als "einen anderen Stil" bezeichnen und es ihnen erlauben, dies auch weiterhin zu tun. Darüber hinaus konzentrieren sich alle anderen Antworten auf die Annäherung des Teams an einen gemeinsamen Stil / eine gemeinsame Konvention. Diese Antwort ...
DXM
1

Unsere vorhandene Codebasis enthält meist lesbaren, sauberen und wartbaren Code

Eine Sache, die ich im Laufe der Jahre gelernt habe, ist, dass die Lesbarkeit im Auge des Betrachters liegt. Ich habe viele Fälle gesehen, in denen jemandes Chickenscratch-Codierungsstil als "lesbar" gerechtfertigt ist, und ich habe völlig vernünftige Leute gesehen, die darüber streiten, welche Codierungsstile am "lesbarsten" sind. Vielleicht sieht dieser Typ Ihren Stil nicht als lesbar an?

Das heißt, der neue Mann sollte Ihren Standards entsprechen, nicht umgekehrt.

Geoffjentry
quelle
0

Ziehen Sie in Betracht, Pull-Anforderungen für neuen Code im Repository zu verwenden. Dies bietet einen praktischen Ort für die Codeüberprüfung. Code, bei dem die Codeüberprüfung fehlschlägt, wird erst dann in das Repository aufgenommen, wenn die Form stimmt.

Achten Sie nur darauf, die Pull-Anforderungen nicht zu groß zu machen. Meiner Erfahrung nach sollten sie nicht länger als einen halben Tag bis maximal zwei Tage sein, da sonst zu viele Zusammenführungskonflikte auftreten.

Online-VCS-Systeme wie Bitbucket oder Github unterstützen diese Funktionalität. Wenn Sie einen On-Premise-Ansatz bevorzugen, ist Stash derzeit die beste Wahl.

Esben Skov Pedersen
quelle
0

Es gibt eine einfache Regel, die Sie befolgen können: Wenn Sie eine Datei mit Code ändern, verwenden Sie den in dieser Datei verwendeten Codierungsstandard. Wenn Sie eine neue Datei erstellen, verwenden Sie einen guten Codierungsstandard. (Plus: Wenn Ihr Compiler Warnungen geben kann, aktivieren Sie alle sinnvollen Warnungen, aktivieren Warnungen = Fehler, wenn möglich, und lassen keinen Code mit Warnungen zu. Plus: Wenn Sie Tools verwenden, die Änderungen in einer Datei vornehmen, z. B. das Ändern Tabs auf Leerzeichen oder ähnliches setzen, NICHT benutzen).

Der Grund, warum es große Argumente für Kodierungsstandards gibt, ist, dass ein Standard nicht besser oder schlechter als der andere ist (normalerweise), sondern nur anders. Das einzig wirklich schlimm ist das Mischen von Codierungsstilen.

Natürlich erwarte ich, dass jeder anständige Programmierer Code schreiben kann, der jedem Codierungsstandard folgt, egal ob er diesen bestimmten Standard bevorzugt oder nicht.

Und andererseits gibt es Qualitätsstandards. Akzeptieren Sie niemals Code, der nicht Ihren Qualitätsstandards entspricht.

gnasher729
quelle