riduidel’s posterous

 
Filed under

développement

 

copier/coller, c'est mal ?

En lisant cet article, plusieurs idées me sont venues à l'esprit, que je jette dans ce coin de l'internet.

1 - un détecteur/empêcheur de copier/coller pour Eclipse, ça doit exister, non ? Ah, tiens ... non. 
2 - Si les gens utilisent du code d'internet avant celui du projet, c'est que les moteurs de recherche de code sur internet sont plus performants que les moteurs de recherche de code dans la base de code. Comment améliorer ça ? Avec un moteur de recherche interne genre fisheye ou krugle ? Auquel il faut évidement ajouter plus de commentaires de code (pour l'indexation), et, éventuellement, un système de forum autour du code pour discuter de ses corrections.
3 - Pour le GUID, he trouve que c'est une excellente idée. Mais GitHub, par exemple, permet d'archiver du source de manière visible du monde. Alors, ce GUID, est-ce que ça ne va pas dans la direction d'un contrôle de sources distribué à l'échelle d'internet ?

 
 

via Coding Horror de Jeff Atwood le 22/04/09

Is copying and pasting code dangerous? Should control-c and control-v be treated not as essential programming keyboard shortcuts, but registered weapons?

keyboard: ctrl-c, ctrl-v

(yes, I know that in OS X, the keyboard shortcut for cut and paste uses "crazy Prince symbol key" instead of control, like God intended. Any cognitive dissonance you may be experiencing right now is also intentional.)

Here's my position on copy and paste for programmers:

 

Copy and paste doesn't create bad code. Bad programmers create bad code.

Or, if you prefer, guns don't kill people, people kill people. Just make sure that source code isn't pointed at me when it goes off. There are always risks. When you copy and paste code, vigilance is required to make sure you (or someone you work with) isn't falling into the trap of copy and paste code duplication:

 

Undoubtedly the most popular reason for creating a routine is to avoid duplicate code. Similar code in two routines is a warning sign. David Parnas says that if you use copy and paste while you're coding, you're probably committing a design error. Instead of copying code, move it into its own routine. Future modifications will be easier because you will need to modify the code in only one location. The code will be more reliable because you will have only one place in which to be sure that the code is correct.

Some programmers agree with Parnas, going so far as to advocate disabling cut and paste entirely. I think that's rather extreme. I use copy and paste while programming all the time, but never in a way that runs counter to Curly's Law.

But pervasive high-speed internet -- and a whole new generation of hyper-connected young programmers weaned on the web -- has changed the dynamics of programming. Copy and paste is no longer a pejorative term, but a simple observation about how a lot of modern coding gets done, like it or not. This new dynamic was codified into law as Bambrick's 8th Rule of Code Reuse:

 

It's far easier and much less trouble to find and use a bug-ridden, poorly implemented snippet of code written by a 13 year old blogger on the other side of the world than it is to find and use the equivalent piece of code written by your team leader on the other side of a cubicle partition.

(And I think that the copy and paste school of code reuse is flourishing, and will always flourish, even though it gives very suboptimal results.)

Per Mr. Bambrick, copy and pasted code from the internet is good because:

 

  • Code stored on blogs, forums, and the web in general is very easy to find.
  • You can inspect the code before you use it.
  • Comments on blogs give some small level of feedback that might improve quality.
  • Pagerank means that you're more likely to find code that might be higher quality.
  • Code that is easy to read and understand will be copied and pasted more, leading to a sort of viral reproductive dominance.
  • The programmer's ego may drive her to only publish code that she believes is of sufficient quality.

But copy and pasted code from the internet is bad because:

 

  • If the author improves the code, you're not likely to get those benefits.
  • If you improve the code, you're not likely to pass those improvements back to the author.
  • Code may be blindly copied and pasted without understanding what the code actually does.
  • Pagerank doesn't address the quality of the code, or its fitness for your purpose.
  • Code is often 'demo code' and may purposely gloss over important concerns like error handling, sql injection, encoding, security, etc.

Now, if you're copying entire projects or groups of files, you should be inheriting that code from a project that's already under proper source control. That's just basic software engineering (we hope). But the type of code I'm likely to cut and paste isn't entire projects or files. It's probably a code snippet -- an algorithm, a routine, a page of code, or perhaps a handful of functions. There are several established code snippet sharing services:

 

Source control is great, but it's massive overkill for, say, this little Objective-C animation snippet:

 

 - (void)fadeOutWindow:(NSWindow*)window{ 	float alpha = 1.0; 	[window setAlphaValue:alpha]; 	[window makeKeyAndOrderFront:self]; 	for (int x = 0; x < 10; x++) { 		alpha -= 0.1; 		[window setAlphaValue:alpha]; 		[NSThread sleepForTimeInterval:0.020]; 	} } 

To me, the most troubling limitation of copypasta programming is the complete disconnect between the code you've pasted and all the other viral copies of it on the web. It's impossible to locate new versions of the snippet, or fold your features and bugfixes back into the original snippet. Nor can you possibly hope to find all the other nooks and crannies of code all over the world this snippet has crept into.

What I propose is this:

 

 // codesnippet:1c125546-b87c-49ff-8130-a24a3deda659 - (void)fadeOutWindow:(NSWindow*)window{ // code 	} } 

Attach a one line comment convention with a new GUID to any code snippet you publish on the web. This ties the snippet of code to its author and any subsequent clones. A trivial search for the code snippet GUID would identify every other copy of the snippet on the web:

 

 http://www.google.com/search?q=1c125546-b87c-49ff-8130-a24a3deda659 

I realize that what I'm proposing, as simple as it is, might still be an onerous requirement for copy-paste programmers. They're too busy copying and pasting to bother with silly conventions! Instead, imagine the centralized code snippet sharing services automatically applying a snippet GUID comment to every snippet they share. If they did, this convention could get real traction virtually overnight. And why not? We're just following the fine software engineering tradition of doing the stupidest thing that could possibly work.

No, it isn't a perfect system, by any means. For one thing, variants and improvements of the code would probably need their own snippet GUID, ideally by adding a second line to indicate the parent snippet they were derived from. And what do you do when you combine snippets with your own code, or merge snippets together? But let's not over think it, either. This is a simple, easily implementable improvement over what we have now: utter copy-and-paste code chaos.

Sometimes, small code requires small solutions.

Loading mentions Retweet
Filed under  //   développement   eclipse   java  

Comments [0]

Agile ?

Grâce à mon collègue désuet, j'ai découvert ce joli petit badge de développeur expérimenté en programmation extrême. Ca me tente bien, je vais peut-être le mettre sur mon blog ...

Par la même occasion, j'ai trouvé quelques articles intéressants sur ce blog, comme celui sur le bûcheron et sa scie ...

Un article d'autant plus intéressant qu'il ne me donne pas de réponses toutes faites, mais me pose plutôt des questions.

En effet, si je passe beaucoup de temps à faire en sorte de n'avoir à corriger les bugs qu'une fois, il y a d'autres domaines sur lesquels je me pose moins de questions, et où je laisse plus bosser mes collègues sans poser la moindre question. Mais est-ce un mal ? Je m'explique .. Quand je suis arrivé dans mon entreprise, on était deux développeurs et demi. Grâce à la croissance mondiale, on est passés à cinq développeurs, ce qui provoque naturellement l'accrétion de compétences autour de points clés : créer des versions, produire une architecture puissante et évolutive, faire rentrer des ronds dans des carrés, ...

La question clé est : sur quels compétences suis-je en train de progresser, et où diable est-ce que j'exerce mon agilité ?

Pour parler franchement, je n'en sais plus rien.

Je suis toujours capable, s'il le faut, d'acquérir des compétences sur une partie du code ou une autre, de la maintenir et de la faire évoluer vers un code plus propre, plus testé, plus ... comment dire ... atomique (au sens où on ne peut pas faire plus petit sans perdre la fonctionnalité). Mais je n'ai plus l'impression que l'avenir du logiciel qu'on est en train de développer se situe sur le plan du code. A mon sens, tout au moins dans mon entreprise actuelle, le problème n'est plus technique, mais organisationnel. Et là, il y a beaucoup de boulot pour lequel il va bien falloir que quelqu'un se motive. Hélas, j'ai utilisé le mot maudit ... "il va falloir". Je déteste réellement utiliser ce genre de phrases. Mais est-ce que j'ai vraiment envie de mouiller ma chemise là-dessus ? Voilà peut-être la question qui va de plus en plus m'agiter ...

PS : pour le badge, voici un test à faire ... Dont le résultat sonne comme un verdict peu flatteur :

Vos résultats :
Management : 5.88%
 
Ingéniérie : 30.43%

Loading mentions Retweet
Filed under  //   agile   développement   expérience   xp  

Comments [0]

préconditions en Java

Quand on développe en Java et qu'on écrit des méthodes, on a souvent le cas de paramètres ayant des valeurs incorrectes (genre un paramètre nul).

Ce qu'on fait d'ahbitude, c'est une vérification simple :

if(toto==null) {

    toto = "toto";

}

C'est laid, hein ?

Et en plus, ça pollue le code.

En me baladant sur internet à la recherche de la solution à un problème compliqué de collection basée sur le hash contenant des éléments mutables, je suis tombé sur cet article : mutable entries in a collection qui m'a mené à celui-ci (beaucoup plus intéressant) : RuntimeExceptions and Gurus failing to meditate bon, j'aime bien la GuruFailedToMeditateException, mais ce que j'aime surtout beaucoup, c'est les vérifications de préconditions avec la classe Preconditions. J'aime même tellement ça que je me demande comment je pourrais inclure ça dans mon projet à grands coups d'annotations (pour que ça marche bien et que ça puisse aussi générer de la doc).

Du coup, j'ai commencé à re-jeter un coup d'oeil aux frameworks de programmation par contrat en Java.

  • modern-jass a l'air très bien
  • Je me demande si on ne peut pas bâtir quelque chose pour ça en utilisant jUnit et son désormais fameux assertThat.
  • Et cet article m'explique ce dont je me doutais déja : les assertions sont un premier pas déja satisfaisant, et hamcrest et FEST-assert sont de très bonnes solutions, grâce essentiellement à leurs interfaces "fluentes".

Bref, c'est un sujet assez intéressant, sur lequel je vais essayer de creuser un peu.

Loading mentions Retweet
Filed under  //   concepts   développement   java   préconditions   test  

Comments [0]

Comment être un vrai programmeur

Dans toute ma carrière, j'ai souvent cherché comment être meilleur. Hélas, comme le dit très bien jeff Artwood, le problème du développeur n'est pas un problème technique, mais un problème d'équipe. Et, souvent, les développeurs posant problème son fceux qui n'ont pas connaissance de toute cette littérature de l'architecture du développement, ni même des bonnes pratiques (j'en ai des exemples pas loin).
Néanmoins, je trouve amusant qu'après un aussi long article, il en arrive à une liste de préconisations aussi courte.

