Orienté objet

1. Du dessein mécanique à la machine potentielle

En mécanique, la structure définit la tâche

Si vous construisez une machine, ce qu’elle peut faire est défini de manière stricte par la structure de cette machine. Engrenages, rouleaux et pompes, moteurs, et surtout la manière dont ils sont assemblés déterminent l’étendue de ses possibilités.

1881, une des premières batteuses

Fabriquer une machine, un processus lourd

Construire une machine suppose un DESSEIN, un but de production. Le textile et l’agriculture sont les premiers domaines à d’industrialiser, et on y construit des machines en bois et en acier qui suppose l’accès à des technologies comme la sidérurgie et la vapeur.

La recherche, les capitaux, les brevets entre dans leur phase industrielle.

Obsession pour l’économie d’échelle

L’industrialisation fait passer d’une culture agraire et menée par des artisans à une culture industrielle orientée sur les échanges commerciaux. L’économie d’échelle, qui permet de dégager des marges de profit va aiguiller son progrès.

- Segmenter la production (le taylorisme)
- Mécaniser les tâches répétitives
- Standardiser la production
- Développer des produits facilement reproductibles

L’ordinateur, point culminant de l’industrialisation

L’ordinateur est le fruit de cette évolution. Il propose des solutions pratiques. C’est une machine logique, standardisée, répétitive, configurable, rapide, sans revendication syndicale. Elle pousse l’économie d’échelle dans des retranchements jamais atteint auparavant. Seule la main d’oeuvre à bas coût peut rivaliser avec elle. Et même là, la littérature néo-libérale promet des avenirs sans main d’oeuvre

Jonction entre l’industrie et l’informatique naissante : la carte perforée

En 1725, Basile Bouchon, un Lyonnais, met au point le premier système de programmation d’un métier à tisser grâce à un ruban perforé.

En 1834, Charles Babbage utilise les cartes du métier Jacquard pour donner des instructions et des données à sa machine analytique, l’ancêtre des ordinateurs.

Détails importants, en passant

Le fait d’utiliser des cartes perforées liées à un métier à tisser a plusieurs conséquences :
- On fabrique des métiers capables d’interpréter les cartes, donc standardisés.
- On peut commercialiser les cartes, c’est l’accélération de ce type de services.
- On passe plus sûrement encore de l’artisan, qui possède les techniques du tissage, à l’ouvrier, qui manutentionne la machine
- On peut produire exactement le même produit à plusieurs endroits, donc délocaliser la production.

Dépasser la mécanique et l’électronique : la computation

La mécanique associée à la lecture de carte perforée permet de séquencer le travail des machines, et donc de rendre modulable les tâches effectuées par la machine.

Mais pour dépasser ce stade, il faudra attendre la naissance de l’informatique, par petites étapes.

Plus de modularité

Avec l’ordinateur, le système de traitement des données n’est plus mécanique mais informatique. Ce qui signifie qu’il n’y a pas que la mémoire qui contient une information : le traitement lui-même est un système modulaire, un « programme » qui peut lui-même être réécrit sans passer par la construction d’un assemblage mécanique ou électronique.

Un assemblage d’informations au lieu d’un assemblage mécanique.

Une machine potentielle dont les usages n’ont pas été tous pensés à l’avance.


2. Qu’est-ce que la programmation

Donner des ordres

Programmer signifie envoyer à une puce un ensemble d’ordres, exécutés dans un ordre logique, en vue d’exécuter une tâche.

Les ordres doivent être compris par la machine, il faut donc respecter une syntaxe précise. L’ordre est aussi déterminant : on ne place par la charrue avant les boeufs.

Tout ce qui peut être énoncé logiquement peut être programmé

Par « logiquement » on entendra « non ambigü ».
"Dessine quelque chose de chouette" n’est pas un énoncé recevable.
"Dessine un cercle d’une taille de 30 pixels à la position 100,100" est déjà beaucoup mieux.

Les variables

Tous les programmes emploient ce qu’on appelle des variables.

Une variable est basiquement un espace de mémoire vive dans la mémoire vive de l’ordinateur, auquel on donne un nom, et dans lequel le programme stocke momentanément une information.

truc = 10

On peut ensuite demander à tout instant la valeur de la variable dans le programme.

Déclarer un type

Dans la plupart des programmes évolué, on doit identifier le type d’information que l’on va stocker dans la variable.

