<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Javasioux &#187; Développement</title>
	<atom:link href="http://www.javasioux.fr/blog/category/dev/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.javasioux.fr/blog</link>
	<description>Par Jérôme Van Der Linden</description>
	<lastBuildDate>Mon, 21 Nov 2011 22:45:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Faire du neuf avec du vieux sur Android</title>
		<link>http://www.javasioux.fr/blog/2011/11/22/faire-du-neuf-avec-du-vieux-sur-android/</link>
		<comments>http://www.javasioux.fr/blog/2011/11/22/faire-du-neuf-avec-du-vieux-sur-android/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 22:20:53 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Développement]]></category>

		<guid isPermaLink="false">http://www.javasioux.fr/blog/?p=549</guid>
		<description><![CDATA[DISCLAIMER : Cet article devait initialement être publié sur le blog octo mais ayant pris un peu de retard, il a moins de valeur aujourd'hui donc je le mets ici... ca faisait longtemps que je n'avais pas publié sur mon blog :)

On ne peut pas vraiment parler de vieux quand on parle d'Android même s'il est vrai que les sdk 3 (1.5) et 4 (1.6) tendent à disparaître (respectivement 1% et 1.8% du parc). Mais lorsqu'on a réalisé une application basée sur le sdk 1.6 et qu'on souhaite bénéficier du push ou bien adresser les tablettes, on veut éviter de perdre 90% de ses utilisateurs... Voilà quelques éléments pour y parvenir.]]></description>
			<content:encoded><![CDATA[<h2>Notifications Push</h2>
<p>Comme Maxence le précisait <a href="http://blog.octo.com/notifications-push-android-c2dm/" target="_blank">dans son article traitant du sujet</a>, les notifications push ne fonctionnent qu&#8217;à partir du SDK 8 (2.2). On pourrait se contenter de migrer vers cette version mais on perdrait alors 16% des utilisateurs (contre 40% en février 2011).<br />
Que se passe-t-il exactement ? Sur un device au SDK antérieur, vous aurez l&#8217;erreur <i>PHONE_REGISTRATION_ERROR</i> au moment de vous enregistrer au service de Google.</p>
<p>Le problème ne vient pas du code écrit pour s&#8217;enregistrer (<a href="http://code.google.com/intl/fr-FR/android/c2dm/#registering" target="_blank">un simple Intent</a>), ni même de la configuration du manifest (<a href="http://code.google.com/intl/fr-FR/android/c2dm/#manifest" target="_blank">des permissions et un receiver</a>), et pas non plus du code pour recevoir les messages (un <a href="http://code.google.com/intl/fr-FR/android/c2dm/#received_data" target="_blank">BroadcastReceiver</a>).</p>
<p>Tout ceci est disponible dans le SDK 4, et on peut donc le mettre en place sans risquer d&#8217;avoir une UnsupportedOperationException. Par contre, afin d&#8217;éviter l&#8217;erreur à l&#8217;enregistrement du device, on va ajouter le bout de code suivant :</p>
<pre class="brush:java">
if (SysUtils.getSystemVersion() >= <img src='http://www.javasioux.fr/blog/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> {
	// register to C2DM
}
</pre>
<p><b>On n&#8217;utilise pas la constante <a href="http://developer.android.com/reference/android/os/Build.VERSION_CODES.html#FROYO" target="_blank">Build.VERSION_CODES.FROYO</a> qui n&#8217;est disponible qu&#8217;à partir du SDK 8 et donc on utilise sa valeur (8)</b>. Cette petite astuce permet de mettre le push à disposition des téléphones récents tout en supportant les téléphones plus anciens.</p>
<h2>Support des tablettes</h2>
<h3>Écrans XL</h3>
<p>La logique voudrait que les tablettes soient des écrans xlarge (>= 960dp x 720dp). Dans les faits ce n&#8217;est pas tout à fait vrai, il existe des tablettes dans la catégorie large (>= 640dp x 480dp). Google fournit dorénavant la propriété <a href="http://developer.android.com/guide/practices/screens_support.html#DeclaringTabletLayouts" target="_blank">smallestWidth</a> pour déterminer à partir de quelle largeur minimum un layout doit être sélectionné mais ce n&#8217;est disponible qu&#8217;en version 3.2. Nous avons pris le parti d&#8217;utiliser xlarge.</p>
<p>Pour ce faire, vous aurez besoin d&#8217;un <strong>répertoire <em>layout-xlarge</em> dans les ressources</strong> (et éventuellement <em>layout-xlarge-land</em> pour le mode paysage plus fréquemment utilisé pour les tablettes) : aucun problème pour ajouter ce répertoire même dans un projet en 1.6.</p>
<p>Le second point important est la quantité de données à afficher sur un écran de cette taille. On a tendance à regrouper plusieurs écrans en un seul pour profiter de tout l&#8217;espace et par conséquent de créer une nouvelle activité. Le problème qui se pose alors est comment réutiliser le code des mes deux, voire trois activités smartphone pour en constituer une seule pour tablette ?</p>
<p>Comme un exemple et un dessin valent tous les blablas, prenons l&#8217;exemple d&#8217;<a href="http://www.appaloosa-store.com" target="_blank">Appaloosa</a>, notre service de store privé :<br />
<a href="http://www.javasioux.fr/blog/wp-content/uploads/2011/11/fragment.png"><img src="http://www.javasioux.fr/blog/wp-content/uploads/2011/11/fragment-218x300.png" alt="" title="composition d&#039;écrans" width="218" height="300" class="alignnone size-medium wp-image-555" /></a></p>
<p>Le client Android fournit plusieurs activités pour les smartphones (liste d&#8217;applications, détail d&#8217;une application et commentaires d&#8217;une application) et une seule pour les tablettes. La première chose à faire est donc de choisir la bonne activité en fonction du device. Pour cela on créé une activité de démarrage : </p>
<pre class="brush:java">
public class LaunchActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		Intent startActivity = null;
		if ((getResources().getConfiguration().screenLayout &#038; Configuration.SCREENLAYOUT_SIZE_MASK) >= 4) {
			startActivity = new Intent(this,
					AppListAndDetailActivity.class);
		} else {
			startActivity = new Intent(this, AppListActivity.class);
		}
		startActivity(startActivity);
		finish();
	}
}
</pre>
<p>Comme pour le push, <strong>on utilise la valeur de la constante <a href="http://developer.android.com/reference/android/content/res/Configuration.html#SCREENLAYOUT_SIZE_XLARGE" target="_blank">Configuration.SCREENLAYOUT_SIZE_XLARGE</a> (4)</strong> plutôt que la constante elle-même, disponible à partir du SDK 9. Pour le reste, il s&#8217;agit simplement de lancer la bonne activité.</p>
<h3>Défragmentation des écrans</h3>
<p>Concernant le layout, on pourrait se contenter de concevoir un layout adapté mais ce serait dommage d&#8217;aborder les tablettes sans faire usage des <a href="http://developer.android.com/guide/topics/fundamentals/fragments.html" title="Fragments" target="_blank">Fragments</a>. D&#8217;autant que Google fournit depuis mars 2011 une <strong>librairie de rétrocompatibilité (<em><a href="http://developer.android.com/sdk/compatibility-library.html" title="Compatibility package" target="_blank">Compatibility Package</a></em>)</strong> permettant d&#8217;utiliser les fragments dans toutes les applications avec un sdk >= 1.6.</p>
<h4>Avant la bataille</h4>
<p><img src="http://www.javasioux.fr/blog/wp-content/uploads/2011/11/before_tablets-300x176.png" alt="" title="Smartphones" width="300" height="176" class="alignnone size-full wp-image-554" /></p>
<ul>
<li><code>res/layout/app_list_screen.xml</code> : layout contenant la ListView des applications.</li>
<li><code>AppListActivity.java</code> : contenant le code pour charger la liste des applications (AsyncTask pour l&#8217;appel du web service, ListAdapter pour l&#8217;affichage des lignes&#8230;).</li>
<li><code>res/layout/app_detail_screen.xml</code> : layout contenant les différentes info de l&#8217;application.</li>
<li><code>AppDetailActivity.java</code> : contenant le code pour charger le détail d&#8217;une application (divers AsyncTask pour le détail, les screenshots, le téléchargement du binaire&#8230;)</li>
</ul>
<p><h4>Utilisation des fragments</h4>
<p><a href="http://www.javasioux.fr/blog/wp-content/uploads/2011/11/after_tablets-1024x570.png"><img src="http://www.javasioux.fr/blog/wp-content/uploads/2011/11/after_tablets-1024x570-300x166.png" alt="" title="Tablettes" width="300" height="166" class="alignnone size-medium wp-image-553" /></a><br />
Après découpage en fragments, on a&#8230; <strong>beaucoup plus de fichiers</strong> ! Oui, en effet, mais c&#8217;est nécessaire pour éviter la duplication de code. Reprenons chaque fichier un par un :</p>
<h4>Déménagement des layout.xml dans les fragment.xml</h4>
<p>L&#8217;essentiel du fichier <code>app_list_screen.xml</code> se retrouve dans <code>app_list_fragment.xml</code> : la liste, le loading (chargement de la liste), l&#8217;empty message (message en cas de liste vide). Ne reste dans le fichier initial que le code suivant (entête et fragment) :</p>
<pre class="brush:xml">
&lt;LinearLayout
	android:orientation="vertical"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"&gt;

	&lt;include layout="@layout/header_layout"&gt;&lt;/include&gt;

	&lt;fragment class="com.octo.appaloosa.activity.AppListFragment"
			android:id="@+id/appListFragment"
			android:layout_width="fill_parent"
			android:layout_height="fill_parent"&gt;&lt;/fragment&gt;

&lt;/LinearLayout&gt;
</pre>
<h4>Des activités au fragments, il n&#8217;y a qu&#8217;un pas</h4>
<p><code>AppListActivity.java</code> (après refactoring) ne contient plus grand chose et <strong>étends FragmentActivity</strong> au lieu d&#8217;une simple Activity. Tous les événements onClick restent dans l&#8217;activité :</p>
<pre class="brush:java">
public class AppnListActivity extends FragmentActivity {

	private AppListFragment listFragment;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.app_list_screen);
		listFragment = (AppListFragment) getSupportFragmentManager().findFragmentById(R.id.appListFragment);
	}

	@Override
	protected void onResume() {
		super.onResume();
		listFragment.loadApplications();
	}
</pre>
<p><code>AppListFragment.java</code> contient dorénavant le code pour interagir avec la vue, utiliser les AsyncTask pour les web services, etc&#8230; :</p>
<pre class="brush:java">
public class AppListFragment extends Fragment {
	private List&lt;Application&gt; mApplicationsList = new ArrayList&lt;Application&gt;();
	private ListView mApplicationsListView;

	private AppListListener listener = new AppListListener() {
		public void onComplete(List&lt;Application&gt; apps) {
			mApplicationsList = apps
			((BaseAdapter)mApplicationsListView).notifyDataSetChanged();
		}
	};

	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.app_list_fragment, container, false);
		mApplicationsListView = (ListView)view.findViewById(R.id.applicationListView);
		mApplicationsListView.setAdapter(new AppListAdapter(mApplicationsList, getActivity()));
		return view;
	}

	public void loadApplications() {
		new AppListAsyncTask(getActivity(), listener).execute();
	}
}
</pre>
<p>Le mécanisme est assez proche d&#8217;une activité, les termes changent un peu (onCreateView au lieu de onCreate par exemple). Par ailleurs, il existe un fragment tout fait pour les listes (ListFragment), que nous n&#8217;avons pas utilisé car le layout contenait un peu plus qu&#8217;une simple liste (loading notamment). </p>
<p></p>
<h4>La version tablette</h4>
<p>Je vous épargne l&#8217;écran de détail qui est basé sur le même principe pour aborder l&#8217;écran tablette qui cumule la liste et le détail. <code>app_list_detail_screen.xml</code> est donc relativement simple puisqu&#8217;il <strong>utilise les mêmes fragments que les smartphones</strong> :</p>
<pre class="brush:xml">
&lt;LinearLayout
  	android:orientation="horizontal"
  	android:layout_width="fill_parent"
  	android:layout_height="0dp"
  	android:layout_weight="1"&gt;

  	&lt;fragment class="com.octo.appaloosa.activity.AppListFragment"
		android:id="@+id/appListFragment"
		android:layout_weight="1" android:layout_width="0dp"
		android:layout_height="fill_parent"&gt;&lt;/fragment&gt;

	&lt;fragment class="com.octo.appaloosa.activity.AppDetailFragment"
		android:id="@+id/appDetailFragment"
		android:layout_weight="2.5" android:layout_width="0dp"
		android:layout_height="fill_parent"&gt;&lt;/fragment&gt;
