Se connecter
Se connecter

ou
Créer un compte

ou
Agrandir
Les Mains dans le Cambouis
Bidouille & Développement Informatique

Le pub des programmeurs

  • 1 927 réponses
  • 117 participants
  • 123 789 vues
  • 130 followers
Sujet de la discussion Le pub des programmeurs
Salut :coucou: y a des programeurs sur AF si oui vous bossez sous quoi ?
Afficher le sujet de la discussion
531

Citation : Mais je suis vraiment curieux, parce qu'une grosse partie de ton argumentaire, a toi et pouet, est base sur ces fameux gros projets maintenus sur 10 ans, et que je vois toujours pas ce qu'ils ont de si particulier.


Citation : Y a quand meme un truc que je comprends pas. Ca veut dire quoi gros projet pour vous ? Parce que bon, les gros projets en libre, par exemple, c'est pas ca qui manque, et y en a pas beaucoup en C++ quand meme.


Dans les projets du libre, comme la plupart du temps c'est bénévole, si le projet est gros et compliqué tu n'auras (quasiment) que des développeurs compétents, voire très ou extrêmement compétent. Dans l'industrie, pour une bonne partie, c'est un gagne-pain, voire le seul boulot que tu as trouvé (je connais des docteurs en électro-magnétisme, un agrégé de poissons exotiques... qui pissent du code sur des applis de "gestion" ). Donc dans une équipe de 10 personnes, tu as au moins un maillon faible ( :mrg: ), voire plusieurs.

Je connais des sources d'une appli de supervision avec des fonctions de 3.000 lignes, truffé de
char*c=malloc(sizeo(char*))
, des applis multi-processus, chacun multi-threadé mélangeant Ada et C+Motif, conçu par une équipe qui découvrait la programmation multi-tâche... Une autre appli avec des gars "compétents" qui se sont fait plaisirs, résultat de l'héritage en C++ sur 7 niveaux en hauteur, 5 en largeur, et bien sûr, en bas, du multi-héritage. Les mêmes se sont faits des functors de folie avec des template de template. Imagine quand le gars du malloc va maintenir ça...

Dans ces cas-là, il faut faire simple et clair, et éviter comme la mort le "balaize", "l'acrobatique", "l'astucieux"... D'ailleurs même quand c'est du code que tu as écrit toi-même, si tu dois le retoucher après l'avoir laissé 2 ans, tu as du mal à t'y retrouver si ce n'est pas "simple voire stupide".

D'où mon "heureux homme" un peu plus haut... :bravo:
532

Citation : Le fait que le C soit pas beaucoup utilise en libre, c'est parce que le libre s'est developpe sur unix, et que le C++ est a l'antithese de la philosophie unix, je pense. Contrairement a toi, je pense que c'est fondamentalement un probleme esthetique/ideologique, plus que pratique. Je pense que l'association windows/c++ est assez pertinente, modestie mise a part: c'est vraiment la meme philosophie.


Je n'ai jamais réellement développé sous Windows, et l'essentiel du C++ que j'ai vu (et voit dans de très gros projets qui démarrent) c'est sous Unix (Linux désormais). Mais c'est dans un contexte industriel, et pas logiciel libre. Je pense que la frontière est plutôt là (une fois que tu es parti sur un choix, tu t'y tiens un moment). D'ailleurs j'ai fait partie de ceux qui ont essayé de faire découvrir le libre (à commencer par Linux), et au début les réticences étaient assez surréalistes... comme l'a été ensuite l'adoption quasi du jour au lendemain...

Citation : Un callback, c'est une fonction, sans attributs. Un objet possède à la fois des attributs et des fonctions qui modifient les attributs. Et bien tu fais une classe de base, et tu dérives tes composants de cette classe de base, en spécialisant leur comportement. Il n'y a aucun callback dans les libraries GUI écrites en C++.


C'est exactement ce à quoi je pensais. Ya pas 36 solutions d'ailleurs.

De plus, mais là je ne fais que répéter ce qu'on m'a dit, Ilog Views est une utilisation de l'objet bien plus convaincante que les MFC de Windows.
533
534

