Bienvenue sur PEBKAC.fr, le site qui recense les anecdotes où l’on se moque des utilisateurs ne maîtrisant pas l’outil informatique. PEBKAC est un acronyme signifiant « Problem Exists Between Keyboard And Chair ».
Le problème se situe entre la chaise et le clavier : soumettez vos histoires, donnez votre avis !
Ce site n'est pas le site original pebkac.fr. Je publie ici la liste des PEBKAC que j'ai pu sauvegarder avant que le site original ne soit mis hors ligne.
Dans la catégorie « pourquoi faire simple quand on peut faire compliqué », voilà le code d'une connaissance qui souhaite ajouter à un nombre "x" un entier relatif "n" :

if(n >= 0) x = x + n;
else x = x - Math.abs(n);

Parce qu'un simple x += n;, c'était trop compliqué. PEBKAC.
PEBKAC #7270 proposé par v6 le 20/03/2013 | 38 commentaires | 👍🏽 👎🏽 +157
int i;
 if (n > 0)
 {
   for (i = 0 ; i < n ; i++)
   {
     int j = 1;
     while(j != 0)
     {
       x = x + 1;
       j = j - 1;
     }
   }
 }
 else
 {
   for (i = 0 ; i > n ; i--)
   {
     int j = 1;
     while(j != 0)
     {
       x = x - 1;
       j = j - 1;
     }
   }
 }
Commentaire #84202 écrit par Epok__ le 20/03/2013 à 12h56 | 👍🏽 👎🏽
:')
Commentaire #84205 écrit par Shadam le 20/03/2013 à 13h01 | 👍🏽 👎🏽
Et si n est égal à zéro !!!!
Commentaire #84211 écrit par juu le 20/03/2013 à 13h35 | 👍🏽 👎🏽
Ça marche aussi
Commentaire #84212 écrit par Noname le 20/03/2013 à 13h36 | 👍🏽 👎🏽
Oui mais ce n'est pas assez désoptimisé, il aurait fallu un cas particulier !
Commentaire #84222 écrit par juu le 20/03/2013 à 13h58 | 👍🏽 👎🏽
Zut, mea culpa, j'aurai du faire un case sur toutes les valeurs acceptées pour n ! Après tout, ca ne fait que 2^32 possibilités, ou 2^64 selon l'archi...
Commentaire #84230 écrit par Epok__ le 20/03/2013 à 14h16 | 👍🏽 👎🏽
Ce terme est génial: désoptimisation. On devrait faire des concours de désoptimisation de code! Celui qui met le plus de temps à exécuter la fonction 2+2 à gagné!
Commentaire #84231 écrit par Moot le 20/03/2013 à 14h20 | 👍🏽 👎🏽
int i;
 int j;
 int k ;
 
 i = 2;
 j = 2;
 
 k = somme(i,j);
 
 int somme(int i, int j){
     int k;
         
     while(1){
         k = rand();
         if(k==i+j)
             return k;
     }
 }


edit : c'est trop rapide, je vais plutôt chercher une belle fonction récursive. C'est con, j'avais autre chose à faire, mais maintenant je vais perdre du temps sur ça...
Commentaire #84235 écrit par Link le 20/03/2013 à 14h34 | 👍🏽 👎🏽
@Moot:
int add(int a, int b)
 {
   if (b > 0)
     return add(a+1, b-1);
   else if (b < 0)
     return add(a-1, b+1);
   else if (b == 0)
     return a+0;
   else
     throw GenericException; //impossible
 
   throw GenericException; //impossible
   return 0; //juste au cas où
 }
 
Commentaire #84237 écrit par Shirluban le 20/03/2013 à 14h36 | 👍🏽 👎🏽
Je n'arrive pas à voir le rapport entre un pebkac et un code certes pourri mais fonctionnel... Je suis désolé mais je trouve que ça fait un peu tirage de nouille entre geek :-) Voire une glorification d'égos genre ah ah ah ah il essaye de programmer comme nous l'élite, mais n'a pas encore le niveau!

