Jaki jest realistyczny sposób obsługi poprawek do oprogramowania specyficznych dla klienta?

16

Próbuję znaleźć skuteczne sposoby, w jakie inni rozwiązali następujący problem. W pracy zostaliśmy zmuszeni do wydania poprawki oprogramowania (do zainstalowania w systemach użytkowników końcowych), która jest widoczna tylko dla konkretnego klienta. Kod niestandardowy znajduje się we własnej gałęzi kontroli źródła. Problem polega na tym, że mamy dwie równoległe linie kodu (i budujemy skrypty) do synchronizacji, i za każdym razem kiedy łatamy oryginalny kod, musimy łatać i testować kod specyficzny dla klienta.

Jestem ciekawy, jak inne organizacje radzą sobie z tym scenariuszem? Jesteśmy otwarci na rozwiązania biznesowe, a nie tylko techniczne (związane z kontrolą źródła). Na przykład mówiliśmy o poinformowaniu klienta, że ​​nie może otrzymywać aktualizacji w tym oddziale.

Nasza strategia rozgałęziania jest taka (na podstawie Visual Studio TFS Branching Guide , chociaż używamy do tego Subversion) wprowadź opis zdjęcia tutaj

Vimes
źródło
Jeśli używasz hglub gitmogę zasugerować, abyś spojrzał na korzystanie z Patch Queues ( Mercurial Queues Extension lub Stacked Git ), ale nie wiem, czy TFS ma coś podobnego.
Mark Booth,
Może powinienem był sprecyzować, że korzystamy z Subversion, nawet jeśli korzystamy ze strategii rozgałęziania sugerującej TFS: P Czy kolejki łat mogłyby ograniczyć niezbędne testy? Wygląda na to, że są to łatki do kontroli źródła? Mamy do czynienia z łatkami instalowanymi przez klientów w systemach użytkowników końcowych.
Vimes,
2
Rozwiązaniem biznesowym byłoby: nie rób tego.
JeffO
@JeffO good call =) W każdym razie, czy jest jakiś sposób, aby uczynić to przełącznikiem wykonawczym opartym na danych?
Patrick Hughes,
1
@JohnB - Przepraszam, nie wiem, ale jeśli masz łatki źródłowe, to twój system kompilacji powinien być w stanie zautomatyzować testy, a dodatkowo utrzymywanie łatek dla poszczególnych klientów na zewnątrz svnoznacza, że ​​nie zakłócają normalnego przepływu pracy. Jeśli kolejki łatek wyglądają na przydatne, możesz je wypróbować za pomocą git-svn lub hgsubversion . Użycie interfejsu DVCS w celu usprawnienia trudnego przepływu pracy svnmoże nawet zachęcić ludzi do rozważenia przejścia na hurtownię DVCS i uzyskania wszystkich innych korzyści.
Mark Booth,

Odpowiedzi:

5

Kiedy zaczynasz rozdawać łaty dla konkretnych klientów, natychmiast stworzyłeś nową wersję swojego produktu, którą należy zachować obok niej. Oznacza to, że zmiany muszą być propagowane między dwiema wersjami. Zwykle łaty specyficzne dla klienta to dostosowania, które powinny być własnością klienta, w tym kod źródłowy.

Wydaje się mało prawdopodobne, aby łatka naprawiająca coś nie trafiła do gałęzi głównej, chyba że jest to mniej niż optymalna tymczasowa poprawka dla bezpośredniego problemu. W takim przypadku łatka będzie musiała być utrzymywana, dopóki oczekiwana poprawka nie znajdzie się w linii głównej.

Charles Lambert
źródło
5

Wydaje mi się, że klucz jest „widoczny” - co powiesz na to, że w ogóle nie ma oddzielnej gałęzi kodu, a raczej opcję konfiguracji, która zmienia zachowanie?

