To pytanie naprawdę zawiera dwa pytania, które należy rozwiązać osobno:
Dlaczego niektóre zespoły mają ścisły proces rozwoju?
Prosta odpowiedź brzmi, ponieważ jeśli nie, błędy się zdarzają. Kosztowne błędy. Dotyczy to zarówno rozwoju, jak i reszty dziedziny IT (sysadmins, DBA itp.).
Jest to bardzo trudne do zrozumienia dla wielu programistów i pracowników IT, ponieważ większość z nas pracowała tylko w jednej z „skrajności” - dużych firm w stylu Fortune z co najmniej tuzinem programistów i surowymi procedurami do spełnienia, lub małe, mikro-niezależnych dostawców oprogramowania lub nawet niezależni pracują tam, gdzie ludzie po prostu nie psują się źle, lub koszt zepsucia jest niski.
Ale jeśli kiedykolwiek widziałeś firmę między tymi fazami - nawet firmę z jasną, utalentowaną kadrą IT - zrozumiesz niebezpieczeństwo związane z brakiem procesu lub procesem połowicznym. Widzisz, komunikacja między pracownikami cierpi na problem wybuchu kombinatorycznego ; kiedy osiągniesz poziom około 6-10 programistów w jednym zespole, główną przyczyną poważnych lub krytycznych defektów nie jest brak talentu lub wiedzy, ale raczej brak komunikacji.
Alice pyta w poniedziałek rano i decyduje, że można wykonać operację rekonstrukcyjną w bagażniku, ponieważ nikt inny nie pracuje nad tą częścią. Bob przybywa godzinę później, wracając z wakacji i pełen energii, i postanawia wdrożyć nową ważną funkcję w tym samym obszarze, i po co zawracać sobie głowę oddziałem, ponieważ nikt i tak nigdy nie dotyka tego kodu? Więc Alice spłaca ten „dług techniczny”, Bob wdraża swoją funkcję zabójcy, która była na tylnym palniku przez 6 miesięcy, a kiedy w końcu oboje sprawdzają swój kod (oczywiście przed zamknięciem w piątek, oczywiście!), Cały zespół musi pozostać w tyle i próbować przetrwać koszmarne piekło konfliktów, które nadal trwają jako błędy i regresy przez następne kilka tygodni.
Alice i Bob obaj świetnie spisali się w zadaniach związanych z kodowaniem, ale obaj zaczęli od złej decyzji („co najgorszego może się zdarzyć?”). Kierownik zespołu lub kierownik projektu prowadzi ich przez sekcję zwłok i opracowuje listę kontrolną, aby zapobiec ponownemu wystąpieniu problemu:
- Zameldowanie musi odbywać się codziennie, aby zminimalizować wpływ konfliktów;
- Zmiany, które potrwają znacznie dłużej niż 1 dzień, należy wprowadzić w oddziałach;
- Wszystkie ważne zadania (w tym prace niefunkcjonalne, takie jak refaktoryzacja) muszą być odpowiednio śledzone i przypisywane w module do śledzenia błędów.
Założę się, że dla wielu z nas ten „proces” wydaje się po prostu zdrowy rozsądek. To stary kapelusz. Ale czy wiesz, że wiele mniejszych zespołów tego nie robi? Dwuosobowy zespół może nawet nie zawracać sobie głowy kontrolą źródła. Kogo to obchodzi? To naprawdę nie jest konieczne. Problemy zaczynają się pojawiać dopiero, gdy zespół rośnie, ale proces nie.
Oczywiście optymalizacja procesu jest jak optymalizacja wydajności; podąża odwrotną krzywą wykładniczą. Powyższa lista kontrolna może wyeliminować 80% defektów, ale po jej wdrożeniu okaże się, że pozostałe 80% odpowiada za pozostałe 80% defektów. W naszym fikcyjnym, ale znanym przykładzie mogą występować błędy kompilacji z powodu różnych środowisk kompilacji, co z kolei wynika z faktu, że nie ma standardowego sprzętu, a programiści używają bibliotek open source, które są aktualizowane co 2 tygodnie.
Masz więc trzy możliwości: albo (a) ujednolicić sprzęt i poważnie ograniczyć wykorzystanie bibliotek innych firm, co jest kosztowne i może znacznie zaszkodzić produktywności, lub (b) skonfigurować serwer kompilacji, który wymaga współpracy grupy sysadmin i pełnoetatowy programista, aby go utrzymać, lub (c) pozwolić programistom zrobić to samodzielnie, dystrybuując standardową maszynę wirtualną i polecając programistom, aby na tym oparli. Oczywiście (b) jest najlepszym rozwiązaniem długoterminowym, ale (c) ma lepszą równowagę między niezawodnością a celowością w perspektywie krótkoterminowej.
Cykl trwa i trwa. Każda „polityka”, którą widzisz, została wprowadzona w celu rozwiązania prawdziwego problemu. Jak pisał Joel Spolsky w 2000 roku (na zupełnie inny temat, pamiętajcie o tym, ale istotne):
Kiedy wchodzisz do restauracji i widzisz znak z napisem „Zakaz wstępu dla psów”, możesz pomyśleć, że znak ten ma charakter czysto prowokacyjny: Pan Restauracja nie lubi psów w pobliżu, więc kiedy zbudował restaurację, postawił ten znak.
Gdyby to wszystko się działo, pojawiłby się również znak „No Snakes”; w końcu nikt nie lubi węży. I znak „Brak słoni”, ponieważ łamią krzesła, kiedy siadają.
Prawdziwy powód, dla którego znak jest tam jest historyczny: to historyczny znacznik, który wskazuje, że osoby wykorzystywane do starają się doprowadzić swoje psy do restauracji.
Tak samo jest w większości (nie powiem wszystkich) zespołów programistycznych: zasady takie jak „Musisz dodać przypadek testowy dla każdej poprawki błędu” prawie zawsze wskazują, że zespół historycznie miał problemy z regresjami. Regresje to kolejny z tych problemów, które najczęściej wynikają z awarii komunikacji, a nie niekompetencji. Tak długo, jak rozumiesz zasady, możesz być w stanie przyjąć uzasadnione skróty (np. Musiałem naprawić 6 małych błędów, ale wszystkie były w tej samej funkcji, więc mogę po prostu napisać jeden przypadek testowy dla wszystkich 9).
To wyjaśnia, dlaczego procesy istnieją, ale to nie jest cała historia. Druga połowa to:
Dlaczego proces jest tak trudny do naśladowania?
To jest właściwie prostsze pytanie, na które należy odpowiedzieć: to dlatego, że zespół (lub jego kierownictwo) koncentruje się na powtarzalnych wynikach i minimalizowaniu defektów (jak wyżej), ale nie poświęcił wystarczającej uwagi optymalizacji i automatyzacji tego procesu.
Na przykład w pierwotnym pytaniu widzę kilka problemów:
System kontroli wersji (CVS) jest dziedzictwem dzisiejszych standardów. W przypadku nowych projektów został prawie całkowicie zastąpiony przez subwersję (SVN), która sama w sobie szybko zostaje przyćmiona przez systemy rozproszone, takie jak Mercurial (Hg). Przejście na Hg sprawiłoby, że rozgałęzienie i scalenie byłyby znacznie prostsze, a nawet w moim hipotetycznym przykładzie powyżej codzienne wymaganie zatwierdzenia stałoby się o wiele mniej bolesne. Kod nawet nie musi się kompilować, ponieważ repozytorium jest lokalne; - leniwi programiści mogliby nawet zautomatyzować ten krok, gdyby chcieli, ustawiając skrypt wylogowania, aby automatycznie zatwierdzać zmiany w lokalnym repozytorium.
Nie poświęcono czasu na automatyzację procesu maszyny wirtualnej. Cały proces uzyskiwania, konfigurowania i pobierania źródła / bibliotek na maszynę wirtualną może być w 100% zautomatyzowany. Może to być nienadzorowany proces uruchamiany gdzieś na centralnym serwerze podczas pracy nad poprawką błędu na komputerze lokalnym (i używaj tylko maszyny wirtualnej, aby zapewnić czystą kompilację).
Z drugiej strony, na pewną skalę rozwiązanie VM-per-developer zaczyna być głupie i powinieneś mieć tylko serwer Continuous Integration. To właśnie tutaj pojawiają się rzeczywiste korzyści produktywności, ponieważ (głównie) uwalnia to indywidualnych programistów od konieczności martwienia się o kompilacje. Nie musisz się martwić konfigurowaniem czystych maszyn wirtualnych, ponieważ serwer kompilacji jest zawsze czysty.
Sformułowanie pytania („przypadek testowy ze wszystkimi krokami”) sugeruje, że trwają testy ręczne . To znowu może działać w przypadku małych zespołów o stosunkowo niskim obciążeniu pracą, ale w ogóle nie ma sensu na większą skalę. Testy regresji można i należy zautomatyzować; nie ma „kroków”, tylko klasa lub metoda dodana do zestawu testów jednostkowych / integracyjnych.
Nie trzeba dodawać, że przejście z Bugzilli do nowszego (lepszego) systemu śledzenia błędów sprawi, że ta część doświadczenia będzie o wiele mniej bolesna.
Firmy niekoniecznie są tanie lub głupie tylko dlatego, że nie rozwiązały tych problemów. Wiedzą tylko, że obecny proces działa , aw niektórych przypadkach są niechętni ryzyku i niechętnie zmieniają cokolwiek na ten temat. Ale tak naprawdę muszą być przekonani o korzyściach .
Jeśli programiści spędzili tydzień na śledzeniu swojego czasu we wszystkich zadaniach niekodujących, możesz łatwo go podsumować, pokaż kierownictwu, że (na przykład) inwestycja o zerowym kapitale, 100 roboczogodzin w aktualizację do Mercurial wyeliminować do 10 roboczogodzin tygodniowo przy rozwiązywaniu konfliktów scalania, to jest to 10-tygodniowa wypłata i prawie na pewno się na to zgodzą. Ten sam pomysł z serwerami kompilacji (CI) lub lepszym śledzeniem błędów.
Podsumowując: zespoły jeszcze tego nie zrobiły, ponieważ nikt nie przekonał kierownictwa, że jest to wystarczająco ważne, aby zrobić to dzisiaj . Więc przejmij inicjatywę i zmień ją w równanie kosztów i korzyści; dowiedzieć się, ile czasu poświęca się na zadania, które można uprościć / zautomatyzować przy minimalnym ryzyku, i obliczyć próg rentowności i ewentualną wypłatę nowego narzędzia lub techniki. Jeśli nadal nie słuchają, to wiesz już, jakie masz pozostałe opcje.
Jeśli programiści spędzili tydzień na śledzeniu swojego czasu we wszystkich zadaniach niekodowania, możesz łatwo go dodać, pokazać zarządzanie ... i przekształcić w równanie kosztów i korzyści itp.
Powyższa część wygląda na dalszą rozbudowę.
Mogę potwierdzić, że to działa. Programiści używali go kilka razy w jednym z projektów, nad którymi pracowałem i za każdym razem doprowadzało to do pożądanych zmian.
Moje ogólne wrażenie było takie, że jeśli zrobimy to dobrze, ta sztuczka może unieważnić całkiem duże zarządzanie ignorancją i bezwładnością.
Chciałbym jednak zauważyć, że firma, w której my (programiści) musieliśmy stosować tego rodzaju podejście do majsterkowania, była bardzo niedojrzała pod względem informatycznym. U bardziej doświadczonych dostawców oprogramowania widziałem, że takie rzeczy są w większości wykonywane przez samych menedżerów. I z reguły byli bardziej wydajni niż my, programiści. Znacznie bardziej produktywny.