Wann sollten wir aufhören zu arbeiten und Werkzeug herstellen?

25

Als Softwareentwickler sind wir stets bemüht, wirksame Tools zur Steigerung unserer Produktivität zu erhalten. Und in unserer täglichen Arbeit sind wir oft mit den vorhandenen Tools nicht zufrieden und möchten bessere Möglichkeiten wie eine bessere GDB-Skriptkonfiguration, ein Vim-Skript und ein Python-Skript, um langweilige Dinge automatisch zu machen.

Dies ist jedoch ein Kompromiss, da das Herstellen von Werkzeugen auch Zeit und Energie erfordert. Es führt nicht sofort zu einer Produktivitätssteigerung. Wie beurteilen Sie daher, ob es an der Zeit ist, die Arbeit einzustellen und einige Werkzeuge zu entwickeln, um Ihre zukünftigen Schmerzen zu lindern?

xiao
quelle
30
ObXKCD - Ist es die Zeit wert
1
Vielleicht auf ein Werkzeug umgestalten und
weiterarbeiten
1
Diese XKCD macht es fast unmöglich, bis auf eines: ob die Zeit, die durch das Tool eingespart wird, nur Ihre eigene ist oder ob sie von einer großen Anwenderbasis in Ihrer gesamten Organisation oder darüber hinaus vervielfacht wird.
Kaz

Antworten:

27

Ich "mache Werkzeuge", wenn eines davon zutrifft:

  1. Die Aufgabe nervt mich
  2. Das Risiko menschlicher Fehler in der Aufgabe ist zu groß

Das "Risiko" für die 2. Option muss nicht unbedingt groß sein - die Kosten für die Erstellung eines kleinen Tools sind normalerweise gering. Wenn Sie also nur das Risiko einsparen, einmal pro Woche eine 10-minütige Erstellung durchzuführen, ist dies in der Regel der Fall sich sehr schnell zurückzahlen.

Ich versuche, die Werkzeuge so klein wie möglich zu halten - vereinfache die Arbeit jetzt ein wenig und verbessere sie vielleicht beim nächsten Mal wieder.

Dies bedeutet, dass Sie jedes Mal nur die größten Schmerzen beheben und keine Korrekturen für Probleme erstellen, die Sie nicht wirklich verletzen.

aviv
quelle
2
+1 zur Vermeidung von Fehlern, da dies mehr als die übliche Zeit ist, die bei der Ausführung eingespart wird.
k3b
1
Ich würde hinzufügen, "wenn Sie feststellen, dass Sie die gleiche Aufgabe sehr oft wiederholen". Überraschenderweise muss ich ziemlich oft eine zufällige Zeichenfolge generieren. Anstatt einen Code zu schreiben, habe ich ein einfaches Formular mit einer Schaltfläche erstellt, um dies für mich zu tun
bsara
9

Aus Erfahrung habe ich herausgefunden, dass es in der Regel am zeitsparendsten ist, nur hart auf das Grunzen zu drücken. Ein Werkzeug herzustellen ist oft verlockend. Ich gebe auf, Widerstand zu leisten, wenn:

  • Das Tool hat mehr als einen Zweck. Ein guter Schachspieler hat mit jedem Zug zwei Dinge erreicht: eine gegnerische Figur blockieren und einen Bischof befreien. Ein Anfänger würde wahrscheinlich zwei Runden brauchen, um das zu tun. Ebenso überlege ich, ob das Tool nur eine Sache machen würde, oder mit etwas mehr Aufwand zwei, z. B. um Rohdatendateien zu reparieren und künstliche Testdaten zu erstellen.
  • Zukünftiger Nutzen. Es könnte mir Zeit für die Arbeit dieser Woche sparen, aber kann es mir oder jemandem in der nächsten Woche Zeit für ein neues Projekt sparen?
  • Es ist eine gute Zeit, um eine neue Sprache, Bibliothek, Designtechnik oder was auch immer zu lernen, und ich habe die Zeit, es zu tun. Das Tool ist ein nützlicher Nebeneffekt bei der Durchführung einer Schulung, bei der die für die Schulung bereits zur Verfügung gestellte Zeit genutzt wird.
  • Wenn wir ernsthafte Probleme haben, Dinge zum Laufen zu bringen. Wie beim Fallschirmspringen ohne Fallschirm sollte man sich wirklich die Zeit nehmen, einen Fallschirm zu bauen oder zu kaufen. Wenn Sie keine aussagekräftigen experimentellen Ergebnisse erhalten oder die neue Web-App überhaupt nicht funktioniert, müssen Sie nur anhalten und ein Tool herstellen oder kaufen, mit dem Sie messen können, was Sie nicht sehen, Komponenten antreiben oder Teile des Systems ersetzen können System. Wenn die Arbeit völlig aufgehängt ist und ein Werkzeug benötigt, ist mir die zukünftige Verwendung oder Mehrfachverwendung egal. Notwendigkeit wiegt genug.
