J'ai beaucoup apprécié le fil "Avis sur les include files" où ont été
abordées entre autres des questions sur l'enseignement du C++ et les "bonnes
habitudes" à enseigner en TP, ce qui m'incite à poster ce message.
Voici la situation : je suis enseignant en IUT - DUT informatique (Bac+2 à
vocation professionnelle). Jusqu'à maintenant la programmation était
enseignée au travers du C++. Il est fortement question de changer ce choix
dans notre IUT pour remplacer C++ par Java (actuellement un enseignement de
Java existe, mais en seconde année seulement, donc avec déjà une pratique du
C++ et les bases de la POO).
J'aimerais vos avis sur ces deux questions :
- quels sont les arguments en faveur (ou en défaveur) du C++ (par rapport à
Java) pour enseigner la POO à des débutants complets en programmation ? (et
pour qui, pour reprendre une remarque apparue dans le fil auquel je faisais
référence, il n'y a plus en majorité "de passion ou de réelle envie de faire
de l'informatique"...)
- est-il raisonnable de lâcher sur le marché du travail des informaticiens
"Bac+2" qui n'aient jamais programmé en C++ ?
Note personnelle : je ne suis pas le chargé de cours concerné, j'ai une
tendance à préférer le C++ (par mon parcours et par mon activité quotidienne
en recherche), mais je n'aurai aucune réticence à faire pratiquer Java si je
suis convaincu que c'est un meilleur choix pour mes étudiants.
Merci d'avance pour vos contributions qui nourriront sûrement le débat que
nous devrions avoir au sein de l'équipe pédagogique.
voila ! que l'auteur expie cette injure au bon sens - et surtout le fait d'utiliser le format d'un méchant éditeur qui fait des sous en vendant cher des softs douteux jamais ouvert ! btw, on aurait pu flamber aussi le flash dans ce fil, non ?
Euh la, par contre, tu ferais mieux de te taire.
je suis entièrement d'accord ... puisque je reprenais des arguments que je ne partage pas du tout.
Sylvain.
Marc Espie a écrit :
In article <49a1d3fd$0$17769$ba4acef3@news.orange.fr>,
Sylvain SF <sylvain@boiteaspam.info> wrote:
voila ! que l'auteur expie cette injure au bon sens - et surtout
le fait d'utiliser le format d'un méchant éditeur qui fait des
sous en vendant cher des softs douteux jamais ouvert ! btw, on
aurait pu flamber aussi le flash dans ce fil, non ?
Euh la, par contre, tu ferais mieux de te taire.
je suis entièrement d'accord ... puisque je reprenais des arguments
que je ne partage pas du tout.
voila ! que l'auteur expie cette injure au bon sens - et surtout le fait d'utiliser le format d'un méchant éditeur qui fait des sous en vendant cher des softs douteux jamais ouvert ! btw, on aurait pu flamber aussi le flash dans ce fil, non ?
Euh la, par contre, tu ferais mieux de te taire.
je suis entièrement d'accord ... puisque je reprenais des arguments que je ne partage pas du tout.
Sylvain.
Fabien LE LEZ
On Sun, 22 Feb 2009 22:54:06 +0100, Wykaaa :
Exact. Quand on voit comment est utiliser le html, on peut se poser des questions sur la bonne santé mentale de 90% des webmestres...
Faut dire aussi que dès qu'on veut faire de l'argent avec un site, le côté "flashy" compte très largement plus que le contenu ou la lisibilité d'icelui.
Il y a une petite différence entre PDF et Flash. L'un est un quasi standard, l'autre sert aux neuneus à fabriquer des arbres de Noël !
En pratique, les deux sont des standards de fait. Et tant que le W3C tourne en rond avec HTML5, utiliser Flash est la seule manière fiable d'afficher de la vidéo sur une page web.
On Sun, 22 Feb 2009 22:54:06 +0100, Wykaaa <wykaaa@yahoo.fr>:
Exact. Quand on voit comment est utiliser le html, on peut se poser des
questions sur la bonne santé mentale de 90% des webmestres...
Faut dire aussi que dès qu'on veut faire de l'argent avec un site, le
côté "flashy" compte très largement plus que le contenu ou la
lisibilité d'icelui.
Il y a une petite différence entre PDF et Flash. L'un est un quasi
standard, l'autre sert aux neuneus à fabriquer des arbres de Noël !
En pratique, les deux sont des standards de fait. Et tant que le W3C
tourne en rond avec HTML5, utiliser Flash est la seule manière fiable
d'afficher de la vidéo sur une page web.
Exact. Quand on voit comment est utiliser le html, on peut se poser des questions sur la bonne santé mentale de 90% des webmestres...
Faut dire aussi que dès qu'on veut faire de l'argent avec un site, le côté "flashy" compte très largement plus que le contenu ou la lisibilité d'icelui.
Il y a une petite différence entre PDF et Flash. L'un est un quasi standard, l'autre sert aux neuneus à fabriquer des arbres de Noël !
En pratique, les deux sont des standards de fait. Et tant que le W3C tourne en rond avec HTML5, utiliser Flash est la seule manière fiable d'afficher de la vidéo sur une page web.
Jean-Marc Desperrier
Fabien LE LEZ wrote:
On Sun, 08 Feb 2009 00:38:48 +0100, Wykaaa:
C'est bizarre si ce n'est pas abordé car c'est plein de pièges. personnellement, et je ne suis pas le seul, j'en déconseille l'emploi sauf dans des cas très particuliers.
Ce qui explique peut-être pourquoi ce n'est pas abordé...
Ne pourrait-on pas en dire presque autant d'un certain nombre des différences entre C++ et Java ?
Dans l'approche présentée ici, n'y-a-t-il pas un risque de surcharge de l'apprenant moyen, détourné vers des subtilités pas essentielles (constructeur faisant de l'allocation dynamiques) et qui à l'arrivée aura retenu une version plus ou moins foireuses des concepts compliqués (et inutilisable car c'est des trucs où on ne peut pas se permettre une seule erreur quand on s'en sert), mais ne maitrisera réellement pas les bases ?
Si dans quelques années, les languages (ou version de languages) à garbage collector se sont définitivement imposées (sauf pour quelques applications très pointues), toute la partie passée à expliquer ces subtilité sur l'allocation dynamique ne sera-t-elle pas un peu ridicule ?
Franchement personnellement je préfererais passer deux fois plus de temps à être sûr que l'apprenant à *vraiment* compris les concept de développement par couches, de conception des interfaces de manière à réllement isoler les objets, de ne pas d'un seul coup exposer dans l'objet A un truc qui manifestement devrait être interne mais voilà en fait finalement l'objet B en a besoin et il ne voit pas comment faire autrement que de le rendre publique, le concept de comment rendre générique mais de ne pas de faire des couches de généricité pour le plaisir sans aucun intérêt, de comment on peut refactoriser un code quand on se rend compte qu'on s'était planté au départ, et de pourquoi définir dès le départ les fonctionnalités attendus et écrire les tests qui s'assurent qu'elles sont réalisées devient un énorme gain de productivité à la fin.
Tiens les deux entrées de blog suivant sur le dévelopement d'un outils python qui duplique le fonctionnement de gmake (et de presque l'intégralité des subtilités de gmake) est une bonne illustration des ces derniers principes (par exemple sur le fait que même les très, très bons hackers savent tôt ou tard ils trouveront une erreur de conception qui les obligera à refactoriser du code) : http://benjamin.smedbergs.us/blog/2009-02-23/sanity-and-testcases-for-pymake/ http://vocamus.net/dave/?p97
D'ailleurs on pourrait se demander si aujourd'hui le meilleur language à enseigner ne serait pas javascript, à condition de le faire proprement en partant du concept de programmation par prototype et des liens avec Self http://en.wikipedia.org//wiki/Self_(programming_language) et sur une plate-forme en JIT, qui fait concurrence à pas mal d'autres languages en rapidité d'exécution, ainsi qu'en utilisant les mécanismes avancés piqués à Python (générateurs, itérateurs, assignation déstructurante, expressions génératrices http://fr.wikipedia.org/wiki/JavaScript#Version_1.7 https://developer.mozilla.org/fr/Nouveautés_dans_JavaScript_1.7
Fabien LE LEZ wrote:
On Sun, 08 Feb 2009 00:38:48 +0100, Wykaaa<wykaaa@yahoo.fr>:
C'est bizarre si ce n'est pas abordé car c'est plein de pièges.
personnellement, et je ne suis pas le seul, j'en déconseille l'emploi
sauf dans des cas très particuliers.
Ce qui explique peut-être pourquoi ce n'est pas abordé...
Ne pourrait-on pas en dire presque autant d'un certain nombre des
différences entre C++ et Java ?
Dans l'approche présentée ici, n'y-a-t-il pas un risque de surcharge de
l'apprenant moyen, détourné vers des subtilités pas essentielles
(constructeur faisant de l'allocation dynamiques) et qui à l'arrivée
aura retenu une version plus ou moins foireuses des concepts compliqués
(et inutilisable car c'est des trucs où on ne peut pas se permettre une
seule erreur quand on s'en sert), mais ne maitrisera réellement pas les
bases ?
Si dans quelques années, les languages (ou version de languages) à
garbage collector se sont définitivement imposées (sauf pour quelques
applications très pointues), toute la partie passée à expliquer ces
subtilité sur l'allocation dynamique ne sera-t-elle pas un peu ridicule ?
Franchement personnellement je préfererais passer deux fois plus de
temps à être sûr que l'apprenant à *vraiment* compris les concept de
développement par couches, de conception des interfaces de manière à
réllement isoler les objets, de ne pas d'un seul coup exposer dans
l'objet A un truc qui manifestement devrait être interne mais voilà en
fait finalement l'objet B en a besoin et il ne voit pas comment faire
autrement que de le rendre publique, le concept de comment rendre
générique mais de ne pas de faire des couches de généricité pour le
plaisir sans aucun intérêt, de comment on peut refactoriser un code
quand on se rend compte qu'on s'était planté au départ, et de pourquoi
définir dès le départ les fonctionnalités attendus et écrire les tests
qui s'assurent qu'elles sont réalisées devient un énorme gain de
productivité à la fin.
Tiens les deux entrées de blog suivant sur le dévelopement d'un outils
python qui duplique le fonctionnement de gmake (et de presque
l'intégralité des subtilités de gmake) est une bonne illustration des
ces derniers principes (par exemple sur le fait que même les très, très
bons hackers savent tôt ou tard ils trouveront une erreur de conception
qui les obligera à refactoriser du code) :
http://benjamin.smedbergs.us/blog/2009-02-23/sanity-and-testcases-for-pymake/
http://vocamus.net/dave/?p97
D'ailleurs on pourrait se demander si aujourd'hui le meilleur language à
enseigner ne serait pas javascript, à condition de le faire proprement
en partant du concept de programmation par prototype et des liens avec
Self http://en.wikipedia.org//wiki/Self_(programming_language) et sur
une plate-forme en JIT, qui fait concurrence à pas mal d'autres
languages en rapidité d'exécution, ainsi qu'en utilisant les mécanismes
avancés piqués à Python (générateurs, itérateurs, assignation
déstructurante, expressions génératrices
http://fr.wikipedia.org/wiki/JavaScript#Version_1.7
https://developer.mozilla.org/fr/Nouveautés_dans_JavaScript_1.7
C'est bizarre si ce n'est pas abordé car c'est plein de pièges. personnellement, et je ne suis pas le seul, j'en déconseille l'emploi sauf dans des cas très particuliers.
Ce qui explique peut-être pourquoi ce n'est pas abordé...
Ne pourrait-on pas en dire presque autant d'un certain nombre des différences entre C++ et Java ?
Dans l'approche présentée ici, n'y-a-t-il pas un risque de surcharge de l'apprenant moyen, détourné vers des subtilités pas essentielles (constructeur faisant de l'allocation dynamiques) et qui à l'arrivée aura retenu une version plus ou moins foireuses des concepts compliqués (et inutilisable car c'est des trucs où on ne peut pas se permettre une seule erreur quand on s'en sert), mais ne maitrisera réellement pas les bases ?
Si dans quelques années, les languages (ou version de languages) à garbage collector se sont définitivement imposées (sauf pour quelques applications très pointues), toute la partie passée à expliquer ces subtilité sur l'allocation dynamique ne sera-t-elle pas un peu ridicule ?
Franchement personnellement je préfererais passer deux fois plus de temps à être sûr que l'apprenant à *vraiment* compris les concept de développement par couches, de conception des interfaces de manière à réllement isoler les objets, de ne pas d'un seul coup exposer dans l'objet A un truc qui manifestement devrait être interne mais voilà en fait finalement l'objet B en a besoin et il ne voit pas comment faire autrement que de le rendre publique, le concept de comment rendre générique mais de ne pas de faire des couches de généricité pour le plaisir sans aucun intérêt, de comment on peut refactoriser un code quand on se rend compte qu'on s'était planté au départ, et de pourquoi définir dès le départ les fonctionnalités attendus et écrire les tests qui s'assurent qu'elles sont réalisées devient un énorme gain de productivité à la fin.
Tiens les deux entrées de blog suivant sur le dévelopement d'un outils python qui duplique le fonctionnement de gmake (et de presque l'intégralité des subtilités de gmake) est une bonne illustration des ces derniers principes (par exemple sur le fait que même les très, très bons hackers savent tôt ou tard ils trouveront une erreur de conception qui les obligera à refactoriser du code) : http://benjamin.smedbergs.us/blog/2009-02-23/sanity-and-testcases-for-pymake/ http://vocamus.net/dave/?p97
D'ailleurs on pourrait se demander si aujourd'hui le meilleur language à enseigner ne serait pas javascript, à condition de le faire proprement en partant du concept de programmation par prototype et des liens avec Self http://en.wikipedia.org//wiki/Self_(programming_language) et sur une plate-forme en JIT, qui fait concurrence à pas mal d'autres languages en rapidité d'exécution, ainsi qu'en utilisant les mécanismes avancés piqués à Python (générateurs, itérateurs, assignation déstructurante, expressions génératrices http://fr.wikipedia.org/wiki/JavaScript#Version_1.7 https://developer.mozilla.org/fr/Nouveautés_dans_JavaScript_1.7
espie
In article , Fabien LE LEZ wrote:
On Sun, 08 Feb 2009 00:38:48 +0100, Wykaaa :
C'est bizarre si ce n'est pas abordé car c'est plein de pièges. personnellement, et je ne suis pas le seul, j'en déconseille l'emploi sauf dans des cas très particuliers.
Ce qui explique peut-être pourquoi ce n'est pas abordé...
Il faudrait au moins mentionner a quoi ca sert, et quand.
Mais bon, je suis encore un peu plus extreme: je suis pour passer beaucoup de temps sur l'encapsulation et l'abstraction, nettement moins de temps sur l'heritage (qui est deja assez dangereux), et apres expliquer les pattern utiles (l'inversion de dependances, et l'heritage implementation/interface, seul cas "raisonnable" d'heritage multiple).
Le chiendent des notions complexes, comme la surcharge ou l'heritage multiple, c'est qu'on ne voit jamais aucun soucis sur de petits projets. C'est seulement lorsqu'on a deja 500 lignes de code qu'on voit les soucis architecturaux qui, a terme, forcent a tout mettre a la poubelle et a recommencer a partir de rien...
In article <ig7so4p2tg306mqak76hvj6kpr5f885ta5@4ax.com>,
Fabien LE LEZ <usenet17@x.edulang.com> wrote:
On Sun, 08 Feb 2009 00:38:48 +0100, Wykaaa <wykaaa@yahoo.fr>:
C'est bizarre si ce n'est pas abordé car c'est plein de pièges.
personnellement, et je ne suis pas le seul, j'en déconseille l'emploi
sauf dans des cas très particuliers.
Ce qui explique peut-être pourquoi ce n'est pas abordé...
Il faudrait au moins mentionner a quoi ca sert, et quand.
Mais bon, je suis encore un peu plus extreme: je suis pour passer beaucoup
de temps sur l'encapsulation et l'abstraction, nettement moins de temps
sur l'heritage (qui est deja assez dangereux), et apres expliquer les pattern
utiles (l'inversion de dependances, et l'heritage implementation/interface,
seul cas "raisonnable" d'heritage multiple).
Le chiendent des notions complexes, comme la surcharge ou l'heritage
multiple, c'est qu'on ne voit jamais aucun soucis sur de petits projets.
C'est seulement lorsqu'on a deja 500 lignes de code qu'on voit les soucis
architecturaux qui, a terme, forcent a tout mettre a la poubelle et a
recommencer a partir de rien...
C'est bizarre si ce n'est pas abordé car c'est plein de pièges. personnellement, et je ne suis pas le seul, j'en déconseille l'emploi sauf dans des cas très particuliers.
Ce qui explique peut-être pourquoi ce n'est pas abordé...
Il faudrait au moins mentionner a quoi ca sert, et quand.
Mais bon, je suis encore un peu plus extreme: je suis pour passer beaucoup de temps sur l'encapsulation et l'abstraction, nettement moins de temps sur l'heritage (qui est deja assez dangereux), et apres expliquer les pattern utiles (l'inversion de dependances, et l'heritage implementation/interface, seul cas "raisonnable" d'heritage multiple).
Le chiendent des notions complexes, comme la surcharge ou l'heritage multiple, c'est qu'on ne voit jamais aucun soucis sur de petits projets. C'est seulement lorsqu'on a deja 500 lignes de code qu'on voit les soucis architecturaux qui, a terme, forcent a tout mettre a la poubelle et a recommencer a partir de rien...
Fabien LE LEZ
On Thu, 26 Feb 2009 16:12:49 +0100, Jean-Marc Desperrier :
Si dans quelques années, les languages (ou version de languages) à garbage collector se sont définitivement imposées [...]
[...] de conception des interfaces de manière à réllement isoler les objets
Et si dans quelques années, un nouveau paradigme (programmation fonctionnelle ? Autre chose ?) a fait oublier la POO ?
On Thu, 26 Feb 2009 16:12:49 +0100, Jean-Marc Desperrier
<jmdesp@alussinan.org>:
Si dans quelques années, les languages (ou version de languages) à
garbage collector se sont définitivement imposées [...]
[...] de conception des interfaces de manière à
réllement isoler les objets
Et si dans quelques années, un nouveau paradigme (programmation
fonctionnelle ? Autre chose ?) a fait oublier la POO ?
On Thu, 26 Feb 2009 16:12:49 +0100, Jean-Marc Desperrier :
Si dans quelques années, les languages (ou version de languages) à garbage collector se sont définitivement imposées [...]
[...] de conception des interfaces de manière à réllement isoler les objets
Et si dans quelques années, un nouveau paradigme (programmation fonctionnelle ? Autre chose ?) a fait oublier la POO ?
Wykaaa
Jean-Marc Desperrier a écrit :
Fabien LE LEZ wrote:
On Sun, 08 Feb 2009 00:38:48 +0100, Wykaaa:
C'est bizarre si ce n'est pas abordé car c'est plein de pièges. personnellement, et je ne suis pas le seul, j'en déconseille l'emploi sauf dans des cas très particuliers.
Ce qui explique peut-être pourquoi ce n'est pas abordé...
Ne pourrait-on pas en dire presque autant d'un certain nombre des différences entre C++ et Java ?
Dans l'approche présentée ici, n'y-a-t-il pas un risque de surcharge de l'apprenant moyen, détourné vers des subtilités pas essentielles (constructeur faisant de l'allocation dynamiques) et qui à l'arrivée aura retenu une version plus ou moins foireuses des concepts compliqués (et inutilisable car c'est des trucs où on ne peut pas se permettre une seule erreur quand on s'en sert), mais ne maitrisera réellement pas les bases ?
Si dans quelques années, les languages (ou version de languages) à garbage collector se sont définitivement imposées (sauf pour quelques applications très pointues), toute la partie passée à expliquer ces subtilité sur l'allocation dynamique ne sera-t-elle pas un peu ridicule ?
Franchement personnellement je préfererais passer deux fois plus de temps à être sûr que l'apprenant à *vraiment* compris les concept de développement par couches, de conception des interfaces de manière à réllement isoler les objets, de ne pas d'un seul coup exposer dans l'objet A un truc qui manifestement devrait être interne mais voilà en fait finalement l'objet B en a besoin et il ne voit pas comment faire autrement que de le rendre publique, le concept de comment rendre générique mais de ne pas de faire des couches de généricité pour le plaisir sans aucun intérêt, de comment on peut refactoriser un code quand on se rend compte qu'on s'était planté au départ, et de pourquoi définir dès le départ les fonctionnalités attendus et écrire les tests qui s'assurent qu'elles sont réalisées devient un énorme gain de productivité à la fin.
Tiens les deux entrées de blog suivant sur le dévelopement d'un outils python qui duplique le fonctionnement de gmake (et de presque l'intégralité des subtilités de gmake) est une bonne illustration des ces derniers principes (par exemple sur le fait que même les très, très bons hackers savent tôt ou tard ils trouveront une erreur de conception qui les obligera à refactoriser du code) : http://benjamin.smedbergs.us/blog/2009-02-23/sanity-and-testcases-for-pymake/
http://vocamus.net/dave/?p97
D'ailleurs on pourrait se demander si aujourd'hui le meilleur language à enseigner ne serait pas javascript, à condition de le faire proprement en partant du concept de programmation par prototype et des liens avec Self http://en.wikipedia.org//wiki/Self_(programming_language) et sur une plate-forme en JIT, qui fait concurrence à pas mal d'autres languages en rapidité d'exécution, ainsi qu'en utilisant les mécanismes avancés piqués à Python (générateurs, itérateurs, assignation déstructurante, expressions génératrices http://fr.wikipedia.org/wiki/JavaScript#Version_1.7 https://developer.mozilla.org/fr/Nouveautés_dans_JavaScript_1.7
Ce que tu dis pourrait ouvrir un nouveau fil et il me semble que tu n'as pas tout à fait tort, dans un premier temps. Il me semble cependant que, dans nombres de cas de la vie réelle, les développeurs vont devoir vivre encore longtemps avec la manipulation, certes délicate, de la mémoire et l'allocation dynamique explicite. Pour moi, ça fait partie de la "culture" du développeur, au moins encore aujourd'hui.
Jean-Marc Desperrier a écrit :
Fabien LE LEZ wrote:
On Sun, 08 Feb 2009 00:38:48 +0100, Wykaaa<wykaaa@yahoo.fr>:
C'est bizarre si ce n'est pas abordé car c'est plein de pièges.
personnellement, et je ne suis pas le seul, j'en déconseille l'emploi
sauf dans des cas très particuliers.
Ce qui explique peut-être pourquoi ce n'est pas abordé...
Ne pourrait-on pas en dire presque autant d'un certain nombre des
différences entre C++ et Java ?
Dans l'approche présentée ici, n'y-a-t-il pas un risque de surcharge de
l'apprenant moyen, détourné vers des subtilités pas essentielles
(constructeur faisant de l'allocation dynamiques) et qui à l'arrivée
aura retenu une version plus ou moins foireuses des concepts compliqués
(et inutilisable car c'est des trucs où on ne peut pas se permettre une
seule erreur quand on s'en sert), mais ne maitrisera réellement pas les
bases ?
Si dans quelques années, les languages (ou version de languages) à
garbage collector se sont définitivement imposées (sauf pour quelques
applications très pointues), toute la partie passée à expliquer ces
subtilité sur l'allocation dynamique ne sera-t-elle pas un peu ridicule ?
Franchement personnellement je préfererais passer deux fois plus de
temps à être sûr que l'apprenant à *vraiment* compris les concept de
développement par couches, de conception des interfaces de manière à
réllement isoler les objets, de ne pas d'un seul coup exposer dans
l'objet A un truc qui manifestement devrait être interne mais voilà en
fait finalement l'objet B en a besoin et il ne voit pas comment faire
autrement que de le rendre publique, le concept de comment rendre
générique mais de ne pas de faire des couches de généricité pour le
plaisir sans aucun intérêt, de comment on peut refactoriser un code
quand on se rend compte qu'on s'était planté au départ, et de pourquoi
définir dès le départ les fonctionnalités attendus et écrire les tests
qui s'assurent qu'elles sont réalisées devient un énorme gain de
productivité à la fin.
Tiens les deux entrées de blog suivant sur le dévelopement d'un outils
python qui duplique le fonctionnement de gmake (et de presque
l'intégralité des subtilités de gmake) est une bonne illustration des
ces derniers principes (par exemple sur le fait que même les très, très
bons hackers savent tôt ou tard ils trouveront une erreur de conception
qui les obligera à refactoriser du code) :
http://benjamin.smedbergs.us/blog/2009-02-23/sanity-and-testcases-for-pymake/
http://vocamus.net/dave/?p97
D'ailleurs on pourrait se demander si aujourd'hui le meilleur language à
enseigner ne serait pas javascript, à condition de le faire proprement
en partant du concept de programmation par prototype et des liens avec
Self http://en.wikipedia.org//wiki/Self_(programming_language) et sur
une plate-forme en JIT, qui fait concurrence à pas mal d'autres
languages en rapidité d'exécution, ainsi qu'en utilisant les mécanismes
avancés piqués à Python (générateurs, itérateurs, assignation
déstructurante, expressions génératrices
http://fr.wikipedia.org/wiki/JavaScript#Version_1.7
https://developer.mozilla.org/fr/Nouveautés_dans_JavaScript_1.7
Ce que tu dis pourrait ouvrir un nouveau fil et il me semble que tu n'as
pas tout à fait tort, dans un premier temps. Il me semble cependant que,
dans nombres de cas de la vie réelle, les développeurs vont devoir vivre
encore longtemps avec la manipulation, certes délicate, de la mémoire et
l'allocation dynamique explicite.
Pour moi, ça fait partie de la "culture" du développeur, au moins encore
aujourd'hui.
C'est bizarre si ce n'est pas abordé car c'est plein de pièges. personnellement, et je ne suis pas le seul, j'en déconseille l'emploi sauf dans des cas très particuliers.
Ce qui explique peut-être pourquoi ce n'est pas abordé...
Ne pourrait-on pas en dire presque autant d'un certain nombre des différences entre C++ et Java ?
Dans l'approche présentée ici, n'y-a-t-il pas un risque de surcharge de l'apprenant moyen, détourné vers des subtilités pas essentielles (constructeur faisant de l'allocation dynamiques) et qui à l'arrivée aura retenu une version plus ou moins foireuses des concepts compliqués (et inutilisable car c'est des trucs où on ne peut pas se permettre une seule erreur quand on s'en sert), mais ne maitrisera réellement pas les bases ?
Si dans quelques années, les languages (ou version de languages) à garbage collector se sont définitivement imposées (sauf pour quelques applications très pointues), toute la partie passée à expliquer ces subtilité sur l'allocation dynamique ne sera-t-elle pas un peu ridicule ?
Franchement personnellement je préfererais passer deux fois plus de temps à être sûr que l'apprenant à *vraiment* compris les concept de développement par couches, de conception des interfaces de manière à réllement isoler les objets, de ne pas d'un seul coup exposer dans l'objet A un truc qui manifestement devrait être interne mais voilà en fait finalement l'objet B en a besoin et il ne voit pas comment faire autrement que de le rendre publique, le concept de comment rendre générique mais de ne pas de faire des couches de généricité pour le plaisir sans aucun intérêt, de comment on peut refactoriser un code quand on se rend compte qu'on s'était planté au départ, et de pourquoi définir dès le départ les fonctionnalités attendus et écrire les tests qui s'assurent qu'elles sont réalisées devient un énorme gain de productivité à la fin.
Tiens les deux entrées de blog suivant sur le dévelopement d'un outils python qui duplique le fonctionnement de gmake (et de presque l'intégralité des subtilités de gmake) est une bonne illustration des ces derniers principes (par exemple sur le fait que même les très, très bons hackers savent tôt ou tard ils trouveront une erreur de conception qui les obligera à refactoriser du code) : http://benjamin.smedbergs.us/blog/2009-02-23/sanity-and-testcases-for-pymake/
http://vocamus.net/dave/?p97
D'ailleurs on pourrait se demander si aujourd'hui le meilleur language à enseigner ne serait pas javascript, à condition de le faire proprement en partant du concept de programmation par prototype et des liens avec Self http://en.wikipedia.org//wiki/Self_(programming_language) et sur une plate-forme en JIT, qui fait concurrence à pas mal d'autres languages en rapidité d'exécution, ainsi qu'en utilisant les mécanismes avancés piqués à Python (générateurs, itérateurs, assignation déstructurante, expressions génératrices http://fr.wikipedia.org/wiki/JavaScript#Version_1.7 https://developer.mozilla.org/fr/Nouveautés_dans_JavaScript_1.7
Ce que tu dis pourrait ouvrir un nouveau fil et il me semble que tu n'as pas tout à fait tort, dans un premier temps. Il me semble cependant que, dans nombres de cas de la vie réelle, les développeurs vont devoir vivre encore longtemps avec la manipulation, certes délicate, de la mémoire et l'allocation dynamique explicite. Pour moi, ça fait partie de la "culture" du développeur, au moins encore aujourd'hui.
Wykaaa
Marc Espie a écrit :
In article , Fabien LE LEZ wrote:
On Sun, 08 Feb 2009 00:38:48 +0100, Wykaaa :
C'est bizarre si ce n'est pas abordé car c'est plein de pièges. personnellement, et je ne suis pas le seul, j'en déconseille l'emploi sauf dans des cas très particuliers.
Ce qui explique peut-être pourquoi ce n'est pas abordé...
Il faudrait au moins mentionner a quoi ca sert, et quand.
On ne peut effectivement pas éviter ce niveau de compréhension pour les futurs développeurs.
Mais bon, je suis encore un peu plus extreme: je suis pour passer beaucoup de temps sur l'encapsulation et l'abstraction, nettement moins de temps sur l'heritage (qui est deja assez dangereux), et apres expliquer les pattern utiles (l'inversion de dependances, et l'heritage implementation/interface, seul cas "raisonnable" d'heritage multiple).
Tout à fait d'accord que l'encapsulation et l'abstraction sont les concepts les plus fondamentaux d'un développement logiciel "propre". Cependant, il y a des cas autres que ceux que tu cites où l'héritage multiple peut être utile à condition qu'il reste très localisé. Ce qu'il faut faire bien comprendre aux débutants c'est qu'il ne faut pas baser la conception générale, quel que soit le logiciel, sur l'héritage multiple aux niveaux les plus hauts (les couches les plus externes).
Le chiendent des notions complexes, comme la surcharge ou l'heritage multiple, c'est qu'on ne voit jamais aucun soucis sur de petits projets. C'est seulement lorsqu'on a deja 500 lignes de code qu'on voit les soucis architecturaux qui, a terme, forcent a tout mettre a la poubelle et a recommencer a partir de rien...
Pour moi, un petit logiciel, c'est jusqu'à, environ, 10 kloc de code...
C'est bizarre de dire "C'est seulement lorsqu'on a deja 500 lignes de code qu'on voit les soucis architecturaux" car, quand on fait de l'architecture, on n'a pas encore codé et si l'on fait de l'architecture "proprement" (c'est-à-dire en respectant bien les principes d'abstraction et d'encapulation) on ne devrait pas rencontrer de gros soucis quel que soit le nombre de lignes de code final.
Marc Espie a écrit :
In article <ig7so4p2tg306mqak76hvj6kpr5f885ta5@4ax.com>,
Fabien LE LEZ <usenet17@x.edulang.com> wrote:
On Sun, 08 Feb 2009 00:38:48 +0100, Wykaaa <wykaaa@yahoo.fr>:
C'est bizarre si ce n'est pas abordé car c'est plein de pièges.
personnellement, et je ne suis pas le seul, j'en déconseille l'emploi
sauf dans des cas très particuliers.
Ce qui explique peut-être pourquoi ce n'est pas abordé...
Il faudrait au moins mentionner a quoi ca sert, et quand.
On ne peut effectivement pas éviter ce niveau de compréhension pour les
futurs développeurs.
Mais bon, je suis encore un peu plus extreme: je suis pour passer beaucoup
de temps sur l'encapsulation et l'abstraction, nettement moins de temps
sur l'heritage (qui est deja assez dangereux), et apres expliquer les pattern
utiles (l'inversion de dependances, et l'heritage implementation/interface,
seul cas "raisonnable" d'heritage multiple).
Tout à fait d'accord que l'encapsulation et l'abstraction sont les
concepts les plus fondamentaux d'un développement logiciel "propre".
Cependant, il y a des cas autres que ceux que tu cites où l'héritage
multiple peut être utile à condition qu'il reste très localisé. Ce qu'il
faut faire bien comprendre aux débutants c'est qu'il ne faut pas baser
la conception générale, quel que soit le logiciel, sur l'héritage
multiple aux niveaux les plus hauts (les couches les plus externes).
Le chiendent des notions complexes, comme la surcharge ou l'heritage
multiple, c'est qu'on ne voit jamais aucun soucis sur de petits projets.
C'est seulement lorsqu'on a deja 500 lignes de code qu'on voit les soucis
architecturaux qui, a terme, forcent a tout mettre a la poubelle et a
recommencer a partir de rien...
Pour moi, un petit logiciel, c'est jusqu'à, environ, 10 kloc de code...
C'est bizarre de dire "C'est seulement lorsqu'on a deja 500 lignes de
code qu'on voit les soucis architecturaux" car, quand on fait de
l'architecture, on n'a pas encore codé et si l'on fait de l'architecture
"proprement" (c'est-à-dire en respectant bien les principes
d'abstraction et d'encapulation) on ne devrait pas rencontrer de gros
soucis quel que soit le nombre de lignes de code final.
C'est bizarre si ce n'est pas abordé car c'est plein de pièges. personnellement, et je ne suis pas le seul, j'en déconseille l'emploi sauf dans des cas très particuliers.
Ce qui explique peut-être pourquoi ce n'est pas abordé...
Il faudrait au moins mentionner a quoi ca sert, et quand.
On ne peut effectivement pas éviter ce niveau de compréhension pour les futurs développeurs.
Mais bon, je suis encore un peu plus extreme: je suis pour passer beaucoup de temps sur l'encapsulation et l'abstraction, nettement moins de temps sur l'heritage (qui est deja assez dangereux), et apres expliquer les pattern utiles (l'inversion de dependances, et l'heritage implementation/interface, seul cas "raisonnable" d'heritage multiple).
Tout à fait d'accord que l'encapsulation et l'abstraction sont les concepts les plus fondamentaux d'un développement logiciel "propre". Cependant, il y a des cas autres que ceux que tu cites où l'héritage multiple peut être utile à condition qu'il reste très localisé. Ce qu'il faut faire bien comprendre aux débutants c'est qu'il ne faut pas baser la conception générale, quel que soit le logiciel, sur l'héritage multiple aux niveaux les plus hauts (les couches les plus externes).
Le chiendent des notions complexes, comme la surcharge ou l'heritage multiple, c'est qu'on ne voit jamais aucun soucis sur de petits projets. C'est seulement lorsqu'on a deja 500 lignes de code qu'on voit les soucis architecturaux qui, a terme, forcent a tout mettre a la poubelle et a recommencer a partir de rien...
Pour moi, un petit logiciel, c'est jusqu'à, environ, 10 kloc de code...
C'est bizarre de dire "C'est seulement lorsqu'on a deja 500 lignes de code qu'on voit les soucis architecturaux" car, quand on fait de l'architecture, on n'a pas encore codé et si l'on fait de l'architecture "proprement" (c'est-à-dire en respectant bien les principes d'abstraction et d'encapulation) on ne devrait pas rencontrer de gros soucis quel que soit le nombre de lignes de code final.
pjb
Wykaaa writes:
Marc Espie a écrit :
Le chiendent des notions complexes, comme la surcharge ou l'heritage multiple, c'est qu'on ne voit jamais aucun soucis sur de petits projets. C'est seulement lorsqu'on a deja 500 lignes de code qu'on voit les soucis architecturaux qui, a terme, forcent a tout mettre a la poubelle et a recommencer a partir de rien...
Pour moi, un petit logiciel, c'est jusqu'à, environ, 10 kloc de code...
C'est bizarre de dire "C'est seulement lorsqu'on a deja 500 lignes de code qu'on voit les soucis architecturaux" car, quand on fait de l'architecture, on n'a pas encore codé et si l'on fait de l'architecture "proprement" (c'est-à-dire en respectant bien les principes d'abstraction et d'encapulation) on ne devrait pas rencontrer de gros soucis quel que soit le nombre de lignes de code final.
Quand on a 500 LOC on peut tout réécrire dans l'après midi.
Quand on a 500 kLOC, on ne peut pas. C'est là que les problème prennent toute leur dimention.
Ceci dit, on peut faire comprendre le problème sur un programme de 500 lignes: il suffit de faire évoler les spécifications.
Donc, pour rejoindre le sujet, on pourrait proposer un schéma de travaux pratiques sur quatre semaines.
1e semaine: énoncé du problème, vous avez une semaine pour implémenter. 2e semaine: c'est bien, mais le client veut changer telle et telle choses. 3e semaine: ah, il avait oublié de dire qu'il veut aussi telle et telle fonctions. 3e semaine et trois jours: et aussi, ceci ne va pas, il veut en fait autre chose. 4e semaine: alors, où il est le programme? le client attend! Ah, au fait, il faut aussi bien sur que le programme fasse ceci et celà.
Après deux ou trois "refactorisation", ils devraient comprendre, même sur seulement 500 lignes et trois ou quatre classes...
-- __Pascal Bourguignon__
Wykaaa <wykaaa@yahoo.fr> writes:
Marc Espie a écrit :
Le chiendent des notions complexes, comme la surcharge ou l'heritage
multiple, c'est qu'on ne voit jamais aucun soucis sur de petits projets.
C'est seulement lorsqu'on a deja 500 lignes de code qu'on voit les soucis
architecturaux qui, a terme, forcent a tout mettre a la poubelle et
a recommencer a partir de rien...
Pour moi, un petit logiciel, c'est jusqu'à, environ, 10 kloc de code...
C'est bizarre de dire "C'est seulement lorsqu'on a deja 500 lignes de
code qu'on voit les soucis architecturaux" car, quand on fait de
l'architecture, on n'a pas encore codé et si l'on fait de
l'architecture "proprement" (c'est-à-dire en respectant bien les
principes d'abstraction et d'encapulation) on ne devrait pas
rencontrer de gros soucis quel que soit le nombre de lignes de code
final.
Quand on a 500 LOC on peut tout réécrire dans l'après midi.
Quand on a 500 kLOC, on ne peut pas. C'est là que les problème
prennent toute leur dimention.
Ceci dit, on peut faire comprendre le problème sur un programme de 500
lignes: il suffit de faire évoler les spécifications.
Donc, pour rejoindre le sujet, on pourrait proposer un schéma de
travaux pratiques sur quatre semaines.
1e semaine: énoncé du problème, vous avez une semaine pour implémenter.
2e semaine: c'est bien, mais le client veut changer telle et telle choses.
3e semaine: ah, il avait oublié de dire qu'il veut aussi telle et telle fonctions.
3e semaine et trois jours: et aussi, ceci ne va pas, il veut en fait autre chose.
4e semaine: alors, où il est le programme? le client attend! Ah, au
fait, il faut aussi bien sur que le programme fasse ceci et celà.
Après deux ou trois "refactorisation", ils devraient comprendre, même
sur seulement 500 lignes et trois ou quatre classes...
Le chiendent des notions complexes, comme la surcharge ou l'heritage multiple, c'est qu'on ne voit jamais aucun soucis sur de petits projets. C'est seulement lorsqu'on a deja 500 lignes de code qu'on voit les soucis architecturaux qui, a terme, forcent a tout mettre a la poubelle et a recommencer a partir de rien...
Pour moi, un petit logiciel, c'est jusqu'à, environ, 10 kloc de code...
C'est bizarre de dire "C'est seulement lorsqu'on a deja 500 lignes de code qu'on voit les soucis architecturaux" car, quand on fait de l'architecture, on n'a pas encore codé et si l'on fait de l'architecture "proprement" (c'est-à-dire en respectant bien les principes d'abstraction et d'encapulation) on ne devrait pas rencontrer de gros soucis quel que soit le nombre de lignes de code final.
Quand on a 500 LOC on peut tout réécrire dans l'après midi.
Quand on a 500 kLOC, on ne peut pas. C'est là que les problème prennent toute leur dimention.
Ceci dit, on peut faire comprendre le problème sur un programme de 500 lignes: il suffit de faire évoler les spécifications.
Donc, pour rejoindre le sujet, on pourrait proposer un schéma de travaux pratiques sur quatre semaines.
1e semaine: énoncé du problème, vous avez une semaine pour implémenter. 2e semaine: c'est bien, mais le client veut changer telle et telle choses. 3e semaine: ah, il avait oublié de dire qu'il veut aussi telle et telle fonctions. 3e semaine et trois jours: et aussi, ceci ne va pas, il veut en fait autre chose. 4e semaine: alors, où il est le programme? le client attend! Ah, au fait, il faut aussi bien sur que le programme fasse ceci et celà.
Après deux ou trois "refactorisation", ils devraient comprendre, même sur seulement 500 lignes et trois ou quatre classes...
-- __Pascal Bourguignon__
Fabien LE LEZ
On Fri, 27 Feb 2009 14:42:25 +0100, Wykaaa :
Il me semble cependant que, dans nombres de cas de la vie réelle, les développeurs vont devoir vivre encore longtemps avec la manipulation, certes délicate, de la mémoire et l'allocation dynamique explicite.
Un certain nombre de programmeurs va continuer à s'en occuper. Mais même aujourd'hui, pour la majorité des programmeurs, ça ne sert pas.
On Fri, 27 Feb 2009 14:42:25 +0100, Wykaaa <wykaaa@yahoo.fr>:
Il me semble cependant que,
dans nombres de cas de la vie réelle, les développeurs vont devoir vivre
encore longtemps avec la manipulation, certes délicate, de la mémoire et
l'allocation dynamique explicite.
Un certain nombre de programmeurs va continuer à s'en occuper. Mais
même aujourd'hui, pour la majorité des programmeurs, ça ne sert pas.
Il me semble cependant que, dans nombres de cas de la vie réelle, les développeurs vont devoir vivre encore longtemps avec la manipulation, certes délicate, de la mémoire et l'allocation dynamique explicite.
Un certain nombre de programmeurs va continuer à s'en occuper. Mais même aujourd'hui, pour la majorité des programmeurs, ça ne sert pas.
Jaco
On 6 fév, 11:48, Wykaaa wrote:
Je ne suis pas d'accord sur "plus C# que Java" car Java est maintenant presque dans le domaine du libre alors que C# est propriétaire et que son langage intermédiaire (MSIL, l'équivalent du bytecode) n'est pas très "inter-langages" (.NET supporte d'autres langages mais pas l'ensemble de leurs bibliothèques, ce qui est très piégeant).
Ce n'est pas tout à fait vrai non plus... Mono est libre (Ce n'est pas encore le cas de Java, loin s'en faut, à moins de n'utiliser que certaines plate-formes). D'ailleurs, je m'en sers pour remplacer Java dans mon cours de cette année car, personnellement, je trouve le langage "mieux foutu" que Java (peut-être aussi parce que ça me gave de voir du Java partout et à toutes les sauces).
On 6 fév, 11:48, Wykaaa <wyk...@yahoo.fr> wrote:
Je ne suis pas d'accord sur "plus C# que Java" car Java est maintenant
presque dans le domaine du libre alors que C# est propriétaire et que
son langage intermédiaire (MSIL, l'équivalent du bytecode) n'est pas
très "inter-langages" (.NET supporte d'autres langages mais pas
l'ensemble de leurs bibliothèques, ce qui est très piégeant).
Ce n'est pas tout à fait vrai non plus... Mono est libre (Ce n'est pas
encore le cas de Java, loin s'en faut, à moins de n'utiliser que
certaines plate-formes).
D'ailleurs, je m'en sers pour remplacer Java dans mon cours de cette
année car, personnellement, je trouve le langage "mieux foutu" que
Java (peut-être aussi parce que ça me gave de voir du Java partout et
à toutes les sauces).
Je ne suis pas d'accord sur "plus C# que Java" car Java est maintenant presque dans le domaine du libre alors que C# est propriétaire et que son langage intermédiaire (MSIL, l'équivalent du bytecode) n'est pas très "inter-langages" (.NET supporte d'autres langages mais pas l'ensemble de leurs bibliothèques, ce qui est très piégeant).
Ce n'est pas tout à fait vrai non plus... Mono est libre (Ce n'est pas encore le cas de Java, loin s'en faut, à moins de n'utiliser que certaines plate-formes). D'ailleurs, je m'en sers pour remplacer Java dans mon cours de cette année car, personnellement, je trouve le langage "mieux foutu" que Java (peut-être aussi parce que ça me gave de voir du Java partout et à toutes les sauces).