Loren Pechtel
źródło
Może to działać w przypadku prostych dostosowań, ale bardziej złożone mogą sprawić, że produkt będzie bardziej niezręczny i niestabilny dla wszystkich klientów.
FrustratedWithFormsDesigner
3
@FrustratedWithFormsDesigner Złożone dostosowania dla pojedynczych klientów stanowią poważne zaniedbanie w zarządzaniu produktem i jego projektowaniu. Każde rozwiązanie, które wymaga oddzielnego oddziału dla jednego klienta dla produktu, stanowi rażącą nieadekwatność produktu do zaspokojenia wszystkich potrzeb klientów i złego zarządzania ze strony właściciela produktu.
wałek klonowy
2
Widziałem również to ugryzienie mojego poprzedniego pracodawcy w kółko. To po prostu zła praktyka, ale zazwyczaj jest to coś, czego zarząd chce i nie chce się wycofać. Zwłaszcza jeśli używasz Subversion, to tylko koszmar, który nie zniknie - synchronizacja kodu będzie boleć raz po raz.
Steve Hill,
1
@maple_shaft - Ale czy pomyślałeś o zadaniu pytania „czy kiedykolwiek korzystałeś z rozgałęzienia kodu w celu wdrożenia internacjonalizacji”?
psr
3
@maple_shaft - żartowałem, ale tak naprawdę o to mi chodziło, używanie rozgałęziania do obsługi internacjonalizacji jest co najmniej tak samo złe, jak oddziałów specyficznych dla klienta. Nie chodzi o to, że prawdopodobnie nie chcesz też pracować w takim miejscu. Jest rzeczą dyskusyjną, że nie zgadzam się z tematem.
psr
3

Czy postrzegasz to jako krótkoterminowe czy długoterminowe? Faktem jest, że firma zdecydowała się już na przyjęcie tego klienta tak krótko, że JEST to już decyzja biznesowa, którą należy rozwiązać przede wszystkim poprzez praktyki biznesowe (zaakceptowanie dodatkowego kosztu / obciążenie klienta kosztami).

W perspektywie długoterminowej prawdopodobnie zobaczysz oszczędności, jeśli ponownie uwzględnisz oprogramowanie, aby łatwo dostosować się do potrzeb klientów poprzez konfigurację (lub konfigurację itp.).

Jeśli jest to względnie krótkoterminowe, co oznacza, że ​​wkrótce połączysz te zmiany z powrotem z gałęzią główną / programistyczną, a wszyscy użytkownicy również je zobaczą, prawdopodobnie praca w granicach obecnej sytuacji będzie prawdopodobnie akceptowalna. Tak jak powiedziałem, decyzja o tym, co należy zrobić, powinna zostać podjęta, gdy podjęta została decyzja o przyjęciu klienta.

Krótko mówiąc. Długoterminowo napraw to technicznie, krótkoterminowo z tym poradzić.

Oczywiście jest punkt, w którym jest to rzut monetą. Jeśli jesteś w tym momencie, zrobiłbym wszystko, co wolą programiści.

ElGringoGrande
źródło
2

Używamy również subversion - i natrafiamy na dokładnie taki scenariusz.

Oto kilka kluczowych punktów do zapamiętania:

  1. O ile jest to konieczne, należy unikać określonych oddziałów dla klientów, należy jednak zminimalizować tę potrzebę; zawsze pytaj, czy można uogólnić rozwiązanie, które może po prostu działać dla wszystkich.

  2. Oddziały specyficzne dla klienta muszą pochodzić z nowej wersji. Załóżmy, że masz wersję 1.2, a nie pochodną od wersji 1.2.1 do 1.2.11 - gałęzie klienta powinny być dozwolone wszystkie łatki, dlatego gałąź klienta musi pozostać kompatybilna w odniesieniu do wersji głównej.

  3. Specjalny oddział klienta musi zostać utworzony na nowo, gdy uruchomisz nową niekompatybilną wersję. Niefortunne jest to, że w jakiś sposób możesz wymagać ponownego wykonania pracy. Jednym z rozwiązań może być utworzenie wszystkich łatek z oddziałów klientów, które należy wyodrębnić, a wszystko, co stanie się nadal kompatybilne, można zastosować w nowym oddziale klienta.

  4. Zawsze, pod żadnym pozorem, nie należy przesuwać zmian specyficznych dla klienta z powrotem, aby zwolnić oddział lub pień. Idealnie jednak należy starać się uogólnić pracę w taki sposób, aby ograniczyć pracę specyficzną dla klienta.

Próbowałem zebrać te pomysły, aby pokazać schemat poniżej:

Dipan Mehta
źródło
1

Co powiesz na wprowadzenie mechanizmu rozszerzenia do swojego kodu?

Twój główny kod ma:

class Foo
{
}

Po uruchomieniu program sprawdza DLL / ekwiwalent moralny w swoim folderze startowym pod kątem lokalnych dostosowań. Jeśli go znajdzie, ładuje się i może zawierać specyficzną dla firmy wersję Foo

class FooForABC : Foo
{
}

FooForABC implementuje to samo zachowanie, co Foo, ale zastępuje funkcje w razie potrzeby, aby zapewnić określone zachowanie, którego potrzebuje ABC. Technika powinna być wystarczająco elastyczna, aby poradzić sobie z każdym scenariuszem, który musisz wesprzeć.

Winston Ewert
źródło