Accueil > Java > Repenser le programme d’étude de Java : Au revoir, Helloworld !

Repenser le programme d’étude de Java : Au revoir, Helloworld !

Par Daniel H. Steinberg, le 21/08/2002

Traduit par Olivier, le 16/11/2002

Voici le premier article d’une série qui va s’intéresser à la manière dont Java est enseigné aux nouveaux programmeurs. Cette série va, en partie, introduire à la programmation orientée objet en s’appuyant sur les pratiques “orientées code” de la programmation extrême (eXtreme Programming - XP). Il ne s’agit pas de débattre pour savoir si XP est la bonne méthode pour le développement de vos applications ; nous allons plutôt réfléchir à ce que les nouveaux programmeurs devraient apprendre dans un cours d’introduction à Java. Vous pouvez joindre cette discussion à la fin de chaque article et n’hésitez pas à suggérer de futurs thèmes d’articles dans ce forum ou en m’envoyant un email à DSteinberg@core.com

Quand le language de programmation Java était tout nouveau, les livres, cours et tutoriel en ligne soulignaient que sa syntaxe proche du language C ferait de lui un language facile à appréhender pour les programmeurs expérimentés. Bien sûr, il y avait des livres qui se concentraient sur les avantages de la programmation orientée objet et promettaient que l’héritage allait sauver le monde. Mais après un bref historique avec quelques références à Oak, boîtier internet pour téléviseur et internet, la plupart des introductions étaient des portages de livres sur le C et C++.

Nous n’avions pas à jeter nos copies de Kernighan et Ritchie, nous n’avions qu’à apprendre ce petit “truc” à propos des objets. Pour une raison ou une autre, Java devait être meilleur. On nous disait que Java n’avait pas de pointeur, et pourtant nombreux parmi nous, quelques heures après le téléchargement du JDK, ont eu l’exception NullPointerException. Au fur et à mesure que l’on découvrait la programmation en Java, on pouvait voir que le C n’était pas la bonne approche pour aborder Java. Cela ne veut pas dire que les livres étaient dans l’erreur ; c’est ce que nous avions besoin d’entendre à ce moment là. Ces documents paraissent obsolètes aujourd’hui parce que de nombreux nouveaux venus à Java sont également de nouveaux venus à la programmation. Nous n’avons pas besoin de leur expliquer comment migrer du C à Java — nous avons besoin de penser à la meilleure façon d’approcher la programmation, si Java est le premier language.

C’est un moment particulièrement intéressant pour repenser notre approche. Début Septembre 2003, l’examen de sciences informatiques à High School Advanced Placement sera disponible en Java. En secondaire, les cours d’introduction sont enseignés en Java, et les enseignants ont fait de gros effort pour repenser le programme d’étude. Un projet dirigé par Lynn Andrea Stein a abouti à Rethinking CS101 Project et son site à venir. Stein est passée du laboratoire d’Intelligence Artificielle du MIT à Olin College tout récemment créé.

Une introduction non orientée objet au concept orienté objet

Si l’on vous permettait de commencer un cours sur la programmation orientée objet en utilisant Java, où débuteriez-vous ? Un choix évident est :

public class HelloWorld {
  public static void main( String [] args) {
    System.out.println("Hello, world.");
  }
}

Comme Jason Hunter le fait remarquer dans son livre Java Servlet Programming (O’Reilly, seconde édition 2002), HelloWorld a été utilisé comme le premier programme depuis le langage B (le prédécesseur du langage C). Toutes les introductions de Java à JSP et Servlets en passant par Ruby et JDBC commencent avec une forme du programme d’exemple HelloWorld. C’est un programme court, simple à écrire qui produit un résultat immédiatement observable. Un utilisateur novice peut être guidé dans l’outil d’édition pour taper et sauvegarder les quelques lignes de code. On peut ensuite expliquer au débutant comment compiler et exécuter le programme. Même les petits nouveaux savent que les tâches ont été correctement effectuées quand les mots “Hello World” apparaissent dans la fenêtre de la console.

D’un autre côté, il y a de nombreuses raisons de voir HelloWorld comme la pire manière de commencer un cours sur la programmation orientée objet. Un programme orienté objet devrait être constitué d’objets fortement liés les uns aux autres envoyant et recevant des messages à d’autres objets. Par exemple quand un utilisateur clique sur un JButton de l’interface d’une application, tous les objets qui ont besoin de savoir quand ce JButton est cliqué recevront une notification. Ces objets savent alors ce qu’ils doivent faire — peut-être envoyer des messages à d’autres objets.

Maintenant revenez à HelloWorld. Aucun objet n’est créé. La classe HelloWorld ne contient même pas de méthode autre que main() — une autre critique que je garde pour la prochaine section. HelloWorld est une classe qui n’a aucune raison d’être, et pourtant c’est par elle que commence notre discussion sur la programmation orientée objet. Si nous étions très charitables, nous donnerions quelques points en OO (Orientation Objet) à HelloWorld parce que la méthode println() de la classe out du package System est invoquée.

