<?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>Exponential Fault &#187; programming</title>
	<atom:link href="http://weblog.lo2k.net/tag/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://weblog.lo2k.net</link>
	<description></description>
	<lastBuildDate>Fri, 25 Feb 2011 16:26:15 +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>5 outils que j&#8217;ai découvert en 5 mois de Java</title>
		<link>http://weblog.lo2k.net/2010/02/5-outils-que-jai-decouvert-en-5-mois-de-java/</link>
		<comments>http://weblog.lo2k.net/2010/02/5-outils-que-jai-decouvert-en-5-mois-de-java/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 11:06:15 +0000</pubDate>
		<dc:creator>X-Blaster</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[guice]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://weblog.lo2k.net/?p=302</guid>
		<description><![CDATA[Venant d&#8217;un monde plus orienté PHP/Python/Ruby, j&#8217;ai envie de faire partager avec vous mes 6 premiers mois d&#8217;expérience &#8220;pro&#8221; en Java. De l&#8217;extérieur, je trouvais la communauté Java assez strict et remplit d&#8217;acronyme (J2EE, JPA, EJB3, WAR) mais une fois passé ce &#8220;langage&#8221; imposé surement par les téchnicos-commerciaux de chez Sun/Oracle, on se rend compte que Java [...]]]></description>
			<content:encoded><![CDATA[<p>Venant d&#8217;un monde plus orienté PHP/Python/Ruby, j&#8217;ai envie de faire partager avec vous mes 6 premiers mois d&#8217;expérience &#8220;pro&#8221; en Java.  De l&#8217;extérieur, je trouvais la communauté Java assez strict et remplit d&#8217;acronyme (J2EE, JPA, EJB3, WAR) mais une fois passé ce &#8220;langage&#8221; imposé surement par les téchnicos-commerciaux de chez Sun/Oracle, on se rend compte que Java n&#8217;a pas beaucoup a envié a d&#8217;autre langage &#8220;hype&#8221;.</p>
<p>Même si le langage reste très strict et fortement typés, certains outils ont réussi a le rendre flexible dans les méthodes de développement.</p>
<h2><a href="http://maven.apache.org/">Maven</a></h2>
<p>Si je dis que c&#8217;est une évolution de Ant, je vais me faire trucider et créer une guerre de religion <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Cet outil m&#8217;a permis de plus facilement structurer mes programmes. Déploiement automatique, test unitaire, Maven crée un squelette qui permet facilement de gérer tout le &#8220;cycle de vie&#8221; d&#8217;une application. Le système de dépendance (repris par Ivy) est plus qu&#8217;appreciable <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Le genre d&#8217;outil que j&#8217;affectionne particulièrement. Une ou deux lignes de code et tout fonctionne parfaitement, peut importe la plateforme <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2><a href="http://code.google.com/intl/fr/webtoolkit/">GWT</a></h2>
<p><a href="http://code.google.com/intl/fr/webtoolkit/"></a>Je sais que le Google Web Toolkit ne fait pas partit intégrante d&#8217;une application Java mais il faut avoué que sur ce coup là, Google a fait fort. Plus qu&#8217;un outil de transcodage Java-&gt;JavaScript, les différents design pattern (comme <a href="http://code.google.com/p/gwt-mvp-sample/">MVP</a>) qui sont proné dans GWT m&#8217;ont permis de faire un bon spectaculaire dans ma manière de coder.</p>
<h2><a href="http://code.google.com/p/google-guice/">Guice</a></h2>
<p>N&#8217;étant pas particulièrement fan des fichiers de conf en XML et n&#8217;étant pas habitué a Spring, je trouve que Guice a toutes les fonctionnalités pour faire de l&#8217;injection de dépendance en Java, simple et efficaces <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<h2><a href="http://sonar.codehaus.org/">Sonar</a></h2>
<p>Il est toujours bon de développer avec une boussole, savoir où on va. Sonar permet d&#8217;avoir des indicateurs de qualité de code. Un petit &#8220;<code>mvn sonar:sonar</code>&#8221; sur un projet maven et zou ! On a une ribambelle d&#8217;indicateurs et le résultat des tests unitaires dans une interface vraiment très pratique.</p>
<h2><a href="http://fornax.itemis.de/confluence/display/fornax/Sculptor+(CSC)">Sculptor</a></h2>
<p>Si vous ne connaissez pas le concept de &#8220;<a href="http://fr.wikipedia.org/wiki/Model_driven_architecture">MDA</a>&#8220;, ce n&#8217;est pas bien grave. Sculptor vous permet de définir votre &#8220;model&#8221; et de générer toutes les parties de codes rébarbatives au possible.</p>
<p>Génération de code EJB3, JPA, Spring et même GoogleAppEngine <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Une fois correctement maitrisé, il vous fera économiser de nombreuses heures <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.lo2k.net/2010/02/5-outils-que-jai-decouvert-en-5-mois-de-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>4 excuses de collègues pour faire du code spaghetti</title>
		<link>http://weblog.lo2k.net/2010/02/4-excuses-de-collegues-pour-faire-du-code-spaghetti/</link>
		<comments>http://weblog.lo2k.net/2010/02/4-excuses-de-collegues-pour-faire-du-code-spaghetti/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 10:38:03 +0000</pubDate>
		<dc:creator>X-Blaster</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://weblog.lo2k.net/?p=288</guid>
		<description><![CDATA[Vous avez un regard terrifié ! Les yeux en sangs, vous venez de voir 12 000 lignes de codes sans commentaire dans une classe statique. Vous demandez des explications ! Pourquoi ? Pourquoi tant de haine ? Voici les &#8220;réponses&#8221; les plus fréquentes. Pourquoi changer ? ça marche Pourquoi changer ? C&#8217;est une bonne question [...]]]></description>
			<content:encoded><![CDATA[<p>Vous avez un regard terrifié ! Les yeux en sangs, vous venez de voir 12 000 lignes de codes sans commentaire dans une classe statique. Vous demandez des explications ! Pourquoi ? Pourquoi tant de haine ?</p>
<p>Voici les &#8220;réponses&#8221; les plus fréquentes.</p>
<p><span id="more-288"></span></p>
<h2>Pourquoi changer ? ça marche</h2>
<p>Pourquoi changer ? C&#8217;est une bonne question et elle n&#8217;est pas si stupide que ça.</p>
<p>Vous avez déjà vu un ou deux stagiaires qui ont voulus optimiser un code backdoor qui n&#8217;est quasiment jamais appelé. Passer de 513ms a 437ms sur un code qui est appelé dans un CRON tout les mois&#8230; ça n&#8217;a pas forcément un grand intérêt. Mais il faut se poser quelques questions:</p>
<ul>
<li>Dois-je modifier ce code souvent ?</li>
<li>Ce code est-il appelé dans une boucle haptique a 1000Hz ?</li>
<li>Est-ce que ma fonction ressemble plus a une boite noire qui des fois me retourne des résultats &#8220;mystique&#8221; ?</li>
</ul>
<p>Si vous avez répondu &#8220;oui&#8221; a une seule de ses 3 réponses, OUI ! Il faut changer !</p>
<p><strong>solution: </strong> Expliquez que la machine à vapeur ça marche aussi et pourtant&#8230;</p>
<h2>On avait pas le temps</h2>
<blockquote><p>C&#8217;est la vie ! Dans une boite (une vrai comme nous), on nous demande des trucs et on a pas le temps de faire comme à l&#8217;univ !</p></blockquote>
<p>HAHAHAHA, celle là me fait bien rire <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . On a pas le temps de reviewer un peu son code mais on a la temps de rester 3 jours jusqu&#8217;a minuit juste avant la prod ! Là on peut bosser !</p>
<p>Le temps ça se trouve. La plupart des entreprises devrait fixer un créneau horaire pour revoir et remanier le code existant. Le temps passé a faire cela serait largement gagné sur les phases de debugging.</p>
<p><strong>solution:</strong> expliquez que ranger sa chambre tout les jours c&#8217;est moins chiant que de le faire une fois par an juste avant que maman passe en foutant tout sous le lit.</p>
<h2>C&#8217;est pour optimiser</h2>
<p>Il y a un petit coté &#8220;humain&#8221; derrière cette excuse. &#8220;J&#8217;aurais bien voulu mais c&#8217;est pas possible&#8221;.</p>
<p>Tout d&#8217;abord si la personne qui vous dit ça fait autre chose que du C ou C++ vous pouvez directement lui jeter des pierres. On &#8220;optimise&#8221; pas un code PHP ou Ruby en faisant du code crade. A partir du moment ou on ne sait pas comment l&#8217;interpréteur/compilateur fonctionne derrière. Le fait de tout mettre dans une fonction ne vous fait faire que des économies de bout de chandelles.</p>
<p>Le soucis d&#8217;optimisation pouvait s&#8217;expliquer encore il y a quelques années avec des machines plus lentes mais maintenant les machines sont suffisamment puissante.</p>
<p>Les solutions actuelles pour gérer de gros volumes de données se font surtout par des clustering/cloud car les processeurs ne montent plus en puissance mais en nombre. Il y a de forte chance pour qu&#8217;un code &#8220;optimiser&#8221; à l&#8217;ancienne ne puissent pas être réutiliser sur un cloud.</p>
<p><strong>solution:</strong> proposez de multi-threadé le code comme ça il sera encore plus performant ;). Les autres dev n&#8217;auront plus l&#8217;excuse de l&#8217;optimisation.</p>
<h2>C&#8217;est trop compliquer, on peut pas faire autrement !</h2>
<p>&#8220;Il y a trop de vérification a faire, on a besoin de ces 34 if/else imbriqués&#8221;.</p>
<p>Souvent les collègues se cachent derrière l&#8217;excuse du &#8220;trop compliqué&#8221;. C&#8217;est vrai que c&#8217;est facile. Le code est compliqué a lire on en déduit que ce que le code fait est&#8230; compliqué.</p>
<p>Si je pars sur l&#8217;exemple du &#8220;34 if/else&#8221;, on peut se poser la question &#8220;si c&#8217;est une vérification, ce code ne devrait t&#8217;il pas être déporté dans une classe Validator ?&#8221;. Sémantiquement, les &#8220;34 if/else&#8221; sont-il dissociable ?</p>
<blockquote><p>Un problème infiniment complexe n&#8217;est que la somme d&#8217;une infinité de problème simple</p></blockquote>
<p>J&#8217;aime me dire que tout problème aussi compliqué soit-il peut être résumé par une somme de problème simple à comprendre.</p>
<p>Partant de ce principe, le code aura surement beaucoup plus de classe et pourra peut être effrayé des personnes de passé d&#8217;une classe statique a une douzaine de petite classe mais pour autant le code sera beaucoup plus simple et raisonné.</p>
<p><strong>solution:</strong> expliquez qu&#8217;un code complexe peut être subdivisé en code plus simple.</p>
<h2>Quelques &#8220;autres&#8221; excuses bidons envoyés par twitter <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </h2>
<ul>
<li>cette appli a pas loin de 7 ans, on va pas s&#8217;amuser à tout reprendre maintenant !</li>
<li>mais si, c&#8217;est bien codé, toi tu sais !</li>
<li>w3c c&#8217;est pour les low</li>
<li>je mets pas de commentaire parce que j&#8217;ai peur de pas comprendre ce que j&#8217;ai voulu dire</li>
</ul>
<p><strong>N&#8217;hésitez pas a en laisser en commentaire <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </strong></p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.lo2k.net/2010/02/4-excuses-de-collegues-pour-faire-du-code-spaghetti/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Comment réutiliser son propre code (et ne pas réinventer la roue) ?</title>
		<link>http://weblog.lo2k.net/2009/12/comment-reutiliser-son-propre-code/</link>
		<comments>http://weblog.lo2k.net/2009/12/comment-reutiliser-son-propre-code/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 08:35:17 +0000</pubDate>
		<dc:creator>X-Blaster</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://weblog.lo2k.net/?p=229</guid>
		<description><![CDATA[Cela fait bientôt&#8230; longtemps que je dev . Ouh là ! Bien plus de 10 ans ! Je prend un coup de vieux là d&#8217;un coup mais fort est de constaté que ma mentalité a pas mal évolué avec le temps. J&#8217;ai envie aujourd&#8217;hui de vous faire partager un certain nombre de choses dont je me rend [...]]]></description>
			<content:encoded><![CDATA[<p>Cela fait bientôt&#8230; longtemps que je dev <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Ouh là ! Bien plus de 10 ans ! Je prend un coup de vieux là d&#8217;un coup mais fort est de constaté que ma mentalité a pas mal évolué avec le temps.</p>
<p>J&#8217;ai envie aujourd&#8217;hui de vous faire partager un certain nombre de choses dont je me rend compte en même temps que je commence a perdre mes cheuveux <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<h2>La réutilisabilité.</h2>
<p>Ahhh la jeunesse, la fac ! Quel nostalgie !</p>
<p>Je me souviens a chaque fois que j&#8217;avais une idée d&#8217;amélioration dans un programme, je reprogrammais TOUT. Repartir d&#8217;un projet vide et tout refaire pour atteindre le code &#8220;ultime&#8221;, celui qui sera maintenable et rapide à la fois.</p>
<p>Mais voilà&#8230; en prenant de l&#8217;age. Il n&#8217;y a plus maman pour faire les courses, la vaisselle, la lessive et du coup il y a forcément moins de temps pour dev. Alors forcément, si j&#8217;ai quelque chose qui marche, j&#8217;ai pas très envie de réinventer la roue (surtout carré).<span id="more-229"></span></p>
<h2>Oui mais j&#8217;ai fait ça il y a 2 ans !</h2>
<p>N&#8217;étant pas un fervent défenseur de la javadoc, phpdoc ou autre joyeuseriedoc, je ne documente pas beaucoup mon code (PÔ BIEN !!!) mais je fais des tests unitaires. Si j&#8217;avais un conseil a vous donnez,<strong> faites des tests unitaires au moins vous aurez un vague souvenir de ce que fais chaque fonctions</strong> <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>A partir du moment ou mes tests unitaires passent, je considère que mon code &#8220;fonctionne&#8221;. Il n&#8217;est surement pas parfait mais je ne vais pas le changer tant qu&#8217;il</p>
<ul>
<li>n&#8217;est pas horriblement lent</li>
<li>n&#8217;a aucun bug detecté</li>
</ul>
<p>Et puis&#8230; le code a t&#8217;il besoin d&#8217;être parfait ? Injection de dépendances, Design pattern, Meta modèle, les concepts en informatiques fleurissent tellement que le temps de finir un projet, techniquement il est déjà dépassé <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Il faut vivre avec son temps mais cela ne sert a rien de modifier quelque chose qui marche et qui semble &#8220;plutôt&#8221; maintenable.</p>
<h2>Ouh là&#8230; mais c&#8217;est en PHP4 !</h2>
<p>Avec le temps, on apprend aussi de nouveau langage. Basic, Delphi, C++, PHP, Python, Ruby, Java&#8230; c&#8217;est qu&#8217;on aime expérimenter un peu tout. Il faut aussi avouer qu&#8217;il serait un peu bête de ne pas utiliser le langage le plus approprié pour la tache. Je ne m&#8217;amuserais pas a faire une appli web en C++ ni a faire un programme en PHP/QT.</p>
<p>Mais comment réutiliser du code d&#8217;un autre langage ? C&#8217;est très simple, en utilisant une interface.</p>
<p>Le mot &#8220;interface&#8221; ici est a prendre au sens large. Que ce soit du xmlrpc, une page en JSON ou une exécution dans le langage actuel avec une glue quelconque (je pense a python avec des dll ou java avec jython, jruby), l&#8217;important ici est d&#8217;utilisé une technique de communication &#8220;standardisée&#8221;.</p>
<p>Mais le mot &#8220;interface&#8221; est aussi a prendre au sens propre d&#8217;un langage de programmation. Plus vous aurez d&#8217;interface définis, plus il sera facile de changer son implémentation par la suite.</p>
<p>Souvent on me regarde de travers quand je dis &#8220;<strong>on peut faire du code bien crade si l&#8217;interface est propre</strong>&#8220;. Peut importe d&#8217;avoir un bout de programme en TCL/TK tant que son utilisation dans le programme principal reste transparente et que cette brique puisse être interchangeable.</p>
<h2>Concretement cela donne quoi ?</h2>
<p>Si j&#8217;ai eu l&#8217;idée de faire ce petit post c&#8217;est parce qu&#8217;actuellement j&#8217;ai 2 projets en parallèles que je traine depuis un moment et où je suis très content de réutiliser le code existant.</p>
<p>Le premier c&#8217;est <a href="http://scrutator.lo2k.net">scrutator</a> où une partie du code serveur est en PHP. Même si la nouvelle implementation est en python twisted, la couche de sauvegarde s&#8217;effectue en XML-RPC et utilise toujours l&#8217;ancien code de sauvegarde. Une partie de l&#8217;ancienne logique de déploiement repose toujours sur du code PHP mais elle a tendance au fur et a mesure a disparaitre.<br />
Le fait d&#8217;avoir décidé de <strong>réutilisé une partie de mon code PHP m&#8217;a facilement fait gagné 2 a 3 semaines</strong> de développement. La logique de déploiement disparaitra mais la sauvegarde se fera a mon avis toujours par la couche PHP qui reste robuste.</p>
<p>Le 2ème c&#8217;est <a href="http://mylibrary.lo2k.net">MyLibrary</a>. Je suis en train de réfléchir a le refaire en GWT. Ici aucun intérêt a changer la couche de sauvegarde et de requête sur Amazon. Je pense développer une couche en JSON pour dialoguer avec PHP. L&#8217;interface de sauvegarde risque ensuite de s&#8217;améliorer par la suite pour surement utiliser la sauvegarde PHP et <a href="http://gears.google.com/">Google Gears</a>.</p>
<h2>Ne pas faire de programmation spaguetti</h2>
<p>Oui il faut réutiliser ! Oui on peut réutiliser du code imbuvable ! Mais attention a ne pas faire n&#8217;importe quoi non plus. Vous devez garder le contrôle.</p>
<p>Rien ne vous empêche de faire des tests unitaires dans votre nouvelle implémentation (en java par exemple) pour vérifier que votre ancienne implémentation (en PHP) fonctionne toujours.</p>
<p>Il faut aussi éviter de réutiliser un code qui utilise lui même un code déjà recyclé. Utiliser du code Perl dans un programme PHP qui est repris en Python&#8230; Il serait peut être un peu temps de se remettre en question et de voir si tout est réellement nécessaire.</p>
<h2>En conclusion</h2>
<p>Pour réutiliser son code il y a quelques règles simples à suivre.</p>
<ol>
<li><strong>Assurez qu&#8217;il est facile de se replonger dans le code.</strong> Tests unitaires, exemples, doc automatique, il y a bien des moyens de faciliter la reprise d&#8217;un code existant. Personnellement je préfère les tests unitaires qui assureront aussi des tests de régressions, de plus ils doivent en théorie être complet et donc utiliser toutes les interfaces ceux qui vous permettra de vous souvenir des entrées/sorties de chaque fonctions.</li>
<li><strong>Faites des interfaces </strong>! Il faut en faire le plus possible. Des interfaces sont nécessaire pour chaque partie &#8220;clé&#8221; de votre code.</li>
<li><strong>Ne pas être perfectionniste.</strong> Pourquoi refaire un code qui marche alors que votre implémentation actuelle fonctionne correctement et qu&#8217;il n&#8217;y a pas d&#8217;évolution prévu pour cette partie de code ?</li>
</ol>
<p>En espérant que cela vous aidera a faire du très bon recyclage <img src='http://weblog.lo2k.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.lo2k.net/2009/12/comment-reutiliser-son-propre-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