Je trouve ça condescendant
Commentaire #84239 écrit par Mr P. le 20/03/2013 à 14h42 | 👍🏽 👎🏽
savoir ajouter deux nombres c'est pas faire partie de l'élite hein... ça doit être à la page 2 du tuto c du site du zéro (j'ai pas vérifié)
Commentaire #84242 écrit par xo le 20/03/2013 à 14h48 | 👍🏽 👎🏽
Pour optimiser le tout, j'ai codé en PHP, qui comme chacun le sait est le langage le plus évolué pour du calcul mathématique.

$i = 5;
 $j = -10;
 
 $k = somme($i,$j, 0);
 
 echo $k;
 
 function somme($i, $j, $k){
     if($i > 0)
         return somme(--$i,$j,++$k);
     else if($i < 0)
         return somme(++$i,$j,--$k);
     else if($j > 0)
         return somme($i,--$j,++$k);
     else if($j < 0)
         return somme($i,++$j,--$k);
    else return $k;
    
 }


Testé et approuvé, même avec des nombres négatifs (mais toujours entiers). Je peux retourner bosser.
Commentaire #84244 écrit par Link le 20/03/2013 à 14h50 | 👍🏽 👎🏽
Ce n'est pas élitiste que de pondre un code à peu prêt propre ! En l'occurrence, ici son code a beau être fonctionnel, il n'en reste pas moins crétin : c'est un peu comme quelqu'un qui imprime son .doc puis scanne son impression pour obtenir un document PDF et l'envoyer par mail. Son processus est fonctionnel mais crétin et celui qui enregistre en PDF directement ne fait pas pour autant parti de l'élite.
Commentaire #84248 écrit par Navi le 20/03/2013 à 14h54 | 👍🏽 👎🏽
Justement. Le code est parfaitement correct et donne un résultat juste. Le raisonnement pour y parvenir est tordu, c'est indéniable, mais parfaitement retranscrit. Pour moi ce n'est pas un pebkac, puisqu'il n'y a pas de problème. Juste une vision biaisée des mathématiques.

Et il y a quand-même gros à parier que le code de départ était plus complexe et qu'au moment de la simplification le codeur n'a pas fait gaffe.
Commentaire #84250 écrit par Mr P. le 20/03/2013 à 15h01 | 👍🏽 👎🏽
Voir ma réponse ci dessus. Sans parler que nous n'avons pas le contexte. Et que pour en arriver à ce code il y a forcément une réflexion en amont que nous ne connaîtrons jamais. Donc juger hors contexte,bof...
Commentaire #84252 écrit par Mr P. le 20/03/2013 à 15h05 | 👍🏽 👎🏽
@Mr P. : En raisonnant comme ça, prendre une photo de son écran avec son smartphone, scanner son smartphone, imprimer et envoyer par courrier au lieu de juste envoyer par courriel une capture d'écran ne serait pas un pebkac... Parce que, là, c'est du même registre et (presque) du même niveau.
Commentaire #84264 écrit par danarmk le 20/03/2013 à 16h06 | 👍🏽 👎🏽
@Mr P. : Ça s'appelle de la factorisation de code dans ce cas là et ça n'excuse pas les aberration de code...
Commentaire #84267 écrit par Shadam le 20/03/2013 à 16h11 | 👍🏽 👎🏽
Le fait que ça marche ne veut pas dire que c'est OK. Le code est inutilement compliqué, ce qui veut dire qu'on doit l'analyser pour le comprendre alors que ce n'est pas nécessaire.
Le danger c'est que lorsque quelqu'un doit repasser derrière le code, il se méprenne sur sa signification et fasse une grosse bourde à cause de ça.

Par contre, tu as certainement raison pour le problème de simplification du code, je vois pas d'autre explication à faire un code comme ça.
Commentaire #84268 écrit par Gné? le 20/03/2013 à 16h19 | 👍🏽 👎🏽
Je ne comprends pas pourquoi le type a utilisé Math.abs(). Ce n'est pourtant pas compliqué à coder :
public static int abs(int a) {
 	return max(a, -a);        
 }


Bien sûr, il faut aussi définir max :
public static int max(int a, int b) {             
 	if (a < 0) {                                  
 		if (b < 0) {                              
 			return -(abs(a + b) - abs(a - b)) / 2;
 		} else {                                  
 			return b;                             
 		}                                         
 	} else {                                      
 		if (b < 0) {                              
 			return a;                             
 		} else {                                  
 			return (abs(a + b) + abs(a - b)) / 2; 
 		}                                         
 	}                                             
 }
Commentaire #84271 écrit par Acné le 20/03/2013 à 16h26 | 👍🏽 👎🏽
Je ne voit pas pourquoi Mr P. se fait moinsoyer.
Pour rentrer chez soi il est tout à fait normal de creuser un trou dans le mur avec la clef, même quand la porte est ouverte.
Commentaire #84276 écrit par Shirluban le 20/03/2013 à 17h14 | 👍🏽 👎🏽
@xo : Erreur. Le chapitre "Savoir ajouter 2 nombres" se trouve à la page 2 du manuel de calcul de CE1. Ou CP si on fait partie de l'élite, mais comme toi j'ai pas vérifié...
Commentaire #84277 écrit par ZK456 le 20/03/2013 à 17h15 | 👍🏽 👎🏽
int add(int a, int b)
{
while(true);
return a+b;
}

FTW...
Commentaire #84278 écrit par Momo le 20/03/2013 à 17h25 | 👍🏽 👎🏽
Boucle infinie <3
Commentaire #84280 écrit par mini le 20/03/2013 à 17h32 | 👍🏽 👎🏽
http://tinyurl.com/d9nfp4e
Commentaire #84291 écrit par Shadam le 20/03/2013 à 17h49 | 👍🏽 👎🏽
Mais tu n'as rien compris, c'est juste sa façon à lui de faire de l'obfuscation de code.



... ou alors non c'est juste un pebkac.
Commentaire #84300 écrit par Pirheas le 20/03/2013 à 18h09 | 👍🏽 👎🏽
Sinon ce n'est pas drôle !
Commentaire #84308 écrit par Acné le 20/03/2013 à 18h20 | 👍🏽 👎🏽
C'est normal si je vois pas de boucle dans le code ? Oo
Commentaire #84309 écrit par Limeila le 20/03/2013 à 18h23 | 👍🏽 👎🏽
Je me disais aussi... il a pas défini abs()

...

et après "ah merde" ^^
Commentaire #84310 écrit par neeko le 20/03/2013 à 18h24 | 👍🏽 👎🏽
@Limeila : essaye abs(0)
Sinon, effectivement, pour tout entier non nul, ça ne boucle pas. Insérer des bugs sur un cas limite qui n'a que peu de chances d'être testé est toujours jouissif !
Commentaire #84312 écrit par Acné le 20/03/2013 à 18h28 | 👍🏽 👎🏽
Non, il n'y en a pas effectivement Limeila ^^
Commentaire #84313 écrit par mini le 20/03/2013 à 18h31 | 👍🏽 👎🏽
@mini : si, avec zéro, il y a pétage de pile...
Commentaire #84322 écrit par Acné le 20/03/2013 à 18h48 | 👍🏽 👎🏽
Bon, ok, le mot élite dans ce cas particulier était inapproprié. C'est juste que ça fait plusieurs fois que je vois passer des sois disant pebkac avec des optimisations de code et des gens qui assènent leur science et ça m'énerve, du coup c'est sorti là. Désolé donc.

Par contre je maintiens que je trouve que ce n'est pas un pebkac. Contrairement aux exemples que vous donnez tous, ici on ne sait rien du contexte. Un jugement se fait à charge et à décharge. Or là on n'a pas assez d'éléments, juste 3 lignes de codes. Celui qui dans sa vie de codeur n'a jamais laissé une portion de code avec une énormité et qui pourtant est fonctionnelle ne doit pas avoir un long passif derrière lui. En fait-ce malgré tout un pebcak ? Pour moi non.
Commentaire #84329 écrit par Mr P. le 20/03/2013 à 19h00 | 👍🏽 👎🏽
Petits joueurs :
let somme p q =
   let rec aux n m ret =
     let s =
       if ret = 0 then
         if (n land 1) = (m land 1) then 0
         else 1
       else
         if (n land 1) = (m land 1) then 1
         else 0
     in
     let r =
       if ret = 0 then
         if (n land 1 = 1) && (m land 1 = 1) then 1
         else 0
       else
         if (n land 1 = 1) || (m land 1 = 1) then 1
         else 0
     in
     if n = 0 && m = 0 && ret = 0 then
      0 
     else
       ((aux (n lsr 1) (m lsr 1) r) lsl 1) lor s
   in
   aux p q 0


Ne marche pas sur les nombres strictement négatifs.
Commentaire #84339 écrit par danarmk le 20/03/2013 à 19h22 | 👍🏽 👎🏽
Moi ce qui m'énerve, ce sont les mauvais programmeurs qui me font perdre mon temps, me détruisent les neurones, et me cassent les pieds. Si si ! :)
Commentaire #84340 écrit par OzoneGrif le 20/03/2013 à 19h27 | 👍🏽 👎🏽
Y'a un moment où il faut quand même arrêter de déconner, hein :

Quelqu'un qui écrit le code décrit dans le pebkac, ou bien :

if (a == True) return true; else return false;

Au lieu de

return a;

n'est à mon avis pas très sérieux :/ (ou ne comprend pas depuis le début ce qu'il fait)

