venerdì 27 gennaio 2012

DZone articolo Inizio del 2011: I Hate Programmazione coppia (e il tuo codice e voi)

"Sei programmazione in coppia ? "il nostro direttore ha chiesto nel suo tono snarky, durante l'utilizzo esagerato di aria doppie virgolette per enfatizzare il suo scetticismo. Poi se ne andò senza aspettare una risposta ...
Questo è solo un esempio dei numerosi casi che ho sperimentato nel corso degli anni da parte degli scettici di programmazione in coppia.
Questo non è un concetto particolarmente nuovo, e in passato sia hardware e sviluppatori software ha lavorato in coppia su una base di routine. Tuttavia, con la recente popolarità (e di notorietà) dello sviluppo del software agile, il dibattito di programmazione coppia continua a infuriare.
Perché questa pratica ad evocare una risposta emotiva da parte di persone?
Fatica accoppiamento
Accoppiamento stanchezza sembra essere uno degli argomenti più comuni contro il pair programming. Infatti, una conversazione che ho avuto recentemente è stato con una persona che accoppiati per oltre 6 ore di fila e poi mai di nuovo appaiati. Il suo volto scrunched quando si parla di esso, tanto che penso si sentiva dolore reale anche pensarci.Mi informai sul perché non ha pause, o utilizzare il pomodoro tecnica ma non era disposto a divulgare i dettagli.
Nota: è importante lavorare ad un ritmo sostenibile e di prendere piccole ma frequenti pause. Questo vale anche per programmazione in coppia!
Singoli punti di guasto
Una delle mie citazioni preferite da un datore di lavoro è passato "Non siamo una organizzazione a thread singolo".Ragazzo era lui sbagliato, abbiamo avuto singoli punti di guasto ovunque! Purtroppo programmazione in coppia è stata vista con disprezzo tale che non è sopravvissuto modalità pilota. Presso altre strutture che ho visto due persone e condividere le conoscenze in modo tale che la sola osservazione dell'organizzazione threaded effettivamente tenuta d'acqua. La gente potrebbe eseguire il codice con successo invece di chiamare un ingegnere del software, mentre lui è in vacanza a Disney World con la sua famiglia. (Storia vera)
Nota: è importante avere una conoscenza condivisa del codice di base, altrimenti la vostra organizzazione non può recuperare quando i membri chiave del team lasciare (e saranno).
È troppo costoso per avere 2 persone in 1 computer
Un altro argomento contro il pair programming è che è troppo costoso avere due sviluppatori di lavorare insieme nello stesso momento. Ho visto dirigenti fare il caso che la programmazione coppia è raddoppiato il loro costo per operare ingegneria del software, e poi prontamente uccidendo l'iniziativa. Tuttavia sembra che il costo di portare gente nuova a regime è spesso trascurato in questa equazione.
Nota: Quando si tenta di realizzare l'analisi costi / benefici di pair programming, invece il tempo di un neo assunto prende per arrivare fino a velocità sul suo contro proprio quando l'accoppiamento con un membro del team già esistente.
Per aiutare a visualizzare questo argomento sto facendo, immaginate un paio di programmazione scivolo r.
Slider paio di programmazione: 
0% []-------------[] 100%
A sinistra allo 0%, i membri del team non hanno assolutamente idea di che cosa l'altro sta lavorando all'interno della base di codice.
Sulla destra al 100%, i membri del team enfaticamente odiano l'un l'altro.
Nessuno dei due estremi promuove la crescita del team, in modo da con la maggior parte delle pratiche è necessario sforzarsi di trovare il giusto equilibrio per la tua squadra e organizzazione.
Sì, sì ... dammi esempi reali
Un anno fa il nostro team di sviluppo praticato pair programming almeno 4 o più ore della nostra giornata lavorativa di 8 ore. Immaginate il cursore paring pari o superiore al 50% ogni giorno. Questo è stato soprattutto perché avevamo già membri del team con una grande quantità di conoscenze dominio transizione off e nuovi membri del team in transizione E prima di chiedere, sì, abbiamo fatto del nostro meglio per lo schermo del nuovi membri del team durante il processo di intervista. Gli intervistati erano tenuti a coppia con i membri esistenti per avere un'idea di quello che un giorno medio sarebbe come prima firma.
E 'ormai un anno dopo, e siamo attualmente l'abbinamento a circa il 25% per 3 giorni a settimana, e 45% per 2 giorni alla settimana. Abbiamo rivisitato come coppia ad ogni iterazione retrospettiva (2 settimane). Questo è importante perché abbiamo bisogno di parlare apertamente di come stiamo lavorando insieme come una squadra e regolare le cose, se necessario.
Abbiamo imparato molto l'uno dell'altro e come lavoriamo nel corso dell'ultimo anno.
Ho scoperto che quando si connette al dispositivo di scorrimento e coppia per un minor numero di ore che si tende a comunicare con l'altro meno. Il ronzio camera squadra è ridotta in modo significativo in questi tempi, ed è più difficile mantenere un impulso della squadra nel suo complesso.
Ho scoperto che con dispositivo di orientamento orari accoppiamento come un artefatto del nostro stand ogni giorno aiuta a mantenerci onesti. Ora anche la domanda "Che cosa vorreste coppia oggi?", In quanto in tempi diversi membri del team vogliono iscriversi per lo stesso compito.
Sono abbastanza certo che continueremo a imparare nel corso dell'anno prossimo.
Così, in breve, prima di dichiarare il vostro odio eterno per la programmazione di coppia, prova a dargli un altro colpo con alcuni controlli ben pensato ed equilibri. Semplicemente potrebbe sorprendervi.