Le Big Bang

Un programme OO consiste donc en des objets qui interagissent les uns avec les autres en s’envoyant des messages. Le dilemme pédagogique est que toute cette interaction doit démarrer quelque part, mais ce n’est pas là que devrait commencer l’explication de la programmation orientée objet. En d’autres termes, il est nécessaire d’avoir une méthode main() pour démarrer le programme, mais on ne veut pas commencer le cours en expliquant tous les éléments de main().

De façon similaire, en cours de sciences physiques, on explique comment les objets interagissent entre eux. On ne commence pas par expliquer le Big Bang et la création de l’univers. Il est plus facile de démontrer et d’expliquer les lois sur le mouvement de Newton. Dans un programme Java, le “big bang” qui crée le premier objet est la méthode main() :

 public static void main( String [] args );

Vous pourriez commencer le cours en expliquant la signification de chaque mot-clé.

  • Accesseurs : Avant que les étudiants ne comprennent la différence entre objets et classes, avant qu’ils n’aient vu un programme avec plus d’un objet ou une classe, vous devez expliquer les niveaux d’accès. La classe HelloWorld n’est même pas dans un package, et pourtant vous allez devoir parler de package et hiérarchie afin de distinguer public, protected, private et ce niveau d’accès qui n’a même pas de nom.
  • Méthodes de classe : L’utilisation du mot-clé static nécessite que les étudiants sachent quelles méthodes et attributs devraient appartenir à la classe et lesquels devraient appartenir à l’objet. Comme nous l’avons dit auparavant, à ce point, les étudiants ne voient pas la différence entre classes et objets (si vous êtes un développeur Java expérimenté, vous ne vous rappelez plus que c’est un concept difficile à appréhender). Remarquez que la classe HelloWorld n’a qu’une seule méthode. Que main() soit static n’est pas vraiment basé sur la différence de concept entre classe et objet, mais sur le fait que la méthode main() doit être invoquée avant même qu’un objet de type HelloWorld ne puisse être créé.
  • Le type retourné : Imaginez que vous deviez expliquer le type de l’objet retourné par une méthode. Vous pourriez choisir quelque chose comme int add(int i, int j) pour illustrer que la méthode add() retourne la somme de i et de j sous forme d’un int. Vous ne choisiriez pas une méthode qui ne retourne rien pour votre premier exemple. Vous n’utiliseriez pas void pour votre premier type retour pas plus que vous ne tenteriez d’expliquer la multiplication en utilisant des exemples de nombres multipliés par zero.
  • Les arguments de la ligne de commande : Les paramètres de la méthode main() sont des arguments de la ligne de commande. Souvent, l’exemple qui suit HelloWorld est une amélioration qui permet à l’utilisateur de taper java HelloWorld monNom et d’avoir en retour Hello monNom. Voulez-vous vraiment parler de cela tout de suite ? Pour cela et tous les autres éléments de la liste, la question n’est pas de savoir si ce sont des points importants ou non, mais plutôt s’ils devraient être présentés de suite dans un cours créé pour enseigner aux étudiants la programmation orientée objet en Java.
  • Chaînes de caractères : La variable args est un tableau de String. Je ne veux pas taper sur cet exemple, mais vous ne voulez pas avoir à introduire les tableaux afin d’expliquer la signature de cette méthode. Vous ne voulez pas non plus avoir à expliquer que si vous voulez lire un int, vous devez dabord le lire comme une String et le convertir en un int en utilisant une autre méthode static dans une classe wrapper.

(Soupir). La méthode main() est certainement le bon endroit pour commencer l’exécution d’un programme Java, mais ce n’est pas là où vous devriez commencer les explications d’un programme Java.

Le Défi

Qu’en pensez-vous ? Etes-vous prêts à abandonner HelloWorld comme votre premier programme, y voyez-vous des avantages que vous voulez défendre ? Et main() ? Vous avez besoin de main() sinon votre programme ne fonctionnera pas. Comment approchez-vous la chose ? Dites-vous à vos étudiants de le taper “mot pour mot, vous apprendrez ce que chaque terme signifie plus tard” ? Expliquez-vous chaque terme et continuez-vous le semestre suivant avec les trois personnes qui n’ont pas déserté le cours ?

Comment débuteriez-vous une introduction à la programmation orientée objet basée sur Java ?

Textes originaux en anglais sur O’Reilly : Rethinking the Java Curriculum: Goodbye, HelloWorld! par Daniel H. Steinberg

opoppon Java ,

  1. Pas encore de commentaire
  1. Pas encore de trackbacks
Vous devez être identifié pour poster un commentaire