Hors sujet :
desole pour la reponse un peu tardive a plusieurs posts, mais AF rame a mort, la



Citation :
Non je ne joue pas sur les mots. Là, t'es en train de dire que le fonctionnel c'est pareil que l'objet.



J'ai jamais parle de fonctionnel (serieux, ou est ce qu'on parle de currying, de closures, etc... la ? :???: ), ni de polymorphisme, juste de cacher l'implementation, et a ce niveau la, le C++ n'apporte rien, puisque dans les deux cas tu declares juste la strucure d'implementation, et tu l'implementes (entre autre declaration des variables membres) dans les fichiers c ou cpp lorsque tu programmes correctement.

Bon, visiblement, je m'exprime tres mal, donc je cite ce que dit paul Davis et E Castro de Lopo sur ce point precis:

https://ccrma.stanford.edu/mirrors/lalists/lad/2003/02/0061.html

Citation :
>"I also think that there is a real problem with the way classes are defined
>in C++ and this is a problem which really does impact design. The problem is
>that you are forced to define the private data members and functions at the
>same time as the public ones. This is OK for the trivial C++ examples you
>see in textbooks but as soon as you REALLY want to hide the private
>information you end up defining the class to have a single private void
>pointer which gets something allocated to it in the implementation. This is
>basically the same thing you do when doing OO programming in C, so where is
>the benefit of C++?"
>
>--
>
>You are not forced to define the private data members and functions at the
>same time as
>the public ones in C++. The way to handle this is to put the public
>interface in a pure
>virtual class:
>
>class animal
>{
>public:
> virtual int legs() = 0; // returns number of legs the animal uses when
>moving around
>};
>
>and then derive from that interface:
>
>class dog : public animal
>{
>public:
> int legs() { return 4; }
>};

i love C++. i think its one of the best things ever. but i happen to
agree with Erik. the solution proposed by martijn doesn't scale well,
and doesn't really address the issue in a comprehensive way. it
requires one pure virtual class per distinct set of private members,
for a start.

the kinds of problems i have with C++ stem from the fact that you
cannot mark a section of protected members as accessible from only a
particular set of friends. the only way to say "only class Foo can
access these member (functions)" is to create a separate class, make
Foo a friend of that class, and then inherit from it.

this gets really messy really soon. the editor object in Ardour
contains many distinct sets of functionality that i would really like
to partition. i could create a set of discrete classes that cover each
aspect of the functionality, and then do MI from all of them. the
problem is that is each one of these aspects *internally* needs to
know about the others, which now means that they each have to be
friends of each other. so what's the point? i'd end up with something
ludicrous like:

class EditorFoo {
...
protected:
friend class EditorThis;
friend class EditorThat;
friend class EditorTheOther;
...
friend class ObjectThatInteractsWithEditorFoo;
...
};

...

class Editor : public EditorFoo, EditorThis, EditorThat,
EditorTheOther .... {
}

which is really no help at all. the other alternative is to use HAS-A
instead of IS-A, and its even worse. we end up with lots of code like:

editor->foo->...
editor->that->...
editor->theother->...

all i'd really like it to be able to say:

class Foo {
protected:
/* scope A */
friend class Bar;
...
protected:
/* scope B */
friend class Baz;
...
};

such that Bar can only access stuff within "scope A" and Baz can only
access stuff in "scope B". that is, access control keywords
("private", "protected", "public" define access scopes). right now, a
friend class declared anywhere within the class declaration is a
friend, period.

none of this helps with the problem erik identified. i would really
love a C++ that did this:

class Foo {
public:
... stuff ...
private:
<some tokens that meant something like #include>
};

and then in other files, you would do:

#use "foo.h"

or

#implementation "foo.h"

or something like that. the first one would just bring in the public
declarations, and its what you'd use when you're calling or creating
Foo objects. the second one would be used in the definitions for the
member functions of Foo, and hence would almost certainly be limited
to "foo.cc".

