Streng oder pragmatisch sein?

13

Mir wird langsam klar, dass das Entwickeln von Software (unter anderem) ein Prozess ist, bei dem Sie sich ständig Fragen stellen. Fragen zur Codequalität, zur Trennung von Anliegen, zur Minimierung von Abhängigkeiten, ...

Aber die Hauptfrage ist: Wie weit können Sie gehen, ohne in einer Nervenklinik zu landen?

Ich bewerbe mich um eine neue Stelle. Gestern war ich bei einem möglichen zukünftigen Arbeitgeber, der meine Programmierfähigkeiten testen wollte. Eine der Übungen war: Erklären Sie, was dieser Code bewirkt. Ich habe einen Code der Anwendung (winforms in vb.net) durchgesehen, die sie entwickelt haben (es ist eine Verwaltungsanwendung für ein Krankenhaus). Dies gab mir die Möglichkeit, tatsächlich zu sehen, wie sie sich den Dingen nähern, und es war ziemlich enttäuschend.

Einige Beispiele:

  • Ich sah irgendwo: Rufen Sie [Name des Unterprogramms hier einfügen] -> Ich war geschlagen: ist das nicht etwas von VB6?
  • Sie haben eine separate Datenschicht, die ado.net verwendet, aber eine Methode, die ich untersuchen musste, gibt einen Datensatz an die aufrufende Schicht zurück. Unabhängig davon, ob es sich um eine separate Datenschicht handelt oder nicht, die Anwendung ist an ado.net gebunden (was auch kein Problem sein kann, wenn sie niemals zu einem anderen Datenzugriffsansatz wechselt).
  • Dieser Datensatz wird so wie er ist gelesen, es handelt sich also immer noch um einen datenzentrierten Ansatz (natürlich kann man darüber streiten, wie viel Logik / Verhalten Sie Klassen wie "Patient" oder "LabAnalysisRequest" zuordnen können.
  • Ich glaube auch, die Konstruktion einer SQL-Abfrage durch String-Verkettung gesehen zu haben.
  • Sie verwenden gespeicherte Prozeduren (was für mich bedeutet: Streuung der Logik)
  • Keine Erwähnung von Views / Controllern: Es ist alles formgetrieben
  • Das hässlichste was ich gesehen habe war:
        Wenn TestEnvironment.IsTesting dann
           someVar = [irgendein fest codierter Wert]
        sonst
           someVar = [ein dynamisch abgerufener Wert]
        ende wenn
        [Rest der Funktion hier]
    

Es ist alles so anders als das, was ich in der Schule gelernt habe: (Persistenz-Agnostiker) Domain-Layer, Persistenz-Layer, Präsentations-Layer, Unit-Testing, ...

Also formuliere ich meine Frage neu: Wie fundamental oder dogmatisch sollte man sein? Inwieweit sollte sich ein Programmierer an seine Prinzipien halten oder einfach Code schreiben, der die Aufgabe erfüllt?

bvgheluwe
quelle
2
Gehört wahrscheinlich zu prorammers.stackexchange, da es eher um die allgemeine Diskussion der Softwareentwicklung als um bestimmte Probleme mit einem Codeblock geht.
Taylonr
7
Auf der akademischen Seite der Welt gibt es keine Fristen. Auf der Geschäftsseite der Welt gibt es fast immer Fristen. Und fast immer sind sie zu früh.
Carlos Campderrós
1
Ich stimme Carlos zu. Als ich anfing, an meinem aktuellen Gig zu arbeiten, lautete meine Einstellung zum Code: "Ich kann nicht glauben, dass dieser Code so schrecklich verklärt ist!" Nach ein paar Wochen änderte sich die Einstellung zu "Ich kann nicht glauben, dass dieser Code nur so verworren ist." Es ist das alte Sprichwort: "Qualität, Geschwindigkeit, Kosten, wählen Sie zwei." Das Erstellen von gutem Code ist entweder langsam oder teuer, und manchmal ist beides keine Option.
Satanicpuppy
1
Meine formale Ausbildung ist so begrenzt, dass meine Dogmen / Grundlagen ziemlich schwach sind. Wenn ich nicht pragmatisch wäre, würde ich eine Ewigkeit (mehr als jetzt) ​​damit verbringen, Dokumentationen zu durchsuchen oder Foren zu besuchen. Die Kehrseite ist, dass ich mit zunehmender Reife als Programmierer lerne, NICHT zu programmieren. Das bedeutet wahrscheinlich, dass meine Grundlagen oder mein Dogma wachsen. Ich arbeite für eine kleine Firma, wo ich eigentlich der erfahrenste Programmierer bin, und wenn es ein Projekt gibt, das in X Days durchgeführt werden muss, habe ich keine andere Wahl, als diese grundlegenden Probleme zu lösen. Eine gute Inline-Dokumentation ist unabdingbar, wenn Sie sie erneut anzeigen und "WT ??"
TecBrat,
3
Wenn das hässlichste, was Sie gesehen haben, war, If TestEnvironment.IsTesting thenist der Code in einem ziemlich guten Zustand.

Antworten:

21

Ich weiß, dass dies Ihre Frage nicht direkt beantwortet, aber ich bin dennoch der Meinung, dass dies mehr als einen Kommentar wert ist:

Wenn Sie ein Vorstellungsgespräch führen, interviewen Sie sie genauso wie sie Sie interviewen . Brechen Sie die Angewohnheit ab, ein Interview als etwas zu sehen, zu dem Sie auf Ihrem Bauch kriechen, und bitten Sie darum, dass sie Ihnen etwas anbieten. Sie checken dich aus, aber du checkst sie auch. Wenn sie dich nicht mögen, werden sie dich nicht einstellen. Wenn Sie sie nicht mögen, gehen Sie nicht dort arbeiten.

Ja, in der Branche wird der Code mit einer zehn Jahre alten alten Codebasis, die im Laufe der Zeit von drei Dutzend Entwicklern mit unterschiedlichem Hintergrund, Fähigkeiten und Leidenschaften gehackt wurde, die von engen Fristen, fehlenden Ressourcen und finanziellen Zwängen getrieben werden, niemals funktionieren Sieh so aus, wie du gelernt hast, dass es aussehen sollte. Sie müssen einige Zugeständnisse machen. Aber wie viele und wo Sie die Grenze ziehen, liegt ganz bei Ihnen.
Natürlich sind Jobs schwieriger zu finden, wenn Sie weniger Zugeständnisse machen. Aber sie könnten angenehmer sein.

FWIW, ich habe bisher (> 10 Jahre in der Branche) noch nie in einem großen Unternehmen mit vielen Entwicklern gearbeitet (~ 30 Entwickler waren die meisten, ein Dutzend der Norm), weil es so viel wahrscheinlicher ist, dass Sie etwas in einem kleinen ändern Unternehmen. Solange ich genug Geld verdiene, um die Kinder nicht zu verhungern, möchte ich nicht ein kleines Zahnrad in einer großen Firma sein, wo ich mich nur synchron mit dem Rest der Gänge drehen muss.
Ich habe Stellenangebote abgelehnt, nachdem ich die Tests gesehen habe, die ich bestehen soll. Ich bin ein C ++ - Entwickler, und es gibt viele C ++ - Tests, die so schlecht sind, dass sich Ihre Zehennägel angewidert kräuseln. Ich möchte meine Zeit nicht damit verbringen, gegen Windmühlen zu kämpfen, weil sie Schwachköpfe eingestellt haben, die keinen sauberen Code schreiben können.
Ich habe den Job auch nach ein paar Monaten verlassen, weil ihre Programmierphilosophie (kurzfristige Ziele, egal nächstes Jahr) nicht zu meinen Fähigkeiten (langfristige Codestabilität) passte, obwohl sie im Interview etwas anderes sagten.

sbi
quelle
Was ist los mit C ++ - Tests?
Reismehl Kekse
2
@Rice: Sie haben Fehler in den Fragen.
sbi
3
Ich würde hinzufügen, dass, wenn Sie in ein Unternehmen eintreten, das auf die Dinge achtet, die Sie in der Schule gelernt haben, Sie viel mehr lernen werden, als in einem Unternehmen zu arbeiten, in dem Sie sie über die Grundlagen aufklären müssen.
Gustav Bertram
1
Mein Kommentar mag tangential sein, aber Ihre Antwort hat mir einen Einblick gegeben, warum man nicht in die Falle einer "großen Firma" fallen sollte und warum es aus den oben beschriebenen Gründen in wenigen Monaten in Ordnung ist, eine große Firma zu verlassen. danke dafür
Tarun
5

Schreiben Sie niemals Code, der nur die Arbeit erledigt. Seien Sie jedoch ebenso bereit, Ihre Lehre zu überprüfen. Nur weil du es in der Schule gelernt hast, heißt das noch lange nicht, dass es aktuell oder sogar gültig ist. Der Lebenszyklus des Software-Designs ist hinfällig, da die Programmierung reaktiver auf die Geschäftswelt reagieren muss. Manchmal sind umständlich verknüpfte Softwarelösungen umständlich verknüpft, weil Teile nach Zeitaufwand ausgetauscht wurden.

Hier ist eine Liste der Themen, die ich zusammengestellt habe, um festzustellen, wie gut Sie in den Kodierungsstil eines Unternehmens passen.

  1. Wie viel Wert legen sie auf die Zeit, die für die Umgestaltung und Aktualisierung ihrer Codebasis aufgewendet wird. Wie sie die Aktualisierung der Codebasis anzeigen, ist ein entscheidender Faktor dafür, wie gut Sie sich einfügen.
  2. Wie oft kaufen sie Drittanbieter, anstatt intern zu codieren?
  3. Was halten sie von Open-Source-Software? Stellen sie fest, dass sie bei der Änderung des Codes flexibel sind? Sehen sie es genauso an wie den Kauf eines Drittanbieters?
  4. Sie arbeiten an einer bestimmten Abstraktionsebene. Bestimmt das Team, mit dem Sie kommunizieren, Ihre Schnittstelle für Sie? Welche Ebene / Team / Seite der Benutzeroberfläche hat mehr Entscheidungsbefugnis?
  5. Wie viel hören die Aufsichtsbehörden den Programmierern zu, wenn sie Entscheidungen treffen? Wenn ein Programmierer eine rote Fahne wirft, stoppt die Aufsicht und überprüft ihre Entscheidung.
  6. Halten Sie das Management für erfahrene Programmierer? Wie sehen sie ihre Erfahrungen? Ist ihre Erfahrung gültig? Beeinflussen veraltete Erfahrungen die Entscheidungsfindung?
  7. Wie klebrig ist die Code-Basis?
  8. Wie oft aktualisieren sie ihre Programmiertools (IDE usw.)

Die Antworten auf diese Fragen passen besser dazu, wie Sie ihren Programmierstil bewerten, als zu sehen, ob sie zu Ihrem Dogma passen.

Das Dogma wird unweigerlich kaputt sein (wir haben einfach keine Zeit, X zu aktualisieren). Die Prioritäten bestimmen jedoch, inwieweit Sie mit Ihrem Stil und Ihrer Entscheidungsfindung in Konflikt geraten.

Lee Louvière
quelle
4

Ich denke, Sie müssen dies als Teil des Ganzen abwägen. Ich erinnere mich, dass einer meiner ersten Jobs eine Position in einer Gruppe war, in der mir mitgeteilt wurde, dass sie objektorientiertes C ++ betreiben - was ich gerade einige Jahre in der Schule getan hatte.

Ihre Selbsteinschätzung war falsch - sie machten etwas klobiges C. Es war immer noch sehr funktional gestaltet und ich musste mir ein C-Buch besorgen, um mir printf und getf und andere C-Mechanismen beizubringen, die ich nie gelernt hatte. Die Tatsache, dass niemand im Team bemerkte, wie sehr C seinen Code mochte, zeigt, dass dieses "C ++ - Design" vom Fleck gefallen war. Mein damaliges Ziel war es, OO-Entwicklung zu betreiben. Das war also ziemlich abstoßend.

Aber ich bin froh, dass ich am Ende bei der Mannschaft geblieben bin. Sie waren eine dynamische Gruppe sehr kluger Leute und ich hatte viele schwere Probleme. Ich musste den gesamten Lebenszyklus durcharbeiten und das, was ich über die Problemdomäne (PKI) gelernt habe, hat meine Karriere seitdem beflügelt. Die Arbeit, die das Team im Funktionsbereich geleistet hat, war unglaublich und ich denke immer noch sehr gern an dieses Produkt und diese Arbeitserfahrung. Besser noch - ich arbeite immer noch mit einigen dieser Leute (einige Firmen später), sie sind immer noch eine Inspiration und wir leisten immer noch gute Arbeit.

Ich denke nicht, dass die perfekte Umsetzung der Best Practices einer Programmiersprache das Ergebnis einer guten Arbeitserfahrung oder eines guten Teams ist - die Arbeit, die eine Karriere ankurbelt, ist viel mehr als das, und wenn das Produkt anständig ist Qualität, das Team hat anständige Arbeitsbedingungen (wie der Joel-Test) und das Team ist voll von Leuten, die klug sind und Dinge erledigen, dann ist die Perfektion der Implementierung zweitrangig. Nehmen Sie Faktoren wie gute Arbeit, gute Leute, gute Arbeitsbedingungen mit - und es lohnt sich nicht, dabei zu bleiben - ob der Code seltsamerweise zusammengesetzt ist oder nicht.

bethlakshmi
quelle
Ich musste nach unten scrollen, um zu sehen, dass ich das nicht geschrieben habe!
4

Wie fundamental oder dogmatisch sollte man sein? Inwieweit sollte sich ein Programmierer an seine Prinzipien halten oder einfach Code schreiben, der die Aufgabe erfüllt?

Das Wichtigste, woran Sie sich hier erinnern sollten, ist, was Sie vorhaben .

In den meisten Unternehmen besteht Ihr Lebenszweck nicht darin, perfekten Code zu schreiben. Ihr Ziel ist es, einen Mehrwert für den Benutzer zu liefern. Das Schreiben von gutem Code ist normalerweise der beste Weg , um ein gutes Produkt zu liefern, das auch einfach zu warten, Probleme zu beheben und zu entwickeln ist.

Guter Code ist ein Tool, das Sie dort anwenden sollten, wo Sie einen guten ROI erzielen.

Einige Beispiele:

  1. Ich würde viel Zeit damit verbringen, meine APIs zu entwerfen und zu codieren, insbesondere die API meiner Geschäftsebene. Viele andere Programmierer werden sie verwenden und es wird viel Zeit und Probleme sparen, wenn sie richtig entworfen werden
  2. Ich werde die Regeln in meiner Präsentationsebene ein wenig lockern. Dort werde ich eher die "Perfektion" des Codes opfern, um mehr Funktionen hinzuzufügen

Fazit: Sie müssen Prinzipien haben, aber Sie sollten auch flexibel genug sein, um diese Prinzipien zu brechen, wenn sie mehr Schaden als Wert bringen.

daramasala
quelle
3

Ich habe einige Jahre für einen E-Commerce-Händler gearbeitet. Als ich dort anfing, war der Code für ihre internen Anwendungen alle in VB für MS Access geschrieben, und es war, gelinde gesagt, schrecklich. Ich hatte ein Team von 3 Entwicklern und in den nächsten Jahren haben wir dies durch richtige VB.Net-Anwendungen ersetzt.

Da mein Einstellungsbudget jedoch äußerst begrenzt war, konnte ich mir nur Junior-Programmierer leisten. Und natürlich war der Code, den sie produzierten, nicht so toll. Aber es hat funktioniert und das Unternehmen nutzte diese Anwendungen jeden Tag, um Geld zu verdienen.

Und dann habe ich angefangen mit meinen Jungs zu arbeiten. Ein wenig Schulung in OOD, Datenbankdesign, MVC und C #. Und im Laufe der Jahre haben sich die Dinge verbessert. Als ich nach 4 Jahren abreiste, war die Codebasis immer noch nicht großartig, aber 100-mal besser als zu Beginn.

Eine Situation wie die, die Sie beschreiben, ist oft die Folge davon, dass Sie mit verfügbaren Ressourcen auskommen müssen. Wir leben nicht in einer idealen Welt. Gleichzeitig ist dies eine großartige Gelegenheit, tatsächlich etwas zu bewirken.

Übrigens: Einige dieser Anwendungen werden immer noch verwendet, praktisch unverändert seit ungefähr drei Jahren, und sie verdienen immer noch Geld.

wolfgangsz
quelle
Das Schöne an einer Black Box ist, dass die Leute nicht sehen können, wie dunkel es darin ist.
3

Ich halte es für sehr wichtig, an Ihren Grundsätzen festzuhalten. Sie sollten sich stets bemühen, den bestmöglichen Code innerhalb der angegebenen Einschränkungen zu erstellen. Wenn Sie jedoch zu Ihrer Liste der Prinzipien hinzufügen, dass Sie niemals fehlerhaften Code lesen oder ändern müssen, werden Sie große Schwierigkeiten haben, Arbeit zu finden. Denken Sie daran, dass 50% der Programmierer in der unteren Hälfte ihrer Klasse abschlossen. Selbst in einem Ein-Mann-Team ist "today you" für die Lösung eines Problems besser qualifiziert als "last month you". Die Fähigkeit, mit nicht idealem Code zu arbeiten, ist nur ein Teil der Arbeit.

Viele Arbeitgeber erkennen dies an, so dass sie den Code, den sie Ihnen zum Lesen geben, für den schlechtesten Code in ihrer Codebasis und nicht für den besten Code repräsentieren. Wenn das aus dem Kontext nicht klar ist, sollten Sie fragen. Ein Kollege, mit dem ich manchmal ein Interview geführt habe, hat eine Codepage, die er absichtlich schlecht geschrieben hat, nur um sie als Interviewfrage zu verwenden.

Karl Bielefeldt
quelle
2

In 99% der Fälle sollten Sie sich an das «Dogma» halten, wie Sie es nennen. Das Dogma wird von erfahrenen Personen über Jahre hinweg praktiziert, und was irgendwann wirklich oft pragmatisch erscheint, ist es nicht. Dies ist in der Regel relevanter als die Tatsache, dass Sie nicht gut genug sind, um dieses Problem richtig zu behandeln.

Befolgen Sie das Dogma jedoch nicht blind. Denken Sie daran, welche Schlussfolgerungen dazu führen, dass Menschen diesem Dogma folgen. Weil Sie einen winzigen Teil der Fälle finden, in denen dies nicht beachtet werden sollte. Auf jeden Fall werden diese Fälle sehr selten sein und Sie sollten sich immer mit anderen erfahrenen Programmierern besprechen, bevor Sie eine solche Entscheidung treffen.

deadalnix
quelle
Ich denke, Sie verwechseln "Dogma" mit "Best Practices".
Toby
Deshalb habe ich «Dogma» geschrieben und nicht nur Dogma.
Deadalnix
Wow, ich habe nicht einmal diese beiden Tasten auf meiner Tastatur. Kein Wunder, dass ich sie nicht benutze.
2

Seien Sie streng, wenn es darauf ankommt. Klammerstil (oder andere Kodierungskonventionen)? Es spielt keine Rolle. Verwenden Sie die, die der Shop verwendet. Kapselung (oder andere grundlegende Programmierprinzipien) ohne guten Grund brechen? Nicht so trivial.

Stack Exchange verwendet Tabellen für das Layout (ebenso wie viele andere wichtige Websites, die Geld verdienen ). Kommt dadurch Rauch aus den Ohren der Puristen? Sicher tut es das. Aber der Pragmatismus setzt sich jedes Mal gegen die Reinheit durch. Versandprodukte überzeugen jedes Mal durch Perfektion.

Die gesamte Domänenschicht, die Persistenzschicht, die Präsentationsschicht und die Einheitentestsache sind aus historischer Sicht noch relativ neu. Es gibt eine Menge Software, die immer noch ein Client / Server-Modell verwenden und nicht auf den neuesten Architekturstil umgestellt werden, nur weil es "besser" ist.

Robert Harvey
quelle