Bien débuter en découpant la complexité

Bien débuter en découpant la complexité

développement, algorithme, débutantPublié il y a 5 ans

Sommaire

En lisant l'excellent article de Mehdi Zed, Conseils pour développeur(euse) junior, je me suis aperçu que parmi les très bons conseils donnés dans l'article, une notion était très importante pour devenir un(e) développeur(euse) :

La première astuce ultra-efficace et qui va te servir toute ta carrière est de toujours avoir une approche de découpage de la complexité. - Mehdi Zed

Aujourd'hui nous allons voir avec un cas concret, cette méthodologie qui vous permettra de progresser si vous êtes débutant dans le développement.

J'ai dans mon entourage quelqu'un en reconversion qui veut devenir développeur, cette personne apprend et ce forme sur des plateformes en lignes avec des exercices à faire. Et le premier point de blocage qu'elle a rencontrée c'est l'incapacité de résoudre un problème. - "Je vais jamais y arriver, c'est trop compliqué !"

Pourtant, l'exercice n'avait aucune difficulté particulière, mais c'est parce qu'elle à voulu répondre au problème dans sa globalité; qu'elle c'est retrouvée démunie sans savoir par ou commencer.

Je vous propose qu'on revoit cet exercice, qu'on l'analyse et qu'on y réponde.

ℹ️ Cet article est à destination des débutants, étudiants ou même curieux de comprendre le développement. Nous allons répondre au problème en PHP, mais la logique reste la même pour n'importe quelle langage de programmation.

Problème :

On à un texte avec lequel nous voulons extraire des informations comme,
le nombre de mots, le nombre de phrases et la récurrence de certains mots.

En lisant l'énoncé je vous imagine déjà vous dire "Il me faut des compteurs, je vais devoir les associer aux mots et aux phrases, mais pour ça je dois découper mon texte, mais par mot ou par phrase ?!" Doucement ! Vous partez dans tous les sens et c'est la meilleur façon de perdre ses moyens et d'abandonner.

Le métier de développeur passe par une phase d'analyse du besoin. L'énoncé nous demande d'extraire des informations d'un texte. Commençons par lister les informations à extraire.

  • Le nombre de mots contenu dans un texte.
  • Le nombre de phrases contenu dans un texte.
  • La récurrence d'une liste de mots dans un texte.

Nous avons maintenant une idée plus précise de ce que nous allons devoir faire, créer trois algorithmes. Commençons avec le premier point, calculer le nombre de mots dans un texte. Mais avant je dois vous faire un petit rappel sur ce qu'on attend par "créer un algorithme". Un algorithme permet de répondre à un problème complexe en découpant celui-ci en sous problèmes simples. Créer un algorithme c'est découper une grosse tâche en plus petites tâches permettant de découper la complexité globale du problème.

Découpons donc notre problème complexe et plus petits problèmes :

  • Problème : Compter le nombre de mots dans un texte
  • 1er sous problème : Transformer mon texte en liste de mots
  • 2ème sous problème : Compter le nombre d’éléments dans ma liste de mots

Nos deux sous problèmes soulèves cependant leur lots de problèmes (qui ce gommerons avec du temps et de la pratique). Comment je découpe mon texte en mots ? Comme je connais la taille de ma liste de mots ?

On ce retrouve avec cette nouvelle liste de sous problèmes et sous sous problèmes :

  • Problème : Compter le nombre de mots dans un texte
  • 1er sous problème : Transformer mon texte en liste de mots
    • sous sous problème : Découper notre texte en mots
  • 2ème sous problème : Compter le nombre d’éléments dans ma liste de mots
    • sous sous problème : Connaître la taille de la liste de mots

Passons maintenant à la pratique en écrivant notre bout de code.

$story = "Maître Corbeau, sur un arbre perché, tenait en son bec un fromage. Maître Renard, par l'odeur alléché, lui tint à peu près ce langage. Et bonjour, Monsieur du Corbeau. Que vous êtes joli ! que vous me semblez beau !";

// Problème complexe : Compter le nombre de mots dans un texte
function getNumberOfWords($text) {

    /**
     * Premier sous problème : transformer mon texte en liste de mots
     * Un mot commence après un espace et fini avant un autre espace
     * En php la fonction `explode` permet de découper une chaîne de caractères
     * selon un délimiteur et de renvoyer un tableau
     */

    $words = explode(" ", $text);

    /*
     * Deuxième sous problème : compter le nombre de mots dans la liste de mots
     * Il suffit tout simplement de savoir la taille du tableau pour avoir le nombre de mots
     * En php pour savoir la taille d'un tableau on utilise la fonction `count`
     */

    return count($words);
}