&lt;/LinearLayout&gt;
</pre>
</p>
<h3>Faire le bon choix</h3>
<p>Un point intéressant à regarder est l&#8217;action d&#8217;un click sur un élément de la liste. En effet, si on se trouve <strong>dans le cas du smartphone, on lance l&#8217;activité</strong> de détail (<code>AppDetailActivity</code>). Si on se trouve <strong>dans le cas de la tablette, on charge le détail dans le fragment</strong> associé : </p>
<pre class="brush:java">
public void onItemClick(AdapterView&lt;?&gt; parent, View view, int position, long id) {
	AppDetailFragment detailFragment = (AppDetailFragment) getFragmentManager().findFragmentById(R.id.appDetailFragment);
	if (detailFragment == null) {
		Intent intent = new Intent(getActivity(), AppDetailActivity.class);
		intent.putExtra("application", mApplicationsList.get(position));
		startActivity(intent);
	} else {
		if (detailFragment.getCurrentApplication() == null || detailFragment.getCurrentApp().getId().equals(mApplicationsList.get(position).getId()) == false) {
			detailFragment.loadApplicationDetail(mApplicationsList.get(position));
		}
	}
}
</pre>
</p>
<p>Au final, on a beaucoup plus de classes et de fichiers, mais les fragments (java + xml) sont réutilisables, ce qui nous permet d&#8217;envisager toute sorte d&#8217;interface et surtout envisager les tablettes, voire les TV&#8230;</p>
<h2>Conclusion</h2>
<p>En l&#8217;état actuel des choses, <strong>il possible de couvrir un spectre de <a href="http://developer.android.com/resources/dashboard/platform-versions.html" target="_blank">SDKs</a> relativement large (1.6 -> 4.0) et un spectre d&#8217;<a href="http://developer.android.com/resources/dashboard/screens.html" target="_blank">écrans</a> complet (small -> xlarge) avec une seule application</strong>. Toutefois, Google fournit la possibilité de proposer plusieurs apk pour une même application, par exemple si la version tablette contient des images HD assez lourdes que l&#8217;on souhaite épargner aux smartphones&#8230;</p>
<p>On dit souvent qu&#8217;Android est fragmenté (je ne le nierai pas complètement) mais cet article démontre que malgré la multitude de devices (qui fait aussi la richesse de la plateforme), on peut adresser 99% des utilisateurs sans trop de difficultés.</p>
<p>La sortie récente de Android 4.0 (Ice Cream Sandwich) promet de réunir les développements tablettes et smartphones mais en attendant d&#8217;avoir un parc conséquent d&#8217;appareils basés sur cette dernière mouture, il faudra continuer a jouer d&#8217;astuces pour cibler le plus grand nombre d&#8217;utilisateurs.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javasioux.fr/blog/2011/11/22/faire-du-neuf-avec-du-vieux-sur-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Distribuer les tests JUnit avec Gridgain et Maven</title>
		<link>http://www.javasioux.fr/blog/2009/09/20/distribuer-les-tests-junit-avec-gridgain-et-maven/</link>
		<comments>http://www.javasioux.fr/blog/2009/09/20/distribuer-les-tests-junit-avec-gridgain-et-maven/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 16:12:21 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[gridgain]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://www.javasioux.fr/blog/?p=496</guid>
		<description><![CDATA[L'un des principaux problèmes du build (sur le poste de dév et sur le serveur d'intégration continue) est le temps d'exécution des tests unitaires. Effectivement, dès lors que l'on dépasse le milliers de tests, on commence a dépasser les quelques minutes de temps d'exécution et multiplié par le nombre de développeurs et le nombre de builds quotidiens, on perd vite des heures !
Dans cet article, je vais utiliser mon outil de build quotidien (Maven) avec un outil de cloud nommé <a href="http://www.gridgain.com/" target="_blank">Gridgain</a> pour distribuer mes tests JUnit.]]></description>
			<content:encoded><![CDATA[<h2>Gridgain</h2>
<p>Gridgain est un framework open source permettant de développer des applications en cloud ou en grille. Basé sur des annotations, il permet depuis la version 1.6 de distribuer les tests :</p>
<pre lang="java">
public class GridTests extends TestSuite {

	@GridifyTest
	public static Test suite()
	{
		TestSuite suite = new TestSuite("Test for fr.javasioux.gridgain");
		suite.addTestSuite(ClientDaoTest.class);
		// ...
	}
}
</pre>
<p>L&#8217;annotation <a href="http://www.gridgain.com/javadoc/org/gridgain/grid/test/GridifyTest.html" target="_blank"><code>@GridifyTest</code></a> permet d&#8217;exécuter la suite de tests sur la grille, de même que si j&#8217;avais déclaré <a href="http://www.gridgain.com/javadoc/org/gridgain/grid/test/junit3/GridJunit3TestSuite.html" target="_blank"><code>GridJunit3TestSuite</code></a> au lieu de la simple <code>TestSuite</code>. </p>
<p>C&#8217;est censé fonctionner avec JUnit 4 également (<a href="http://www.gridgain.com/javadoc/org/gridgain/grid/test/junit4/GridJunit4Suite.html" target="_blank"><code>GridJunit4Suite</code></a>) mais j&#8217;ai essuyé quelques exceptions m&#8217;empêchant d&#8217;aller au bout&#8230;</p>
<p>Alors bien sûr, ce n&#8217;est pas magique et pour distribuer les tests, il faut bien un ou des noeuds sur lesquels les distribuer. Dans le répertoire <i>bin</i> de l&#8217;installation de grigain se trouve un fichier <i>gridgain-junit.bat</i> (ou .sh). Lancez le autant de fois que vous souhaitez de noeud. Bien entendu il s&#8217;agit du mode le plus simple de tester, en local tout sur la même machine.</p>
<p>Mais ce n&#8217;est pas tout. Plusieurs choses restent à configurer. Et plutôt que de le faire dans eclipse comme la <a href="http://www.gridgain.com/screencast/junit_integration/junit_integration.html" target="_blank">vidéo d&#8217;exemple</a> le montre, je vais le faire dans Maven&#8230;</p>
<h2>Maven</h2>
<h3>Dépendances</h3>
<p>Avant de rentrer dans les détails techniques, quelques généralités. Tout d&#8217;abord, les dépendances :</p>
<pre lang="xml">
<repositories>
	<repository>
		<id>gridgain</id>
		<name>GridGain Repository</name>
		<url>http://www.gridgainsystems.com/maven2/</url>
		<snapshots>
			<enabled>false</enabled>
		</snapshots>
		<releases>
			<enabled>true</enabled>
		</releases>
	</repository>
</repositories>

<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.4</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.gridgain</groupId>
		<artifactId>gridgain</artifactId>
		<version>2.1.1</version>
		<scope>test</scope>
	</dependency>
</dependencies>
</pre>
<p>Il faut ajouter le repo gridgain car les dépendances ne sont pour le moment pas dans le repo central.</p>
<h3>Compilation 1.5</h3>
<p>Compilation en 1.5 pour le support des annotations :</p>
<pre lang="xml">
<build>
<plugins>
<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<source>1.5</source>
				<target>1.5</target>
			</configuration>
		</plugin>
		<!-- ... -->
	</plugins>
</build>
</pre>
<h3>Exécution de la suite sur la grille</h3>
<pre lang="xml">
<properties>
	<aspectjweaver-version>1.6.4</aspectjweaver-version>
</properties>
<build>
<plugins>
<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-surefire-plugin</artifactId>
			<version>2.4</version>
			<configuration>
				<!-- (1) -->
				<includes>
					<include>**/GridTests.java</include>
				</includes>

				<!-- (2) -->
				<argLine>-javaagent:${basedir}/target/libs/aspectjweaver-${aspectjweaver-version}.jar</argLine>
				<workingDirectory>${basedir}/target/libs/</workingDirectory>
			</configuration>
		</plugin>

		<!-- (3) -->
<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-dependency-plugin</artifactId>
			<executions>
				<execution>
					<id>copy</id>
<phase>process-resources</phase>
					<goals>
						<goal>copy</goal>
					</goals>
					<configuration>
						<artifactItems>
							<artifactItem>
								<groupId>org.aspectj</groupId>
								<artifactId>aspectjweaver</artifactId>
								<version>${aspectjweaver-version}</version>
								<outputDirectory>${project.build.directory}/libs/</outputDirectory>
							</artifactItem>
						</artifactItems>
					</configuration>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>
</pre>
<ul>
<li>Premièrement, j&#8217;exclue les tests pour n&#8217;ajouter que la ou les suites de tests.</li>
<li>Ensuite, on a besoin de préciser le <a href="http://blog.xebia.fr/2008/05/02/java-agent-instrumentez-vos-classes/" target="_blank">javaagent</a> (<a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/instrument/package-summary.html" target="_blank">doc officielle</a>), en l&#8217;occurence aspectj weaver.</li>
<li>Et pour que le javaagent retrouve ses petits, il faut copier le jar dans le répertoire pointé par le javaagent.</li>
</ul>
<p>Un point important qu&#8217;on ne voit pas dans le pom est la présence du <i>META-INF/aop.xml</i> (disponible dans <i>gridgain-x.x.x/config/aop/aspectj/</i>) dans les ressources du projet (<i>src/test/resources</i>). Effectivement ce répertoire doit être dans le classpath.</p>
<h2>Exécution</h2>
<p>Comme je le disais plus haut, il faut lancer autant d&#8217;instances que nécessaire dans le répertoire bin de gridgain. Ensuite, depuis votre projet mave, lancez simplement un <code>mvn test -DGRID_ROUTER_PREFER_REMOTE=true</code></p>
<pre>
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running fr.javasioux.gridgain.GridTests
[00:56:01,906][INFO ][main][GridKernal%junit]
  _____      _     _  _____       _
 / ____|    (_)   | |/ ____|     (_)
| |  __ _ __ _  __| | |  __  __ _ _ _ __
| | |_ | '__| |/ _` | | |_ |/ _` | | '_ \
| |__| | |  | | (_| | |__| | (_| | | | | |
 \_____|_|  |_|\__,_|\_____|\__,_|_|_| |_|

...

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
</pre>
<p>Et voilà ! On a un build Maven qui exécute les tests en parallèle sur plusieurs noeuds.</p>
<h2>Conclusion</h2>
<p>Ecrire des tests, c&#8217;est bien&#8230; Les executer, c&#8217;est mieux ! Et donc si vous avez arrete de les executer car vous etes perpetuellement en train d&#8217;attendre qu&#8217;ils soient termines, gridgain peut vous aider. Ce framework de cloud permet (entre autre) de dispatcher les tests en parallele sur differents noeuds et ainsi diminuer la duree du build.</p>
<p>Toutefois, lancer plusieurs fois gridgain-junit.bat sur son poste fini par plomber le temps de build plutot que de l&#8217;ecourter. Il faut donc mettre en place une vraie infrastructure de cloud sur des serveurs / VM distantes pour y gagner. Je suis parvenu à utiliser <a href="http://www.gridgain.com/screencast/jboss_gridgain_integration/jboss_gridgain_integration.html" target="_blank">gridgain dans un JBoss</a> local (Mac OS) depuis une VM Windows (Gridgain peut <a href="http://www.gridgainsystems.com/wiki/display/GG15UG/GridMulticastDiscoverySpi">découvrir</a> les noeuds faisant partie de la grille) : <img alt="" src="http://www.javasioux.fr/blog/wp-content/uploads/2009/09/gridgain_remote.png" title="Grigain remote" class="aligncenter" /></p>
<p>Sur l&#8217;integration continue, cela peut egalement etre utile pour alleger la charge sur serveur. L&#8217;ideal serait de pouvoir combiner cette fonctionnalite avec les possibilites de build distribue fournies par les principaux acteurs du marche (Teamcity, Hudson) et ainsi lancer les tests sur lea agents deja configure. A quand un plugin Hudson Gridgain ?!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javasioux.fr/blog/2009/09/20/distribuer-les-tests-junit-avec-gridgain-et-maven/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Compte rendu CITCON Paris 2009</title>
		<link>http://www.javasioux.fr/blog/2009/09/20/compte-rendu-citcon-paris-2009/</link>
		<comments>http://www.javasioux.fr/blog/2009/09/20/compte-rendu-citcon-paris-2009/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 12:38:11 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[citcon]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[intégration continue]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://www.javasioux.fr/blog/?p=517</guid>
		<description><![CDATA[Ce samedi avait lieu la <a href="http://citconf.com/paris2009/" target="_blank">CITCON</a> Europe 2009 à Paris. CITCON pour Continuous Integration and Test CONference, donc pour les anglophobes Conférence sur l'Intégration Continue et les Tests. J'ai eu la joie d'y participer et donc voici un résumé de ce que j'ai pu y voir et entendre.]]></description>
			<content:encoded><![CDATA[<p><strong>Vendredi Soir 18h30</strong> : Début des festivités, présentation individuelle des 100 et quelques personnes dans la plus grande salle de l&#8217;ISEP qui accueillait la conférence. Pour faire rapide, chacun dit son nom, comment il a connu la CITCON et ce qu&#8217;il est venu y chercher. Mine de rien, au rythme de 30 secondes par personnes, on a bien passé plus d&#8217;une heure à se présenter. L&#8217;occasion de revoir des visages connu : <a href="http://massol.myxwiki.org/xwiki/bin/view/Blog/" target="_blank">Vincent Massol</a>, <a href="http://blog.aheritier.net/" target="_blank">Arnaud Héritier</a>, <a href="http://www.touilleur-express.fr/" target="_blank">Nicolas Martignole</a> et de mettre des noms sur des visages : Hervé Boutemy avec qui j&#8217;ai relu le livre Maven Fr d&#8217;Arnaud Héritier et <a href="http://blog.loof.fr/" target="_blank">Nicolas De Loof</a> à paraître prochainement.</p>
<p>Suite à cela, proposition de sujets. Tous ceux qui le souhaitaient, passaient au tableau présenter rapidement un sujet. C&#8217;était très varié : quelques topics orientés outils (Plugins Hudson, futur de l&#8217;IC&#8230;), pas mal autour des tests (accélérer les tests, les mocks, les UAT, les tests sur la bdd), l&#8217;agile (scrum) et j&#8217;en passe.</p>
<p><center>~~~~~~~~~~~~~~~</center></p>
<p><strong><br />
Samedi matin, 10h00, première session sur les plugins Hudson</strong>, où comment développer un plugin hudson, quels plugins manquent, etc&#8230; </p>
<p><a href="http://citconf.com/wiki/index.php?title=Douglas_Squirrel" target="_blank">Douglas Squirrel</a> nous présente un plugin qu&#8217;il a développé pour voir le status d&#8217;agents depuis Nagios (par exemple lorsque le serveur maître est down). Son retour d&#8217;expérience est que la <a href="http://wiki.hudson-ci.org/display/HUDSON/Extend+Hudson" target="_blank">documentation</a> pour créer des plugins est relativement bien faite et que l&#8217;utilisation de maven facilite la chose (<code>mvn hpi:create</code>). Par contre, l&#8217;utilisation de <a href="http://wiki.hudson-ci.org/display/HUDSON/Basic+guide+to+Jelly+usage+in+Hudson" target="_blank">jelly</a> pour la création de vue est assez déroutante ainsi que savoir où placer son code. Heureusement la communauté est là et <a href="http://www.java.net/blogs/kohsuke/" target="_blank">Kohsuke Kawaguchi</a> aussi ! Une fois votre plugin codé, la commande <code>mvn hpi:run</code> lance un hudson en local et vous pouvez tester votre création. Donc n&#8217;ayez pas peur de vous lancer, ca fait pas mal normalement. Je vais peut-être tenter&#8230; </p>
<p>On est ensuite parti sur les plugins et améliorations à avoir : meilleure gestion des dépendances entre build avec par exemple la possibilité d&#8217;avoir un graph des dépendances entre build, la distribution des tests unitaires : j&#8217;ai bien envie de tenter de distribuer les tests avec gridgain sur les agents configurés dans hudson (un article devrait arriver d&#8217;ici peu sur le sujet).</p>
<p><center>~~~~~~~~~~~~~~~</center></p>
<p><strong><br />
11h15, deuxième session.</strong> J&#8217;ai commencé par aller voir le sujet du <strong>déploiement en continu</strong>,  mais étant arrivé après le départ, j&#8217;ai eu du mal a entrer dans la discussion. Ils parlaient de pipeline de build avec toutes les étapes de l&#8217;intégration continue. Ca m&#8217;a paru bien loin du sujet initial et j&#8217;ai donc changé de salle (c&#8217;est le principe des open spaces, si ca ne vous plait pas, partez) pour aller discuter <strong>release de (gros) projets</strong>. Vincent Massol se pose la question de comment automatiser la release : quand un produit (au hasard XWiki <img src='http://www.javasioux.fr/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ) est composé de nombreux modules (qui n&#8217;ont pas forcément tous bougé et n&#8217;ont dont pas forcément à être releasé), le <code>mvn release</code> n&#8217;est pas forcément adapté puisqu&#8217;il descend dans les sous modules et les release tous. Après nous avoir présenté sa manière de faire pour les releases XWiki (une belle et longue procédure), on part sur la réalisation d&#8217;un algo pour trouver les dépendances d&#8217;un projet qui ont évolué depuis la dernière release :</p>
<pre lang="java">
// En récursif sur le projet parent et tous les modules :
List currentDependencies = getDependencies();
// Faire de même avec la version précédente du projet (avec le scm, récupérer la version tagé antérieure)
List previousDependencies = getPreviousDependencies();
// Faire le diff des deux listes sur les versions => on obtient les modules ayant évolués
// On peut ainsi releaser ce qui a été modifié
// On peut avoir les évolutions de version pour la release note
</pre>
<p>On s&#8217;est ensuite plongé dans le code du plugin dependency pour essayer d&#8217;y inclure le mojo <em>diff</em> permettant d&#8217;avoir le différentiel entre deux versions sans toutefois aller bien loin puisque le déjeuner nous appelait.<br />
On a également mentionné un plugin Maven que je ne connaissais pas : <a href="http://mojo.codehaus.org/versions-maven-plugin/" target="_blank">versions-maven-plugin</a> et qui permet, comme son nom l&#8217;indique, de jouer sur les versions des artefacts et entre autre de setter une version pour un projet et tous les modules qui le constituent (fini les grep !) ou encore d&#8217;avoir la liste des dépendences et plugins qui sont disponibles dans une version plus récente. </p>
<p><center>~~~~~~~~~~~~~~~</center></p>
<p>Le déjeuner est l&#8217;occasion de discuter avec Hervé Boutémy d&#8217;OSS : Apache, Maven, Archiva, Continuum, Jason Van Zyl&#8230; discussion intéressante sur le passage de l&#8217;open source au gain de sa vie (distinction avec &laquo;&nbsp;se faire de l&#8217;argent&nbsp;&raquo;).</p>
<p><center>~~~~~~~~~~~~~~~</center></p>
<p><strong><br />
14h00, session sur la rapidité des tests.</strong> La session commence par une question : &laquo;&nbsp;combien de temps prennent des tests rapide ?&nbsp;&raquo;, sans toutefois préciser de quel type de test on parle. On en arrive à généraliser à comment avoir un feedback rapide (pas seulement les tests mais le build complet) et il émerge que 5 minutes est le maximum raisonnable.<br />
Douglas Squirrel nous présente son expérience avec selenium : 12 agents hudson, 15 agents pour selenium pour tester sur différents browsers. Avec cette technique, il en a pour 25 minutes à faire ses tests d&#8217;IHM.<br />
Par la suite, différentes propositions sont faites : </p>
<ul>
<li>Exploiter au mieux les différents cœurs des processeurs (chose qui n&#8217;est actuellement pas le cas avec surefire par exemple et qui pourrait s&#8217;avérer vraiment bénéfique)</li>
<li>Distribuer les tests avec Gridgain (pour JUnit) ou TestNG</li>
<li>Utiliser une base mémoire (HSQL, H2) pour les tests unitaires. On s&#8217;est attardé sur le fait de commiter ou pas les requetes mais étant en mémoire, je ne vois pas le problème de commiter. </li>
<li>Le personnal build (fonctionnalité de Teamcity) pour permettre de continuer à coder pendant que l&#8217;intégration continue déroule le build (sans toutefois commiter le code pour ne pas perturber les autres développeurs).</li>
<li>Et une fois que toutes les solutions <em>annexes</em> ont été mentionnées, quelqu&#8217;un a tout de même dit : &laquo;&nbsp;et si c&#8217;était les tests qui étaient pourris&nbsp;&raquo;. Donc plutôt que de chercher à améliorer le build, améliorer les tests eux-mêmes. Il parle de réduire le nombre de tests, qui en soit peut être une bonne chose si la couverture reste équivalente. Mais pour cela, il souhaite utiliser des valeurs aléatoires. Je l&#8217;interpelle &laquo;&nbsp;comment on peut connaître le résultat attendu en faisant du random ?&nbsp;&raquo; Alors effectivement, c&#8217;est pas tout à fait du random. On a une map avec les valeurs d&#8217;entrée et leurs sorties attendus et on test un cas au hasard. Avec le nombre de builds joués par jour, on s&#8217;attend à avoir couvert l&#8217;ensemble. On diminue effectivement le nombre de tests mais je ne suis pas convaincu de la reproductibilité, du moyen de corriger une erreur détectée par un test&#8230;</li>
</ul>
<p><strong>15h15, session Cloud</strong>, le sujet du moment. Avant toute chose, on a décrit les raisons pour lesquelles on veut aller sur le cloud :</p>
<ul>
<li>Réduction des coûts d&#8217;infrastructure (serveurs), maintenance et mise à jour des outils</li>
<li>Optimisation du coût d&#8217;utilisation du CPU.</li>
<li>Gérer au mieux les pics de charges. Comme vous pouvez le voir sur le graphique, le serveur d&#8217;intégration continue n&#8217;est utilisé qu&#8217;à certains moment (en bleu) et donc le reste du temps, on paye pour rien (en rouge).<br />
<center><img src="http://www.javasioux.fr/blog/wp-content/uploads/2009/09/ci_usage.png" alt="Utilisation du serveur d'intégration continue"/></center></li>
</ul>
<p>Ensuite, on a parlé des différents problèmes que l&#8217;on peut avoir à mettre le serveur sur le cloud (Amazon EC2 par exemple). Plusieurs choses : </p>
<ul>
<li>La première à mon sens est la sécurité. Tout le monde n&#8217;a pas d&#8217;algo de pricing ultra protégé mais pour ceux la, le code n&#8217;est pas prêt d&#8217;être déporté. J&#8217;ai récemment vu dans une grande banque d&#8217;investissements française que d&#8217;une équipe à une autre, il ne souhaitait pas diffusé le code donc ce n&#8217;est pas encore pour tout le monde. Mais il existe des solutions, il est effectivement possible de mettre en place un VPN et ainsi limiter le risque. J&#8217;ai beaucoup aimé la remarque de Nicolas Martignole qui &laquo;&nbsp;fait plus confiance en Amazon qu&#8217;en son équipe IT&nbsp;&raquo; et qui imagine bien dans quelques mois ou années coder sur son poste et compiler/tester&#8230; sur le cloud.</li>
<li>Autre problème mentionné, les latences réseaux</li>
<li>Les limitations en cas d&#8217;environnement complexes&#8230; on ne peut pas tout déporter.</li>
</ul>
<p>Une des personnes présentes a mentionné <a href="http://www.eucalyptus.com/">Eucalyptus Cloud</a> et en est plutôt satisfait.</p>
<p><center>~~~~~~~~~~~~~~~</center></p>
<p><strong><br />
Conclusion</strong>, je n&#8217;ai pas pu participé à la dernière session, mais je suis assez satisfait de ma journée. Des discussions intéressantes, des gens intéressants, bien entendu, vu le nombre de sujets en parallèles à chaque session, il m&#8217;a fallu choisir mais aucun regret sur mes choix. L&#8217;une des sessions consistait à choisir le prochain pays d&#8217;Europe à accueillir CITCON et donc, on verra l&#8217;année prochaine si je pourrai remettre ça.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javasioux.fr/blog/2009/09/20/compte-rendu-citcon-paris-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Astuce du jour Android : récupérer dynamiquement une ressource</title>
		<link>http://www.javasioux.fr/blog/2009/05/29/astuce-du-jour-android-recuperer-dynamiquement-une-ressource/</link>
		<comments>http://www.javasioux.fr/blog/2009/05/29/astuce-du-jour-android-recuperer-dynamiquement-une-ressource/#comments</comments>
		<pubDate>Fri, 29 May 2009 21:43:20 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Développement]]></category>

		<guid isPermaLink="false">http://www.javasioux.fr/blog/?p=467</guid>
		<description><![CDATA[Petite astuce si comme moi vous cherchez à récupérer dynamiquement une ressource (drawable, color...) en connaissant son nom...]]></description>
			<content:encoded><![CDATA[<p>Mon besoin est simple, la solution aussi&#8230;</p>
<p>
Sur métroide (mon application de calcul d&#8217;itinéraire de metro pour Android), j&#8217;ai un grand nombre d&#8217;images pour toutes les lignes du métro (+rer et tram) que je dois afficher dynamiquement sur l&#8217;itinéraire.</p>
<p>
<u>Comme un exemple vaut mille paroles, exemple</u> :<br />
J&#8217;ai l&#8217;itinéraire suivant : nation (&laquo;&nbsp;m1&#8243;: ligne 1 du métro), porte d&#8217;italie (&laquo;&nbsp;m7&#8243;).<br />
Je vais donc avoir besoin des images R.drawable.m1 et R.drawable.m7. Mais je n&#8217;ai qu&#8217;une chaine de caractère pour spécifier le nom de l&#8217;image. J&#8217;aurais aimé faire un truc du genre R.drawable["m1"] ou R.drawable.get(&laquo;&nbsp;m7&#8243;)&#8230; mais malheureusement, ce n&#8217;est pas possible. Je dois avouer que pour le concours SFRJTD, je n&#8217;ai pas poussé plus loin mes recherches et j&#8217;ai fait un switch en découpant ma chaine (m1 -> m et 1, donc m me dit metro, 1 ligne 1, je prend donc R.drawable.m1)&#8230; berk !</p>
<p>
Cette solution ne me convenant pas et n&#8217;ayant pas trouvé de réponse à ma question, je me suis dit : &laquo;&nbsp;tant qu&#8217;a faire crade, pourquoi ne pas faire de l&#8217;introspection ?&nbsp;&raquo; Et c&#8217;est comme ca que j&#8217;ai réduit un switch de 40 lignes en 5 lignes comme ceci :</p>
<pre lang="java">
try {
	Field f = R.drawable.class.getField(line); // line = "m1" ou "rb" ou "t3"...
	return f.getInt(null); // class static et champs static dans R, on peut laisser à null
} catch (Exception e) {
	return R.drawable.empty;
}
</pre>
<p>Je ne suis pas encore complètement convaincu et je me dis que j&#8217;ai du me prendre la tête à faire compliqué alors que c&#8217;est prévu dans le SDK. Si tel est le cas, je suis preneur de vos solutions&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javasioux.fr/blog/2009/05/29/astuce-du-jour-android-recuperer-dynamiquement-une-ressource/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Paris Jug 12/05/09</title>
		<link>http://www.javasioux.fr/blog/2009/05/13/paris-jug-120509/</link>
		<comments>http://www.javasioux.fr/blog/2009/05/13/paris-jug-120509/#comments</comments>
		<pubDate>Wed, 13 May 2009 08:28:50 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[hot deploy]]></category>
		<category><![CDATA[javarebel]]></category>
		<category><![CDATA[paris jug]]></category>
		<category><![CDATA[productivité]]></category>

		<guid isPermaLink="false">http://www.javasioux.fr/blog/?p=463</guid>
		<description><![CDATA[Hier soir, se déroulait comme tous les mois, le <a href="http://www.parisjug.org/xwiki/bin/view/Meeting/20090512" target="_blank">Paris JUG</a>. Au programme : cache distribué, grille de données, <a href="http://www.terracotta.org/web/display/orgsite/What+Is+Terracotta" target="_blank">Terracotta</a> en première partie et <a href="http://www.zeroturnaround.com/javarebel/" target="_blank">javarebel</a> en fin de session.]]></description>
			<content:encoded><![CDATA[<h1>Cache distribué, NAM et grilles</h1>
<p>Je ne vais pas m&#8217;étendre sur la première partie présentée par <a href="http://www.parisjug.org/xwiki/bin/view/Speaker/AlliaumeErwan" target="_blank">Erwan Alliaume</a> et <a href="http://www.parisjug.org/xwiki/bin/view/Speaker/LeclercCyrille" target="_blank">Cyrille Le Clerc</a> de Xebia ainsi que <a href="http://www.parisjug.org/xwiki/bin/view/Speaker/BeaJeanMichel" target="_blank">Jean-Michel Bea</a> de FastConnect, le touilleur a encore une fois fait <a href="http://www.touilleur-express.fr/2009/05/13/compte-rendu-de-la-soiree-datagrid-et-javarebel/" target="_blank">un bon résumé</a>. La session était dense mais très intéressante.</p>
<h1>Javarebel</h1>
<p>Je vais m&#8217;attarder un peu plus sur la deuxième partie (qui n&#8217;a duré qu&#8217;une demi heure) dont le sujet me correspond plus : la productivité des développements avec JavaRebel. C&#8217;est <a href="http://www.zeroturnaround.com/author/toomasr/" target="_blank">Toomas Römer</a> de ZeroTurnaround qui nous présente l&#8217;outil.</p>
<p>
La démo de l&#8217;outil est toujours aussi bluffante (dispo <a href="http://www.zeroturnaround.com/javarebel-demonstration-screencast/" target="_blank">ici</a> et <a href="http://www.zeroturnaround.com/javarebel-spring-integration-screencast/" target="_blank">là</a>), d&#8217;autant que pressé par le temps, Toomas l&#8217;a déroulé assez vite, ajoutant du punch à la démo :</p>
<ul>
<li>Modification d&#8217;une jsp => rafraichissement instantané de la page web</li>
<li>Modification d&#8217;un validator => rafraichissement instantané de la page web</li>
<li>Ajout de méthode, de paramètres => rafraichissement instantané de la page web</li>
<li>Ajout d&#8217;un bean spring et d&#8217;une jsp => rafraichissement instantané de la page web</li>
</ul>
<p>Aucun repackaging, aucun redéploiement, aucune perte de temps ! C&#8217;est l&#8217;objectif de Javarebel : éviter de devoir recompiler, retester, repackager et surtout redéployer l&#8217;application à chaque modification du code.</p>
<p>
La démo nous laisse à penser : &laquo;&nbsp;mais comment j&#8217;arrive à supporter mes builds Maven de plusieurs minutes ?&nbsp;&raquo; Probablement parce qu&#8217;on n&#8217;a pas goûté à ce plaisir&#8230;</p>
<p>
A la fin de la session, on a le droit à une question intéressante qui est de savoir s&#8217;il (Toomas ndlr) n&#8217;avait pas peur que les développeurs ne prennent plus le temps de réfléchir à leur code (modélisation, archi&#8230;) mais se contentent de coder / tester / coder&#8230; pour se rendre compte au bout de plusieurs heures que leur code n&#8217;est pas bon. Ce à quoi Toomas a répondu que l&#8217;outil était là pour éviter de perdre du temps au redéploiement (10 minutes par ci, 10 minutes par là) et ne devait pas changer la manière dont travaillent les développeurs. Et Antonio d&#8217;ajouter qu&#8217;on ne pourrait plus prendre autant de pauses cafés <img src='http://www.javasioux.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  !</p>
<p>
A l&#8217;issue de la présentation, en discutant avec Erwan (qui avait <a href="http://blog.xebia.fr/2008/11/14/javarebel/" target="_blank">blogué sur le sujet</a>), il s&#8217;avère que l&#8217;outil n&#8217;est pas tout à fait aussi magique, tou au mions pas tout le temps. Notamment sur un gros projet, Javarebel rame et finit même par planter. Je présume qu&#8217;il doit bien s&#8217;appliquer sur des appli webs relativement simples.</p>
<p>
En tout cas je suis persuadé que la démo plus quelques chiffres pourraient convaincre quelques managers de l&#8217;intérêt de l&#8217;outil.<br />
Pensez donc : 10 développeurs qui redéploiement environ 10 fois par jours au prix de 5 minutes à chaque fois (maven + serveur d&#8217;app) : 500 minutes (8h), soit 1j.h perdu par jour ! Au regard du prix de la <a href="http://sales.zeroturnaround.com/" target="_blank">license</a> (150 $ pour une entreprise), ca donne à réfléchir !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javasioux.fr/blog/2009/05/13/paris-jug-120509/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Retour sur le livre &#171;&#160;Fact &amp; Fallacies about Software Engineering&#160;&#187;</title>
		<link>http://www.javasioux.fr/blog/2009/03/13/retour-sur-le-livre-fact-fallacies-about-software-engineering/</link>
		<comments>http://www.javasioux.fr/blog/2009/03/13/retour-sur-le-livre-fact-fallacies-about-software-engineering/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 12:50:48 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[Développement]]></category>

		<guid isPermaLink="false">http://www.javasioux.fr/blog/?p=382</guid>
		<description><![CDATA[<table><tr><td><img src="http://www.informit.com/ShowCover.aspx?isbn=0321117425&#038;type=f" alt="Fact &#038; Fallacies about Software Engineering" /></td><td>Me voilà de retour après un déménagement et pas mal de boulots dans mes nouveaux murs pour vous parler d'un livre de Robert L. Glass : <u>Fact &#038; Fallacies about Software Engineeing</u>... <p>
Si vous recherchez "Robert L Glass" sur Amazon, vous aurez le droit à une <a  target="_blank" href="http://www.amazon.com/exec/obidos/search-handle-url/ref=ntt_athr_dp_sr_1?_encoding=UTF8&#038;search-type=ss&#038;index=books&#038;field-author=Robert%20L%20Glass">liste impressionnante d'ouvrages</a> consacrés au développement logiciel. Parmi tous ces livres, se trouve celui dont je vais vous parler ici : <a href="http://www.amazon.com/Facts-Fallacies-Software-Engineering-Development/dp/0321117425/ref=sr_1_2?ie=UTF8&#038;s=books&#038;qid=1236602018&#038;sr=1-2" target="_blank">Fact &#038; Fallacies about Software Engineering</a>. Pour les non anglophones, je traduis : les faits et les fictions (ou illusions, croyances) du développement logiciel. Au travers d'une cinquantaine de faits et dix fictions, l'auteur nous fait part de son avis sur les problèmes rencontrés dans le développement logiciel.</td></tr></table>]]></description>
			<content:encoded><![CDATA[<h1>La forme</h1>
<p>Rapidement sur la forme, l&#8217;auteur nous liste les 55 faits et 10 fictions avec les éléments suivants :</p>
<ul>
<li>Le fait ou la fiction</li>
<li>Une description : l&#8217;analyse du fait et les éléments qui portent l&#8217;auteur à croire ce qu&#8217;il mentionne (expérience personnelle principalement)</li>
<li>Les controverses : les opinions contraires au fait, </li>
<li>Les sources et références : des pointeurs vers des livres ou articles témoignant en faveur des faits mentionnés</li>
</ul>
<p>C&#8217;est un peu une liste à la Prévert mais chaque sujet est bien traité, ça reste donc facilement lisible. </p>
<h1>Le fond</h1>
<p>Sur le contenu, on peut ne pas être d&#8217;accord avec tout ce qu&#8217;il mentionne (d&#8217;où les parties &laquo;&nbsp;controverses&nbsp;&raquo;), mais globalement, le bonhomme est plein de bon sens et on sent qu&#8217;il a du vécu. Le plus incroyable reste à mon sens les références vers des ouvrages qui ont parfois plus de 30 ans mais qui sont pourtant toujours d&#8217;actualité : gestion de projet/d&#8217;équipe, cycle de vie du logiciel, qualité du logiciel&#8230; À croire qu&#8217;on n&#8217;a pas appris de nos erreurs après toutes ces années !</p>
<p>
Je ne vais pas vous recopier le livre, simplement énoncer/refactorer quelques faits intéressants qui à eux seuls méritent que tous les chefs/directeurs/managers de projets lisent le livre :</p>
<h3>Les hommes</h3>
<p>Le premier concerne les développeurs et la gestion des ressources. Les managers ont tendance à croire qu&#8217;un développeur est une ressource, au même titre qu&#8217;un serveur. Lorsque le serveur tombe en panne, on le change. Lorsque le serveur est trop lent, on en ajoute un autre. Pourquoi ne pas faire pareil avec les développeurs ? Ils sont trop lent, on en ajoute ! Un d&#8217;entre eux s&#8217;en va, on l&#8217;échange ! </p>
<p>Et bien malheureusement, ça ne marche pas comme ça&#8230; eh oui ! Une équipe trop lente ne sera que plus ralentie si on ajoute d&#8217;autres personnes (temps de formation, communication plus difficile, répartition des tâches&#8230;). De même, lorsqu&#8217;un développeur s&#8217;en va, on ne se contente pas d&#8217;en mettre un autre lorsque le premier est parti, il y a un minimum de passage de connaissances à faire !</p>
<p>Enfin, si on devait tout de même faire l&#8217;analogie au serveur, si on veut une application rapide, il faut un serveur rapide (plus puissant). Donc si on veut une application développée rapidement et efficacement (de meilleure qualité j&#8217;entends), on prend des développeurs meilleurs. Selon R. Glass et ses sources, un bon développeur peut être jusqu&#8217;à 28 fois meilleur qu&#8217;un mauvais ! Tout ça pour dire que vous n&#8217;aurez pas forcément votre logiciel plus rapidement avec deux prestataires débutants à 400€/j plutôt qu&#8217;un développeur plus expérimenté facturé 800, bien au contraire !</p>
<h3>Estimation des charges et délais</h3>
<p>Je vais simplement reprendre une anecdote du bouquin vécue par l&#8217;auteur : chez un de ses clients, il a demandé aux développeurs comment s&#8217;était déroulé le projet. Ceux-là lui ont répondu que le projet fonctionnait bien et respectait les besoins du client. Il a ensuite posé la même question au chef de projet qui a déclaré que c&#8217;était un échec, que les délais prévus avaient été dépassés de moitié&#8230;</p>
<p>J&#8217;aime beaucoup cette petite anecdote et le fait qui lui est associé : une des principales causes des dépassements de délais (et donc pour certains managers d&#8217;échec du projet) est la mauvaise estimation du projet. </p>
<p>Les raisons qu&#8217;il cite sont multiples : </p>
<ul>
<li>On fait l&#8217;estimation au mauvais moment : à quoi bon estimer un projet avant d&#8217;avoir les spécifications ? On ne sait pas encore ce que va faire le logiciel et il faudrait déjà planifier sa durée ?</li>
<li>L&#8217;estimation est faite par les mauvaises personnes. Bien souvent, ce sont les managers qui déterminent la date butoire de livraison. Mais savent-ils vraiment ce qu&#8217;il faut faire ? Et quand bien même, savent-ils combien de temps il faut à leurs développeurs pour le faire ? Les développeurs seraient plus à même d&#8217;estimer leur charge en fonction des besoins et le manager, lui, se contenterait d&#8217;agréger ces infos, prendre la marge nécessaire et ainsi avoir une estimation plus proche du terrain&#8230;</li>
<li>L&#8217;estimation est faite à partir de mauvaises bases : nombre de lignes de code (comment on peut savoir à l&#8217;avance le nombre de lignes de code qui vont constituer le logiciel ?!), rapprochement avec les expériences passées (&laquo;&nbsp;mon dernier projet avait mis 6 mois, là ça devrait prendre un peu plus, allez on va dire 8 !&nbsp;&raquo;)</li>
</ul>
<p>Effectivement, si l&#8217;on prévoit 1 an pour un projet et qu&#8217;on en met 2, on peut se dire qu&#8217;on a échoué. On peut aussi se dire que 1 an était peut-être sous-estimé et que même si on a dépassé, on a un projet qui répond au besoin (si c&#8217;est effectivement le cas, sinon oui c&#8217;est probablement un échec).</p>
<h3>La réutilisation</h3>
<p>Bien souvent, on nous demande de développer des logiciels dont le code puisse être réutilisable (modules, frameworks). Ça part d&#8217;un bon sentiment, limiter le nombre de fois où l&#8217;on va développer la même chose. Mais est-on bien sûr qu&#8217;il s&#8217;agisse effectivement de la même chose. D&#8217;après lui et certaines études qu&#8217;il mentionne, pour être sûr que du code est vraiment réutilisable, il faut qu&#8217;il soit réutilisé avec succès dans 3 applications différentes.</p>
<h3>Cycle de vie du logiciel</h3>
<p>Concernant le cycle de vie, quelques faits bien connus, mais pourtant toujours aussi mal appréhendés:</p>
<h4>Spécification</h4>
<p>Notamment, il rappelle que la principale cause des projets en retard est l&#8217;instabilité des spécifications et que les erreurs de spécifications (les &laquo;&nbsp;features&nbsp;&raquo; comme dirait un certain <a href="http://www.tomsquest.com/blog/" target="_blank">Tom</a> <img src='http://www.javasioux.fr/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) sont les plus chères et compliquées à corriger.<br />
Ça me paraît évident mais on perpétue la tradition des dossiers de spécification (de plusieurs centaines de pages, voire de plusieurs tomes), rédigés en année/homme avant de commencer à concevoir et développer&#8230;<br />
Je doute que cela change si on n&#8217;ajoute pas une pointe d&#8217;agilité dans notre manière de recueillir et retranscrire le besoin.</p>
<h4>Revues de code et rétrospectives</h4>
<p>Je vous passe le design, le code&#8230; pour vous parler de revue de code. C&#8217;est une pratique assez rare et pourtant selon l&#8217;auteur, elle permettrait de supprimer jusqu&#8217;à 90 % des erreurs avant même les tests. Les tests restent donc essentiels.</p>
<p>
Il mentionne également les rétrospectives comme étant importante pour le bon fonctionnement de l&#8217;équipe, mais elles aussi sont trop rarement pratiquées. Les rétrospectives permettent de faire le point à l&#8217;issu d&#8217;un projet (ou d&#8217;une phase) sur ce qui a marché, ce qui a moins marché et comment s&#8217;améliorer. Cela permet à l&#8217;équipe d&#8217;apprendre de ses erreurs pour éviter de les refaire.</p>
<h3>Qualité</h3>
<p>J&#8217;aime beaucoup ce qu&#8217;il dit sur le sujet : &laquo;&nbsp;La qualité, ce n&#8217;est pas la satisfaction de l&#8217;utilisateur, ce n&#8217;est pas non plus la concordance avec les besoins, ni même le respect des délais et du budget&nbsp;&raquo;. Ce sont peut-être des critères de réussite d&#8217;un projet, mais en aucun cas des critères de sa qualité.</p>
<p>Et il mentionne les 7 critères suivants:</p>
<ul>
<li>La portabilité (fonctionne sur des environnements différents)</li>
<li>La fiabilité du logiciel (pas de plantage)</li>
<li>L&#8217;efficacité (les performances)</li>
<li>L&#8217;usabilité (ergonomie, productivité des utilisateurs&#8230;)</li>
<li>La testabilité (avoir une application qui soit testable, automatiquement si possible)</li>
<li>La compréhensibilité (compréhension du code à sa relecture)</li>
<li>La modifiabilité (le code est facilement modifiable)</li>
</ul>
<p>Effectivement, ça me va mieux comme &laquo;&nbsp;définition&nbsp;&raquo; de la <a href="http://en.wikipedia.org/wiki/Software_quality" target="_blank">qualité</a>.</p>
<h3>Autres sujets</h3>
<p>Il aborde de nombreux autres sujets tout aussi intéressants : la maintenance, les tests, la formation des développeurs, les outils&#8230; mais je vous laisse le soin de vous faire votre avis en lisant ce livre.</p>
<h2>Conclusion</h2>
<p>Je vais passer pour un contestataire mais je ne saurai que trop conseiller à tous les chefs de projets et managers de lire ce livre : l&#8217;auteur retrace toutes les croyances, les erreurs&#8230; qu&#8217;il a rencontrées au long de sa carrière (40 ans) dans l&#8217;ingénierie logicielle. Il n&#8217;apporte pas de réelle solution mais le simple fait de prendre conscience de ses erreurs peut parfois aider à s&#8217;améliorer.</p>
<p>
Bien entendu, les développeurs et tous les acteurs du développement logiciel sont invités à le lire aussi, la lecture ne pourra qu&#8217;être bénéfique.</p>
<p> Arrêtons de reproduire encore et toujours les mêmes erreurs !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javasioux.fr/blog/2009/03/13/retour-sur-le-livre-fact-fallacies-about-software-engineering/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Intégrer en s&#8217;amusant</title>
		<link>http://www.javasioux.fr/blog/2009/01/07/integrer-en-samusant/</link>
		<comments>http://www.javasioux.fr/blog/2009/01/07/integrer-en-samusant/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 23:14:07 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[fun]]></category>
		<category><![CDATA[intégration continue]]></category>

		<guid isPermaLink="false">http://www.javasioux.fr/blog/?p=319</guid>
		<description><![CDATA[Après les fêtes et les divers excès en tout genre, et pour commencer cette nouvelle année en légèreté, je voudrais vous parler des moyens de notifier les développeurs qu'un build a échoué sur le serveur d'intégration continue. On connaît le traditionnel mail,  les très pratiques flux rss ou encore la messagerie instantanée, un peu plus rare. En voici quelques autres qui pourront vous amuser et probablement aussi faire adhérer quelques développeurs récalcitrants...]]></description>
			<content:encoded><![CDATA[<p>Vous êtes convaincu de l&#8217;intérêt de l&#8217;intégration continue mais les développeurs de votre équipe n&#8217;y prêtent guerre d&#8217;attention ? Il existe une solution : ajouter du fun à son utilisation ! Oubliez les tristes mails la plupart du temps filtrés et envoyés directement dans la poubelle. Laissez tomber les flux rss lus deux semaines trop tard. Passe encore pour les notifications dans l&#8217;IDE ou la barre des tâches mais s&#8217;ils ne sont pas installés, quel intérêt ?! Voilà quelques solutions fun pour égayer vos journées et redonner un coup de jeune à votre intégration continue&#8230;</p>
<h1>La torture</h1>
<p>Il y a quelques techniques pour contraindre et forcer les gens à faire attention à l&#8217;intégration continue :</p>
<ul>
<li>Verser quelques centimes d&#8217;euros dans une cagnotte à chaque fois que l&#8217;on fait échouer un build. Doubler la mise si le build n&#8217;est pas réparé dans l&#8217;heure et payer les croissants si le build est toujours rouge le lendemain&#8230; C&#8217;est assez sévère mais si ça peut permettre de nourrir l&#8217;équipe en même temps, pourquoi pas ?!</li>
<li>Afficher la photo du plus mauvais builder de la semaine dans l&#8217;open space. Pareil, ça peut ne pas plaire et donc inciter chacun à y mettre du sien. Je vous conseille l&#8217;image de fond suivante, ca fera du plus bel effet :<br />
<center><img src="http://bp0.blogger.com/_7p0Y1PPIDJY/RrXEzggHz5I/AAAAAAAAAS0/BTNga_Wx0z8/s400/ist2_2980675_wanted_dead_or_alive.jpg" width="100"></center>
</li>
<li>Sinon, à l&#8217;ancienne, le bonnet d&#8217;âne, ridicule à souhait <img src='http://www.javasioux.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>&#8230; à vous de trouver ceux qui s&#8217;adapteront le mieux à votre équipe !</li>
</ul>
<h1>Le fun</h1>
<p>On va arrêter de terroriser les développeurs&#8230; Le bâton n&#8217;est pas forcément le meilleur moyen de faire avancer les choses. On peut donc tenter la carotte, ou tout au moins essayer de dédramatiser le cassage d&#8217;un build sans pour autant oublier de le corriger !</p>
<h2>Les lampes</h2>
<table>
<tr>
<td><img src="http://www.zerotoys.com/newsite/products/images/LavaLamp_Image3.jpg" width="130"></td>
<td valign="top">Utiliser une <a href="http://ambientdevices.com/cat/orb/orborder.html" target="_blank">Ambient Orb</a> permettra de donner un peu de couleurs au plateau. Pour les détails d&#8217;implémentation, vous pouvez lire ce <a href="http://blogs.msdn.com/mswanson/articles/169058.aspx" target="_blank">post</a> assez complet. </p>
<p>Pour les plus courageux d&#8217;entre vous, vous avez aussi les lava lamp et là attention, c&#8217;est assez <a href="http://www.pragmaticautomation.com/cgi-bin/pragauto.cgi/Monitor/Devices/BubbleBubbleBuildsInTrouble.rdoc"><em>teutchi</em></a> de par l&#8217;utilisation du protocole <a href="http://fr.wikipedia.org/wiki/X10_(informatique)">X10</a> ! On doit pouvoir en trouver en usb pour simplifier la tâche.</p>
<p><u>Remarque</u>: préférez les lampes vertes et rouges, enfin vertes surtout <img src='http://www.javasioux.fr/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </td>
</tr>
</table>
<p></p>
<h2>Le lance-missile USB</h2>
<table>
<tr>
<td valign="top">Je remercie Erwan Alliaume qui m&#8217;a récemment donné cette idée. Effectivement, il existe des <a href="http://www.mageekstore.com/186-lance-missiles-usb-programmable.html">lance missile USB</a> que vous pouvez programmer pour lancer un missile sur la personne qui a fait échouer le build. A condition toutefois d&#8217;avoir une petite équipe sur un petit open space. J&#8217;adore !</td>
<td>
<img src="http://www.superinsolite.com/images/lance-missile-usb.jpg" width="150"></td>
</tr>
</table>
<h2>Le Nabaztag</h2>
<p>Enfin, un peu plus connu mais tout aussi efficace, le lapin wifi, Mr <a href="http://www.nabaztag.com/fr/index.html"  target="_blank">Nabaztag</a> ! De même que pour les gadgets ci-dessus, il existe une <a href="http://doc.nabaztag.com/api/" target="_blank">api</a> permettant de manipuler le lapin. Il a d&#8217;ailleurs eu tellement de succès auprès de tous les amateurs d&#8217;intégration continue qu&#8217;il existe des plugins pour <a href="http://hudson.gotdns.com/wiki/display/HUDSON/Nabaztag+Plugin" target="_blank">hudson</a>, <a href="http://code.google.com/p/buildbunny/">teamcity</a> ou encore <a href="http://nixbit.com/cat/system/monitoring/nabaztag-cruise-control-plugin/">cruise control</a>, hallucinant !<br />
<center><img src="http://www.lebloggadget.com/images/nabaztag.jpg"></center></p>
<h1>Conclusion</h1>
<p>Voilà la preuve qu&#8217;on peut travailler en s&#8217;amusant et joindre l&#8217;utile à l&#8217;agréable ! Fini la corvée de réparer un build cassé, ça sera désormais avec le sourire et la bonne humeur qu&#8217;on le fera. Comme j&#8217;aime à le dire : on peut avoir &laquo;&nbsp;le fun et l&#8217;argent du fun&nbsp;&raquo; (&copy; VDL) ! Je vous souhaite donc une bonne année 2009 pleine de Nabaztags, de lances missiles&#8230; mais surtout pleine de builds verts et de logiciels de qualité !</p>
<p>PS: n&#8217;hésitez pas à nous faire découvrir vos systèmes de notifications les plus funs, ou même les plus efficaces.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javasioux.fr/blog/2009/01/07/integrer-en-samusant/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Une semaine avec Netbeans 6.5</title>
		<link>http://www.javasioux.fr/blog/2008/11/30/une-semaine-avec-netbeans-65/</link>
		<comments>http://www.javasioux.fr/blog/2008/11/30/une-semaine-avec-netbeans-65/#comments</comments>
		<pubDate>Sun, 30 Nov 2008 11:36:54 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[environnement de développement]]></category>
		<category><![CDATA[netbeans]]></category>

		<guid isPermaLink="false">http://www.javasioux.fr/blog/?p=228</guid>
		<description><![CDATA[Suite à l'<a href="http://www.theserverside.com/news/thread.tss?thread_id=51949" target="_blank">annonce</a> faite sur TSS et aux nombreux commentaires en faveur de cet IDE, j'ai voulu l'essayer et voir ce qu'il avait à m'offrir par rapport à Eclipse. J'ai déjà eu l'occasion de m'en servir durant un an chez Club Internet en 2005 (la version 5.0 à l'époque) et j'en garde un assez bon souvenir, malgré quelques manques. Aujourd'hui, où en sommes nous ?]]></description>
			<content:encoded><![CDATA[<h2>Fonctionnalités</h2>
<table>
<tr>
<td><img src="http://www.netbeans.org/images/v5/nb-logo2.gif"></td>
<td>Après avoir lu  la <a href="http://www.netbeans.org/community/releases/65/relnotes.html">release note</a>, Netbeans ne semble pas avoir à rougir de son concurrent&#8230;</td>
</tr>
</table>
<h2>Premier pas&#8230;</h2>
<p>Contrairement à Eclipse qui se décompresse tout simplement, Netbeans s&#8217;installe. La première méthode a le mérite d&#8217;être simple et de ne pas nécessiter les droits administrateurs, problématique chez certains clients&#8230;<br />
<center><br />
<img src="http://www.javasioux.fr/blog/wp-content/uploads/2008/11/netbeans.png" alt="" title="netbeans" width="473" height="300" class="aligncenter size-full wp-image-233" /><br />
</center><br />
Une fois installé, Netbeans consomme rapidement plus de 100 mo de RAM, 150 pour Eclipse. L&#8217;interface est assez jolie et intuitive.</p>
<h2>Plugins</h2>
<p>On fait souvent l&#8217;éloge des nombreux plugins disponibles pour Eclipse et effectivement ils sont nombreux. Le problème, c&#8217;est que la plupart ne fonctionnent pas, ou pas sur notre version d&#8217;Eclipse ou bien encore rendent l&#8217;environnement instable, bref c&#8217;est pas la panacé ! </p>
<p>Je me lance donc à la recherche des plugins que j&#8217;ai l&#8217;habitude d&#8217;utiliser :</p>
<h3>Maven</h3>
<p>J&#8217;ai entendu beaucoup de bien à propos du plugin Maven. Je m&#8217;empresse de l&#8217;installer via le menu Tools/Plugins. Tout comme son copain Eclipse, il faut le redémarrer pour prendre en compte l&#8217;update&#8230; dommage. Je créé une webapp maven en quelques clicks :</p>
<p><center><img src="http://www.javasioux.fr/blog/wp-content/uploads/2008/11/mavennetbeans.png" alt="" title="mavennetbeans" width="271" height="277" class="alignnone size-full wp-image-236" />  <img src="http://www.javasioux.fr/blog/wp-content/uploads/2008/11/mavennetbeansfiles.png" alt="" title="mavennetbeansfiles" width="272" height="223" class="alignnone size-full wp-image-237" /></center></p>
<p>En moins de temps qu&#8217;il n&#8217;en faut pour le dire, je peux déployer l&#8217;application sur un glassfish installé pour l&#8217;occasion avec Netbeans. Deux petites modifications dans l&#8217;index.jsp, un refresh dans le browser et magie, mes modifications sont là <strong>sans redéploiement</strong>. Ca me plait bien, je verrai après ce que ça donne pour le rechargement de classes à chaud !</p>
<p>Revenons-en à nos moutons et ajoutons Spring à nos dépendances. Intuitivement je fais un click droit sur Libraries, et je trouve mon bonheur avec &laquo;&nbsp;Add Library&nbsp;&raquo;. Monsieur a même profité du temps que je passais à jouer pour m&#8217;indexer le repo central et ainsi me proposer les groupId, artifactId et version :<br />
<center><img src="http://www.javasioux.fr/blog/wp-content/uploads/2008/11/dependencynetbeans.png" alt="" title="dependencynetbeans" width="385" height="235" /></center></p>
<p>J&#8217;importe un projet multi module existant sans problème, quelques clicks pour lancer des goals maven, bref la base est là. Par contre, pas d&#8217;éditeur avancé du pom (même si je ne m&#8217;en sers jamais), <strong>pas d&#8217;analyse graphique des dépendances </strong>(très pratique pour faire du ménage), des absences que propose <a href="http://m2eclipse.codehaus.org/">m2eclipse</a>. Cependant, l&#8217;ensemble est bien mieux intégré à l&#8217;éditeur : j&#8217;ai souvent des problèmes avec m2eclipse et je dois désactiver la gestion des dépendances puis la réactiver&#8230;</p>
<h3>Spring</h3>
<p>J&#8217;ai passé un peu de temps à chercher un équivalent de <a href="http://springide.org/" target="_blank">Spring IDE</a>. J&#8217;en trouve un sur la page des <a href="http://plugins.netbeans.org/" target="_blank">plugins</a> mais ne parvient pas à l&#8217;installer. Finallement, je me dis que c&#8217;est peut être déjà intégré, sait-on jamais ? Et effectivement, il est bien là !</p>
<p><center><img src="http://www.javasioux.fr/blog/wp-content/uploads/2008/11/springnetbeans.png" alt="" title="springnetbeans" width="499" height="561" class="alignnone size-full wp-image-246" /></center></p>
<p>Navigation dans les beans, autocomplete, les basiques encore une fois mais intégrés directement à l&#8217;éditeur. Je retrouve mon Ctrl + click pour aller directement dans les classes Spring (après récupération du code à l&#8217;aide de Maven) ou dans mes propres beans.</p>
<h3>Contrôle qualité</h3>
<p>J&#8217;aime bien disposer sur mon IDE des différents outils dont on dispose sur l&#8217;intégration continue. Cela me permet de découvrir un problème dès le moment où il est écrit, plutôt que d&#8217;attendre le retour du maven site quotidien effectué sur l&#8217;intégration continue. Bref&#8230;</p>
<h4>Checkstyle</h4>
<p>Le plugin <a href="http://www.sickboy.cz/checkstyle/" target="_blank">Checkstyle</a> (que je peux configurer avec mon fichier de règles) me permet d&#8217;avoir quelques alertes sur la qualité de mon code. </p>
<h4>PMD</h4>
<p>Tout comme checsktyle, <a href="http://sourceforge.net/project/showfiles.php?group_id=56262&#038;package_id=63621">PMD</a> s&#8217;installe très facilement et fonctionne ! Sur Eclipse, je ne sais plus trop où nous en sommes à ce niveau étant donné que ça ne marche jamais avec ma version et donc j&#8217;avais un peu abandonné l&#8217;idée&#8230; Là, j&#8217;ai mes alertes (configurées avec les mêmes règles que l&#8217;intégration continue) et en plus c&#8217;est joli :<br />
<center><br />
<img src="http://www.javasioux.fr/blog/wp-content/uploads/2008/11/pmdnetbeans.png" alt="" title="pmd netbeans" width="418" height="150" class="alignnone size-full wp-image-289" /></center></p>
<p>Seul bémol, l&#8217;outil ne me propose aucune correction, mais rare sont ceux qui le font.</p>
<p>Niveau plugins, je suis donc plutôt satisfait et grâce à ces quelques outils supplémentaires (mais très bien intégrés), je vais pouvoir être <a href="http://www.javasioux.fr/blog/2008/11/06/productif-oui-mais-pas-sans-la-qualite/">productif et efficace</a> !</p>
<h2>A l&#8217;utilisation</h2>
<h3>Rapidité de l&#8217;IDE</h3>
<p>Les déplacements de fichiers (refactoring) sont lonnnnnnnngs, chaque action (ctrl + espace, click droit, &#8230;) bloque l&#8217;éditeur quelques secondes, à la longue ça devient fatiguant ! Assez étrange pour un outils de cette facture&#8230; Je test donc sur un autre PC (sans vista cette fois <img src='http://www.javasioux.fr/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ) et là rien à voir, <strong>quelques lenteurs &laquo;&nbsp;habituelles&nbsp;&raquo;</strong> pour du java, mais ça reste du niveau d&#8217;Eclipse. Grosse frayeure !</p>
<h3>Raccourcis claviers et refactoring</h3>
<p>Je parviens à retrouver mes raccourcis préférés :</p>
<ul>
<li>Ctrl + O remplace le Ctrl + Shift + T pour rechercher un type. Alt + Shift + O remplace Ctrl + Shift + R pour une ressource.</li>
<li>Le raccourci Alt + Insert propose quelques &laquo;&nbsp;générateurs automatiques&nbsp;&raquo; :<br />
<center><img src="http://www.javasioux.fr/blog/wp-content/uploads/2008/11/autogeneratenetbeans.png" alt="" title="autogeneratenetbeans" width="297" height="179" class="alignnone size-full wp-image-266" /></center></li>
<li>On peut remonter dans la hiérarchie (classe mère ou interface) d&#8217;une classe avec Alt + F12 ou Ctrl + Shift + P pour une interface.</li>
<li>L&#8217;optimisation des import se fait avec Ctrl + Shift + I (Ctrl + Shift + O sous Eclipse). </li>
<li>Le Ctrl + Shift + V est une belle alternative au copier-coller puisqu&#8217;il permet de coller du code directement formaté. Plus besoin de faire Ctrl + V, Ctrl + A puis Alt + Shift + F (Ctrl + Shift + F sous Eclipse).</li>
<li>Niveau exécution et debug on peut vite s&#8217;emmêler les pinceaux : F11 <em>buid</em> sous Netbeans et <em>debug</em> sous Eclipse, F6 <em>run</em> sous Netbeans et <em>step over</em> sous Eclipse, Ctrl + F5 <em>debug</em> sous Netbeans et F5 <em>step into</em> sous Eclipse !</li>
<li>&#8230; Netbeans propose un <a href="http://usersguide.netbeans.org/files/documents/40/1935/file_1935.dat?filename=Keyboard%20Shortcuts%20Card%206.1.pdf" target="_blank">pdf</a> regroupant les différents raccourcis (disponibles sur la version 6.1 mais qui pour la plupart fonctionnent aussi sur la 6.5), très pratique quand on découvre l&#8217;outil.</li>
</ul>
<p>Quelques critiques : </p>
<ul>
<li>Le <strong>quick fix (Alt + Entrée) est loin d&#8217;être si évolué</strong> que le <a href="http://eclipser-blog.blogspot.com/2008/11/eclipse-tip-ctrl1-and-ifs.html">Ctrl + 1</a> contextuel d&#8217;Eclipse.</li>
<li>Je n&#8217;ai pas trouvé comment rechercher les implémentations d&#8217;une interface (Ctrl + T sous Eclipse), on doit faire un Find Usage (Alt + F7) puis rechercher les sous-types.</li>
</ul>
<h3>Ecriture / Formatage du code</h3>
<p>Concernant l&#8217;aide à la saisie et malgré l&#8217;absence du Ctrl + 1, Netbeans fournit de <strong>nombreux templates de code</strong>. Tapez &laquo;&nbsp;forl&nbsp;&raquo; puis Tabulation, il vous génèrera une jolie boucle for&#8230; C&#8217;est juste dommage qu&#8217;on ne puisse pas utiliser le Ctrl + Espace au lieu de la tabulation.<br />
J&#8217;ai été déçu de ne pas trouver &laquo;&nbsp;sysout&nbsp;&raquo;, mais Netbeans permettant d&#8217;ajouter ses propres templates, j&#8217;ai rapidement résolu le problème.</p>
<p>D&#8217;autre part, vous avez comme dans Eclipse tout un module de gestion du formatage, pour ajouter des espaces après les ; dans les boucles for, aligner les paramètres de méthodes sur plusieurs lignes, j&#8217;en passe et des meilleurs.</p>
<p>Rien de bien extraordinaire mais l&#8217;essentiel est là.</p>
<h3>Warnings</h3>
<p>Au niveau des alertes, on peut comme sous Eclipse personnaliser le niveau. On retrouvera quelques problèmes que peuvent remonter checkstyle, findbugs ou PMD :<br />
<center><img src="http://www.javasioux.fr/blog/wp-content/uploads/2008/11/warningnetbeans.png" alt="" title="warningnetbeans" width="258" height="226" class="alignnone size-full wp-image-279" /></center><br />
Par contre, on a rarement la correction disponible. Alors on prend ses mains et on corrige !</p>
<h3>Actions à la sauvegarde</h3>
<p>Malheureusement aujourd&#8217;hui, <strong>Ctrl + S ne fait rien de plus que sauvegarder</strong> votre fichier dans Netbeans. C&#8217;est déjà pas mal me direz vous mais comparé à Eclipse qui permet de formater le code, organiser les imports et plus encore, c&#8217;est assez décevant. On perd donc pas mal de temps avec les raccourcis de formatage et d&#8217;organisation des imports&#8230;<br />
Il y a une <a href="http://www.netbeans.org/issues/show_bug.cgi?id=140817">issue</a> sur le sujet ouverte chez eux depuis&#8230; juillet 2008. Mais pourquoi ne pas l&#8217;avoir intégré à la version 6.5 ?! <img src='http://www.javasioux.fr/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<h3>Gestionnaire de sources</h3>
<p>Pour le coup, j&#8217;ai utilisé le gestionnaire de source de mon client (Clearcase UCM) et je suis assez content de voir qu&#8217;il existe un plugin clearcase (disponible dans l&#8217;IDE sans googler !).<br />
Pour ceux qui ne connaissent pas, tous les fichiers sur le poste de travail sont en lecture seule. Lorsqu&#8217;on veut travailler sur un fichier, on le &laquo;&nbsp;checkout&nbsp;&raquo; en précisant une activité (une sorte de tâche). Il est alors possible de le modifier puis de faire un &laquo;&nbsp;checkin&nbsp;&raquo; pour le remettre au source control.<br />
Le problème que j&#8217;ai rencontré, c&#8217;est l&#8217;<strong>impossibilité de choisir mon activité lors du checkout</strong> ! Du coup, je modifie du code avec la dernière activité créée.</p>
<p>NB : CVS, SVN et Mercurial sont directement intégrés.</p>
<h3>Tests unitaires</h3>
<p>Je ne suis <strong>pas aidé pour faire du TDD </strong>: la création de classes se fait dans le même package que le test, donc dans le répertoire src/main/tests/&#8230; Pas de problème pour refactorer et déplacer ma classe mais c&#8217;est un peu gênant. Pour la création des méthodes manquantes, pas de problème. </p>
<p>Par contre, je suis agréablement surpris lorsque je vois que <strong>l&#8217;exécution des tests est faite avec Maven </strong>(<code>mvn -Dtest=EmptyJUnitTest test-compile surefire:test</code>) et le résultat est disponible dans l&#8217;interface (pas besoin d&#8217;aller dans les fichiers surefire). Plus de différence de comportement entre mon IDE et mon build <img src='http://www.javasioux.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
<p><center><img src="http://www.javasioux.fr/blog/wp-content/uploads/2008/11/testsnetbeans.png" alt="" title="testsnetbeans" width="436" height="154" class="aligncenter size-full wp-image-252" /></center></p>
<h3>Debug / Exécution</h3>
<p>Concernant <strong>le debug, tout est là</strong>, j&#8217;attache mon debugger par dt_socket sur le port qui va bien et roulez jeunesse. Nous avons vu plus haut que nous disposons de nombreux raccourcis pour le pas à pas mais si vous êtes habités à Eclipse, vous risquez de vous embrouiller les premières fois&#8230;</p>
<p>Pour en revenir au rechargement à chaud des classes modifiés dans ma webapp, ça ne marche pas, je dois arrêter et relancer le serveur.</p>
<h2>Conclusion</h2>
<p>Après quelques jours d&#8217;utilisation en remplacement d&#8217;Eclipse, je suis assez content. J&#8217;avais un peu peur des lenteurs chez moi sur un Vista mais au boulot sur XP ou sur Ubuntu, tout roule. Pour le reste, pas mal d&#8217;<strong>éléments bien intégrés (maven, spring)</strong> peuvent servir d&#8217;exemple à Eclipse.</p>
<p>De surcroît, il fournit <strong>pas mal de fonctionnalités en plus</strong> (que je n&#8217;ai pas testées) : php, groovy &#038; grails, un éditeur swing sympa, le profiling, un designeur html/ jsp / jsf à étudier, un éditeur avancé de web.xml ou de faces-config.xml&#8230; bref pas mal d&#8217;éléments pour commencer rapidement à développer.</p>
<p>Par contre, il manque quelques raccourcis pour faciliter la navigation, les actions à la sauvegarde également. <strong>On perd donc un peu de temps de ci de là</strong>.<br />
De même, j&#8217;ai été assez <strong>gêné avec le plugin clearcase</strong> : obligé de créer une activité en dehors de l&#8217;IDE avant de modifier des fichiers&#8230; Je ne doute pas que CVS et SVN soient bien mieux gérés.</p>
<p>Alors, abandon d&#8217;Eclipse ou pas ? Si le plugin clearcase me permettait de créer mes activités, je pense que j&#8217;essaierai. Malgré quelques raccourcis manquant, il est très agréable à utiliser, relativement fluide au final et répond à mes besoins. J&#8217;essaierai au moins dans un premier temps pour valider cette semaine de test et si tout va bien, souhaiterai bon vent à Eclipse. Donc à voir sur un projet sans Clearcase <img src='http://www.javasioux.fr/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Prochaine étape : tester IntelliJ. Affaire à suivre sur javasioux !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javasioux.fr/blog/2008/11/30/une-semaine-avec-netbeans-65/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Documentation Maven</title>
		<link>http://www.javasioux.fr/blog/2008/11/09/documentation-maven/</link>
		<comments>http://www.javasioux.fr/blog/2008/11/09/documentation-maven/#comments</comments>
		<pubDate>Sun, 09 Nov 2008 14:34:48 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[documentation]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[sonatype]]></category>

		<guid isPermaLink="false">http://www.javasioux.fr/blog/?p=90</guid>
		<description><![CDATA[  On entend souvent ici ou là des plaintes quant à la qualité et la quantité de documentation sur Maven. Je pense qu&#8217;Apache peut effectivement fournir des efforts, ainsi que tous les plugins mais globalement, on va dans le bon sens : Les Guides Maven, fournissent un bon point de départ à Maven L&#8217;ebook Better [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<table border="0">
<tbody>
<tr>
<td><a href="http://www.javasioux.fr/blog/wp-content/uploads/2008/11/maven.jpg"><img class="alignnone size-medium wp-image-120" title="maven" src="http://www.javasioux.fr/blog/wp-content/uploads/2008/11/maven-300x300.jpg" alt="" width="115" height="115" /></a></td>
<td>On entend souvent ici ou là des plaintes quant à la qualité et la quantité de documentation sur Maven. Je pense qu&#8217;Apache peut effectivement fournir des efforts, ainsi que tous les plugins mais globalement, on va dans le bon sens :</td>
</tr>
</tbody>
</table>
<ul>
<li>Les <a href="http://maven.apache.org/guides/index.html" target="_blank">Guides Maven</a>, fournissent un bon point de départ à Maven</li>
<li>L&#8217;ebook <a href="http://www.mergere.com/better-build-maven" target="_blank">Better Build with Maven</a>, écrit par Jason Van Zyl en personne, et Vincent Massol, qui au delà de l&#8217;utilisation simple de l&#8217;outil décrit comment réaliser un plugin, comment migrer un projet vers Maven (la fameuse &laquo;&nbsp;mavenisation&nbsp;&raquo;), travailler en équipe avec Maven&#8230;</li>
<li>L&#8217;ebook <a href="http://www.sonatype.com/community/definitive_guide.html" target="_blank">Maven Definitive Guide</a>, aussi publié chez Oreilly et un poil plus récent, décortique Maven en long, en large et en travers. Tout y passe, jusqu&#8217;au plugin <a href="http://m2eclipse.codehaus.org/" target="_blank">m2eclipse</a> en passant par le repository manager <a href="http://nexus.sonatype.org/" target="_blank">Nexus</a>. Tout y est décrit et illustré par des exemples&#8230; en un mot, la référence venu de Sonatype (dont Jason Van Zyl est CTO).</li>
</ul>
<p>Avec environ 1000 pages de documentation sur Maven, rien que dans ces 2 livres, vous n&#8217;avez plus d&#8217;excuses pour vous y mettre !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.javasioux.fr/blog/2008/11/09/documentation-maven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Productif OUI ! Mais pas sans la qualité !</title>
		<link>http://www.javasioux.fr/blog/2008/11/06/productif-oui-mais-pas-sans-la-qualite/</link>
		<comments>http://www.javasioux.fr/blog/2008/11/06/productif-oui-mais-pas-sans-la-qualite/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 22:32:21 +0000</pubDate>
		<dc:creator>Jérôme</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[environnement de développement]]></category>
		<category><![CDATA[intégration continue]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[qualité]]></category>
		<category><![CDATA[tests]]></category>

		<guid isPermaLink="false">http://www.javasioux.fr/blog/?p=54</guid>
		<description><![CDATA[Octo a publié récemment un nouveau <a href="http://www.octo.com/com/com_Java-Productivity-Primer-white-paper-octo.html" target="_blank">livre blanc</a>, disons pour le coup white paper puisqu'il est en anglais, sur le thème de la productivité des développements java : "12 conseils pour booster votre productivité avec une usine de développement". N'ayant pas participé à cet ouvrage, je reviens dessus et donne mes impressions sur la productivité ET la qualité des développements.]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ffffff;">_</span></p>
<h2>La productivité des développements</h2>
<p>Sans rentrer dans les détails du document, je vous laisse le télécharger et le lire mais voici les points qui me semblent clés :</p>
<ul>
<li>Disposer d&#8217;un <strong>socle technique</strong> (jdk, frameworks&#8230;) qui permet d&#8217;être productif. La sphère java est très nébuleuse et il est parfois difficile de s&#8217;y retrouver dans tous les frameworks disponibles. Privilégier les <em>standards de fait</em>, autrement dit les frameworks qui, à force d&#8217;utilisation, sont devenus des références et qui grâce à cette renommée, ont également pu s&#8217;améliorer. On citera notamment <span style="text-decoration: underline;">hibernate</span> pour le mapping objet relationnel, <span style="text-decoration: underline;">spring</span> qui couvre pas mal de domaines aujourd&#8217;hui (configuration, injection de dépendances, sécurité, batch, IHM web&#8230;). Ce dernier est particulièrement productif, tout au moins dans ses dernières versions, où la configuration XML a laissé place aux annotations. Annotations d&#8217;ailleurs apparues avec le <span style="text-decoration: underline;">jdk 5</span>, qui apporte beaucoup du point de vue productivité et efficacité.</li>
</ul>
<ul>
<li>Disposer d&#8217;un <strong>environnement de développement</strong> optimum sur le poste de travail du développeur; à savoir un <strong>éditeur</strong> efficace (<span style="text-decoration: underline;">Eclipse</span>, <span style="text-decoration: underline;">IntelliJ</span>) et correctement configuré (raccourcis, syntaxe du code&#8230;) avec des plugins additionnels aidant à être productif (<span style="text-decoration: underline;">Spring Ide</span> si on fait du Spring par exemple). Mais ca ne s&#8217;arrête pas à l&#8217;éditeur. Le <strong>serveur d&#8217;application</strong>, si l&#8217;on développe une application JEE, est tout aussi important. Comptez le nombre de minutes passées à attendre qu&#8217;un ear se déploie et multipliez par le nombre de déploiement effectués par jour, vous allez simplement haluciner. Personnellement, j&#8217;apprécie beaucoup <span style="text-decoration: underline;">jetty</span> qui est simple à configurer, démarre très vite et peut être lancé depuis Maven. Vous verrez que vous aurez moins peur de votre code quand vous saurez qu&#8217;en moins de 30 secondes, c&#8217;est plié, comparé à un certain serveur qui commence par web et fini par sphere&#8230;</li>
</ul>
<ul>
<li>Disposer d&#8217;une <strong>usine de développement</strong> et tous les composants qui s&#8217;avèrent nécessaires :
<ul>
<li><strong>Gestionnaire de sources</strong>, dans un premier temps, afin de garantir un échange plus fluide entre les développeurs et un gain de temps sur l&#8217;intégration du code.</li>
<li><strong>Mécanisme et process de build</strong>, autrement dit un outil à la Maven et les bonnes pratiques qu&#8217;il apporte, afin de se baser sur un standard éprouvé et ne pas chercher midi à 14 heures où sont vos fichiers et comment construire votre application.</li>
<li><strong>Intégration en continue</strong>, pour éviter l&#8217;&nbsp;&raquo;effet tunnel&nbsp;&raquo; et les longues soirées la veille d&#8217;une livraison parce que le module foo ne correspond pas à ce qu&#8217;appelle le module bar&#8230;</li>
<li><strong>O</strong><strong>util de suivi de tâches et anomalies</strong>, au moins pour faciliter les échanges MOA/client  &#8211; MOE.</li>
</ul>
</li>
</ul>
<ul>
<li>Enfin, rester &laquo;&nbsp;aware&nbsp;&raquo; concernant la productivité. JCVD, sors de mon corps ! Blague à part, on est productif si on est dans <strong>un état d&#8217;esprit productif</strong>, c&#8217;est à dire qu&#8217;on cherche à limiter les tâches répétitives manuelles en les automatisant, on ne reste pas dans l&#8217;inconfort (je citais Websphere plus haut : si vous perdez une heure par jour au moins à déployer votre application, remontez le au manager qui généralement n&#8217;aime pas ce temps gaspillé, ça facilitera peut-être un changement), on parle de productivité et on lève les problèmes pour les résoudre au plus tôt mais sans tout changer&#8230;</li>
</ul>
<ul>
<li>J&#8217;allais oublier quelque chose qui me semble prépondérant et qui va faire la transition avec la deuxième partie : <strong>les tests</strong>. Bien sûr, certains médisants diront que les tests consomment du temps et qu&#8217;ils sont contre-productifs. A ceux-là, je dirai faites un calcul simple : comptez le nombre de bugs dans vos applications, multipliez par le temps de correction et par le taux de réapparition moyen :</li>
</ul>
<p style="text-align: center;"><span style="font-family: courier new,courier;">nombre de bugs  x  temps de correction  x  taux de réapparition moyen  =  consommé<br />
</span></p>
<p style="text-align: center;"><span style="font-family: courier new,courier;">Exemple :  50  x  1j.h  x  0.30  =  15</span></p>
<p style="text-align: left; padding-left: 30px;">Maintenant, pour chaque bug apparu et chaque nouvelle fonctionnalité, ajoutez un ou plusieurs tests unitaires (<span style="text-decoration: underline;">JUnit</span> par exemple) qui valident (et valideront au cours du temps) le bon fonctionnement et la non-régression. Refaites ensuite le calcul précédent au cours du temps. Non seulement vous réduirez le nombre de bugs, mais vous réduirez également le temps de correction et le taux de réapparition : les tests permettent de cibler plus rapidement un bug qu&#8217;en passant au travers de tout le code avec un debugger, et ils limitent également les régressions.</p>
<p style="text-align: center; padding-left: 30px;"><span style="font-family: courier new,courier;">Exemple : </span><span style="font-family: courier new,courier;">30  x  0.5j.h  x 0.10  =  1.5</span></p>
<p style="text-align: left; padding-left: 30px;">Alors, c&#8217;est pas de la productivité ça ?</p>
<h2>Et la qualité ?</h2>
<p>On a souvent tendance à délaisser la qualité au profit de la productivité et des coûts. Rappelez vous du fameux triptyque coûts &#8211; délais &#8211; qualité :</p>
<div class="mceTemp mceIEcenter">
<dl id="attachment_76" class="wp-caption aligncenter" style="width: 213px;">
<dt class="wp-caption-dt"><a href="http://www.javasioux.fr/blog/wp-content/uploads/2008/11/triptyque.png"><img class="size-medium wp-image-76" title="triptyque" src="http://www.javasioux.fr/blog/wp-content/uploads/2008/11/triptyque-300x239.png" alt="triptyque" width="203" height="161" /></a></dt>
</dl>
</div>
<p>Le problème c&#8217;est qu&#8217;on oublie tout aussi souvent que les trois sont étroitement liés et qu&#8217;une mauvaise décision sur l&#8217;une des branche peut impacter les deux autres :</p>
<ul>
<li>&laquo;&nbsp;Il faut livrer vite, à telle date, je veux tout ça !&nbsp;&raquo;</li>
<li>Pour palier à la réduction des délais de livraison, on augmente généralement le nombre de développeurs, c&#8217;est à dire les coûts. De même, on met de côté la qualité (doc, tests&#8230;) pour s&#8217;attacher aux fonctionnalités.</li>
<li>Le problème en délaissant la qualité, est qu&#8217;on augmente les délais (cf. calcul ci-dessus) et généralement aussi les coûts (100j.h, c&#8217;est plus cher que 50&#8230;).</li>
<li>Au final, on a voulu réduire les délais et c&#8217;est le contraire que l&#8217;on a obtenu.</li>
</ul>
<p>Maintenant on peut envisager les choses autrement :</p>
<ul>
<li>On <strong>mise sur la qualité</strong>. Cela passe par tout un tas de choses dont nous parlerons ensuite et notamment les tests.</li>
<li>Soyons honnêtes, à court terme, cela augmente les coûts et les délais : développer des tests en plus du code est consommateur, mettre en place une usine de développement prend du temps, configurer correctement un environnement de développement peut sembler futile&#8230;</li>
<li>Par contre, à moyen et long terme, cela s&#8217;avère payant, les développeurs sont plus efficaces (intégration continue, IDE configuré), plus sereins (couvertures des tests).</li>
</ul>
<p>Combien de projets en échecs pour un réussi ? combien de budgets dépassés pour un tenu ? Cela se produit encore trop souvent parce qu&#8217;on se borne à vouloir faire comme on a toujours fait, à savoir mal !</p>
<p>Je n&#8217;ai pas de chiffre précis pour comparer les deux cas cités ci-dessus mais simplement un retour d&#8217;expérience :</p>
<p>Je travaille pour le compte d&#8217;une grande banque française sur le développement d&#8217;un outil de provisionning d&#8217;habilitations. En 3 semaines, avec des tests unitaires (<span style="text-decoration: underline;">JUnit</span>), des tests d&#8217;interface (<span style="text-decoration: underline;">Selenium</span>), un serveur d&#8217;intégration continue (<span style="text-decoration: underline;">Hudson</span>), on a mis en production une première version simple mais qui marchait.</p>
<p>Aujourd&#8217;hui, 6 mois et 1600 tests plus tard, on a à tout casser 5 bugs bloquants et tout au plus une dizaines de majeurs (en préprod) et aucun bug important sur la prod&#8230; Un nouveau développeur arrivé récemment a pu, grâce aux tests et sans souffrir, faire un gros refactoring au bout d&#8217;une semaine sur le projet. Le temps de correction d&#8217;un bug est inférieur à la demi journée, voire à l&#8217;heure&#8230; bref, on a misé sur la qualité et aujourd&#8217;hui, l&#8217;application est stable, évolutive, l&#8217;équipe est efficace et la MOA commence a comprendre l&#8217;intérêt d&#8217;être un peu patient.</p>
<h2>Conclusion</h2>
<p>Je ne suis pas entré dans les détails sur la qualité des développements, les différents types de test, les méthodologies de tests, les outils annexes pour faire de la qualité (métriques diverses)&#8230; et tout ce dont nous avons à disposition pour faire des logiciels de qualité. Je traiterai plus en détails de ces aspects dans un prochain article. Je voulais surtout mettre l&#8217;accent sur le fait que la productivité n&#8217;est pas incompatible avec la qualité, voire bien au contraire : faire du travail propre permet d&#8217;être efficace !</p>
<p>Encore une fois : faites l&#8217;expérience et prenez le temps de mesurer les gains de la mise en place de tests par rapport à une politique de debug intensif. Vous verrez que vous y gagnerez en qualité et en productivité&#8230;</p>
<p>Et surtout, n&#8217;hésitez pas à lire le <a href="http://www.octo.com/com/com_Java-Productivity-Primer-white-paper-octo.html" target="_blank">livre blanc</a> Octo <img src='http://www.javasioux.fr/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.javasioux.fr/blog/2008/11/06/productif-oui-mais-pas-sans-la-qualite/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

