
Souvent l'apprentissage de la programmation se fait au travers l'apprentissage d'un langage de programmation. C'est un schema classique, et pourtant, je pense que ça peut poser des problèmes par la suite. J'ai le sentiment qu'il y a un risque que la personne se retrouve à apprendre à utiliser un langage, un framework plutôt que d'apprendre à programmer.

Les formations très courtes comme le wagon permettent à certaines personnes de devenir développeuses professionnelles, et j'en connais. Ceci dit, au moins pour deux d'entre elles, ces personnes ont du mal, voir ne sortent pas du tout de l'environnement qu'elles ont appris. En général, ces personnes s'en sorte bien tant que l'outil ne change pas trop. Les deux personnes en questions sont tout à fait consciente de ça il me semble, et ont montré une capacité d'apprentissage assez intéressante. Reste qu'il faut l'accompagner. Nous ne pourrons pas demander à ces personnes de se démerder avec une petite application sous flask en python, alors qu'elles n'on appris qu'à utiliser Ruby On Rails. Même avec Sinatra, un petit framework web en ruby, ce n'était pas évidant.

Un des pièges lorsqu'on apprend à programmer par le biais d'un langage, c'est que souvent on va penser qu'il faut apprendre la syntaxe. Parallèle un peu rapide entre l'apprentissage d'une langue étrangère et la programmation. Oui, la programmation est plus proche de la linguistique que des maths, et pourtant, il y a des concepts, des abstractions, qui ne s'apprennent pas de la même manière.

Si on place la syntaxe comme étant une cloison, une frontière entre la programmation et un langage, qu'est-ce qu'il y a d'un coté, qu'est-ce qu'il y a de l'autre ?

### Langage

Coté langage de programmation, il y a plusieurs points qui me semble constitué ce qu'il faut savoir pour utiliser un langage (tous ne sont pas obligatoire pour savoir s'en servir).

1. Paradigme

Chaque langage de programmation permettent l'utilisation d'un ou plusieurs paradigme. La plupart des langages aujourd'hui propose plusieurs paradigme en général. J'ai longtemps cru qu'il n'en existait que 4 : l'impératif, l'objet, le fonctionnel et le logique... 

Un jour, une personne apprenante m'a posé une question sur les paradigmes. Je ne voulais pas répondre directement, j'avais envie de commenter une réponse que cette personne aurais pu trouver sur wikipedia... La [page wikipedia des paradigmes de programmation](https://fr.wikipedia.org/wiki/Paradigme_%28programmation%29) m'a appris qu'il en existe un grand nombre ! Et que le rangement s'opère plutôt en grande catégorie comme la programmation impérative, orientée objet et déclarative. Viennent ensuite s'ajouter d'autre paradigme dans une catégorie foure-tout.

Pour apprendre un langage de programmation, je dirais qu'il faut surtout apprendre à reconnaitre et utiliser un des paradigmes que le langage propose. Le gros intérêt c'est que la plupart des paradigmes sont communs à plusieurs langage :)

2. Typage

3. Execution

4. Documentation

5. Erreur

6. Gestion librairie

7. Histoire

8. Communauté



### Programmation

3 grandes catégories.

1. la matière première

Ce qu'on voit quand on ouvre un programme... Les mots alignés, les blocs de code, la ponctuation.

Pour l'instant, décomposé en 2 gros morceaux : la donnée qu'on manipule, les outils pour la manipuler.

la donnée commence par le bit, le 0, le 1... Par dessus on peut construire facilement une donnée de type booléenne, viens ensuite d'une part le grand ensemble des nombres, et de l'autre le char, le caractère. Par dessus je place d'un coté les tableaux, les dictionnaire, les hash, les veteurs, les hash, les set. Et de l'autre les objet, les structures de données plus personnalisé, plus complexe.

Pour manipuler tout ça il y a la famille des boucles, et les structures conditionné. Viens s'ajouter à cela les enbranchements et appel de sous programme propre au paradigme (méthodes, procédure, fonction).

Une autre façon de regarder cette matière, c'est la décomposition façon école élémentaire : sujet, verbe, complément. Sauf qu'ici, nous identifions instinctivement les mots clefs du langages (les mots réservés), les littéraux (chiffre, chaine de caractères, booléen, ...), puis les mots choisi dans un programme (la méthode qu'on a défini ailleur, voir la fonction défini par les personnes ayant créée le langage et proposant une série de programme pour aider). Ce dernier point permet souvent d'aborder la dimension _core lib_ et _standard lib_ qu'on retrouve dans presque tout les lanages de programmation.


2. les gestes

Je crois que la table des matières du livre refactoring permet de lister l'ensemble des gestes qu'une personne qui programme effectue sur la matière pour écrire et modifier un programme.

3. les concepts & principes

Les grandes idées qui nous permettent d'écrire des programmes qui vont être globalement plus lisible pour les autres.

Nous entendons souvent parler de 
- DRY (Don't Repeat Yourself)
- KISS (Keep It Smart Simple)
- SOLID (accronyme regroupant 5 principes de programmation SRP, Open/Close, Lisktov Substitution, Interface segregation, Dependency Inversion [wikipedia solide informatique](https://fr.wikipedia.org/wiki/SOLID_%28informatique%29))
- ...

Mais la base me semble être : _rendre son code lisible pour la prochaine personne qui le lira_

Un peu comme si le point important de la programmation c'était d'arriver à faire passer des idées que nous n'arrivons pas à exprimer avec des mots.


## Et ?

Ce découpage permet de montre tout les poits commun d'un langage à l'autres. J'ai l'impression que ça aide à créer une bonne abstraction.
