Io sto avendo dei problemi di build management sul progetto del nostro nuovo prodotto... Piano tirennale, roba grossa.
Abbiamo circa 20 persone che sviluppano e non seguono alcuna logica umana.
I problemi sono anche di tipo organizzativo (non c'è alcuna pipeline di sviluppo: il mercato chiede e loro fanno). Nessuno è coordinato con niente. Se l'utente A implementa una feature, forka e la scrive. L'ultimo che finisce prima della release della milestone si becca il merge (mentre facevo l'auditing del vecchio processo uno è durato 4 ore e mezzo, la media è 1:10).
Siccome non c'è una persona una che ha una del totale del progetto (che non è concettualmente così complesso da non renderlo possibile è solo che in due anni di preliminari non hanno scritto un cazzo di documentazion e con il tempo l'analisi iniziale è diventata una leggenda urbana tramandata la sera dopo gli straordinari non pagati), chi fa il merge spesso non è che sa bene cosa sta facendo... Non vi dico cosa succede al testing (fatto a mano)...
Insomma morale della favola, stiamo cercando di riorganizzare tutto e si parte proprio dal source e dal build management. Al momento usiamo questa tecnica:
All'inzio di ogni sprint (al momento intese in senso molto lato) decidiamo le nuove feature e chi se ne occupa.
Ogni gruppo che si occupa di una feature brancha il proprio codice e a feature è conclusa fa il merge con il trunk di sviluppo. E' un merge di nome e non di fatto: il codice è separato, quindi i task sono verticalizzati in maniera tale che i vari gruppo di lavoro si occupano dello stesso subset di componenti, così ci sono collisioni minime. Il merge non lo fa un pincopallo a cazzo, lo fa un build manager (uno degli sviluppatori senior o io) che si fanno aiutare dal team leader del gruppo di lavoro. Questo non tanto per allineare versioni e dirimere collisioni quando per verificare che la qualità del codice sia garantita (usiamo i tool di visual studio ma non è sbagliato assicurarsi che i dev più giovani non stiano prendendo brutte pieghe).
A fine milestone, il trunk di sviluppo è tornato sano, si verifica che buildi e si passa tutto al trunk di release. Il build manager a quel punto dà luce verde a chi si occupa dei test che procedono da unit testing in su (sino a test automatizzati di VS, non tutto è testabile a quel modo ma è sempre meglio di far fare tutto a mano ad un pincopallo scazzato che deve scorrere un excel di casi di test), producendo un casino di report, tra cui uno stato di qualità del codice (molto utile quello di copertura del codice che ci fa capire se abbiamo impostato male i test o abbiamo codice morto).
A questo punto si riparte con un altro sprint, la cui prima attività (1 giorno circa) è decidere se bisogna modificare le frontiere (interfacce, web service, etc) dei vari sistemi per implementare le nuove feature. Se si, si procede alla modifica delle stesse e alla creazione di eventuali Stub per avere il codice buildabile, poi si parte con l'implementazione delle nuove cose. Ad ogni fine giornata, chiunque abbia lavorato deve committare tutto con merge automatico. Se non ci sono collisioni da sistemare a mano, di notte il server builda e il mattino sappiamo se ci sono problemi grossolani.
Devo dire che nonostante sembri tutto complicato funziona piuttosto bene (e abbiamo praticamente annullato i merge in senso stretto, anche se per arrivarci ho dovuto fare 2 sett e mezzo di refactoring praticamente da solo, perché quasi nessuno aveva idea di dove si potesse arrivare con un po' di disciplina).
Ora resta l'ultimo scoglio: passare il controllo ai quattro team da cinque per la definizione dei task negli sprint settimanali: si stanno letteralmente cagando sotto, anche se due settimane fa hanno dovuto subire la sottostima di un'attività (di solo il 637%, che volete che sia) fatta da terzi. Visto che la qualità del lavoro era bassa e i cazziatoni costanti, sono convinti che prendersi direttamente la responsabilità sul decidere cosa fare e per quando farlo sia errata. Al momento partiremo con i team leader che stimano le attività ma l'idea finale è che ogni sviluppatore diventi padrone della sua velocity e la usi al meglio, anche in funzione di impegni personali, etc etc...