via Coding Horror de Jeff Atwood le 13/02/09

A common response to The Ferengi Programmer:

 

From what I can see, the problem of "overly-rule-bound developers" is nowhere near the magnitude of the problem of "developers who don't really have a clue."

The majority of developers do not suffer from too much design patterns, or too much SOLID, or agile, or waterfall for that matter. They suffer from whipping out cowboy code in a pure chaos environment, using simplistic drag & drop, data driven, vb-like techniques.

Absolutely.

But here's the paradox: the types of programmers who would most benefit from these guidelines, rules, principles, and checklists are the least likely to read and follow them. Throwing a book of rules at a terrible programmer just creates a terrible programmer with a bruise on their head where the book bounced off. This is something I discussed previously in Mort, Elvis, Einstein, and You:

 

Thus, if you read the article, you are most assuredly in the twenty percent category. The other eighty percent are not actively thinking about the craft of software development. They would never find that piece, much less read it. They simply don't read programming blogs-- other than as the result of web searches to find quick-fix answers to a specific problem they're having. Nor have they read any of the books in my recommended reading list. The defining characteristic of the vast majority of these so-called "vocational" programmers is that they are unreachable. It doesn't matter what you, I or anyone else writes here -- they'll never see it.

In the absence of mentoring and apprenticeship, the dissemination of better programming practices is often conveniently packaged into processes and methodologies. How many of these do you know? How many have you practiced?