note that the private stuff would be in a file that looked just like
the class declaration, but had no public (and protected?)
declarations. in other words, the class declaration it includes is
implicitly 100% private, but it can include header files that are
necessary for the private declarations.

just dreaming.

--p



Citation :
Mauvais exemple, les mots clés rajoutés par QT ne sont pas du C++ standard. Ils ont été introduit pour palier à une limitation du C++. N'empêche qu'avec d'autres librairies GUI, tu n'as pas besoin de ces mots-clés et ça ne justifie pas non plus l'utilisation de callbacks (ou pointeurs de fonction si tu veux)



Bon, c'est quoi les GUI dont tu parles ? Je viens de regarder wxwindow, c'est plus moche que QT avec des macros, avec gtkmm (wrapper c++ de gtk), ca utilise les template, mais c'est juste une maniere d'avoir un callback safe, etc... En python, que ce soit pygtk ou pyqt, ce sont des callbacks, win32, ce sont des callback. Alors avec ca, je pense qu'on couvre deja au moins 50 % dues librairies pour GUI.

Citation :
Et bien si justement :

extern "C" {
// ton code C ici
}



extern C, c'est la convention de linkage; rien a voir avec la compatibilite C/C++ au niveau source. Ca permet au contraire aux fonctions C++ d'etre appeles par des facilites faites pour le C (par exemple dlopen sous unix).

Par exemple:

extern "C" {
int foo()
{
double *a = malloc(sizeof(*a));
free(a);
}
}

Ca compilera pas, parce que C++ interdit la promotion automatique de void*. Par contre, ca permet d'ouvrir la fonction foo a partir d'une librairie dynamique en utilisant dlopen et assimiles a partir d'un programme C, comme ca le nom foo n'est pas "mangle" (tu dois faire ca pour utiliser du code c++ sous matlab, par exemple).

Citation :
Je connais pas mal Qt et un petit peu Mozilla, c'est très "objet", le code est très propre et lisible, et ne verras pas de pointeurs de fonction dedans



C'est bien ce que je dis pour QT: t'as pas de pointeurs de fonctions, parce que c'est laid. En C, t'as pas le choix. En c++, t'as en gros l'approche template, qui n'est pas dynamique et utilisee dans gtkmm par exemple au travers de libsig++

http://libsigc.sourceforge.net/libsigc2/docs/manual/html/ch02.html#id2446517

Ou l'approche QT (ou par macro, mais je pense que derriere, c'est equivalent). Tous les deux sont des astuces pour donner l'impression que tu peux passer une fonction en argument d'une autre (ce que moi j'appelle un callback, mais je pense que le terme est ambigu, car pour toi, ca veut dire pointeur, alors que pour moi, ca veut juste dire pouvoir passer une fonction comme une variable).

Citation :
En gros, je te conseille de relire le bouquin de Gamma et al. car j'ai l'impression que tu as loupé pas mal de trucs.



Je crois pas non, mais je veux bien que tu me donnes un exemple d'un truc que j'ai pas compris :bravo2: Vu qu'on a jamais parle des design pattern pour l'instant, je vois difficilememtn comment tu pourrais savoir ce que j'en ai compris ou pas, cependant...

Citation :
La plupart des limitations que tu imputes au C++ concernent justement des pirouettes qui rendent difficile la maintenance de gros projets



Mais c'est bien ce que je reproche au C++: le fait que c'est tellement complexe quie chacun implemente un sous ensemble, qui est chaque fois different... LE sous ensemble de QT me convient tres bien, par contre. Pas de template, un bon mecanisme pour les evenements (on va eviter callback :) ), une putain de doc, une bonne license, et de loin la plus cross plateforme que je connaisse :) Mais encore une fois, c'est dans le domaine des GUI complexes, ou je pense que le C++ est le plus souvent LE langage de choix.

