# [OFF] Je cherche un livre qui s'agit de la programmation.

## homeobocks

S'il vous plait, excusez mon mauvais francais; je suis anglophone. Un jeune ami a moi Quebecois veut apprendre la programmation. Pourriez-vous recommander de bon livres ou sites web en francais qui peuvent aider mon ami a commencer a apprendre la programmation? Merci bien.

----------

## kangal

Quel langage veut-il apprendre?? :Cool: 

----------

## homeobocks

Je pense qu'il veut un introduction generale aux sciences informatique. J'aime beaucoup le livre anglais "An Invitation to Computer Science" par G. Michael Schneider et Judith L. Gersting. Il (le livre) enseigne un peut de C, de C++, de Perl, d'HTML, ... Peut-etre un livre qui enseigne avec Python serait bon, mais je pense qu'il vaut mieux avoir un livre de C ou des langages varie.

Y a-t-il un tranduction francais de "An Invitation to Computer Science"? Peut-etre il s'appelerait "Un invitation aux sciences informatique".

Mon ami aurait le cul borde de nouilles s'il y avait un tranduction francais de "An Invitation to Computer Science". Je viens d'apprendre cet idiotisme. :Wink: 

----------

## expl0rer

Bonjour,

Une référence :  La programmation système en C de Christian Blaess ( il a son nom en bas de certaines man-pages en francais ) par contre c'est déjà un bon niveau.

----------

## kwenspc

oui le bouquin de Christian Blaess est très bien mais je doute que ça réponde à sa recherche.

c'est trop ciblé.

perso j'ai commencé avec "Practical C Programming" aux édition O'Reilly. Mais je ne sais pas si il a été traduit en français.

Et là encore c'est peu être trop ciblé. (quoique l'auteur aborde le sujet vraiment à la base de la base)

Je pense que pour débuter la programmation rien ne vaut le C. Après les autres langages parraissent familiers. 

le truc ensuite c'est de bien maitriser la programmation procédural et objet qui sont toutes deux très différentes.