1969 Structured programming
1975 Jackson Structured Programming
1980 Structured Systems Analysis and Design Methodology
1980 Structured Analysis and Design Technique
1981 Information Engineering
1990 Object-oriented programming
1991 Rapid Application Development
1990 Virtual finite state machine
1995 Dynamic Systems Development Method
1998 Scrum
1999 Extreme Programming
2002 Enterprise Unified Process
2003 Rational Unified Process
2004 Constructionist Design Methodology
2005 Agile Unified Process

And how do we expect the average developer to find out about these? In a word, marketing. (I could have substituted religion here without much change in meaning.) It's no coincidence that a lot of the proponents of these methodologies make their living consulting and teaching about them. And they have their work cut out for them, too, because most programmers are unreachable:

 

I was sitting in my office chatting with my coworker Jeremy Sheeley. Jeremy leads the dev team for Vault and Fortress. In the course of our discussion, I suddenly realized that none of our marketing efforts would reach Jeremy. He doesn't go to trade shows or conferences. He doesn't read magazines. He doesn't read blogs. He doesn't go to user group meetings.

Jeremy is a decision-maker for the version control tool used by his team, and nothing we are doing would make him aware of our product. How many more Jeremies are out there?

Millions! As Seth Godin notes, the unreachable are now truly unreachable -- at least not through marketing.