DarenW
quelle
3
"Das Werkzeug hat mehr als einen Zweck" Wenn es sich nicht tatsächlich um denselben Zweck handelt, der auf zwei verschiedene Arten angewendet wird, ist es meiner Erfahrung nach besser, nur zwei Werkzeuge herzustellen.
AJMansfield
5

Meine Faustregel lautet: Wenn ich zum dritten Mal etwas tun muss, ist es Zeit, entweder ein kleines Skript zu schreiben, um es zu automatisieren, oder meinen Ansatz zu überdenken.

Ich mache derzeit kein vollständiges "Tool", sondern nur ein kleines Skript (normalerweise Bash oder Python; Perl würde auch funktionieren oder sogar PHP), das das automatisiert, was ich zuvor manuell gemacht habe. Es ist im Grunde eine Anwendung des DRY-Prinzips (oder des Single Source Of Truth-Prinzips, das im Wesentlichen dasselbe ist) - wenn Sie zwei Quelldateien gleichzeitig ändern müssen, muss es eine gemeinsame Wahrheit geben, die sie teilen, und das Die Wahrheit muss herausgerechnet und an einem zentralen Ort aufbewahrt werden. Es ist großartig, wenn Sie dies intern durch Refactoring lösen können, aber manchmal ist dies nicht möglich, und hier kommen die benutzerdefinierten Skripte ins Spiel.

Später kann sich das Skript möglicherweise zu einem vollständigen Tool entwickeln oder auch nicht, aber ich beginne normalerweise mit einem sehr spezifischen Skript, in dem viele Dinge fest programmiert sind.

Ich hasse leidenschaftliche Grunzarbeit, bin aber auch der festen Überzeugung, dass dies ein Zeichen für schlechtes oder falsches Design ist. Faul sein ist eine wichtige Eigenschaft eines Programmierers, und es ist die Art, in der man lange durchläuft, um sich wiederholende Arbeiten zu vermeiden.

Sicher, manchmal ist der Kontostand negativ - Sie verbringen drei Stunden damit, Ihren Code zu überarbeiten oder ein Skript zu schreiben, um eine Stunde sich wiederholender Arbeit zu sparen. In der Regel ist der Saldo jedoch positiv. Dies gilt umso mehr, wenn Sie Kosten berücksichtigen, die nicht direkt ersichtlich sind: menschliches Versagen (Menschen sind bei sich wiederholenden Arbeiten wirklich schlecht), kleinere Codebasis, bessere Wartbarkeit aufgrund reduzierter Redundanz, bessere Selbstdokumentation, schnellere Zukunft Entwicklung, sauberer Code. Also selbst wenn der Rest erscheint negativ jetztwächst die Codebasis weiter und das Tool, das Sie zum Generieren von Webformularen für drei Datenobjekte geschrieben haben, funktioniert immer noch, wenn Sie über 30 Datenobjekte verfügen. Nach meiner Erfahrung wird das Gleichgewicht in der Regel zugunsten von Grunzarbeit geschätzt, wahrscheinlich, weil sich wiederholende Aufgaben leichter abschätzen und damit unterschätzen lassen, während Umgestaltungen, Automatisierungen und Abstraktionen als weniger vorhersehbar und gefährlicher und damit überschätzbar empfunden werden. Normalerweise stellt sich heraus, dass die Automatisierung gar nicht so schwer ist.

Und dann besteht die Gefahr, dass es zu spät ist: Es ist einfach, drei brandneue Datenobjektklassen in Form zu bringen und ein Skript zu schreiben, das Webformulare für sie generiert. Wenn Sie dies getan haben, können Sie auf einfache Weise 27 weitere Klassen hinzufügen arbeite auch mit deinem script. Es ist jedoch nahezu unmöglich, dieses Skript zu schreiben, wenn Sie an einem Punkt angelangt sind, an dem es 30 Datenobjektklassen gibt, von denen jede handgeschriebene Webformulare enthält und zwischen denen keine Konsistenz besteht (auch als "organisches Wachstum" bezeichnet). Die Aufrechterhaltung dieser 30 Klassen mit ihren Formularen ist ein Alptraum für sich wiederholendes Codieren und halb-manuelles Suchen-Ersetzen. Das Ändern gemeinsamer Aspekte dauert dreißig Mal so lange wie es sollte, aber das Schreiben eines Skripts, um das Problem zu lösen. Was zu Beginn des Projekts eine Mittagspause gewesen wäre, ist jetzt ein schreckliches zweiwöchiges Projekt mit der beängstigenden Aussicht auf einen einmonatigen Zeitraum, der darin besteht, Fehler zu beheben, Benutzer zu unterrichten und möglicherweise sogar aufzugeben und auf das Programm zurückzugreifen alte Codebasis. Ironischerweise dauerte das Schreiben des 30-Klassen-Chaos viel länger als die saubere Lösung, weil Sie die ganze Zeit das bequeme Skript hätten verwenden können. Nach meiner Erfahrung ist die zu späte Automatisierung von sich wiederholenden Arbeiten eines der Hauptprobleme bei langen, umfangreichen Softwareprojekten. weil Sie die ganze Zeit das bequeme Skript gefahren haben könnten. Nach meiner Erfahrung ist die zu späte Automatisierung von sich wiederholenden Arbeiten eines der Hauptprobleme bei langen, umfangreichen Softwareprojekten. weil Sie die ganze Zeit das bequeme Skript gefahren haben könnten. Nach meiner Erfahrung ist die zu späte Automatisierung von sich wiederholenden Arbeiten eines der Hauptprobleme bei langen, umfangreichen Softwareprojekten.