$numberOfWords = getNumberOfWords($story);

echo "Le nombre de mots dans le texte est : " . $numberOfWords;

Notre premier algorithme n’était pas si compliqué que ça finalement 😉 Quelques petites remarques cependant : Lorsque vous développer un algorithme, pensez toujours à sa ré-utilisabilité, le développeur est faignant et il n'aime pas refaire ce qu'il a déjà fait. Prenez donc l’habitude d'encapsuler votre code dans des fonctions ré-utilisables. Également, notre code n'est pas parfait car il compte la ponctuation comme des mots. Faite toujours au plus simple dans un premier temps pour répondre au plus à votre besoin. Puis seulement dans un second temps, revenez sur votre code pour apporter plus de finesse, par exemple en parcourant le tableau et en enlevant chaque ponctuation du tableau avant de calculer sa taille.

Nous avons répondu à 1/3 de l'énoncé, continuons. Prochain point, calculer le nombre de phrases dans un texte. On refait notre découpage en sous problèmes, en prenant en compte ce que nous avons déjà appris.

  • Problème : Compter le nombre de phrases dans un texte
  • 1er sous problème : Transformer mon texte en liste de mots
  • 2ème sous problème : Reconnaître une phrase
  • 3ème sous problème : Compter le nombre de phrase

Nous savons comment découper un texte et connaître la taille d'un tableau, ce n'est donc plus des problèmes pour nous, cependant nous ne savons pas comment Reconnaître une phrase.

  • Problème : Compter le nombre de phrases dans un texte
  • 1er sous problème : Transformer mon texte en liste de mots
  • 2ème sous problème : Reconnaître une phrase
    • Sous sous problème : Parcourir notre liste de mots
    • Sous sous problème : Reconnaître la fin d'une phrase depuis un mots
  • 3ème sous problème : Compter le nombre de phrases
$story = "Maître Corbeau, sur un arbre perché, tenait en son bec un fromage. Maître Renard, par l'odeur alléché, lui tint à peu près ce langage. Et bonjour, Monsieur du Corbeau. Que vous êtes joli ! que vous me semblez beau !";

// Problème complexe : Compter le nombre de phrases dans un texte
function getNumberOfSentences($text) {

    // Premier sous problème : transformer mon texte en liste de mots
    $words = explode(" ", $text);

    /*
     * Deuxième sous problème : Reconnaître une phrase
     * Une phrase finie par avec une ponctuation "." ou "!"
     * Il suffit donc de parcourir nos mots
     * Lorsqu'on trouve une ponctuation, alors c'est qu'on est en fin de phrase
     */
    $numberOfSentences = 0;

    for ($i = 0; $i < count($words); $i++) {

        /*
         * Un sous sous problème est de détecter une ponctuation dans un mot
         * La ponctuation est toujours à la fin d'un mot
         * En php la fonction `substr("texte", -1);` permet d'avoir le dernier caractère d'une chaîne de caractères
         */

        $lastChar = substr($words[$i], -1);
        if ($lastChar == "." || $lastChar == "!") {

            /*
             * Troisième sous problème : Compter le nombre de phrases
             * Ici un simple compteur que l'on incrémente chaque fois
             * que notre condition de fin de phrase est vérifiée
             */

            $numberOfSentences++;
        }
    }

    return $numberOfSentences;
}

$numberOfsentences = getNumberOfSentences($story);

echo "Le nombre de phrases dans le texte est : " . $numberOfsentences;

Cet algorithme est déjà plus compliqué mais il nous a permit de voir la résolution de nouveaux sous problèmes, nous voila plus fort pour attaquer le dernier point, calculer la récurrence d'une liste de mots. Avant de vouloir calculer la récurrence d'une liste de mot, il faut savoir le faire pour un seul mot. Voici notre nouvelle liste de sous problèmes.

  • Problème : Compter la récurrence d'un mot dans un texte
  • 1er sous problème : Transformer mon texte en liste de mots
  • 2ème sous problème : Parcourir chaque mot
  • 3ème sous problème : Compter le nombre de fois que le mot apparaît
    • Sous sous problème : Comparer deux mots