So, if we know the programmers who would benefit most from these rules and principles and guidelines are:

 

  1. highly unlikely to ever read them of their own volition
  2. almost impossible to reach through traditional religionmarketing

Remind me again -- who, exactly, are we writing these principles, rules, guidelines, and methodologies for? If we're only reaching the programmers who are thoughtful enough to care about their work in the first place, what have we truly accomplished? I agree with Jeff R., who left this comment:

 

There's nothing wrong with the SOLID principles; they make sense to me. But I've been programming since the days of card readers and teletypes. They won't make sense to those with little experience. They don't know when or how to apply them appropriately. They get bogged down in the attempt.

So trying to follow them changes the focus from result to process. And that's deadly.

It's the job of the lead programmer or manager to see that good principles are followed, perhaps by guiding others invisibly, without explicitly mandating or even mentioning those principles.

 

In my effort to suck less every year, I've read hundreds of programming books. I've researched every modern programming methodology. I'm even a Certified Scrum Mastertm. All of it, to me, seems like endlessly restated versions of four core fundamentals. But "four core fundamentals?" that's awful marketing. Nobody will listen in rapt, adoring attention to me as I pontificate, nor will they pay the exorbitant consulting fees I demand to support the lifestyle I have become accustomed to. It simply won't do. Not at all. So, I dub this:

 