tdammers
quelle
4

Ich habe mich gerade daran erinnert:

xkcd - Ist es die Zeit wert?

Das Problem dabei ist natürlich, dass Sie in der Realität diese Daten nicht einfach messen können, um die richtige Zelle in der Tabelle auszuwählen. Und wie bereits in anderen Antworten erwähnt, gibt es andere Variablen (das Fehlerrisiko, die Aufgabe ist zu langweilig, um sie auch nur einmal auszuführen, ...), die Sie der Gleichung hinzufügen müssen.

Meine Antwort ist also, dass es wirklich von der Situation abhängt und Sie nicht hoffen können, für alle Situationen eine "richtige" Antwort zu erhalten. Immerhin wäre das Leben langweilig, wenn wir Kochbücher für alles hätten.

Honza Brabec
quelle
1
Schön! :-) Die eingesparte Zeit kann aber auch für andere Aufgaben verwendet werden - entweder weil das Tool für mehrere Zwecke verwendet werden kann oder weil Sie über die Kenntnisse verfügen, die Sie beim Schreiben des Tools erworben haben.
Hans-Peter Störr
3

Dies ist nach meiner Erfahrung ein großes Problem. Der Werkzeugbau wird normalerweise einem motivierten Entwickler überlassen, der die Arbeit zum Erstellen des Werkzeugs einstellt. Dies stört häufig die Entwicklung, auch wenn sie einen Wert liefert. Der Werkzeugbau muss als integraler Bestandteil des Entwicklungsprozesses gesehen werden.

Ich erinnere mich, an Code-Überprüfungen teilgenommen zu haben, bei denen Header-Fehler dazu führten, dass eine weitere Überprüfung geplant wurde. Viele davon könnten von einem Tool erkannt worden sein. zB falsche Sloc-Zählungen, fehlende Anforderungen, Formatierungsfehler. Mein in Perl geschriebenes Tool generierte den Header aus dem gelieferten Code und validierten Anforderungen aus einer Oracle-Datenbank. Es war nicht Teil unseres "Prozesses", daher wurde das Tool kurzfristig als verspätete Lieferung angesehen.

Das gesamte Team muss in regelmäßigen Abständen anhalten und sehen, wo manuelle Anstrengungen erforderlich sind, die durch das Erstellen von Werkzeugen automatisiert werden können.

Donleslie
quelle
2

Alle anderen Antworten sind gut, aber ich möchte noch einen weiteren Grund hinzufügen, warum es wertvoll ist, Zeit mit dem Erstellen kleiner Tools zu verbringen (und Ihre .vimrc-, .emacs-Dateien usw. anzupassen):

Manchmal bleibt man kreativ oder motivierend "in der Brunft stecken" und macht irgendetwas, um die Säfte wieder zum Fließen zu bringen (um Metaphern zu mischen). Im Idealfall würde dies das Projekt produktiv vorantreiben, aber wenn es ein bisschen tangential ist und Sie inspiriert, dann ist das auch gut so.

Möglicherweise starren Sie nicht auf einen leeren Bildschirm, sondern haben nur Probleme, den Fortschritt zu sehen, den Sie bei einer großen Aufgabe erzielen. Wenn Sie in dieser Situation etwas Greifbares ankreuzen, haben Sie möglicherweise nicht mehr das Gefühl, irgendwohin zu gelangen.

Eine Variation davon ist, wenn Sie über etwas nachdenken, das auf dem "Backburner" stehen sollte. Nehmen Sie sich einen Moment Zeit und tun Sie dies, um sich wieder ganz der Hauptaufgabe zu widmen.

Tom
quelle
1

Es hängt davon ab, was Sie als Werkzeug betrachten. Wahrscheinlich mache ich eine Menge davon auf eine Art und Weise, die andere Entwickler für leichtfertig halten würden ... Weil ich sie für fast alles außer für die grundlegendsten Dateisystembefehle mache .

Ich benutze 2 Rationales, um das zu unterstützen.

  • Es ist eine Erweiterung des DRY-Prinzips. Wenn wir etwas wiederholen wollen, ist manueller Aufwand der am wenigsten effektive Einsatz von Humanressourcen.
  • Auf diese Weise kann ich auf effektive Weise aufzeichnen, was ich getan habe. Wenn ich also etwas gebaut habe, möchte ich (oder jemand anderes) möglicherweise darauf zurückgreifen, wie ich es Wochen oder Monate später getan habe, und es führt das Protokoll der Arbeit mit dem Projekt.

Gelegentlich wachsen sie zu größeren Werkzeugen heran und erhalten interaktive Funktionen, aber wenn sie nicht vorhanden sind, haben sie immer noch Wert als Aufzeichnung.

James Snell
quelle