3.2 Conception et découverte d'algorithmes
Objectifs d'apprentissage
À la fin de cette section, vous serez en mesure de :
- Comprendre l'approche de résolution des problèmes algorithmiques
- Expliquer comment les patrons de conception d'algorithmes sont utilisés pour résoudre de nouveaux problèmes
- Décrire comment les algorithmes sont analysés
Notre introduction aux structures de données s'est principalement concentrée sur la représentation de données complexes. Mais les informaticiens s'intéressent également à la conception d'algorithmes pour résoudre une plus grande variété de problèmes au-delà du stockage et de la récupération de données. Par exemple, ils peuvent vouloir planifier un itinéraire entre un point de départ et un point d'arrivée sur une carte. Bien que chaque problème du monde réel soit unique, les informaticiens peuvent utiliser un ensemble général de principes pour concevoir des solutions sans avoir à développer de nouveaux algorithmes à partir de zéro. Tout comme de nombreuses structures de données peuvent représenter le même type de données abstrait, de nombreuses solutions différentes existent pour résoudre le même problème.
Résolution de problèmes algorithmiques
Un algorithme est une séquence d'instructions précises qui prend n'importe quelle entrée et calcule la sortie correspondante, tandis que la résolution de problèmes algorithmiques (algorithmic problem-solving) fait référence à un ensemble particulier d'approches et de méthodes pour concevoir des algorithmes qui s'appuient sur les liens historiques de l'informatique avec l'étude de la résolution de problèmes mathématiques. Les premiers informaticiens ont été influencés par le formalisme mathématique et la résolution de problèmes mathématiques. Le livre de George Pólya de 1945, How to Solve It, décrit un processus de résolution de problèmes qui commence par une compréhension formelle du problème et se termine par une solution au problème. Comme la taille de l'entrée d'un algorithme est toujours finie, la recherche d'une solution à un problème algorithmique peut toujours être accomplie par une recherche exhaustive. Par conséquent, l'objectif de la résolution de problèmes algorithmiques, par opposition à la résolution de problèmes mathématiques, est de trouver une solution « efficace », soit en termes de temps d'exécution, soit en termes d'espace utilisé (par exemple, taille de la mémoire de l'ordinateur). Par conséquent, l'étude de la résolution de problèmes algorithmiques met l'accent sur le problème (problem) ou la tâche formelle, avec des données d'entrée et des données de sortie spécifiques correspondant à chaque entrée. Il existe de nombreuses autres façons de résoudre des problèmes avec des ordinateurs, mais cette approche mathématique reste l'approche dominante dans le domaine. Voici quelques problèmes bien connus en informatique que nous explorerons plus loin dans ce chapitre.
Un problème de structure de données (data structure problem) est un problème computationnel impliquant le stockage et la récupération d'éléments pour l'implémentation de types de données abstraits tels que les listes, les ensembles, les cartes et les files de priorité. Ceux-ci incluent :
- la recherche (searching), ou le problème de la récupération d'un élément cible à partir d'une collection d'éléments
- le tri (sorting), ou le problème de la réorganisation des éléments dans un ordre logique
- le hachage (hashing), ou le problème de l'affectation d'un index entier significatif pour chaque objet
Un problème de graphe (graph problem) est un problème computationnel impliquant des graphes qui représentent des relations entre des données. Ceux-ci incluent :
- le parcours (traversal), ou le problème de l'exploration de tous les sommets d'un graphe
- l'arbre couvrant minimal (minimum spanning tree) est le problème de trouver le moyen le moins coûteux de connecter tous les sommets entre eux
- le plus court chemin (shortest path) est le problème de trouver le moyen le moins coûteux d'aller d'un sommet à un autre
Un problème de chaînes de caractères (string problem) est un problème computationnel impliquant du texte ou des informations représentées comme une séquence de caractères. Les exemples incluent :
- l'appariement (matching), ou le problème de la recherche d'un motif textuel dans un document
- la compression (compression), ou le problème de la représentation d'informations en utilisant moins de stockage de données
- la cryptographie (cryptography), ou le problème de masquer ou d'obscurcir du texte pour le rendre inintelligible
Modélisation
Les informaticiens se concentrent sur la définition d'un modèle de problème (problem model), souvent simplement appelé modèle (model), qui est une représentation simplifiée et abstraite de problèmes du monde réel plus complexes. Ils appliquent le processus de résolution de problèmes algorithmiques mentionné précédemment pour concevoir des algorithmes lors de la définition de modèles. Les algorithmes modélisent les phénomènes de la même manière que les structures de données implémentent des types de données abstraits tels que les listes, les ensembles, les cartes, les files de priorité et les graphes. Mais contrairement aux types de données abstraits, les modèles ne sont pas nécessairement des concepts purement abstraits ou mathématiques. Les modèles sont souvent liés aux humains et aux phénomènes sociaux. Un système médical pourrait vouloir décider quels médicaments administrer à quels patients, de sorte que le concepteur d'algorithmes pourrait décider de modéliser les patients comme un type de données complexes (complex data) composé de l'âge, du sexe, du poids ou d'autres caractéristiques physiques. Parce que les modèles représentent des abstractions, ou des simplifications de phénomènes réels, un modèle doit mettre l'accent sur certains détails plutôt que sur d'autres. Dans le cas du système médical, le concepteur d'algorithmes a mis l'accent sur les caractéristiques physiques des personnes jugées importantes et a choisi d'ignorer d'autres caractéristiques, telles que les opinions politiques, jugées moins importantes pour le modèle.
Si un algorithme est une solution à un problème, alors le modèle est le cadre à travers lequel le concepteur d'algorithmes définit les règles et les résultats potentiels. Sans modèles, les concepteurs d'algorithmes seraient confrontés à la complexité et à la richesse infinies du monde. Imaginez, par exemple, la conception d'un système médical qui modélise les patients au niveau des atomes individuels. Ce modèle offre une représentation détaillée de chaque patient au sens le plus physique ou littéral. Mais ce modèle est impraticable car nous ne savons pas comment des configurations et des collections particulières d'atomes contribuent à la santé globale d'une personne. Comparé à ce modèle à l'échelle atomique, notre ancien modèle composé de l'âge, du sexe, du poids et d'autres caractéristiques physiques est plus pratique pour la conception d'algorithmes, mais implique nécessairement d'effacer notre humanité individuelle pour tirer certaines conclusions.
Afin de concevoir des algorithmes, nous devons être capables de nous concentrer sur les informations pertinentes plutôt que sur des représentations détaillées du monde réel. De plus, l'informatique exige un esprit philosophique pour aider à la résolution de problèmes. Selon Brian Cantwell Smith, philosophe et scientifique cognitif et informaticien, « Bien que ce ne soit pas le lieu pour la métaphysique, il ne serait pas exagéré de dire que tout acte de conceptualisation, d'analyse ou de catégorisation, fait une certaine violence à son sujet, afin d'atteindre les régularités sous-jacentes qui regroupent les choses. »1 Sans exercer cette « violence », il y aurait trop de détails à parcourir pour créer un algorithme utile.
La relation entre les algorithmes, les logiciels qu'ils alimentent et les résultats sociaux qu'ils produisent est actuellement au centre d'un débat social et politique contesté. Par exemple, toutes les plateformes médiatiques utilisent un certain niveau de publicité ciblée basée sur les préférences des utilisateurs afin de recommander des films ou des émissions spécifiques à leurs utilisateurs. Les utilisateurs peuvent ne pas vouloir que leurs informations soient utilisées de cette manière, mais il doit y avoir un certain degré de compromis pour rendre ces plateformes attrayantes et utiles aux gens.
D'une part, la définition technique d'un algorithme (algorithm) est qu'il représente des processus complexes comme une séquence d'instructions précises opérant sur des données. Cette définition ne suggère pas ouvertement comment les algorithmes encodent les résultats sociaux. D'autre part, les programmes informatiques sont conçus par l'homme et socialement élaborés. Les concepteurs d'algorithmes simplifient les problèmes complexes du monde réel en supprimant des détails afin qu'ils puissent être modélisés comme des problèmes computationnels. Parce que les logiciels encodent et automatisent les idées humaines avec des ordinateurs, les ingénieurs logiciels exercent un pouvoir immense à travers leurs algorithmes.
Pour compliquer davantage la question, le génie logiciel (software engineering) est souvent une discipline restrictive et formelle. La modélisation des problèmes est contrainte par le modèle de calcul (model of computation), ou les règles de l'ordinateur sous-jacent qui est finalement responsable de l'exécution de l'algorithme. Historiquement, l'informatique s'est développée à partir de ses fondements en mathématiques et en logiques formelles, de sorte que les algorithmes étaient spécialisés pour résoudre des problèmes spécifiques avec un modèle modeste des phénomènes sous-jacents. Cette approche de la conception d'algorithmes (algorithm design) résout certains types de problèmes tant qu'ils peuvent être raisonnablement réduits à des modèles qui opèrent sur un nombre modeste de variables — quel que soit le nombre de variables que le concepteur d'algorithmes peut garder à l'esprit. Dans le cas du système médical, le concepteur d'algorithmes a identifié certaines caractéristiques comme particulièrement utiles pour le calcul d'un résultat.
Mais il existe de nombreux autres problèmes qui défient cette approche, en particulier les tâches qui impliquent une utilisation subtile et souvent inconsciente des facultés sensorielles et cognitives humaines. Un exemple de cela est la reconnaissance faciale (facial recognition). Si on lui demandait de décrire comment nous reconnaissons le visage d'une personne particulière, un concepteur d'algorithmes aurait du mal à identifier des variables spécifiques ou des combinaisons de variables qui correspondent à une seule personne. La logique formelle requise pour définir un algorithme est stricte et absolue, tandis que notre compréhension des visages humains est définie par de nombreux facteurs subtils qu'il est difficile pour quiconque d'exprimer en utilisant la logique formelle.
Pleins feux sur l'industrie
Algorithmes d'apprentissage automatique
Un algorithme d'apprentissage automatique (machine learning algorithm) aborde ce type de problèmes en utilisant un modèle de calcul alternatif, qui se concentre sur des algorithmes généralisés conçus pour résoudre des problèmes avec un modèle massif des phénomènes sous-jacents. Au lieu de tenter d'identifier quelques variables clés pour la reconnaissance faciale, par exemple, les algorithmes d'apprentissage automatique peuvent prendre en entrée une image numérique représentée comme une grille rectangulaire de pixels colorés. Bien que chaque pixel de l'image offre très peu d'informations sur la personne en question, les caractéristiques faciales uniques à chaque être humain proviennent des arrangements et des motifs de pixels qui résultent de la visualisation de nombreuses images de la même personne.
Pensez à la façon dont votre iPhone Apple ou votre téléphone Google Pixel peut vous regarder lorsque vous essayez d'y accéder et que la reconnaissance faciale est activée. L'algorithme ne va pas essayer de faire correspondre votre visage à une photo de vous enregistrée car cela ne fonctionnerait pas tout le temps si vous ne ressembliez pas exactement à la photo. Au lieu de cela, il utilise l'apprentissage automatique pour extraire des motifs du visage d'une personne et les faire correspondre, ce qui permet de reconnaître les gens tout le temps, même s'ils portent des lunettes mais ne les portaient pas lorsqu'ils ont configuré la reconnaissance faciale sur leur téléphone. Cette méthode semble imiter la façon dont les humains reconnaissent les gens, même s'ils ne les ont pas vus depuis des décennies.
Les algorithmes d'apprentissage automatique offrent une approche plus robuste pour modéliser ce type de problèmes qui ne sont pas facilement exprimables en logique formelle. Mais dans ce chapitre, nous nous concentrons sur la perspective classique antérieure de la résolution de problèmes algorithmiques, avec pour objectif final de concevoir des algorithmes spécialisés pour résoudre des problèmes avec des modèles modestes des phénomènes sous-jacents.
Algorithmes de recherche
En informatique, la recherche (searching) est le problème de la récupération d'un élément cible (target) à partir d'une collection (collection) qui contient de nombreux éléments. Il existe de nombreuses façons de comprendre les algorithmes de recherche ; selon le contexte exact du problème et les données d'entrée (input), la sortie (output) attendue peut différer. Par exemple, supposons que nous voulions trouver le terme cible dans un dictionnaire (dictionary) qui contient des milliers ou des millions de termes et leurs définitions associées. Si nous représentons ce dictionnaire comme une liste, l'algorithme de recherche renverrait l'index du terme dans le dictionnaire. Si nous représentons ce dictionnaire comme un ensemble, l'algorithme de recherche renverrait si la cible est dans le dictionnaire. Si nous représentons ce dictionnaire comme une carte, l'algorithme de recherche renverrait la définition associée au terme. La structure de données du dictionnaire a des implications sur la sortie de l'algorithme de recherche. La résolution de problèmes algorithmiques tend à être itérative car nous pourrions parfois réaliser plus tard que nos structures de données doivent changer. Le changement des structures de données, à son tour, nécessite souvent aussi un changement de la conception de l'algorithme.
Malgré ces différences de sortie, l'algorithme de recherche canonique (canonical searching algorithm) sous-jacent peut toujours suivre la même procédure générale. Les deux algorithmes de recherche canoniques les plus connus sont la recherche séquentielle (sequential search) et la recherche binaire (binary search), qui sont effectués sur des structures de données linéaires, telles que les listes de tableaux.
- Recherche séquentielle (Figure 3.9). Ouvrez le dictionnaire au premier terme. Si ce terme est la cible, alors parfait — nous avons trouvé la cible. Sinon, répétez le processus en lisant le terme suivant dans le dictionnaire jusqu'à ce que nous ayons vérifié tous les termes du dictionnaire.
- Recherche binaire (Figure 3.10). Ouvrez le dictionnaire à un terme au milieu du dictionnaire. Si ce terme est la cible, alors parfait — nous avons trouvé la cible. Sinon, déterminez si la cible se trouve avant ou après le terme que nous venons de vérifier. Si elle se trouve avant, répétez le processus sur la première moitié du dictionnaire. Sinon, répétez le processus sur la seconde moitié du dictionnaire. Chaque fois, nous pouvons ignorer la moitié des termes restants en fonction de l'endroit où nous nous attendrions à trouver la cible dans le dictionnaire.
Patrons de conception d'algorithmes
Cette étude de cas des algorithmes de recherche canoniques démontre certaines idées sur la résolution de problèmes algorithmiques (algorithmic problem-solving), telles que la façon dont la conception d'algorithmes implique une amélioration itérative (de la recherche séquentielle à la recherche binaire). Mais cette étude de cas ne démontre pas comment les algorithmes sont conçus en pratique. Les concepteurs d'algorithmes sont parfois inspirés par des analogies et des métaphores du monde réel, comme le fait de s'appuyer sur un ordre trié pour diviser un dictionnaire en deux moitiés égales. Plus souvent, ils dépendent de la connaissance d'un patron de conception d'algorithme (algorithm design pattern) existant, ou d'une solution à un problème informatique bien connu, tel que le tri et la recherche. Plutôt que de développer des idées entièrement nouvelles chaque fois qu'ils sont confrontés à un nouveau problème, les concepteurs d'algorithmes appliquent plutôt un ou plusieurs patrons de conception d'algorithmes pour résoudre de nouveaux problèmes. En se concentrant sur les patrons de conception d'algorithmes, les programmeurs peuvent résoudre une grande variété de problèmes sans avoir à inventer un nouvel algorithme à chaque fois.
Par exemple, supposons que nous voulions concevoir une fonctionnalité de saisie semi-automatique (autocomplete), qui aide les utilisateurs lorsqu'ils tapent du texte dans un programme en proposant des complétions de mots pour une requête de préfixe donnée. Les concepteurs d'algorithmes commencent par modéliser le problème en termes de types de données plus familiers.
- L'entrée (input) est une requête de préfixe, telle qu'une chaîne de lettres qui pourrait représenter le début d'un mot (par exemple, « Mer »).
- La sortie (output) est une liste de termes correspondants (suggestions de complétion) pour la requête de préfixe.
En plus des données d'entrée et de sortie, nous supposons qu'il existe une liste de termes potentiels que l'algorithme utilisera pour sélectionner les termes correspondants.
Il existe plusieurs façons de résoudre ce problème. Une approche consiste à appliquer le patron de conception de recherche séquentielle à la liste des mots possibles (Figure 3.11). Pour chaque terme de la liste, nous l'ajoutons au résultat s'il correspond à la requête de préfixe. Une autre approche consiste à d'abord trier la liste des termes potentiels, puis à appliquer deux recherches binaires : la première recherche binaire pour trouver le premier terme correspondant et la seconde recherche binaire pour trouver le dernier terme correspondant. La liste de sortie est constituée de tous les termes entre la première correspondance et la dernière correspondance.
La technologie dans la vie quotidienne
Algorithmes de saisie semi-automatique en ligne
Dans la cartographie en ligne (online mapping), la saisie semi-automatique pourrait prendre le préfixe Mer et suggérer automatiquement la ville de Seattle. Nous savons que les algorithmes de recherche résolvent ce problème en maintenant une collection triée de suggestions de lieux. Mais de nombreuses applications de cartographie en ligne permettent aux utilisateurs de modifier les cartes à mesure que les lieux changent dans le monde réel. Comment pouvons-nous concevoir la fonction de saisie semi-automatique pour prendre en charge les changements d'utilisateurs dans le monde réel ? Pour appliquer l'algorithme de recherche binaire (binary search algorithm), tous les noms de lieux doivent être stockés dans une liste basée sur un tableau trié. Ainsi, chaque modification devra également maintenir l'ordre trié.
Si nous ajoutons plutôt tous les noms de lieux à un arbre binaire de recherche, quelles sont les étapes de l'algorithme de saisie semi-automatique ? Comment ce choix affecte-t-il les ajouts, les modifications et les suppressions ?
Analyse d'algorithme
Plutôt que de s'appuyer sur une analogie directe avec nos expériences humaines, ces deux algorithmes pour la fonction de saisie semi-automatique composent un ou plusieurs patrons de conception d'algorithmes pour résoudre le problème. Comment savoir quelle approche pourrait être la plus appropriée à utiliser ? Un type d'analyse est connu sous le nom d'analyse d'algorithme (algorithm analysis), qui étudie les sorties produites par un algorithme (algorithm) ainsi que la manière dont l'algorithme produit ces sorties (output). Ces sorties sont ensuite évaluées pour leur exactitude (correctness), qui examine si les sorties produites par un algorithme correspondent aux résultats attendus ou souhaités sur l'ensemble des entrées possibles. Un algorithme est considéré comme correct uniquement si ses sorties calculées sont cohérentes avec toutes les sorties attendues ; sinon, l'algorithme est considéré comme incorrect.
Bien que cette définition puisse sembler simple, vérifier l'exactitude d'un algorithme est souvent très difficile en pratique, car les algorithmes sont conçus pour généraliser et automatiser des processus complexes. La manière la plus directe de vérifier l'exactitude est de s'assurer que l'algorithme calcule la sortie correcte pour chaque entrée possible. Ceci est non seulement difficile sur le plan computationnel, mais même potentiellement impossible à réaliser, car certains algorithmes peuvent accepter une gamme infinie d'entrées.
Vérifier l'exactitude d'un algorithme est difficile non seulement en raison de sa généralité, mais aussi en raison de son ambiguïté. Précédemment, nous avons vu comment les algorithmes de recherche canoniques peuvent avoir des sorties différentes selon le type de collection d'entrée. Que se passe-t-il si le terme cible contient des caractères spéciaux ou des fautes d'orthographe ? L'algorithme doit-il tenter de trouver la correspondance la plus proche ? Certaines ambiguïtés peuvent être résolues en étant explicite sur la sortie attendue, mais il existe aussi des cas où l'ambiguïté ne peut tout simplement pas être résolue de manière satisfaisante. Si nous décidons de trouver la correspondance la plus proche du terme cible, comment l'algorithme gère-t-il les différences culturelles d'interprétation ? Si les humains ne sont pas d'accord sur la sortie attendue, mais que l'algorithme doit calculer une sortie, quelle sortie calcule-t-il alors ? Ou, si nous ne voulons pas que nos algorithmes calculent une certaine sortie, comment reconnaît-il ces situations ?
L'exactitude considère principalement la cohérence entre l'algorithme et le modèle, plutôt qu'entre l'algorithme et le monde réel. Notre modèle de saisie semi-automatique précédent renvoyait toutes les complétions de mots qui correspondaient à la chaîne de lettres incomplète. Mais en pratique, cette sortie serait probablement inutilisable : un utilisateur tapant « a » verrait une liste de tous les mots commençant par la lettre « a ». Étant donné que notre modèle ne spécifiait pas comment ordonner les résultats, l'utilisateur pourrait être frustré par la non-pertinence de nombreuses complétions de mots. Supposons que nous remédiions à ce problème en définissant une métrique de pertinence : chaque fois qu'un utilisateur termine de taper un mot, augmentez la pertinence de ce mot pour les futures requêtes de saisie semi-automatique. Mais, comme Safiya Noble l'a montré dans Algorithms of Oppression, déterminer la pertinence de cette manière universalisante peut avoir des impacts sociaux indésirables. Peut-être en raison de métriques de pertinence déterminées par le vote populaire, à un moment donné, les suggestions automatiques de recherche Google incluaient des idées comme :
- Les femmes ne peuvent pas : conduire, être évêques, être dignes de confiance, parler à l'église
- Les femmes ne devraient pas : avoir de droits, voter, travailler, boxer
- Les femmes devraient : rester à la maison, être dans la cuisine
- Les femmes doivent : être remises à leur place, connaître leur place, être contrôlées, être disciplinées2
La critique de Noble s'étend davantage pour considérer l'intersection des identités sociales telles que la race et le genre en relation avec les sorties des algorithmes qui soutiennent notre vie quotidienne.
Problèmes mondiaux en technologie
Recherche d'identité
Dans Algorithms of Oppression, Safiya Noble décrit comment les moteurs de recherche peuvent amplifier les idées sexistes, racistes et misogynes. En recherchant « Black girls », « Latina girls » et « Asian girls » vers 2013, Safiya a été surprise de constater combien de résultats de recherche et de publicités figurant en première page de Google Search menaient à des résultats pornographiques alors que sa requête d'entrée ne suggérait absolument rien de pornographique. En revanche, la recherche de « White girls » n'incluait pas de résultats pornographiques. À mesure que les algorithmes deviennent plus courants dans nos vies quotidiennes, ils deviennent également une force plus puissante pour déterminer certains futurs sociaux. Les algorithmes sont immensément puissants dans leur capacité à influencer non seulement la façon dont nous agissons, mais aussi ce que nous voyons, ce que nous entendons, ce que nous croyons du monde, et même ce que nous croyons de nous-mêmes.
À mesure que la quantité de données d'entrée augmente, les ordinateurs ont souvent besoin de plus de temps ou de stockage pour exécuter les algorithmes. Cette condition est connue sous le nom de complexité (complexity), qui est basée sur le degré de ressources computationnelles qu'un algorithme consomme lors de son exécution en relation avec la taille de l'entrée. Plus de temps de calcul signifie aussi souvent consommer plus d'énergie. Compte tenu de l'explosion exponentielle de la demande de données et de calcul, la conception d'algorithmes efficaces n'est pas seulement d'une valeur pratique, mais aussi d'une valeur existentielle, car l'informatique contribue directement au réchauffement climatique et aux crises climatiques qui en résultent.
Questions de réflexion
Modération de contenu
Les plateformes de médias sociaux en ligne facilitent les relations sociales entre les utilisateurs en leur permettant de créer et de partager du contenu entre eux. Ce contenu généré par les utilisateurs nécessite une modération, c'est-à-dire des méthodes de gestion du contenu partagé entre les utilisateurs de la plateforme. Certains chercheurs soutiennent que la modération de contenu (content moderation) définit une plateforme de réseau social ; en d'autres termes, les politiques de modération de contenu déterminent exactement quel contenu peut être partagé sur la plateforme, ce qui définit à son tour la valeur de l'information. À mesure que les plateformes de médias sociaux deviennent de plus en plus répandues, les informations sur ces plateformes jouent un rôle important dans l'influence de leurs utilisateurs.
Une approche de la modération de contenu consiste à recruter des modérateurs humains pour examiner le contenu toxique, c'est-à-dire le contenu profane, abusif ou susceptible de faire désengager quelqu'un. Un algorithme pourrait être développé pour déterminer la toxicité d'un contenu, et le contenu le plus toxique pourrait être ajouté à une file de priorité pour une modération prioritaire.
Quelles sont les conséquences de cette approche ? Comment la définition de la toxicité priorise-t-elle (ou dépriorise-t-elle) certains contenus ? À qui cela profite-t-il ? Considérez la positionnalité des utilisateurs qui interagissent avec la plateforme :
- les utilisateurs marginalisés de la plateforme, qui peuvent être davantage marginalisés par cette définition de la toxicité.
- les modérateurs de contenu, qui examinent chacun plusieurs centaines de contenus les plus toxiques pendant des heures chaque jour.
- les équipes juridiques, qui veulent atténuer les réglementations et législations gouvernementales qui ne sont pas alignées avec les intérêts de l'entreprise.
- les hackers des médias sociaux, ou les utilisateurs qui veulent tirer parti de la façon dont certains contenus sont priorisés afin de façonner délibérément l'opinion publique.