mercoledì 25 gennaio 2012

Gradle sonar e multi-modulo Progetti

Amo Sonar . E 'un modo meraviglioso per raccogliere alcune metriche per i vostri progetti Java - senza problemi e avvolto in un dolce dall'aspetto dell'interfaccia utente. Per i progetti basati su Maven Sonar opere letteralmente fuori dalla scatola. Basta avviare l'istanza Sonar (assumendo che si sta utilizzando le impostazioni predefinite in esecuzione su localhost) e poi semplicemente sparare utilizzando:?
1.$ mvn sonar: sonar 
Pochi istanti dopo si dovrebbe avere le metriche disponibili sul sito:

1.http://localhost : 9000 /
Bene, negli ultimi giorni sono stato la creazione di un multi-modulo Gradle progetto Sonar. Vorrei iniziare dicendo che Gradle è impressionante. Avere la possibilità di dichiarare le dipendenze come battute e anche di essere in grado di personalizzare facilmente i vostri script, hanno ancora impostazioni predefinite, è molto bello. Sorta di il meglio dei due mondi. Impostazione di Sonar per un progetto di moduli multi, però, è purtroppo un po 'più complicato, rispetto a ciò che io sono abituato al mondo Maven. Non è terribilmente complicato, ma ci ho messo un po 'per raccogliere tutti i pezzi di informazioni. Ottenere il vostro plugin per Sonar a fare solo una cosa è abbastanza semplice. Basta seguire i passi di base descritte nella documentazione di plug-in:


  • http://gradle.org/docs/current/userguide/sonar_plugin.html
Di differenziazione tra i plugin Sonar per Gradle e Maven si è, che la versione Gradle non viene eseguito automaticamente l'analisi di copertura del codice. Questo deve essere manualmente l'installazione. Questo è dove il doc ufficiali solo vagamente si riferisce a Cobertura. Per prima cosa, ho provato a usare Cobertura per la copertura del codice, ma mi sembrava di correre in difficoltà per i miei progetti multi-modulo. Il plugin Cobertura è qui:

https://github.com/valkolovos/gradle_cobertura/wiki
Per caso mi sono reso conto che i ragazzi Sonar hanno un repository GitHub con esempi su come configurare sonar per i vari sistemi di compilazione, tra cui Gradle:
  • https://github.com/SonarSource/sonar-examples/