Par exemple
- Un chiffre entier (1, 5,2000378, ou -15)
- Un chiffre avec virgule (10.679 ou -576890.1)
- Une chaine de caractères (« Bonjour »)
- et même une liste (1,2,78,6543)

int truc = 10

int signifie « chiffre entier »

Assigner

Assigner une variable signifie lui associer une valeur, comme on vient de le faire

int truc = 10 ;
float machin = 39.6909

string chose = « une phrase toute entière »

int[] bazar = 10,20,89,-3

Lire et modifier

On peut enfin lire ou afficher des variables, et s’en servir pour réaliser des opérations. Pour le programme, lire un chiffre ou une variable contenant un chiffre est indifférent.

int truc=10

int machin = truc * 6

print truc

print machin

Environnement du code

Tout code est exécuté dans un contexte spécifique, une machine capable de recevoir et d’exécuter le programme :

une puce électronique (le langage C)
un serveur web (langage PHP ou
un ordinateur (C++ ou JAVA)

En fonction de cet environnement, on a accès à certaines possibilités du code. Un logiciel sur un ordinateur pourra ouvrir une fenêtre, analyser les touches du clavier qui sont appuyées, lire une vidéo...

Programmation séquentielle

La programmation séquentielle permet d’exécuter une tâche connu à l’avance en disposant de toute l’information, sans feed-back d’information durant le processus.

Par exemple,

- Convertir une monnaie dans une autre monnaie :
montant * cours unitaire = résultat
- Construire un mur de brique :

Mettre une demi-truelle de mortier,
poser la brique en laissant un joint à droite de 1 cm,
si le bord gauche est atteint, se déplacer sur le bord gauche
si la hauteur demandé est atteinte, stopper, sinon recommencer

Programmation procédurale

La programmation procédurale permet de faire appel à des fonctions.

Une fonction est un ensemble d’instructions regroupées dans un ensemble, qui peut être appellé à plusieurs endroits du code.

La fonction James V1

Imaginons que nous engageons un aide-ménager. Nous allons lui apprendre à faire des courses. Le premier exemple permet de lui faire acheter un ensemble de produits habituels...

On programmera une fonction qui s’appelle « les courses ».

les courses {
prendre 100 euros
aller à l’épicerie du village
mettre dans le panier
1 kilo de pommes6 tranches de jambon
6 rouleaux de papier toilette
payer
rentrer
ranger le jambon dans le frigo
ranger les pommes et le papier toilette dans le cellier
rendre la monnaie
}

Ensuite on appelle notre fonction en écrivant dans le programme

les courses()

James V2 : envoyer des arguments

Une fonction peut recevoir des arguments, des informations qui sont utilisées lors de l’exécution :

Par exemple la liste de course peut varier tout en gardant la même procédure, ce qui la rendra plus utilisable.

On ajoute donc un endroit qui permet de donner de l’information en même temps que l’on appelle la fonction.

les courses (element 1, element 2, element 3){
prendre 100 euros
aller à l’épicerie du village
mettre dans le panier element 1
mettre dans le panier element 2
mettre dans le panier element 3
rentrer
mettre les éléments dans le cellier
rendre l’argent
dire "j'ai fini"
}

Cette fois l’appel de la fonction est plus compexe :

les courses(«1 litre de lait», «2 tranches de jambon», «un pain»)

Dans notre cas, le programme prévoit que la fonction dit "j’ai fini", c’est à dire renvoie une information vers celui qui a appelé la fonction. Cette réponse pourrait être plus complexe, comme la liste des chose qui manquait au magasin, ou le cout total de l’achat. il faut alors compléter la fonction pour qu’elle renvoie ces information spécifiques.

Bien sûr, il y a plus

Les langages séquentiels et procéduraux emploie de plus

- des tests (si ceci arrive, fait cela)
- des boucles (répète 3 fois ceci, répète ceci jusqu’à ce que ça se passe, etc.)
- les fonctions peuvent renvoyer une information

Mais on en parlera une autre fois.

C’est compliqué, on résume

- Les langages séquentiels et procéduraux utilise des variables.
- Un langage procédural utilise en plus des fonctions
- une fonction est un ensemble d’instructions regroupées sous un nom, qui peut être appelée à tout moment
- on peut envoyer des arguments à une fonction
- la fonction peut renvoyer une information vers celui qui l’a appelé

Code et management

Cette simple démonstration fait déjà pointer la manière dont la logique de programmation a colonisé l’espace social : on trouve dans notre environnement humain bon nombre de documents écrits en procédural décrivant par exemple le comportement à adopter en cas d’incendie dans un bâtiment public.
Mais le management va avoir recourt à de telles prodécure, dans le comportement des employés sur leur lieu de travail, dans l’administration ou le travail en usine par exemple. On voit bien que transformer des actions qualitatives humaines en séquences logiques permet de préparer leur automatisation plus poussée par des machines.

L’art et l’écriture procédural

Il y a de nombreux exemple de l’utilisation du code procédural en art.

En peinture, dessin, performance, animation, écriture, etc.

Vera Molnar (Site personnel - page Wikipedia)

Tony Orrico (site personnel)

Bruce Nauman (page Wikipedia)

Dance or Exercise on the Perimeter of a Square (Square Dance), 1967-68
Avec Playing a Note…, Bouncing two Balls…, et Walking in an Exaggerated Manner…, ce film fait partie des quatre premiers films enregistrant des activités d’atelier réalisés à Mill Valley au cours de l’hiver1967-68. Bruce Nauman y exécute un pas de danse simple. Partant d’un angle d’un carré matérialisé par du ruban adhésif collé sur le sol,il se déplace sur son périmètre. Il tourne son corps alternativement vers l’intérieur du carré ou vers le mur, se présentant selon les cas de dos ou face à la caméra. Ses mouvements sont régulés par le battement d’un métronome.

Robert Ryman (page Wikiedia)


3. « Orienté objet » ?

Une écriture plus « naturelle »

La programmation orientée objet a été implémentée dans les années 80’. L’idée est d’apporter aux programmeurs des méthodes plus proche du monde réel dans leur manière de coder.

Programmer objet

On identifie les objets dont a besoin : un livre dans une bibliotheque par exemple, on identifie ses variables (titre, auteur, maison d’édition, etc.) et on identifie des processus qui lui sont associés (pretêr, déplacer, associer).

L’écriture est facilitée par le fait que les variables et comportements sont DANS l’objet.

Manipuler plein d’éléments

La programmation orienté objet a permis l’écriture plus facile de programmes manipulant un grand nombre d’éléments :
- les poils de monstres et company
- les flammes, fumées, balles dans les jeux vidéos
- les zombies de world war z
- les oeuvres de reas
- oiseaux en nuée

L’objet, un outil facile

Un objet est utile en programmation parce qu’il permet aussi de réutiliser facilement le travail d’autres programmeurs. On intègre un fichier et de là on dispose d’un outil qu’on a pas besoin décrire mais surtout dont on a pas à connaitre le fonctionnement.
On doit juste connaître ce qu’il peut faire (ses méthodes) et ce dont il a besoin pour fonctionner.

De là, on peut l’employer de manière opaque, comme lorsqu’on commande un livre sur internet. On sait juste qu’il faut l’acheter, et qu’il va arriver par la poste.

Modéliser un objet

L’exemple le plus courant est celui de voitures prises dans la circulation :

Comment programmer le comportement d’un flux de voiture ?
On peut le faire via la programmation procédurale, bien sûr, mais c’est vite chiant.

Définir la classe

On définira une voiture de manière générique en écrivant la matrice de toutes les voitures : sa classe

Une classe comprend
1) Des propriétés (= ses variables)
- sa vitesse, sa cylindrée, sa direction, sa couleur, sa taille
Ce sont des chiffres ou des valeurs