Citation :
Dans les projets du libre, comme la plupart du temps c'est bénévole, si le projet est gros et compliqué tu n'auras (quasiment) que des développeurs compétents, voire très ou extrêmement compétent. Dans l'industrie, pour une bonne partie, c'est un gagne-pain, voire le seul boulot que tu as trouvé (je connais des docteurs en électro-magnétisme, un agrégé de poissons exotiques... qui pissent du code sur des applis de "gestion" ). Donc dans une équipe de 10 personnes, tu as au moins un maillon faible ( ), voire plusieurs.



Je suis bien conscient de ca. Mais du coup, je trouve que ca apporte beaucoup d'eau a mon moulin sur le fait que le C++ n'est pas un langage fantastique; en gros, on l'utilise parce que c'est ce que les gens connaissent, et que comme tout le monde connait le C ou le Java, on peut faire du C++, les 3 langages etant tres similaires... :)

Hors sujet :
Je me rends compte qu'encore une fois, je m'emporte un peu, et ca peut passer pour des attaques personnelles... C'est pas l'effet voulu, mais je trouve que ce genre de discussions permet d'approfondir des points qu'on connait pas forcement, et de voir un autre point de vue. Donc meme si j'en ai pas l'air, je trouve tres interessant vos arguments, car vous venez pouet et toi d'un autre contexte que le mien.

535

Citation :
Dans ces cas-là, il faut faire simple et clair, et éviter comme la mort le "balaize", "l'acrobatique", "l'astucieux"... D'ailleurs même quand c'est du code que tu as écrit toi-même, si tu dois le retoucher après l'avoir laissé 2 ans, tu as du mal à t'y retrouver si ce n'est pas "simple voire stupide".



Donc ton argument, c'est que le C++ est un bon langage pour eviter ca ? Serieusement, je comprends pas le raisonnement. Faire du code lisible, c'est quand meme nettement plus possible en python (ou en ruby, lisp, VB, ce que tu veux) qu'en C++. Si je veux appliquer une fonction a une liste C++, on fait un truc du style


int foo(int);
for_each(v.begin(), v.end(), _1 = bind(foo, _1));