Nella loro esempi, stanno usando JaCoCo , che non è menzionato nella documentazione originale Gradle e magari avrei potuto continuare con Cobertura ma sembrava che Sonar è stato preferendo JaCoCo e così ho continuato con questo. Alcuni Gradle Limitazioni Plugin Sonar Il Sonar Plugin Gradle è una limitazione fastidiosa, dove posso correre per il progetto ROOT OR per i sotto-progetti individualmente. Vedere il seguente Gradle biglietto Jira per i dettagli:

  • http://issues.gradle.org/browse/GRADLE-1813
Inoltre, ho colpito il piccolo problema che non riesco a impostare il link nel cruscotto Sonar. Questo sembra essere correlato al problema seguente Sonar Jira:
  • https://jira.codehaus.org/browse/SONAR-2749
Il plugin di copertura JaCoCo codice è "un po 'meno" supportati dal plugin Sonar Gradle, ad esempio il plugin Gradle non ha un setter esplicito per la JacocoReportPath  e assume nella cartella "target", come la directory di compilazione di default. Pertanto è necessario impostare in modo esplicito:
puntelli ["sonar.jacoco.reportPath"] = "$ {} buildDirName / jacoco.exec"
Infine, ho deviato un po 'da esempio Gradle SonarSource, e invece di proprietà del sistema, ho voluto utilizzare le proprietà Gradle per consentire agli utenti di fornire non di default le impostazioni di configurazione Sonar (url databasem, parametri jdbc ecc.) Bene, durante l'impostazione che fino mi sono imbattuto in un altro problema Gradle Jira:
  • http://issues.gradle.org/browse/GRADLE-1826
Ma alla fine, io sono felicemente in grado di eseguire un progetto multi-modulo Gradle con Sonar e raccolta di dati statistici di code coverage. Ecco il codice relevant dal mio build.gradle file:

. 01si applicano plugin: 'sonar'
02. 
03.sonar {
04. 
05.se (rootProject.hasProperty ( 'sonarHostUrl' )) {
06.server.url = rootProject.sonarHostUrl
07.}
08. 
09.database {
10.se (rootProject.hasProperty ( 'sonarJdbcUrl' )) {
11.url = rootProject.sonarJdbcUrl
12.}
13.se (rootProject.hasProperty ( 'sonarJdbcDriver' )) {
14.driverClassName = rootProject.sonarJdbcDriver
15.}
16.se (rootProject.hasProperty ( 'sonarJdbcUsername' )) {
17.username = rootProject.sonarJdbcUsername
18.}
19.se (rootProject.hasProperty ( 'sonarJdbcPassword' )) {
20.password = rootProject.sonarJdbcPassword
21.}
22.}
23. 
24.Progetto {
25.dynamicAnalysis = "reuseReports"
26.withProjectProperties {props ->
27.props [ "sonar.core.codeCoveragePlugin" ] = "jacoco"
28.props [ "sonar.jacoco.reportPath" ] = "$ {} buildDirName / jacoco.exec"
29.}
30.}
31. 
32.println "i parametri utilizzati Sonar: server.url = '$ {} server.url'; database.url = '$ {} database.url'; database.driverClassName = '$ {} database.driverClassName'; database. username = '$ {database.username}' " )
33. 
34.}
35. 
. 36sottoprogetti {sottoprogetto ->
37. 
38....
39. 
42.configurazioni {
43.jacoco gruppo / / configurazione utilizzata da Sonar per fornire code coverage con JaCoCo
44.}
45. 
46.​​/ / dipendenze che sono comuni a tutti i progetti java
47.dipendenze {
48....
49.jacoco gruppo: "org.jacoco" , name: "org.jacoco.agent" , versione:"0.5.3.201107060350" , classificatore: "runtime"
50....
51.}
52. 
53.prova {
54.jvmArgs "-javaagent:${configurations.jacoco.asPath}=destfile=${buildDir}/jacoco.exec,includes=org.your.project.*"
55.}
56....
57.}
Spero che questo sia informazioni utili per tutti gli utenti Gradle là fuori.