Notre code…

$story = "Maître Corbeau, sur un arbre perché, tenait en son bec un fromage. Maître Renard, par l'odeur alléché, lui tint à peu près ce langage. Et bonjour, Monsieur du Corbeau. Que vous êtes joli ! que vous me semblez beau !";

// Problème complexe : Compter le nombre de fois qu'apparaît un mot dans un texte
function getWordIteration($text, $target) {

    // Premier sous problème : transformer mon texte en liste de mots
    $words = explode(" ", $text);

    /*
     * Deuxième sous problème : Parcourir notre liste de mots
     * En php on utilise plus souvent `foreach` pour parcourir un tableau
     */

    $number = 0;
    foreach ($words as $word) {

        /*
         * Troisième sous problème : Compter le nombre fois qu’apparaît le mot ciblé
         * Sous sous problème : comparer deux mots
         */
        if ($word == $target) {
            $number++;
        }
    }

    return $number;
}

$iterationOfMonsieur = getWordIteration($story, "Monsieur");

echo "Monsieur apparaît : " . $iterationOfMonsieur . " fois.";

ℹ️ Encore une fois notre code n'est pas parfait. Notre condition de comparaison de mots est trop simple. Par exemple si nous voulons chercher la présence de monsieur sans majuscule, notre fonction renvoie 0, nous pourrions l'améliorer en forçant les minuscules, avec la fonction php strtolower, des deux mots avant de les comparer.

Maintenant que nous savons compter le nombre de fois qu'apparaît un mot dans un texte, il suffit de le faire plusieurs fois pour plusieurs mots.

$story = "Maître Corbeau, sur un arbre perché, tenait en son bec un fromage. Maître Renard, par l'odeur alléché, lui tint à peu près ce langage. Et bonjour, Monsieur du Corbeau. Que vous êtes joli ! que vous me semblez beau !";

$targets = ["Monsieur", "bec", "beau"];

foreach ($targets as $target) {
    $number = getWordIteration($story, $target);

    echo $target . " apparaît : " . $number . " fois.";
}

Et voilà ! Nous somme venu à bout de ces trois problèmes complexes, il nous reste plus qu'a rassembler toutes nos fonctions pour répondre à l'énoncé.

$story = "Maître Corbeau, sur un arbre perché, tenait en son bec un fromage. Maître Renard, par l'odeur alléché, lui tint à peu près ce langage. Et bonjour, Monsieur du Corbeau. Que vous êtes joli ! que vous me semblez beau !";

function getTextInformations($text, $targetWords) {

    echo "Le nombre de mots dans le texte est : " . getNumberOfWords($text);
    echo "Le nombre de phrases dans le texte est : " . getNumberOfSentences($text);

    foreach ($targetWords as $target) {
        $number = getWordIteration($text, $target);

        echo $target . " apparaît : " . $number . " fois.";
    }
}

getTextInformations($story);

Félicitation si vous êtes arrivez jusqu'ici 👏. En appliquant les quelques conseils de mon article et ceux de Mehdi, vous avez toutes les clés pour devenir un(e) bon développeur(euse). Sachez toute-fois qu'aucun truc ou astuce ne pourra remplacer le temps et la patience investie pour maîtriser une discipline. Alors à vos bouts de codes !

⚠️ Si certains collègues vous conseillent d'utiliser des fonctions telle que array_merge ou array_filter pour simplifier votre code, je vous encourage très fortement à maîtriser d'abord avec des simples foreach avant d'utiliser de telle fonction. Ré-inventer la roue n'est pas un mal lorsque c'est pour apprendre. Un jour un collègue c'est moqué de moi car j'avais réécris une fonction php, peut être, mais maintenant je sais comment fonctionne cette fonction 😉

Commentaire(s) 

Ari

Merci pour cet article junior friendly, le découpage n'est pas forcément un réflexe quand on débute ! Il faut faire attention à certains cas comme le explode avec espace en délimiteur qui va retourner des mots avec la ponctuation (comme "Corbeau," "alléché," etc) ce qui risque d'influer sur la partie recherche récurrence du mot mais je sais que ce n'était pas le but ici d'avoir une réponse parfaite mais surtout la méthode et c'est très bien expliqué ^^ Merci encore de penser aux juniors !
Publié il y a 4 ans