La programmation selon GodDonut
Par Qwerty le Temps de lecture estimé : 10min 5 Commentaires
Salut GodDonut ! Peux-tu te présenter ?
Euh… je m'appelle Joshua, je suis étudiant en informatique, et je m'intéresse à la recherche en langages de programmation et en compilation. J'espère devenir chercheur, soit dans le secteur public, soit dans un secteur de Recherche et Développement dans une entreprise.
À part ça, je fais de la guitare et du handball.
Quels sont les langages de programmation que tu connais ?
Houlà, ça dépend de ce qu'on appelle connaître. Il y a des langages que je peux un petit peu utiliser, mais que je ne prétends pas maîtriser, comme PHP, Java, Scheme, SQL ou encore Factor. Il y en a que je connais mieux, comme C ou Python.
Mais mon langage préféré reste le langage OCaml, un langage fonctionnel et orienté objet moderne, qui apporte beaucoup de concepts très nouveaux. En fait, j'essaye de toucher à beaucoup de langages différents. C'est important pour ma formation, naturellement, mais de toute façon la plupart des nouveaux langages conçus par les entreprises reprennent des idées qui ont été testées dans le milieu académique. C'est toujours bien de se tenir au courant…
Peux-tu nous parler de l'algorithmique ?
Avec plaisir ! Personnellement, je considère que l'informatique est la science du traitement de l'information (notamment avec les ordinateurs). L'algorithmique, c'est une branche de l'informatique qui se charge de dire à la fois comment on traite cette information, et avec quelle efficacité. Si vous faites de la musique, travailler l'algorithmique c'est un petit peu comme travailler ses gammes : en soi, ça ne sert pas forcément à grand chose, mais ça devient vital quand on veut atteindre un niveau professionnel élevé.
Autant dire que c'est très important dans la formation d'un informaticien. Étudier l'algorithmique apprend à résoudre des problèmes qui reviennent fréquemment dans les applications. Derrière beaucoup d'applications se cachent en fait des problèmes très classiques. Par exemple, prenons l'application Google Maps : elle doit résoudre de nombreux problèmes. Notamment, si ses utilisateurs veulent se rendre d'un point A au point B, il faut qu'elle leur fournisse le chemin qui les fera consommer le moins d'essence, ou qui mettra le moins de temps, en tenant compte des prévisions de bouchon. Un vaste programme !
Mais tout ça se résout assez bien quand on connaît une structure de données appelée les « graphes », et les algorithmes qui permettent de trouver les plus courts chemins entre deux points d'un graphe. Hé oui : derrière l'interface de Google Maps, il y a des algorithmes très classiques, que les développeurs de Google ont soigneusement retranscrits dans le langage de leur choix pour avoir une application aussi efficace que possible. Pour détecter le spam dans un e-mail ? On peut utiliser un classifieur bayésien (un algorithme de classification). Pour développer un moteur de recherche ? Beaucoup de sociétés cherchent des algorithmes plus efficaces que ceux de la concurrence. Mais par exemple, celui de Google fait intervenir d'autres techniques connues, comme la multiplication de matrices creuses. Et ainsi de suite…
Bien sûr, l'algorithmique n'intervient pas dans toutes les applications. Quand les programmes sont assez simples, on se ne préoccupe pas vraiment de leur efficacité, et les problèmes qu'ils résolvent sont suffisamment basiques. Mais souvent c'est juste une différence de taille : quand une application de discussion instantanée se met à devoir traiter des centaines de messages par seconde (par exemple pour faire une recherche dans des logs), alors les structures de données utilisées sont importantes.
Enfin, l'algorithmique n'est pas une question de langages. Même si certains langages sont plus adaptés que d'autres pour l'étudier, et que d'autres proposent des structures de données et des algorithmes tout prêts, il est parfois bien pratique (et intéressant) de savoir comme ceux-ci fonctionnent.
Et puis les plus grosses entreprises n'hésitent plus, aujourd'hui, à faire passer des entretiens d'algorithmique pour sélectionner les candidats. C'est une sorte de mini-concours, pas si difficile, mais qui fait quand même la différence entre les développeurs qui prétendent à un même poste. Que le meilleure gagne, en somme !
Quels sont les différents styles de programmation (fonctionnelle, programmation orientée objet, procédurale…) ?
Comme je l'ai dit plus haut, il y a beaucoup de langages différents. On les distingue par leur utilité (SQL sert à faire des requêtes sur des bases de données, PHP sert essentiellement à écrire des scripts côté serveur…), mais pas seulement. En fait, d'un langage à l'autre, il peut y avoir beaucoup de points communs, ou beaucoup de ressemblances. Cependant, tous ces différents points de comparaison ne sont pas aussi importants.
Par exemple, un certain nombre de langages découpent leurs programmes en instructions séparées par des point-virgules, alors que Python ou Ruby séparent leurs instructions par des retours à la ligne. Cependant, est-ce que c'est vraiment différent ? A priori, non, c'est juste une question de notation. Un programme PHP peut facilement être traduit en Python, et inversement.
Par contre, il y a des langages qui ne découpent pas les programmes en instructions successives. Ils ne donnent pas d'ordre d'exécution, ou bien alors un ordre plus faible. En conséquences, ils sont plus éloignés de la machine (ce qui peut les rendre plus difficiles à compiler), mais disposent aussi d'autres avantages (puisque l'ordre de calcul est moins strict, on peut plus facilement paralléliser les programmes, c'est-à-dire les exécuter sur plusieurs processeurs).
On distingue donc de grands groupes parmi les langages de programmation : les langages impératifs, comme le C, le Python, le Java, le PHP… et les langages déclaratifs, comme SQL, OCaml, Prolog… Certains de ces langages sont en réalité plusieurs choses, par exemple OCaml contient aussi des instructions (qui sont optionnelles), et d'autres distinctions apparaissent entre eux. Dans les langages déclaratifs, par exemple, il y a des langages de requête (toujours comme SQL), des langages logiques (comme Prolog ou Clips) et des langages fonctionnels (comme OCaml, Lisp, Scheme ou Haskell). Ces derniers sont ainsi nommés parce qu'ils sont axés autour du concept de fonctions : un programme fonctionnel est comme un gigantesque emboîtement de plusieurs fonctions, que l'on compose, que l'on applique les unes aux autres, ou même que l'on retourne.
Mais ça n'est pas tout : parmi tous ces langages, il y en a qui sont dits « orientés objets ». En réalité, tous les langages objets ne fonctionnent même pas de la même façon, donc on pourrait encore faire des distinctions. Mais l'idée générale, c'est de permettre ce que l'on appelle le polymorphisme « ad-hoc » (qui veut dire « au cas-par-cas »). On envoie un certain message à un objet, et c'est lui qui décide comment il se comporte (en respectant éventuellement certaines contraintes). Ici encore, on croise des langages impératifs et orientés objet, comme PHP ou Java, des langages fonctionnels possédant des objets, comme OCaml, et ainsi de suite. On dit parfois que les langages non-orientés objet sont « procéduraux », parce que le code est découpé en procédures (des fonctions qui ne retournent pas de résultat).
Enfin, une autre grosse différence entre les langages de programmation est leur « dynamicité » : certaines fonctionnalités dans certains langages n'ont de sens que lorsqu'elles sont interprétées, alors que d'autres langages sont entièrement vérifiés à la compilation. Par exemple, les types des variables de PHP ne sont connus que pendant l'exécution du programme, pas avant. En Java ou en OCaml, ils sont vérifiés pendant la compilation, ce qui permet de découvrir certaines erreurs de typage (quand on utilise une chaîne de caractères à la place d'un entier, par exemple).
Quel langage conseillerais-tu aux personnes voulant commencer à programmer ?
Ça dépend : si ce sont des amis à vous, vous devriez leur conseiller un langage que vous aimez bien, et que vous connaissez bien. C'est en effet en groupe qu'on apprend le mieux.
Mais dans l'absolu, je pense que j'ai un faible pour Python. Il est expressif (dans le sens où il permet de faire des programmes complets en quelques lignes) et bien pensé, et donne de bonnes habitudes aux débutants. Il est également bien documenté, et il est facile à utiliser, sans pour autant cacher trop de choses au débutant selon moi. Cependant, il semble aussi que ça dépende des caractères de chacun. L'idéal, je pense, ça reste de toucher à plusieurs langages, de plusieurs styles différents. Et puis une fois que l'on connaît bien la programmation, apprendre un nouveau langage n'est qu'une question de jours.
Quel langage correspond à quel besoin ?
Difficile de faire une réponse complète ! Ça dépend vraiment des problèmes. Parfois, quand on doit résoudre un certain problème, on n'a pas le choix du langage. Mais quand on a ce choix-là (par exemple pour un projet personnel), il est clair que tous les langages ne sont pas aussi bons les uns que les autres pour résoudre certains problèmes.
Par exemple, même si aujourd'hui tous les langages peuvent servir à faire du web, pour un petit projet développé rapidement, la palme revient sans doute toujours à PHP, Ruby, Perl ou Python. Pour l'écriture de programmes très bas niveau comme des pilotes matériels, le C est une référence. Pour écrire des compilateurs, ou encore étudier l'algorithmique, OCaml reste une référence. Et ainsi de suite…
La seule idée que je voudrais mettre en avant, c'est qu'il existe de nombreux langages de programmation intéressants. C'est assez triste de voir que la plupart des débutants se concentrent sur des langages dont l'intérêt est essentiellement professionnel. Apprendre Java à 14 ans parce qu'on espère devenir développeur à 21 ans, c'est s'empêcher de faire beaucoup de découvertes intéressantes sur la programmation.
Interview réalisée par Qwerty
Quoique apprendre l'algorithmique Paraît toujours d'une complexité sans nom…