2) Des méthodes (= ses fonctions)
- avancer, accélerer, changer de direction, éviter
Ce sont des actions qui modifient ses variables, la plupart du temps

Les pommes sur un arbre

Les pommes sur un arbre ont le même code génétique.
Elles se comportent toutes de la même manière.
On peut donc l’écrire sous forme de classe

Elles pourraient être décrites comme ceci :
Un état : bourgeon - fleur - pomme
Un poids en grammes, une couleur, une taille
Une position sur l’arbre

Tout ceci constitue ses propriétés, sous forme de chiffre, de texte

Les méthodes de la pomme

Si on veut maintenant décrire les actions de la pomme (ses méthodes), on peut les lister par exemple comme ceci :

- Pousser (prendre du poids)
- Changer de type (passer de bourgeon à fleur)
- Mûrir (changer de couleur, prendre du poids)
- Tomber (quand un certain poids est atteint)

On pourrait ajouter des intéractions plus poussée avec son environnement : le vent peut faire tomber une pomme pas encore mûre, ou une branche peut lui faire de l’ombre et freiner sa croissance, etc.

On peut accéder aux propriétés

Dans un programme, on peut accéder aux propriétés : je peux savoir à tout moment quel est le stade d’évolution de la pomme (bourgeon ou fleur ?) au popids, à sa position dans l’espace. Je peux dans certains cas actionner ses méthodes.