Donc, si, c'est un pebkac, un pebkac de dév certes, mais un pebkac quand même!

Edit : Et quand bien même nous serions dans un contexte où l'on définirait des fonctions primitives récursives, ça reste tout de même plus court que ça...
Commentaire #84361 écrit par Sonny le 20/03/2013 à 21h36 | 👍🏽 👎🏽
C'est pas exactement une boucle infinie, c'est plutôt une récursion sans terminaison (volontaire)

Edit : Même si, si l'on voulait représenter ce programme par un automate, on en reviendrait à parler de boucle, finalement
Commentaire #84362 écrit par Sonny le 20/03/2013 à 21h40 | 👍🏽 👎🏽
Librement inspiré du premier essai de Link :

int sum (int, int);
 
 int i;
 int j;
 int k;
 
 i = 2;
 j = 2;
 
 k = sum(i, j);
 
 int sum(int i, int j){
     int k;
         
     while((k = rand()) != sum(i, j))
         ;
     return k;
 }


Dans la mesure où tout bit du cache ou de la RAM a, à tout instant, une probabilité non nulle de changer spontanément d'état, le test récursif finira nécessairement par être vrai, fût-ce par hasard. Et si le programme foire parce que d'autres bits ont changé d'état, ce n'est pas la faute du codeur mais celle fondeur.

(Je profite de ce que les règles énoncées par Moot ne posent pas que le résultat doit être juste en arithmétique classique, hé hé.)
(Et puis c'est quand même délicieusement vicieux.)
Commentaire #84516 écrit par Geist le 21/03/2013 à 15h04 | 👍🏽 👎🏽
Franchement, vous pouvez pas faire concis ?

,>,<[->>+>+<<<][+>>>-<<<]>[->+>+<<][+>>-<<]>.
Commentaire #84558 écrit par danarmk le 21/03/2013 à 18h12 | 👍🏽 👎🏽