en python (et dans la plupart des langages ou les fonctions peuvent etre des variables au meme titre qu'entier, chaine de caracteres, c'est similair, donc c'est pas propre du tout a python), ca donne


[foo(i) for i in v]


Faire du code lisible, c'est important pour moi parce que la duree, c'est en annee, et c'est souvent un peu complique algorithmiquement (les structures de donnees sont hyper simples, par contre, dans la majorite des cas). C'est une des raisons pour laquelle j'ai abandonne tres vite blitz, par exemple.
536
Erratum, j'ai écrit fonctionnel au lieu d'impératif. Pour l'objet en C, je trouve qu'il y a déjà un abus de langage. Si tu peux effectivement coder à la main une structure d'objet en C, tu n'as pas tous les avantages d'un vrai langage objet. Et le C, pour moi c'est de l'impératif car la notion d'objet, de polymorphisme, d'encapsulation des données et des méthodes n'existent pas en C "normal".

Citation : extern C, c'est la convention de linkage; rien a voir avec la compatibilite C/C++ au niveau source. Ca permet au contraire aux fonctions C++ d'etre appeles par des facilites faites pour le C (par exemple dlopen sous unix).



Ben écoutes, j'utilise des libraries écrites initialement en C dans mes programmes C++ grâce à cette technique donc je sais bien que ça fonctionne.

Citation : Je crois pas non, mais je veux bien que tu me donnes un exemple d'un truc que j'ai pas compris Vu qu'on a jamais parle des design pattern pour l'instant, je vois difficilememtn comment tu pourrais savoir ce que j'en ai compris ou pas, cependant...



Dans le bouquin de Gamma, il n'y a pas que la description des Design Patterns mais aussi des conseils sur la conception objet, les problèmes que l'on rencontre dans un design et leurs solutions. Par exemple, tu dis par exemple que c'est dur de faire des callback en C++. Et ben dans le bouquin de Gamma, ils précisent que de toute façon c'est pas une bonne idée à la base de vouloir faire des callbacks. Pour ton exemple d'héritage et de factorisation de code, ben ils en parlent dans le même bouquin et expliquent qu'il faut préférer l'aggrégation à l'héritage pour cette raison. Bref, les problèmes que tu soulèves avec le C++ me semblent plutôt mettre en évidence des problèmes de conception objet plutôt que les limitations du langage C++ - même si je ne nie pas qu'il y a bien des limitations du langage hein ;) C'est pour ça que je te suggère de relire le bouquin.

Pour QT, je trouve que c'est un très bon exemple de design objet dans sa majorité, excepté pour le coup des signals/slots puisque la syntaxe n'est pas entièrement C++. Sinon comme dis Dr Pouet, ilog views est bien fichu aussi d'après ce que j'ai entendu.

Citation : Ou l'approche QT (ou par macro, mais je pense que derriere, c'est equivalent). Tous les deux sont des astuces pour donner l'impression que tu peux passer une fonction en argument d'une autre (ce que moi j'appelle un callback, mais je pense que le terme est ambigu, car pour toi, ca veut dire pointeur, alors que pour moi, ca veut juste dire pouvoir passer une fonction comme une variable).



Ce que j'appelle callback c'est bien une fonction que tu passes en paramètre, et la fonction n'a pas d'attributs propres comme pour les objets. Donc en C++ c'est un forcément pointeur sur une fonction. Je ne sais plus ce qu'impliquent les signals et slots en termes de fonctionnalités du langage, mais ça ne se situe pas au niveau des callbacks il me semble puisque c'est réalisable en C++ standard.

Citation : Mais c'est bien ce que je reproche au C++: le fait que c'est tellement complexe quie chacun implemente un sous ensemble, qui est chaque fois different...



Dans le fond, je suis un peu d'accord, mais je ne pense pas que le C++ ait l'exclusivité sur la diversité des approches pour parvenir à la même solution. La faute incombe selon moi plus aux mauvaises habitudes des programmeurs qu'au langage ;) D'ailleurs, les bouquins sur les Design Patterns sont justement fait pour éduquer les programmeurs à la conception objet.
537

Citation : J'ai jamais parle de fonctionnel (serieux, ou est ce qu'on parle de currying, de closures, etc... la ? )


Je pense que zieQ veut dire "impératif" au lieu de "fonctionnel".

Citation : The problem is that you are forced to define the private data members and functions at the same time as the public ones.


C'est vrai que c'est bien dommage ça.

Citation : Je suis bien conscient de ca. Mais du coup, je trouve que ca apporte beaucoup d'eau a mon moulin sur le fait que le C++ n'est pas un langage fantastique; en gros, on l'utilise parce que c'est ce que les gens connaissent, et que comme tout le monde connait le C ou le Java, on peut faire du C++, les 3 langages etant tres similaires...


Pas fantastique, on est bien d'accord. Mais je trouve que dans la plupart des cas, c'est un peu mieux que C au sens où il est un peu plus facile de faire du code lisible, et un peu plus difficile de faire des erreurs.

Mon "retour de vécu" était là aussi pour dire que plus le compilateur trouve d'erreurs (donc avant les tests que l'on fait manuellement), moins il en reste ensuite.

Dans ce contexte je ne pense pas que la richesse d'expression de langages comme python, perl ou php compense la perte d'un typage fort. Par contre un langage qui conjuguerait le meilleur des deux mondes serait vraiment chouette, et apparemment Ocaml le fait. Mais sera-t-il assez répandu un jour pour être utilisé dans ces contextes ? Pas sûr du tout (malheureusement).

Citation : Donc ton argument, c'est que le C++ est un bon langage pour eviter ca ? Serieusement, je comprends pas le raisonnement. Faire du code lisible, c'est quand meme nettement plus possible en python (ou en ruby, lisp, VB, ce que tu veux) qu'en C++. Si je veux appliquer une fonction a une liste C++, on fait un truc du style