Par exemple, je lui dit que le soleil est fort, ce qui augmente la vitesse de sa maturation.

Sol Lewitt versus Casey Reas

Pour illustrer le changement conceptuel apporté par la programmation orienté objet, comparons deux oeuvres d’art :

Sol Lewitt est procédural !

Il donne un ensemble d’instructions à un assistant, qui les exécute.

Casey Reas est orienté objet

Il décrit la procédure affectant des éléments indépendants, qu’il peut faire agir en grand nombre, et laisse travailler la machine qui génère des formes qui répondent à son dessein, mais qui comportent une part d’imprévu.


The Elements, Forms, and Behaviors referenced within the Processes are defined in the Library :

Forms
F1 : Circle
F2 : Line

Behaviors
B1 : Move in a straight line
B2 : Constrain to surface
B3 : Change direction while touching another Element
B4 : Move away from an overlapping Element
B5 : Enter from the opposite edge after moving off the surface
B6 : Orient toward the direction of an Element that is touching
B7 : Deviate from the current direction

Elements
E1 : F1 + B1 + B2 + B3 + B4
E2 : F1 + B1 + B5
E3 : F2 + B1 + B3 + B5
E4 : F1 + B1 + B2 + B3
E5 : F2 + B1 + B5 + B6 + B7

Process 17
A rectangular surface filled with instances of Element 5, each with a different size and gray value. Draw a transparent circle at the midpoint of each Element. Increase a circle ?s size and opacity while its Element is touching another Element and decrease while it is not.

Implemented by Casey Reas, Summer 2010, Processing 1.1

Process 16
A rectangular surface filled with instances of Element 3, each with a different size and gray value. Draw a tiny, transparent circle at the midpoint of each Element. Increase a circle ?s size and opacity while its Element is touching another Element and decrease while it is not.

Implemented by Casey Reas, Fall 2006, Processing 1.2.1

Limites de l’orienté objet

La programmation orientée objet est utilisée massivement dans les programmes contemporains.

Pris en charge par un call-center, on sent bien que l’on est un objet dans un processus. (Voir mon article sur le sujet sur le blog codedrops).

La programmation orientée objet décrit les objets et ce qui peut les modifier. Mais elle ne peut agir que ce qui a été prévu par celui-ci. Contrairement aux objets réels, il ne subissent aucune contraintes sur des variables non prévues. Même si la modélisation permet de faire émerger des comportements qui n’avaient pas été anticipés, ils reflètent uniquement la compréhension que nous avons d’un phénomènent. Ils ne peuvent pas se confondre avec le réel.

Les pommes de mon arbre modélisé ne réagiront pas à une explosion nucléaire, parce que le programme n’a pas prévu ce cas de figure. Nous n’avons pas cette chance.

C’est une des raisons pour lesquelles les modélisations donnent des résultats erronés. Certains pensent qu’en complexifiant les propriétés de objets et leurs méthodes, on finit par copier la nature, mais les théories du chaos par exemple leur donne tort. L’effet papillon est la métaphore de cette faille : un paramètre minuscule et négligeable (le battement d’aile d’un papillon) peut affecter un phénomène à grande échelle (l’ouragan).

Le réel est plus riche que la programmation. Il est simplement autre chose que le monde de la programmation. On ne peut ni modéliser ni solutionner le monde avec des lignes de codes, aussi intelligentes soient-elles.

Dans un livre de blagues écrit en 1977, on trouve trois blagues associées au mot "ordinateur", dont celle-ci.

On a mis trente ans à construire le plus grand ordinateur du monde. C’est une machine à laquelle on a infusé toutes les connaissances scientifiques et qui peut résoudre tous les problèmes restés insolubles. Et le jour de son inauguration, une centaine d’ingénieurs sont rassemblés autour de la machine. Ils ont décidé de lui poser la question des questions : "Est-ce que Dieu existe ?"
Au bout d’une minute, l’ordinateur rend sa réponse affirmative :
"Maintenant, oui … Dieu, c’est moi."

Il est étonnant de constater que cette blague molle et un peu cliché trouve des résonances particulières aujourd’hui, comme par exemple dans le livre "Pour tout résoudre, cliquez ici" de vgeny Morozov.