(là c'est plus des notions d'algorithmique qu'il faut que des notions relatives à un language spécifique)

----------

## fafounet

Le livre de Christophe Blaess n'est pas du tout pour les débutants en programmation et n'a pas pour vocation d'apprendre le C.

Pour le C il existe le bouquin de Kernighan et Richtiche "Le c norme ansi". Il est trouvable d'occasion un peu partout (on peut aussi acheter le bouquin de solutions des exercices). 

Pour Python il existe plusieurs ouvrages que je ne connais pas trop. Celui ci http://www.oreilly.fr/catalogue/2841772993.html est bien et est dispoible gratuitement sur le net (faut chercher au moins deux secondes )

Ayant commencé par Python, je ne saurais que conseiller un bouquin sur Python  :Very Happy: 

----------

## kwenspc

je sais pas si commencer avec un language de haut niveau est une bonne idée.

je connais pas mal de personnes qui me disaient savoir programmer, qu'elles faisaient du VB (sic!)...mais dès qui leur a fallu apprendre un nouveau language : larguées!

et python est un language de haut niveau. (en plus c'est un langage objet...pour commencer c'est pas la joie)

"Le C norme ANSI" reste un bouquin très académique. Pour un débutant ça peut rebuter. (comme le très bon "Le Langage C" de Delanoy mais qui n'est pas non plus fait pour les débutants)

Ce qui serait vraiment bien je pense c'est un bouquin qui lit "pseudo-langage" pour l'algorithmie et vrai langage (comme le C) pour mettre en pratique.

mais faut trouver...   :Confused: 

----------

## TGL

Perso, un bouquin d'introduction à la programmation que j'aime bien, c'est le "Apprendre à programmez avec Python" de Gérard Swinnen. Il a une approche très pédagogique, inspirée du fameux "How to think as a computer scientist". Il est disponible en vrai papier chez O'Reilly, et en téléchargement libre ici :

http://www.ulg.ac.be/cifen/inforef/swi/python.htm

J'aime bien Python comme langage d'apprentissage parcequ'il est simple et très lisible, et ça permet vraiment de se concentrer sur des principes généraux (algorithmique, structure des données, etc.) sans galérer sur des points de détails. J'aime bien aussi qu'on puisse commencer avec de simples évaluations d'expressions et blocs de code dans l'interpréteur, pour évoluer progressivement jusqu'à la POO, en étant passé d'abord par l'apprentissage de la notion de fonction, puis par un première approche de la modularité non-objet.

Je conseillerais volontier Ruby aussi un peu pour les même raisons, mais il n'y a pas encore à ma connaissance autant de bonnes ressources pédagogiques qui l'utilise, et surtout pas en français.

À mon avis, il est toujours temps de passer à des langages plus laborieux comme le C ou C++ dans un deuxième temps, quand on commence à déjà avoir des idées claires sur la programmation. Mais bon, je sais que le choix d'un premier langage est un sujet très chaud et que de nombreuses opinions divergent inexorablement. Voir par exemple :

http://linuxfr.org/~equi/18770.html

Oh, et puis dans le genre super bouquin d'introduction (mais en anglais seulement malheureusement), il y a le "How to design programs", qui lui aussi s'achète en papier (MIT Press), ou se lit en ligne là :

http://www.htdp.org/2003-09-26/Book/

Je laisse aux curieux la surprise quant au langage utilisé, en leur suggèrant de mettre au placard leur éventuels a priori à son encontre, le temps d'une bonne lecture...

EDIT : grillé pour le python... arf, j'suis trop bavard...

----------

## aLexTaze

http://www.eyrolles.com/Accueil/Livre/9782212110524/livre-le-livre-du-c-premier-langage.php

Je doute qu'on puisse faire plus clair, plus simple pour un débutant  :Smile: Last edited by aLexTaze on Tue Jul 26, 2005 12:47 pm; edited 1 time in total

----------

## TGL

 *kwenspc wrote:*   

> je sais pas si commencer avec un language de haut niveau est une bonne idée.

 

Je pense que si, ça évite de tout avoir à apprendre à la fois, grands principes et détails techniques confondus. Quelqu'un qui passe de Python à C++, il n'a qu'à apprendre une nouvelle syntaxe et quelques notions techniques comme la gestion mémoire, ça reste moins rebutant que de tout faire d'un coup. Bon, après, le risque (mais est-ce vraiment grave ?) c'est qu'il se dise «Pourquoi je me ferais chier à apprendre un langage bas niveau alors que je fais déjà ce que je veux avec un langage haut-niveau ?»...

 *Quote:*   

> (en plus c'est un langage objet...pour commencer c'est pas la joie)

 

Un débutant qui ne connais pas l'objet, ça ne lui pose pas de question existentielle. Faire "machin.truc()", ça n'est pas moins naturel pour lui que de faire "truc(machin)". De ma petite expérience de l'enseignement, je retire que l'utilisation d'objets est une notion parfaitement anodine. Après, la conception objet, c'est une autre affaire, mais ça rien n'oblige à en faire dès le début.

----------

## TGL

 *aLexTaze wrote:*   

> http://www.eyrolles.com/Accueil/Livre/9782212110524/livre-le-livre-du-c-premier-langage.php
> 
> Je doute qu'on peut faire plus clair, plus simple pour un débutant 

 

Si on tient à commencer par le C, alors oui, je le conseille aussi chaudement.

----------

## anigel

Quitte à travailler sur un langage "non-propre" (autrement dit : n'importe quoi sauf du C), autant travailler sur JAVA non ?

Enfin je dis ça, mais j'avoue que je trouve ce langage insupportable. En fait, tout langage dans lequel on n'a pas besoin de se préoccuper de la mémoire me parait un non-sens, pour les besoins pédagogiques. Le risque est trop grand de se retrouver avec des populations ne comprenant pas grand-chose au fonctionnement même de leurs développements (c'est ce que j'appele l'automagically working software : le "développeur" sait que ça marche, mais est bien incapable de savoir par quel miracle !).

Pour commencer, l'assembleur me paraît donc tout indiqué...

Comment ça, j'exagère ?  :Laughing: 

----------

## kwenspc

ben le C puis l'assembleur dans ce cas là. 

sinon commencer par l'asm c'est parfois décourageant. Mais une fois qu'on comprend l'asm c'est jouissf!   :Razz: 

----------

## TGL

 *anigel wrote:*   

> Quitte à travailler sur un langage "non-propre" (autrement dit : n'importe quoi sauf du C), autant travailler sur JAVA non ?

 

Le "HelloWorld" de Python, c'est 

```
print "Hello World!"
```

 alors que celui de Java c'est 

```
public class HelloWorld {

  public static void main(String[] args) {

    System.out.println("Hello World!");

  }

}
```

 C'est tout con, mais c'est un sacrée différence : le premier est compréhensible sans autre forme d'explication (sinon que c'est une première occasion de faire la distinction entre instructions du langage et données), alors que pour expliquer le deuxième à un débutant, tu dois soit lui faire une introduction à l'objet et au typage, soit lui dire que «Bon y'a plein de trucs magiques là dedans que tu peux pas comprendre et c'est normal.» Bref, pas moyen de faire faire du Java à un débutant sinon en lui donnant de mystérieux programmes à trou, pas terrible niveau pédagogique je trouve.

À la limite, la seule bonne façon que je vois de vraiment commencer avec un syntaxe Java, c'est d'utiliser BeanShell, qui offre un interpréteur et la possibilité de faire du code non-objet.

Quant à ton "non-propre", franchement, c'est du troll. Le garbage-collecting et autres mécanismes de gestion automatique de la mémoire, c'est une fonctionnalité appréciable de certains langages et qui n'est pas plus sale qu'une autre. C'est non-trivial de comprendre comment ça marche, ok, mais c'est très simple de comprendre comment l'utiliser. Et le programmeur c'est ça qu'il fait, il n'est que l'utilisateur d'un langage.  Ou bien est-ce qu'il faudrait n'utiliser que les fonctionnalités dont on connait en détail le fonctionnement ? On n'aurait le droit de passer au C seulement le jour où l'on a pu écrire son propre compilo en assembleur, et n'utiliser la glibc que lorsqu'on a fini d'en lire les sources ? Évidemment que si tu demande à un programmeur Java de faire du C sans apprendre, il va +/- finir par s'en tirer mais va faire des fuites de partout... Mais le problème n'est pas qu'il sera passé par la case "apprentissage de Java", seulement qu'il aura sauté celle "apprentissage du C". C'est pas Java qui l'handicape, c'est juste son empressement. Fais faire du C++ à un mec qui n'as réellement appris que le C, et tu vas voir bien des horreurs aussi, vraiment. 

Bon enfin bref... Sinon pour en revenir à la relation C/assembleur, petit retour par des étudiants que j'avais cette année : en gros, on leur a fait des cours de C et structures de données (listes, arbres, tout ça) d'un côté, et des cours de "schéma de compilation" (de l'assembleur x86, mais avec une approche systématique du style "une boucle for ça se traduit comme ça", presque naïve, plutôt que bidouille aléatoire et autres optimisations douteuses) de l'autre. Y'en a pas mal qui nous ont dit qu'ils auraient voulu voir fusionner tout ça ensemble, pour apprendre en parallèle le C et la façon dont il est compilable. Apparement certains n'ont eu l'étincelle sur l'utilisation des pointeurs que le jours où ils ont commencé à jouer avec les modes d'adressages indirects en assembleur par exemple, etc. Je ne connais pas de bouquin qui aurait cette approche, mais ça pourrait être un truc intérressant effectivement.

----------

## anigel

Je passe sur les arguments pédagogiques, que je respecte totalement. Effectivement, dans le cadre de l'apprentissage "de base", python convient tout à fait. Je n'ai pas explicité ma pensée, mea culpa. Le principal avantage à démarrer sur du java, c'est l'immense quantités de petits tutos disponibles sur le net. Pas forcément du java académique, juste du JAVA "qui marche", sans se soucier de rien. Ca me semblait sympa pour quelqu'un qui va apprendre à partir d'un bouquin. Il ne s'agissait pas de troller là-dessus.

 *TGL wrote:*   

> Quant à ton "non-propre", franchement, c'est du troll.

 

Là non plus, je ne trollais pas ! Et là par contre, j'ai de solides arguments ! Ne pas apprendre à gérer la mémoire, c'est aussi ne pas comprendre les effets de bord des surcharges que peuvent induire certains structures informatiques. Genre des boucles qui allouent un bloc à chaque tour, avec des conditions d'arrêt plus ou moins douteuses. J'ai vu cette année un bel exemple, sur du code threadé qui plus est (non content de programmer comme un cochon, il le faisait en multithread le bougre !). Et ben merci le debuggage ! On s'y est mis à 3, et on y a passé 2H !

Et c'est là que l'étudiant nous a sorti qu'il ne voyait pas où était le problème... Effectivement, sans aucune notion d'allocation mémoire, c'est très très difficile de lui inculquer une programmation "précise". Or, c'est une condition sine qua non pour produire du code propre, que de parfaitement maitriser le comportement de son code, non ?

Je veux dire par là, que la compréhension acquise du fonctionnement interne des allocations / libérations de mémoire, ne peut qu'aider ensuite pour l'apprentissage de langage disposant d'un garbage collector (c'est un "plus" !). L'inverse est beaucoup beaucoup plus dur, je trouve. Non ?

Sans aller jusqu'à l'extrémité que tu décris, et qui ne correspond pas à ma pensée (connaitre l'asm et la glibc pour avoir le droit de programmer en C), je pense que commencer avec une méthode "précise et autoritaire" pour aller vers un langage plus libéral comporte plus d'avantages que l'inverse. C'est juste mon point de vue, en fonction des étudiants que j'ai vu passer. Et le retour de tes étudiants me laisse à penser que cette "austérité" ne leur déplairait pas forcément ?

 *Anigel wrote:*   

> Pour commencer, l'assembleur me paraît donc tout indiqué... 

 

Là en revanche, c'était de la provoc gratuite. Mais je l'ai indiqué : j'exagérais.

Amicalement,

----------

## Trevoke

anigel, on m'a appris a programmer sur du C++, langage qui s'ocupe assez bien du nettoyage automatique tant qu'on ne fait pas de choses trop curieuses (et puis bon, malloc etc etc ca existe et c'est pas trop dur de s'en servir) et il a suffit de m'expliquer une fois qu'il fallait gaffe a ou tu mettais tes variables pour que je comprenne le reste..

Enfin, le principe, c'est d'economiser de la memoire. Fais-les travailler sur un vieux 186 lol  :Smile: 

----------

## TGL

 *anigel wrote:*   

> Le principal avantage à démarrer sur du java, c'est l'immense quantités de petits tutos disponibles sur le net. Pas forcément du java académique, juste du JAVA "qui marche", sans se soucier de rien. Ca me semblait sympa pour quelqu'un qui va apprendre à partir d'un bouquin. Il ne s'agissait pas de troller là-dessus. 

 

Ouais, mais bon, t'as à peu près autant de ressources pour Python, et plein de code libre à te mettre sous la dent, etc. À ce niveau là, je trouve que ça se vaut.

 *anigel wrote:*   

> Effectivement, sans aucune notion d'allocation mémoire, c'est très très difficile de lui inculquer une programmation "précise". Or, c'est une condition sine qua non pour produire du code propre, que de parfaitement maitriser le comportement de son code, non ?

 

Bah nan, enfin j'irais pas jusqu'à dire qu'il faut se préocuper de l'allocation mémoire. Dans un langage garbage-collecté, il suffit pour être précis dans son code de l'être sur les notions d'instance des objets ou structures que tu manipules. En Python, faut avoir compris que "listeB=listeA" c'est pas pareil que "listeB=listeA[:]", ça ok. Mais c'est un point de vue qui est plus haut-niveau que celui de l'allocation/désallocation de la mémoire, et qui est pourtant suffisant pour comprendre parfaitement le fonctionnement du code que l'on écrit. Même si on ne comprend pas le fonctionnement de l'interpréteur, on peut prévoir son comportement et c'est ce qui importe.

 *anigel wrote:*   

> Je veux dire par là, que la compréhension acquise du fonctionnement interne des allocations / libérations de mémoire, ne peut qu'aider ensuite pour l'apprentissage de langage disposant d'un garbage collector (c'est un "plus" !). L'inverse est beaucoup beaucoup plus dur, je trouve. Non ?

 

Bah nan, j'suis pas vraiment d'accord. À mon avis, la gestion explicite de la mémoire c'est vraiment un aspect supplémentaire de la programmation, propre à certains langages, mais je vois pas trop où ça aiderait pour comprendre la programmation à gestion automatique (à part dans pour certains types de programmes calculatoires très gourmands en mémoires et où justement tu peux avoir à penser ton code en fonction du comportement du garbage collector, pour conserver des perfs raisonnables). En général, t'as juste à savoir que les objets/structures conservés en mémoire c'est ceux auquels tu as accès (t'as conservé des références, etc.) et que les autres bah tu t'en fous, ils vont disparaitre et c'est plus ton problème. Ça me semble assez naturel en soit comme fonctionnement, sans avoir à l'expliciter ça en termes d'allocation/désallocation. La gestion explicite, tu peux l'ajouter dans un deuxième temps, dire que pour certains langages ils faut faire un vrai ménage soit même plutôt que de se contenter de détourner le regard des ordures. La difficulté n'est alors pas vraiment cette notion supplémentaire en soit, mais plus le peu d'intérêt qu'elle suscite a priori (le "pourquoi se faire chier si y'a des langages qui s'en passent"). 

 *Quote:*   

> je pense que commencer avec une méthode "précise et autoritaire" pour aller vers un langage plus libéral comporte plus d'avantages que l'inverse. C'est juste mon point de vue, en fonction des étudiants que j'ai vu passer.

 

Je suis tout à fait pour le "précis et autoritaire" (non, j'ai jamais fouetté personne ;p), mais pas pour autant pour le "tout à la fois". J'aime bien pouvoir faire explorer aux étudiants une seule notion à la fois. La programmation à de multiple facettes souvent dissociables, et on a la chance d'avoir des langages variés qui en font briller certaines et en dissimulent d'autres. Je trouve Scheme très agréable pour s'initier à l'algorithmique fonctionnelle et Python pour celle impérative, OCaml formidable pour bien comprendre le typage, Ruby sur l'ongle pour apprendre l'objet, Eiffel au poil pour se pencher sérieusement sur la robustesse du code, etc. Le C là dedans, bah... très bien pour étudier dans le détail les structures de données (mais si ça ne tenait qu'à moi, ça serait après les avoir vues d'un plus haut niveau en OCaml), et de manière générale le fonctionnement interne des autres langages, mais je commencerais vraiment pas par ça. 

 *Quote:*   

> Et le retour de tes étudiants me laisse à penser que cette "austérité" ne leur déplairait pas forcément ?

 

Mouaif, enfin c'est pas non plus leur premier contact avec la programmation dont je parlais là. Ils ont derrière eux au moins de la programmation fonctionnelle (Scheme) et de la programmation impérative (l'infâme Java à trous que je verrais volontier remplacé par du Python ou au moins du BeanShell), et en même temps d'autres langages.

 *Anigel wrote:*   

> Amicalement,

 

Idem, comme toujours  :Wink: 

----------

## zdra

TGL > t'as un refroidisseur sur ton clavier aussi ? il me semble qu'il doit fort chauffer avec tout ça  :Very Happy:  lol

----------

## mrduchnok

pour apprendre la programmation et avoir un aperçu de ce que s'est, il faut déjà commencé par l'algorithme je pense

comme ça on reste indépendant de chaque langage, et on apprend ce qu'es réellement programmer

un bon site de référence en la matière est www.developpez.com

nombreux tutoriaux tous niveaux, tous langages, tous aspects informatiques y sont traités

bon courage

----------

## Pixys

A la fac (à Bordeaux I) on apprend le Python comme premier langage, c'est sympa, pas trop compliqué et (c'est un avis personnel) ça ressemble un peu au langage des calculatrices programmables

Il parait qu'on peut apprendre ce langage en 1 week-end notamment grâce au livre de Gérard Swinnen: Apprendre à programmer avec Python

----------

## ghoti

 *TGL wrote:*   

> Je conseillerais volontier Ruby aussi un peu pour les même raisons, mais il n'y a pas encore à ma connaissance autant de bonnes ressources pédagogiques qui l'utilise, et surtout pas en français.

 

Ruby est plus jeune et souffre sûrement de sa nationalité japonaise. Il paraît pourtant que là-bas, Ruby a purement et simplement détrôné Python ! 

En français, il y a tout de même 2 ou 3 choses sympas, par exemple :

- Apprenez Ruby

- différents tutoriels

- Guide utilisateur du langage ruby en VF

 *TGL wrote:*   

> Le "HelloWorld" de Python, c'est 
> 
> ```
> print "Hello World!"
> ```
> ...

 

Et le "HelloWorld" de Ruby, c'est... "Hello World!". Plus simple, c'est difficile !  :Laughing: 

Tiens, une réflexion que j'avais trouvée je ne sais plus où et qui tentait de comparer Python et Ruby : Python utilise du procédural pour simuler l'"orienté objet" tandis que Ruby utilise l'"orienté objet" pour simuler du procédural ...

Mais là, on s'éloigne !

----------

## Sleeper

 *TGL wrote:*   

> 
> 
> Je laisse aux curieux la surprise quant au langage utilisé, en leur suggèrant de mettre au placard leur éventuels a priori à son encontre, le temps d'une bonne lecture...

 

Ben quoi .. c'est bien le Scheme !

----------

## Sleeper

 *ghoti wrote:*   

> 
> 
> Ruby est plus jeune et souffre sûrement de sa nationalité japonaise. Il paraît pourtant que là-bas, Ruby a purement et simplement détrôné Python ! 
> 
> 

 

Les editeurs francais sont aussi un peu frileux ... On en a contacte certains avec Dave Thomas, en envisageant la traduction en francais de Programming Ruby (2nd ed), mais on n'a meme pas recu une reponse (ne serait-ce que pour dire: ca ne nous interesse pas ..)

 *Quote:*   

> 
> 
> En français, il y a tout de même 2 ou 3 choses sympas, par exemple :
> 
> - Apprenez Ruby
> ...

 

Il y a aussi RubyFr, et puis ce blog

 *Quote:*   

> 
> 
>  *TGL wrote:*   Le "HelloWorld" de Python, c'est 
> 
> ```
> ...

 

Sauf que dans le cas que tu donnes, "Hello World" ne sortira pas sur la sortie standard .... 

```
puts "Hello World!"
```

 serait plutot l'equivalent ..

----------

## fafounet

J'ai commencé par Python et je n'ai pas eu de mal à comprendres les enjeux de la bonne gestion de la mémoire dans les programmes. Python présente aussi un coté attrayant par son code élégant et simpliste et aussi par la multitude de chose que l'on peut faire rapidement pour un débutant (histoire de pas être dégouté de la programmation)

----------

## [vector]

J'ai commencé par du Pascal, et l'interet est qu'on peut commencer par se familiariser au non-objet, apprendre les concepts de base, pour passer ensuite  la POO. Et surtout, le compilo du Pascal étant assez strict, il donne de bonnes habitudes en entrainant à écrire un programme clair. Les compilos du C étant généralement plus "gentil", ça peut parfois donner des programmes illisibles, car bourrés de raccourcis de syntaxe et autres magouilles.

----------