The Atwood System of Real Ultimate Programming Power

 

  • DRY
  • KISS
  • YAGNI
  • NAMBLA
  • All those incredibly detailed rules, guidelines, methodologies, and principles? YAGNI. If it can't be explained on a single double-spaced sheet of paper, it's a waste of your time. Go read and write some code! And if you can't grok these fundamentals in the first three or four years of your programming career, well -- this slightly modified R. Lee Ermey quote comes to mind.

    My name is Jeff, and I can't stop thinking about programming. And neither should you.

    Loading mentions Retweet
    Filed under  //   amélioration   développement   programmeur  

    Comments [0]

    Le serpent de mer du jour : les IDE

    Petit avant propos : ce message est issu d'une discussion sur une liste de diffusion Java à laquelle je participe. Il m'a semblé intéressant (surtout que je sais que certains de mes lecteurs sont comme moi développeurs Java)

    Je suis étonné qu'un tel sujet ne déchaîne plus les passions.

    J'ai souvenir de discussions plus enflammées sur des sujets moins polémique sur cette liste ...

    On a du vieillir ;-)

    Ca doit être ça

    Je crois surtout que, grâce à maven en particulier, le choix d'un IDE n'est plus structurant pour les projets de grosse taille (typiquement les projets JEE). On a en effet maintenant toutes nos bibliothèques disponibles de manière standardisée quelquesoit l'interface de développement choisie.

    C'est un peu faux en ce qui concerne les développements "visuels" quels qu'ils soient : depuis l'époque môdite de Struts, on cherche toujours, pour le web comme pour le swing, le générateur d'UI qui marche à tous les coups avant de toujours en revenir au développement à la main dans Eclipse ou NetBeans. Et là, en revanche, avoir ses petites habitudes, ça peut aider à gagner des dizaines de jours : savoir bien utiliser le debuggeur, connaître les raccourcis clavier, c'est le genre de feintes où l'habitude d'un outil est primordiale, plus encore que l'ergonomie du dit outil ou encore son intérêt réel.

    Pour ce genre de cas (et histoire d'insister sur le thème "elle est finie la belle époque des débuts, quand je codais avec TextPad, la javadoc en WinHelp et le JDK en ligne de commande"), j'ai une citation chinoise qui est assez appropriée : "il n'y a pas de mauvais outils, seulement de mauvais ouvriers". En l'occurence, ça signifie pour moi que forcer un développeur à utiliser un outil qu'il ne connaît pas (genre un IDE, même s'il est meilleur comme IntelliJ Idea, qui garde pour moi une aura de qualité depuis mon dernier test qui remonte à 5 ans), ça revient à lui couper une main et lui demander d'être performant.

    Parce que l'IDE, c'est notre troisième bras. C'est lui qui nous permet de voir le code sous différents aspects, de le travailler selon chacun de ces aspects, pour enfin le faire marcher. La contrepartie de ça, c'est que ne pas savoir utiliser un IDE, c'est en quelque sorte un aveu d'incompétence : on a un outil qui nous permet de définir une architecture, de coder un produit professsionnel, de le tester sous toutes les coutures, de voir quels sont les mauvais comportements du produit qu'on développe, et on ne sait utiliser que l'éditeur et (parfois) un tout petit peu le débuggeur. Ca, c'est un scandale. Moi, quand je vois ça, ça me donne envie de filer aux développeurs d'opérette qui en sont à ce niveau TextPad et une ligne de commande, juste pour leur faire comprendre qu'ils ne sont pas obligés d'utiliser le meilleur matériel s'ils ne savent pas s'en servir. Mais je m'égare ...

    Pour finir, ma réponse à la question initiale est assez simple : quel IDE ? Celui que je préfère pour la tâche en cours : Eclipse pour coder et debugger, et NetBeans pour profiler. Et parfois notepad++ quand je dois juste modifier une ligne ou deux. Si vous me dites qu'ils sont tous les trois open-source et que c'est une volonté de ma part, je vous dirais que c'est faux. ils sont certes tous les trois open-sources et gratuits, mais la seule chose qui m'intéresse, c'est leur gratuité. je pourrais vous faire tout un laïus sur le darwinisme appliqué à la production logicielle démontrant que, pour les outils de développement, l'open-source garantit la meilleure qualité, mais je ne crois pas que ça vous intéresserait des tonnes ...

    Loading mentions Retweet
    Filed under  //   développement   IDE   java   maven  

    Comments [2]

    auto-management

    Mon fan ne me détrompera pas, je travaille actuellement dans une entreprise présentant certains dysfonctionnements (normal, une entreprise est une affaire d'hommes, et les hommes n'étant pas parfaits, la structure qu'ils construisent ne peuvent pas l'être).

    L'un des avantages majeurs de cette structure pour moi et qu'elle me permet de remettre en cause un certain nombre d'éléments de ma personnalité et de ce que doit être mon travail (là, j'ai envie, juste pour flamber, de faire un lien sur cet article de Coding Horror : How To Become a Better Programmer by Not Programming qui parle un peu du sujet intéressant de ce que doit faire un développeur pour cultiver ses compétences annexes).

    Avant de revenir au coeur du sujet, je vais faire un petit retour en arrière. Quand j'ai quitté Sogeti l'année dernière, j'ai eu une longue discussion où j'ai expliqué à mon chef de projet que l'un des dysfonctionnements majeurs de cette entreprise est l'impact du marketting personnel sur la perception des compétences. C'est-à-dire que, dans une grosse structure comme celle-là, il est trop facile pour quelqu'un qui se markette bien d'accumuler promotions et augmentations quand ceux qui bossent réellement continuent à trimer dans un coin sombre.

    Et ce matin, deux articles reçus dans mon lecteur RSS m'ont fait réfléchir. Le premier, c'est encore Coding Horror : The One Thing Every Software Engineer Should Know, qui nous parle précisément du marketting pour les développeurs, et le second, c'est un lien rapide d'outils froids, vers La méthode en 6 points pour se "manager soi-même" de Peter Drucker. Le rapport entre les deux ? Dans aucun de ces cas on ne parle de code, d'algorithme, de conception, ou même de qualité. On parle plutôt de ce qui me pose le plus de problèmes dans mon entreprise actuelle : l'amélioration de la perception de l'efficacité d'un développeur. Bon, évidement, la version US est beaucoup plus directe (je dirais même "slogan"). Mais les deux m'incitent à la réflexion sur un point bien précis : améliorer une entreprise, ça n'est pas seulement améliorer ses procédures, ses produits. C'est aussi et surtout améliorer ses propres méthodes de travail au sein de l'entreprise pour "faire prendre la sauce".

    Je crois qu'à l'heure actuelle c'est l'un de mes principaux problèmes, et je vais d'ailleurs essayer de mettre en place la méthode décrite, même si je n'en comprend pas précisément tous les points ... Eh oui, je débute dans cet exercice délicat de l'amélioration du professionnel que je suis (d'ailleurs faudra que je vous reparle d'un point assez proche, bientôt).

    Loading mentions Retweet
    Filed under  //   développement   gestion de projet   ma vie   organisation   priorités  

    Comments [0]