Angenommen, ich habe ein Projekt, das von 10 Bibliotheken abhängt, und innerhalb des Stamms meines Projekts kann ich beliebige Versionen dieser Bibliotheken verwenden. Also fange ich mit den neuesten Versionen an. Jede dieser Bibliotheken wird dann einmal im Monat (im Durchschnitt) aktualisiert. Um meinen Kofferraum vollständig auf dem neuesten Stand zu halten, müsste jetzt alle drei Tage eine Bibliotheksreferenz aktualisiert werden.
Das ist offensichtlich zu viel. Obwohl normalerweise Version 1.2.3 ein Ersatz für Version 1.2.2 ist, wissen Sie es nie , ohne es zu testen. Unit-Tests sind nicht genug; Wenn es sich um eine DB / Datei-Engine handelt, müssen Sie sicherstellen, dass sie ordnungsgemäß mit Dateien funktioniert, die mit älteren Versionen erstellt wurden, und möglicherweise umgekehrt. Wenn es etwas mit der Benutzeroberfläche zu tun hat, müssen Sie alles visuell überprüfen. Und so weiter.
Wie gehst du damit um? Einige mögliche Ansätze:
- Wenn es nicht kaputt ist, reparieren Sie es nicht . Behalten Sie Ihre aktuelle Version der Bibliothek bei, solange Sie bei der Verwendung in Ihrer Anwendung nichts Falsches bemerken, unabhängig davon, wie oft der Bibliotheksanbieter Aktualisierungen veröffentlicht. Kleine inkrementelle Änderungen sind nur Verschwendung.
- Aktualisieren Sie regelmäßig, um Änderungen gering zu halten. Da Sie in jedem Fall eines Tages ein Update durchführen müssen, ist es besser, ein Update häufig durchzuführen, damit Sie Probleme frühzeitig bemerken, wenn sie einfach zu beheben sind, anstatt mehrere Versionen zu überspringen und potenzielle Probleme sich ansammeln zu lassen.
- Etwas dazwischen. Gibt es einen Sweet Spot?
quelle
Antworten:
Ich bin schockiert - und in der Tat entsetzt - über die Anzahl der Antworten, die hier lauten: "Nicht aktualisieren, es sei denn, Sie müssen". Ich habe das getan, und obwohl es kurzfristig einfacher ist, brennt es auf lange Sicht höllisch. Häufigere, kleinere Updates sind sehr viel einfacher zu verwalten als gelegentlich größere, und Sie profitieren früher von neuen Funktionen, Fehlerkorrekturen usw.
Ich kaufe nicht die Idee, dass Bibliotheksänderungen schwieriger zu testen sind als Codeänderungen. Es ist genau das Gleiche - Sie nehmen eine Änderung an der Codebasis vor und müssen diese validieren, bevor Sie ein Commit durchführen und bevor Sie sie freigeben. Dafür müssen Sie jedoch bereits über Prozesse verfügen, da Sie Codeänderungen vornehmen!
Wenn Sie in zwei bis vier Wochen dauernden Iterationen arbeiten, empfehle ich, die Aktualisierung von Bibliotheken einmal pro Iteration vorzunehmen, und zwar so bald wie möglich nach dem Start, wenn die Dinge etwas entspannter sind als kurz vor einer Iteration Abgabetermin und das Projekt hat mehr Kapazitäten, um Veränderungen zu absorbieren. Lassen Sie jemanden (oder ein Paar, wenn Sie Pair-Programmierung durchführen) sich hinsetzen, schauen Sie sich an, welche Bibliotheken aktualisiert wurden, und versuchen Sie, alle neu zu erstellen und zu testen. Etat vielleicht einen halben Tag bis einen Tag für jede Iteration. Wenn es funktioniert, überprüfen Sie die Änderungen (ich gehe davon aus, dass Sie die Bibliotheken in der Quellcodeverwaltung behalten, wie wir es tun; ich bin nicht sicher, wie Sie die Änderung auf kontrollierte Weise verbreiten würden, wenn nicht). Dies ist natürlich viel einfacher, wenn Sie automatisierte Tests durchführen, als wenn die Tests vollständig manuell durchgeführt werden.
Die Frage ist nun, was Sie tun, wenn ein Update Probleme verursacht. Nehmen Sie sich Zeit, um diese zu beheben, oder lassen Sie es weg? Ich würde vorschlagen, sich zu letzterem zu neigen; Wenn es in einer Stunde behoben werden kann, tun Sie es, aber wenn ein Update einen erheblichen Integrationsaufwand erfordert, dann erhöhen Sie es als Ihre eigene Entwicklungsaufgabe, die wie jede andere geschätzt, priorisiert und geplant werden muss. Die Chancen stehen gut, dass die Priorität niedrig ist, wenn dies keine entscheidenden Korrekturen oder Verbesserungen mit sich bringt, und Sie werden nie daran vorbeikommen. Sie werden jedoch nie wissen, dass sich das Problem zu dem Zeitpunkt, zu dem der nächste iterative Aktualisierungstag beginnt, möglicherweise selbst behoben hat. Auch wenn nicht, zumindest wissen Sie jetzt, dass der Update-Pfad eine Straßensperre enthält, die Sie nicht überrascht.
Wenn Sie keine Iterationen dieser Länge durchführen, würde ich eine Art eigenständigen Zeitplan für Updates einrichten - nicht länger als monatlich. Gibt es einen anderen Projektrhythmus, an den Sie ihn binden könnten, wie eine monatliche Statusüberprüfung oder ein Architekturratstreffen? Zahltag? Pizza Nacht? Vollmond? Was auch immer, Sie müssen etwas finden, das viel kürzer ist als ein herkömmlicher Veröffentlichungszyklus, da der Versuch, alle 6 bis 18 Monate alles auf einmal zu aktualisieren, schmerzhaft und demoralisierend sein wird.
Wenn Sie vor der Veröffentlichung Stabilisierungszweige ausführen, wenden Sie diese Richtlinie nicht auf diese an. Dort würden Sie nur Bibliotheken aktualisieren, um wichtige Korrekturen zu erhalten.
quelle
Ich bewerte.
Dann wäge ich das alles gegen das Beibehalten der vorhandenen Bibliothek ab.
Immer testen - hoffentlich stellen Ihre Unit- / Integrationstests sicher, dass keine größeren Regressionen auftreten.
quelle
Das Hauptproblem bei Bibliotheken von Drittanbietern besteht darin, dass Sie IHRE Anwendung beim Aktualisieren erneut testen müssen, bevor sie in Produktion gehen kann. Wenn Sie also einen gemeldeten Fehler haben, für den eine Bibliothek aktualisiert werden muss, berühren Sie ihn erst, wenn Sie die Zeit haben, einen vollständigen Qualitätssicherungszyklus durchzuführen.
Dies geschieht normalerweise bei der Veröffentlichung einer neuen Version.
Ich würde jedoch vorschlagen, dass Sie eine Testsuite für die fortlaufende Erstellung haben, mit der Sie die Bibliotheken im Entwicklungszweig automatisch aktualisieren können. Auf diese Weise stellen Sie sicher, dass Sie frühzeitig feststellen, wann der Fehler auftritt, und können Fehlerberichte an das Projekt senden.
quelle
Teilweise wie in svn vendor branches beschrieben . Die dort beschriebene Vorgehensweise ist sehr nützlich, wenn Sie Open-Source-Bibliotheken von Drittanbietern noch lange verwenden und Änderungen vorgenommen haben, um sie an Ihre Bedürfnisse anzupassen.
quelle
Ich würde darüber nachdenken, alle Bibliotheken eines Projekts kurz vor oder kurz nach einer Veröffentlichung zu aktualisieren. Dies kann jedoch außer Kontrolle geraten, wenn Sie sich auf mehr als 10 oder 15 Bibliotheken verlassen. In diesem Fall kann eine Art Update-Überprüfungsmechanismus sehr hilfreich sein. Dies hat den Vorteil, dass Sie Zeit zum Testen Ihrer Bibliotheken haben und Probleme in einem Durchgang beheben können. Sie müssen auch nicht ständig die Aktualisierungen jeder einzelnen Bibliothek nachverfolgen, sondern müssen nur an einem bestimmten Tag nach Aktualisierungen suchen.
Ich würde auch gegen jede Art von Auto-Update-Funktion in einem Dev-Zweig verstoßen. Es wäre frustrierend, wenn ich mitten in der Arbeit an etwas, an dem das Projekt scheitern würde, weil sich eine Bibliothek automatisch aktualisiert, oder ich plötzlich Abschreibungswarnungen für die Verwendung einer API bekomme, die gerade von etwas anderem abgelöst wurde.
quelle
Sie müssen sich fragen, was Sie wirklich von dem Update wollen? Die meisten Sicherheitskorrekturen sind eigentlich triviale Patches in Form von Korrekturen:
Wenn Sie sich die meisten CVEs in den letzten fünf Jahren ansehen, sind die Patches, mit denen sie behoben wurden, in der Regel recht trivial, wenn Sie offene Bibliotheken verwenden, was ich hoffe, dass Sie es sind.
Dann haben Sie aktuelle Fehlerbehebungen, die Sie wahrscheinlich möchten, aber vielleicht haben Sie sie bereits selbst behoben. Wenn es nicht kaputt ist, reparieren Sie es nicht.
Schließlich haben Sie neue Funktionen ... und möglicherweise veraltete Funktionen. Sie müssen diese Versionshinweise und Unterschiede sorgfältig prüfen. Können Sie sie verwenden, auch wenn sie eine API beschädigen, von der viele andere Dinge abhängen? Wenn ja, ist es Zeit für eine Operation. Wenn nein, wählen Sie aus, was Sie möchten, und fahren Sie fort.
Einige mögen mit mir nicht einverstanden sein, aber ich lehne es ab, eine Bibliothek ohne Quellcode zu verwenden.
quelle
Dies hängt davon ab, für welche Bibliotheken sie verwendet werden, wie umfassend sie in Ihrem Code sind, welche Kosten (in Bezug auf Zeit und Geld) für die Durchführung des Upgrades anfallen usw.
Idealerweise hätten Sie immer den neuesten Stand, aber wenn die neue Version nicht abwärtskompatibel ist, was dann? Möglicherweise müssen Sie dieses Update für eine zukünftige Version zurückstellen, bis Sie die Änderung sorgfältig handhaben können. Möglicherweise hat sich das Verhalten geringfügig geändert (z. B. "Sie müssen jetzt die Eigenschaft X festlegen, bevor Sie die Methode Y aufrufen, oder es tritt ein langsamer Speicherverlust auf"), der beim Testen nur schwer zu überprüfen ist.
Auf der anderen Seite könnte die neue Version einige schwerwiegende Sicherheitskorrekturen enthalten, so dass Sie dies ebenfalls berücksichtigen müssen.
Kurzfassung: Nehmen Sie es von Fall zu Fall.
quelle
Dies würde von Ihren Release-Zeitplänen abhängen.
Mein Rat wäre jedoch, eine Reihe von Bibliotheken auf allen Entwicklermaschinen zu installieren. Betrachten Sie es als Goldstandard, wenn Sie es als etwas bezeichnen möchten, und beginnen Sie mit der Entwicklung für dieses Release.
Bewerten Sie Ihre Bibliotheken, ihre Versionen und Funktionen erst, wenn das Release bereitgestellt wurde und Sie sich in der Post-Release-Phase befinden. Wenn sie einige wesentliche Verbesserungen oder neue Funktionen bieten, installieren Sie sie vor dem Start des nächsten Entwicklungszyklus.
Installieren Sie neue Versionen nur, wenn ein schwerwiegendes Problem oder ein Fehler vorliegt, der vor der Bereitstellung der Software behoben werden muss.
Es bedeutet, dass Sie einige Versionen verpassen werden, aber es sollte einige Kopfschmerzen und Versionsprobleme ersparen, sodass Sie sich auf die Entwicklung Ihrer Anwendung konzentrieren können.
quelle
Subversion Externals
Das Besondere an dieser Funktion ist, dass Sie die gewünschte Revision angeben können.
Bitte beachten Sie, dass Aktualisierungen langsamer sind, wenn Sie viele externe Geräte haben.
quelle
Ich richte gerade so etwas ein:
Wenn ich nun an einer Erweiterung arbeiten muss, die nicht "grundlegend" ist (implizit als Subrepo im Anwendungsrepo enthalten), klone ich das Repo einfach im Erweiterungsordner und lasse CMake die Projekte und Lösungen für die gesamte Anwendung generieren.
Auf diese Weise kann ich:
Ich habe noch nicht viel Erfahrung mit dieser Organisation, aber ich denke, das ist ziemlich nützlich.
quelle
Wenn Ihre Software sicherheitskritisch ist, müssen Sie so schnell wie möglich aktualisieren, keine Ausreden. Sie möchten nicht, dass ein kleiner Fehler in einer Grafikbibliothek Ihr gesamtes Programm angreifbar macht.
Andernfalls, wenn die Bibliothek ausgereift ist, lautet sie "Wenn sie nicht kaputt ist, repariere sie nicht." für mich. Früher oder später benötige ich möglicherweise ein Feature einer späteren Version und habe keine andere Wahl, als es zu aktualisieren, aber bis dahin ist der Aufwand schwer zu rechtfertigen. Wenn ich dagegen mit einer relativ neuen Bibliothek oder einem relativ neuen Framework wie Grails oder ExtJS arbeite, halte ich mich mit der neuesten Version auf dem Laufenden, da sich diese Produkte noch nicht vollständig ausgereift anfühlen. Ein Update kann mich also wahrscheinlich retten Wenn Sie auf einen dieser Fehler stoßen, wurde die spätere Version behoben.
quelle
Ich verwende NuGet , um meine Bibliotheken von Drittanbietern auf dem neuesten Stand zu halten.
Wenn ein Freund, ein Mitarbeiter oder ein Blog mich benachrichtigt, dass eine meiner DLLs von Drittanbietern veraltet ist, können Sie sie mit NuGet ganz einfach aktualisieren.
quelle