La lisibilité serait un avantage de C++ sur C ; et le typage un avantage de C++ sur les langages que tu cites (VB je sais pas, mais là l'inconvénient c'est Windows et c'est rédhibitoire !). L'exemple de la liste n'est effectivement pas à l'avantage de C++ !

Citation : Faire du code lisible, c'est important pour moi parce que la duree, c'est en annee, et c'est souvent un peu complique algorithmiquement (les structures de donnees sont hyper simples, par contre, dans la majorite des cas). C'est une des raisons pour laquelle j'ai abandonne tres vite blitz, par exemple.


Tu donnes peut-être bien un éclairage clé à notre discussion là : en "informatique de gestion" les algorithmes sont rarement bien compliqués (et ces parties sont vraiement isolées), par contre ils sont très nombreux, et les structures de données sont complexes et nombreuses. Depuis quelque temps, il y a en plus le parallélisme qui rajoute de la complexité (au sens de gros bordel à gérer / ordonner, et pas "algorithme pointu qui fait mal à la tête" ).

Citation : Je me rends compte qu'encore une fois, je m'emporte un peu, et ca peut passer pour des attaques personnelles... C'est pas l'effet voulu, mais je trouve que ce genre de discussions permet d'approfondir des points qu'on connait pas forcement, et de voir un autre point de vue. Donc meme si j'en ai pas l'air, je trouve tres interessant vos arguments, car vous venez pouet et toi d'un autre contexte que le mien.


;)
T'inquiète, je m'en doute un peu. Je suis pas sûr que ça te plairait ce genre de domaine d'ailleurs, en tout cas ça t'énerverait au moins au début (avec pas mal de bonnes raisons). Au moins avec ce genre de discussion tu sais mieux à quoi ces univers ressemblent !
538
Pour parler d'une (bonne) expérience que j'ai eu est le framework juce en C++. Très propre, porte sur absolument tout (de l'entier en passant par la GUI, les listes, les threads, le VST...). Le code est hyper bien documenté, et les exemples font foisons.
Regardez du code en Juce est simple. Il fait toutes ces surcouches des types de bases pour éviter les abus habituels des codeurs.
Enfin je vous laisse jeter un coup d'oeil par vous même à la démo. Par contre la première compilation n'est pas triviale en soit (prenez donc la demo précompilée, les sources sont consultables dedans).

http://www.rawmaterialsoftware.com/juce/download.php

Le code y est très propre. On peut encore faire des ignominies, c'est sûr, mais juste par curiosité de voir quelque chose de bien fait.
(le gars qui a fait cela est esponsable de Tracktion aussi).

http://soundcloud.com/bat-manson

539

Citation : Sinon comme dis Dr Pouet, ilog views est bien fichu aussi d'après ce que j'ai entendu.


En plus à l'origine il a été écrit en lisp (et s'appelait Aïda Masaï) (je drague Gabou là ;) ) avant d'être ré-écrit en C++ pour connaître une plus large diffusion. Tout ça vient de l'Inria (Ilog en est une émanation).

Citation : Y a quand meme un truc que je comprends pas. Ca veut dire quoi gros projet pour vous ? Parce que bon, les gros projets en libre, par exemple, c'est pas ca qui manque, et y en a pas beaucoup en C++ quand meme.


En fait, mon argumentation sur les développeurs pas toujours rigoureux vaut surtout en faveur des langages typés statiquement. Pour les logiciels libres, je pense qu'il y a d'autres facteurs qui ont joué :
- gcc n'a bien géré le C++ que assez récemment, et pas mal d'années après certains compilos industriels
- une large part du code (libc, gcc, emacs) date de bien avant C++, et une bonne part des développeurs aussi (Stallman le premier), et n'ont pas vraiment eu envie de changer leurs habitudes.

Dans le domaine public aussi il y a des compromis finalement. Ce ne sont pas les mêmes, il y a moins de développeurs avec un niveau insuffisant, mais il est plus difficile d'avoir 10 personnes qui vont démarrer un projet de zéro en bossant à temps plein dessus pendant 2 ans, avec une bonne coordination (plus facile quand il y a un "chef", même si ça n'a pas que des avantages ;) ).
540
La discution ne pourra jamais se terminer! :8O: