Les bases de la programmation

Ou comprendre ce qu’est un programme, un langage de programmation, l’algorithmique.

Le problème exposé dans ce sujet a été résolu.

Bonjour tout le monde.

Nous en avions parlé, c'est désormais chose faite ! Partant du constat qu'un tuto qui veut enseigner un langage de programmation depuis zéro doit systématiquement expliquer certaines notions de base de la programmation, à commencer par ce qu'est la programmation exactement, nous avons décidé d'épargner aux futurs auteurs cette tâche fastidieuse et répétitive d'un tuto à l'autre. Mesdames et Messieurs, sous vos yeux ébahis…

Si je dis officiel, c'est que nous avons réuni une quinzaine d'auteurs de cours de programmation depuis zéro de ZdS afin de préparer ce cours, de décider de quoi on allait parler, etc. Après une première série de corrections et remarques apportées par ces derniers, nous avons le plaisir de vous le présenter en bêta.

Ce cours se veut réellement une introduction et rien de plus : aucun des concepts abordés ne sera traité dans les détails, il s'agit seulement d'apporter une compréhension générale à quelqu'un qui n'a jamais programmé et, potentiellement, ne sait même pas ce que ce mot veut dire.

En outre, le dernier extrait offre une présentation rapide des principaux langages, afin de permettre d'orienter le lecteur vers un premier apprentissage. Chaque fois que cela était possible, nous avons joint un lien vers un tuto, si possible sur ZdS, même en bêta. De cette manière, ce cours constitue en quelque sorte un sommaire des cours de programmation pour débutants totaux.

Bonne lecture !

+11 -0

Le contenu a l'air cool. J'ai juste un bémole : c'est super dense et sans image.

Trois images qui seraient bienvenues par exemple (capture d'écran):

  • vi(m)/emacs/notepad++ pour les éditeur de texte
  • geany pour les IDE light
  • Netbeans/visual studio pour les IDE complet

Un exemple de debugger et de ce que ça peut donner (de ddd à un pas à pas style netbeans) peut être aussi sympa.

"Le JavaScript n’est pas un très bon langage." Ho. Des jugements de valeur, dans un tuto qui se devrait d'être objectif.

Le JS est mal maîtrisé par beaucoup de développeurs, car implémenté différemment selon les navigateurs, devrait-on dire. Mais il n'en reste pas qu'il est hyper flexible niveau syntaxe; et surtout qu'il permet de mettre très rapidement en place des solutions (multiplateformes !), sans bibliothèque et de tas de manières différentes, ce qui le rend très accessible et plutôt intéressant pour étudier certaines choses en programmation.

Autant je serais d'accord pour dire que JS n'est pas adapté pour l'apprentissage en tant que premier langage, autant dire dans un tuto "c'est pas un bon langage", c'est pas vraiment acceptable. Ce genre de chose ne devrait pas passer la validation.

Je vais encore critiquer, hein, mais n'y voyez aucune malice. Il est dit, dans une note, qu'ARM est un fabricant. Or c'est inexact, puisqu'il ne possède aucune usine. Cette marque conçoit en fait des processeurs, et vend/loue des licences à des fabricants tels que Broadcom, NVidia ou Samsung qui peuvent alors fabriquer, en apportant parfois des modifications, des processeurs dits alors ARM.

Cool ! Quelques remarques :

Malgré cet inconvénient, il est presque toujours plus pratique de créer un programme pour un système d’exploitation donné que de faire en sorte qu’il tourne sans système d’exploitation.

Je trouve cette phrase peu claire : j'ai du m'y reprendre à trois fois avant de comprendre. Peut être remplacer "que de faire en sorte qu’il tourne sans système d’exploitation." par "que de faire en sorte qu’il fonctionne sans faire appel au système d’exploitation."

Il n’appartient pas à ce cours de vous présenter les différents paradigmes de programmation. Si la question vous intéresse, rendez-vous sur le cours dédié (pas encore disponible).

Le lien me donne une 403.

Les limites du classement

Pourquoi ne pas ajouter ici une distinction langage/implémentation ? Python est pas mal pour ça : entre CPython, PyPy, JPython, IronPython, on a tout !

Un éditeur de texte

Peut-être glisser ici un paragraphe sur la différence éditeur de texte/traitement de texte. Sinon on va avoir des débutants qui travaillent avec MSWord.

Dans la section sur les différents langages, j'ajouterai quelques points dans la section C++. C'est un langage très riche, trop riche. Du coup très difficile à maitriser. Mais il fourni plein de possibilités pour résoudre les problématiques du C tout en conservant ses avantages.

+0 -0

Ce cours se veut réellement une introduction et rien de plus : aucun des concepts abordés ne sera traité dans les détails, il s'agit seulement d'apporter une compréhension générale à quelqu'un qui n'a jamais programmé et, potentiellement, ne sait même pas ce que ce mot veut dire.

Considérez-vous les pré-requis comme nuls (à part une connaissance du vocabulaire courant du monde informatique : ordinateur, navigateur Web, etc.) ?

+0 -0

Je reviens sur un truc déjà dit, mais le "pas très bon langage" Js est en passe de devenir un langage majeur même dans la conception de programmes "clients lourds". On peut par exemple citer Atom, qui est conçu en Node.js . ^^

Mon avis personnel reste que ce cours n'est pas adapté pour quiconque débutant et n'étant pas spécialement technicien, mais alors pas du tout. Un lecteur lambda arrivant dessus décrochera probablement au bout de deux-trois paragraphes (déjà à cause des problèmes d'images manquantes). Ca demanderait peut-être un peu plus de travail, mais c'est un sujet déjà très compliqué, ce qui est proposé ici est très loin d'être à jeter. Bien joué :)

Salut, alors mes remarques (je me mets dans la peau du débutant complet) :

Je trouve le début très abstrait : on me parle de processeur, qui met des données en mémoire, de fichiers, de librairies… et la première définition, "Programmer un ordinateur, cela consiste donc à placer en mémoire les données adéquates ", ça parle pas vraiment. Ce n'est qu'après que tu donnes des exemples de programme (OS, navigateur, jeux…).

Au final, j'arrive au milieu du tuto, je ne sais toujours pas ce que je fais là… Pour moi, le tuto devrait plus se placer dès le début du point de vue du programmeur : qu'est-ce qu'un programme, puis un exemple d'algo, pour montrer le genre d'instructions qu'on doit donner à un ordi (là vous commencez direct par de l'assembleur, c'est hard). Je pense que c'est à ce moment qu'on peut aborder la question du comment on fait, donc parler du proc, de la mémoire… puis des langages qui permettent de s'abstraire de la machine, puis des compilos, donc des outils du développeur. Puis montrer qu'on n'a pas besoin de tout réinventer puisqu'il existe des librairies (la richesse d'une librairie peut être déterminante dans le chois du langage par exemple)

De même, parler de paradigmes, de design patterns et de framework, de règles de codage,… avant même de présenter les langages, est-ce vraiment optimisé ?

Pour résumer, programmer, cela consiste à générer un ou des fichiers exécutables pour un système d’exploitation donné

Pas vraiment applicables aux langages interprétés, non ?

Pour la présentation des langages, ça reste aussi trop abstrait pour moi. Peut-être montrer l'implémentation de l'algo de l'exemple de départ dans chaque langage ?

Banni

Bonsoir, voici mes suggestions d'amélioration.

Tous ces programmes tournent sur un système d’exploitation : ce peut être Windows, Linux2, Mac OS

« Mac OS » est le nom du système d'exploitation des ordinateurs d'Apple de 1984 à 2001. Au printemps 2001 est sorti la première version de « Mac OS X », système complètement neuf, basé sur Unix (les anciens programmes ne tournaient plus sous Mac OS X nativement, mais ce dernier comportait un émulateur nommé Classic, permettant de faire tourner ces anciens programmes dans un environnement dédié). Depuis quelques années, Apple a enlevé le mot « Mac » et désormais le système d'exploitation se nomme « OS X ».

La correction serait également à faire dans la note 4 :

La plupart du temps, elles ont l’extension .dll sous Windows, .dylib ou .so sous Mac OS et .so sous Linux.

Au sujet du langage Swift :

il pourrait bien devenir l’incontournable de la programmation d’applications sur iOS

Oui, mais aussi pour les applications OS X, ne l'oublions pas. Par ailleurs, Apple a annoncé début juin que le langage sera rendu open-source à l'automne 2015, avec mise à disposition d'un compilateur tournant sous Linux.

Pour le reste, il s’agit d’un langage assez classique et proche du C dans sa syntaxe

Il m'a semblé avoir lu qu'il offrait des fonctionnalités assez modernes, s'éloignant du C (pas besoin de manipuler des pointeurs, notamment) ; il a été annoncé comme étant de l' « Objective-C without the C ». Ceci étant, je ne suis pas assez connaisseur en profondeur pour être affirmatif, il faudrait sans doute des avis plus éclairés que le mien.

et Swift ou ObjectiveC sous iOS.

Plutôt : « et Swift ou Objective-C sous iOS et OS X (et watchOS). »

Ce tutoriel est une dispose d'un contenu et d'un potentiel intéressant, c'est une bonne chose qu'il voit le jour.

En outre, si vous vous intéressez plutôt au fonctionnement de l’ordinateur lui-même qu’au moyen de le programmer, ce cours en bêta de Mewtwo est fait pour vous.

Dans le pseudo de Mewtow, le o et le w sont inversés.

Le JavaScript n’est pas un très bon langage.

Comme dit par mes voisins du dessus, je ne pense pas que cette phrase est sa place ici. Là, c'est vraiment une question d'appréciation personnelle. Certains vont peut-être adorer Java, d'autres en seront horrifiés. Mais ça dépendra de chacun. A la limite, la phrase " Il est réputé… " passe mieux.
Autrement, la dernière partie, concernant l'utilisation de la programmation, est pas mal. Elle peut-être intéressante pour guider un débutant.

Sinon, comme je l'ai déjà dit, ce tutoriel est une bonne idée. Il permettra certainement d'éviter de s'enliser dans des explications lors de la rédaction d'un cours pour débutant. Au passage, ça montre que l'on a pas mal de tutos sur Zeste de Savoir (Java, Ruby, Ada, ActionScript, Cobol, Haskell..) auquels on peut ajouter les tutos en rédaction ou en validation (C, C++, Python, Perl, Rust, Fortan, PHP, Rust, Assembleur), ça donne une liste assez conséquente !

Cher tous, voici une nouvelle mouture de la bêta, suite à vos remarques et retours. Quand je ne réagis pas explicitement à l'une de vos remarques, c'est qu'elle a été intégrée et prise en compte dans cette nouvelle version. En particulier, artragis, tu seras content de voir que nous avons parsemé le cours de nombreuses images.

@luxera, artragis, Genroa, Emeric : je suppose qu'il fallait bien que les récriminations sur la présentation des langages commencent quelque part. Bref, j'ai reformulé pour adopter une position plus neutre. Mais vous ne me ferez pas dire que JS est un bon langage, et ce même s'il est utilisé par de grosses applis. :)

@Luthaf : certains ont déjà mis en doute la pertinence de toute la section « Les limites du classement », je pense qu'on irait vraiment trop loin en parlant d'implémentations.

@Vayel : en principe, oui, il est possible de lire le cours en n'ayant de l'informatique que les connaissances de toutes façons indispensable pour venir sur ZdS.

@Genroa : ce tuto surprend un peu, car on a plutôt l'habitude de voir toutes ces informations distillées au long d'un cours sur un langage donné, mais elles correspondent ni plus ni moins à ce que quelqu'un qui apprend un langage doit acquérir comme notions d'informatique générale pour comprendre son cours. J'ai malgré tout ajouté une note dans l'intro pour inviter les gens à si nécessaire revenir sur le cours plus tard.

@Looping : l'ordre de présentation des notions est un choix réfléchi. En effet, tu dis de commencer par définir ce qu'est un programme. Sauf qu'un programme, c'est un quelque chose (fichier exécutable) conçu pour réaliser une tâche donnée sur un ordinateur, et on le crée au moyen d'un quelque chose (langage de programmation) qui sera traduit au moyen d'un quelque chose (compilateur / interpréteur) en quelque chose (instructions) compréhensible par le quelque chose (processeur).

Ce que j'essaye de montrer, c'est que ta démarche commence en haut de l'arbre de dépendances des notions. De notre côté, nous avons préféré partir du bas, et construire petit à petit les notions plus complexes qui ont besoin des autres pour être comprises. En outre, cette démarche a pour avantage d'enlever le côté « magie noire » de la programmation : le langage bizarre et les outils étranges que l'on va enseigner au lecteur ne sont pas des idées farfelues d'un sorcier malade, mais les solutions techniques les plus adaptées au fait que programmer un ordinateur à la main est juste putain de trop difficile. On justifie l'apprentissage d'un langage plutôt que de le considérer comme une fin en soi.

Ce faisant, les explications sont en effet un peu abstraites (j'ai d'ailleurs ajouté une note à ce sujet), mais cela est inévitable quand on veut donner des explications qui restent valables pour tous les langages.

Les notions de paradigme, framework, etc. sont présentées avant la liste des langages pour deux raisons. Premièrement pour pouvoir utiliser ces concepts dans la description des langages, deuxièmement pour que la présentation des langages soient vraiment l'aboutissement du cours : la dernière chose que fait l'apprenant, c'est choisir vers où il se dirige ensuite.

Quant à cette présentation, je ne la trouve pas particulièrement abstraite. Au contraire, un point sur lequel tous nos premiers relecteurs sont d'accord, c'est que la description est accessible et compréhensible pour des débutants. Et c'est là l'objectif premier : utiliser des arguments qui peuvent parler à quelqu'un qui n'a jamais programmé. Dans cette optique, un exemple-type de chaque langage me paraît une mauvaise idée (outre que cela rendrait cette section aussi longue qu'une file d'attente soviétique) : un débutant risque surtout de se dire « ces langages se ressemblent tous » et de s'en trouver encore plus confus. Nous, programmeurs chevronnés, savons analyser la syntaxe d'un langage, mais qu'est-ce qu'un débutant pourrait en tirer ?

@quark67 : tu remarqueras que j'ai parlé de la syntaxe du langage et non de ses fonctionnalités. Il se trouve que je suis relecteur sur le tuto à venir de Swift, et la syntaxe est vraiment classique, et aussi similaire à du C que peut l'être un langage qui n'est pas du C. ^^

+1 -0

Faudrait peut-être faire une introduction un peu plus douce, qui ne commence pas directement par l'architecture des ordinateurs. Personnellement, j'ajouterais une introduction vaguement historique.

On commence en disant que le début de l'informatique a commencé avec des machines à calculer non-programmables, qui sont devenues de plus en plus puissantes : d'une simple pascaline, en passant par les calculateurs analogiques type MONIAC, suivis par les circuits électroniques non-programmables. Ensuite, on rajoute que c'était une plaie à reconfigurer, et qu'on ne pouvait pas les reconfigurer pour faire autre chose que ce pour quoi ils ont étés conçus. Et là, paf : arrivent les calculateurs programmables, qui peuvent faire tout et n'importe quoi, et auxquels ils faut donner une procédure à suivre pour qu'ils fassent ce qui est demandé. Et c'est seulement là qu'on parle d'architecture des ordinateurs, en faisant le lien avec ce qui est dit précédemment.

Cette introduction permettrait de clairement contextualiser ce qu'est l'informatique, pourquoi cela a été inventé, de montrer que cela ne sort pas de l'esprit tordu d'un savant fou. Après, tu peux pousser le vice en ajoutant un petit coté historique à ce premier extrait (le second étant celui sur l'architecture d'un ordinateur), cela aiderait à préparer la suite.

+1 -0

Je trouve ça dommage de laisse penser que l'informatique se fait uniquement avec un ordinateur. C'est plutôt la science de l'information. Il se trouve qu'elle a trouvé son essor avec l'apparition des ordinateurs mais ça fait très longtemps qu'on la pratique. Par exemple, en quoi un boulier chinois ne permet-il pas de gérer de l'information ?

Je suis pas trop d'accord quand Mewtow tu dis que l'informatique a été inventée. C'est prendre parti sur une question plus générale sur le statut de la science (humaine/naturelle). Je suis pas sur que ça soit rendre service que de dire ça dans un tuto de première approche pour un débutant.

Bref, ça me paraîtrait plus juste de distinguer l'ingénierie des ordinateurs avec la science de l'information.

PS : BTW j'ai une erreur sur le lien de la dernière beta >_>.

+1 -0

@Looping : l'ordre de présentation des notions est un choix réfléchi.

Pourtant tu admets toi-même que certains passages sont abstraits : "c’est normal, vous comprendrez mieux une fois qu’ils seront mis en application dans le premier langage que vous apprendrez. N’hésitez pas alors à revenir"

Du coup ça perd un peu sa vocation de tuto d'introduction. Tu dis que c'est normal si on veut être généraliste. Moi je pense qu'on peut éviter cet écueil avec une approche partant dans l'autre sens.

Une introduction sur l'histoire des ordinateurs, je suis pas fan. Je suis un lecteur qui arrive en se disant : "j'ai envie de savoir créer les jolies fenêtres que je vois sur mon ordi". C'est pour ça que je pense que le tuto doit commencer par là, j'ai pas envie de lire l'histoire de l'informatique au début.
Ca, je le verrais plus lorsqu'on aura parlé des processeurs. Là on peut faire une petite digression : comment on en est arrivé là. A ce moment-là, le pourquoi d'une approche historique se justifie, le lecteur ne se demande pas "qu'est-ce que ces infos font là".

Tout bien réfléchi, l'ordre des propos me semble correct (de toute manière, il est désormais fixé). Par contre, je suis d'accord avec Looping sur l'excès d'abstraction de certains passages, et je pense que cela peut se régler assez simplement en n'oubliant pas que le tutoriel s'adresse à des débutants. Mais regardons cela en détail.

Introduction

Et pour ce faire, il vous faut déjà comprendre ce qu’est réellement un ordinateur en fin de compte.

Je chipote, mais je ne suis pas certain que ce soit nécessaire ; tout comme il n'est pas nécessaire de connaître le fonctionnement d'une voiture pour en conduire une.

un ordinateur est composé des trois éléments suivants.

J'ai du mal à voir s'il s'agit ici d'une implication ou d'une équivalence. Ce n'est pas très important, mais toute chose composée de tels éléments est-elle un ordinateur ? Le cas échéant, j'en serais donc un ?

De la mémoire, qui peut prendre des formes extrêmement variées

Peut-être pourriez-vous fournir des exemples simples ?

par exemple, une carte graphique, pour afficher des choses sur un support visuel, une carte son, pour… produire du son, une carte réseau, pour communiquer avec d’autres ordinateurs

Pour avoir vécu la réforme des prépas scientifiques, avec des cours obligatoires d'informatique, je pense que beaucoup de ces termes ne seront pas connus par la plupart des lecteurs. Peut-être prendre des exemples plus simples, comme les claviers, souris et compagnie ?

En effet, bien qu’il fonctionne à l’électricité

Une petite note à ce propos pour la culture serait chouette. En fait, ça permettrait peut-être même d'éclairer le propos en disant que l'électricité n'est qu'un moyen particulier de réaliser un automate (cf. remarque suivante) et que ce qu'on a dans nos bureaux ne sont que des cas particuliers d'ordinateurs.

un processeur n’est rien de plus qu’un automate : il est possible de lui donner des ordres, que l’on appelle des instructions, et une suite d’instructions strictement identiques produira systématiquement le même résultat, sans la moindre originalité.

Là aussi, peut-être qu'un exemple d'automate autre qu'un processeur serait judicieux. Idéalement, un exemple de la vie courante, connu du plus grand nombre.

mais elles se ramènent toutes à quatre types.

J'ai du mal à voir ce qu'apporte cette liste au programmeur débutant.

Et cela fait, vous ne saurez vous servir que de votre processeur, mais pas comment lui faire contrôler ses périphériques.

Il me semble que le "mais" ne convient pas. Un "et même" irait mieux je crois. En effet, le "que" est placé devant l'objet, pas devant l'action, tandis que le "mais", lui, porte sur cette dernière.


En somme, je pense que cette introduction est un peu trop technique. Or il y a fort à parier que les lecteurs en seront à leur première expérience informatique, en dehors de l'utilisation basique qu'on peut faire d'un ordinateur (par exemple, je doute qu'ils soient experts en réseau). Du coup, il me semble intéressant de raccrocher ces notions aux choses simples qu'ils connaissent (écran, clavier, clé USB, Windows, etc.).

Pour ce qui est de l'approche historique, ce n'est à mon avis pas le propos ici : beaucoup ne liront pas ce tutoriel comme une introduction à l'informatique, mais comme une introduction à la création de son jeu vidéo méga over cool.

Merci pour le contenu. Le texte est toujours aussi agréable. ^^

+1 -0
Ce sujet est verrouillé.