Utiliser Symfony pour vos projets
Par NiKo le jeudi 1 novembre 2007, 10:26 - Dev
- Lien permanent -
29 commentaires -
Tags :
Suite à l'émergence des frameworks web, beaucoup d'équipes de développement ont décidé de leur utilisation sans toujours bien réaliser les tenants et aboutissants liés la démarche, croyant souvent avoir enfin trouvé une méthode miracle pour produire vite et bien. Il peut en résulter de sévères déconvenues, quel que soit le framework, le langage ou la plateforme retenus.
Concernant Symfony, il en va de même ; et si on peut bien entendu trouver énormément d'avantages à son utilisation sur un projet, il faut également bien avoir conscience des contraintes qu'un développement sur sa base implique, sous peine de se retrouver dans le mur assez rapidement.
Symfony n'est pas un CMS
Il est immédiatement tentant de retenir Symfony pour tout type de projet tellement il est agréable de développer sur sa base. Cependant, pourquoi systématiquement réinventer une roue qui tourne peut-être déjà fort bien ailleurs ? L'idée ici est de s'interroger sur la réelle nécessité de recourir à un développement spécifique ; en effet, même si coder en Symfony est très encadré, il n'empêche que la logique métier est entièrement à définir par l'équipe de développement [1]. Plus particulièrement concernant les problématique de gestion de contenus, le besoin métier sur le projet est-il suffisamment conséquent, ou un CMS comme Drupal, SPIP, ezPublish ou Joomla couvre t-il nativement l'ensemble du périmètre fonctionnel cible ? [2]
Un développement spécifique introduira le plus souvent beaucoup plus d'exigences, de compétences et de compléxité qu'une intégration basée sur un outil de gestion de contenus autonome existant (et digne de ce nom). L'idée est bel et bien de renoncer à se faire plaisir à tout prix pour se situer au plus près de la réalité du besoin.
Bien entendu, je me fais aussi ici l'avocat du diable. Pour avoir joué avec les principaux CMS PHP open source du marché et connaissant la propension naturelle d'un client à enrichir au gré de l'avancement projet le périmètre fonctionnel souhaité [3], je préfère allègrement à titre personnel me baser sur un framework comme Symfony afin de rester agile et parer à toute éventualité. Mais je sais aussi quelles sont mes compétences réelles sur le sujet, et dès qu'une équipe dont je ne cerne pas le niveau entre en ligne de compte, généralement les problèmes commencent. Ça tombe bien, c'est justement l'objet du prochain chapitre 
Symfony est exigeant
Non, Symfony ne transformera pas magiquement un mauvais développeur en bon développeur... même s'il peut y contribuer à terme 
Plus sérieusement, le but réel de l'utilisation d'un framework est bel est bien de vous rendre plus efficace et productif, certainement pas de vous compliquer la vie ou de vous faire perdre du temps.
Il faut bien prendre conscience que le temps de montée en compétence sur l'utilisation du framework - déjà naturellement exigeante - requière également pour certains une montée en compétence en programmation tout court. Et cette dernière, si elle peut se faire sur un projet, peut également allègrement le plomber. Un développeur débutant bidouilleur PHP mettra fatalement plus de temps qu'un codeur expérimenté à appréhender l'ensemble des possibilités introduites par PHP5, la programmation orientée objet, les motifs de conception, mais aussi le respect des bonnes pratiques notamment liées au travail collaboratif ou que sais-je encore.
Le risque à court terme est de voir le code du projet grevé dans sa qualité et sa maintenabilité. À moins bien entendu de prendre en compte en amont cette charge inhérente à la formation, mais on connait tous la réalité professionnelle et commerciale du milieu qui est le notre 
Symfony ne vous dispense pas d'organiser votre projet
Oui, Symfony fait la part belle aux conventions et prémâche énormément le travail redondant à tout projet de type web. La vie des (bons) développeurs est grandement facilitée, et on peut vraiment gagner rapidement beaucoup de temps. Mais une grave erreur serait de sous-estimer la charge liée à l'organisation et la gestion de la vie du projet.
Par exemple, ce n'est pas en mettant plus de développeurs sur un projet Symfony (ou autre d'ailleurs) que celui-ci sera développé plus vite. Au contraire, même ; tout codeur avec un tant soit peu d'expérience professionnelle a déjà rencontré ce type de cas de figure : on vend un projet de 100 jours de développement, on se fixe un retroplanning ambitieux avec une mise en ligne à 20 jours ouvrés, et on staffe donc arithmétiquement cinq développeurs à plein temps en pensant que le résultat sera totalement équivalent au travail qu'aurait fourni un unique développeur en 100 jours de développement pour concevoir l'intégralité du code de l'application résultante.
Bien entendu, c'est illusoire et généralement, le projet se termine sur des dépassements conséquents et le mécontentement du client [4]. Et pour cause, la déperdition d'énergie utilisée à la communication sur le projet est fonction du nombre d'acteurs présents sur ce dernier. Et on peut staffer trois chefs de projet à plein temps pour canaliser tout ça, c'est d'une part économiquement peu viable et d'autre part totalement inefficace, ces derniers devant perdre également beaucoup de temps à se synchroniser entre eux, puis avec les membres de l'équipe.
Moralité
Non, Symfony n'est pas le remède miracle aux lacunes organisationnelles des structures en charge de la réalisation d'un projet, mais bien un outil exigeant qu'il faut savoir appréhender de la bonne façon en prenant en compte le plus en amont possible ces problématiques. Le gain réel et indiscutable d'efficacité apporté par l'utilisation d'un framework comme Symfony est à ce prix 
Notes
[1] Je n'ose pas évoquer ici la notion d'architecte logiciel connaissant la réalité moyenne du monde PHP.
[2] Pour nuancer ce propos, de plus en plus de plugins Symfony tendent à apparaitre pour couvrir ce type de besoins fonctionnels.
[3] Le premier qui me parle du sacrosaint cahier des charges contractuel, je le mords.
[4] Sans parler de la charge de stress portée sur l'équipe, qui du coup va saloper le boulot pour livrer au plus vite.
29 commentaires (Ajouter un commentaire)
Excellent article qui tombe à point nommé pour répondre à une question que je me posais depuis un petit moment, moi qui n'ai plus vraiment touché à PHP depuis des lustres, et qui entre donc parfaitement dans la catégorie des bidouilleurs PHP ! Il va falloir que je me mette sérieusement à PHP 5... vite vite vite.
Concernant les CMS, j'ai la nette impression que quand on décide de les utiliser, on oriente le site qu'on souhaite en fonction des possibilités clairement offertes par le CMS utilisé. Je suis en train de développer un petit site en SPIP, et bien que ce CMS soit réellement puissant, j'ai dû mettre le hola sur les demandes formulées par ceux qui allaient l'utiliser au final... comme c'est un projet bénévole, je fais mon dictateur sur le coup, j'avoue
Enfin, tu parles de la synchronisation des développeurs et des chefs de projet, c'est exactement ce dont parle David de Biologeek dans son dernier billet ! Les grands esprits se rencontrent, on dirait !
À ton avis, quel doit être le niveau minimal d'un développeur PHP pour se mettre à Symphony ? Quelles doivent être les notions de PHP 5 assimilées avant de pouvoir commencer à développer en utilisant Symphony ?
Bonne continuation !
Très bien dit.
Cet outing me fait penser à quelque chose...
"À ton avis, quel doit être le niveau minimal d'un développeur PHP pour se mettre à Symphony ?"
Selon moi, il faut être niveau 21. Au moins. :P Sinon, article très sympa, bravo.
Billet intéressant. Fervent utilisateur d'eZ Publish (avec un espace entre le z et le p :p), je me dis qu'on pourrait très bien remplacer Symphony par eZ Publish dans le texte (à quelques exceptions près certes) ou certainement par d'autres produits, le propos serait toujours aussi pertinent
@Pierre à propos des CMS, ça dépend des demandes supplémentaires et des CMS. Certains sont plus ou moins flexibles. Cela dit, cette "pseudo rigidité du CMS" dans un cadre professionnelle peut être un avantage il permet parfois de limiter "la propension naturelle d'un client à enrichir au gré de l'avancement projet le périmètre fonctionnel souhaité"
Symfony, c'est comme un couteau suisse, c'est très pratique, très efficace mais tout ça dépend surtout de qui tient le manche.
PS : À noter sfCoffeePlugin pour que Symfony puisse aussi faire le café.
PPS : Damien : D'accord pour l'espace dans eZ Publish mais attention au F de symFony ;o)
Niko, ca te dit pas de casser un peu de sucre sur Ror au passage ?
J'ai beaucoup de mal a faire croire à certaine personne, que les framework PHP se sont depuis longtemps mis à jour ...
et son bien plus efficace sur des projets un peu complexe ..
"D'accord pour l'espace dans eZ Publish mais attention au F de symFony ;o)"
ah oui euh ok, 1 partout, balle au centre
Pierre:
Bonne question. C'est relativement difficile à évaluer mais je pense que des notions de POO et la connaissance (pour ne pas dire la compréhension) de quelques patterns utilisés dans Symfony sont une bonne base de départ. Plus encore, une sensibilité aux respects des standards et des bonnes pratiques, une veille technologique permanente et quelques réalisations de sites internet d'envergure derrière soi me semblent de sérieux atouts pour réussir avec Symfony. Enfin, une véritable envie de bien faire et de produire quelque chose de maintenable me semblent également totalement indispensable, mais on s'écarte de la technique pure, là
Très bon article qui donne envie de tester Symfony!
Une question: est-il possible d'intégrer Symfony à un projet existant ou force-t-il une architecture spécifique ne permettant que de l'utiliser uniquement sur de nouveaux projets?
bactisme : Tu penses à la PHPLib ?
Yann : Si je peux me permettre une réponse, symfony utilise une architecture qui découle d'une certaine expérience et «oblige» les programmeurs à se conformer à un certain nombre de «bonnes pratiques» (notemment le MVC). Il est donc plus que fort probable qu'il faille réécrire un projet existant pour l'intégrer avec symfony. Cependant, rien n'empêche d'utiliser des bouts de symfony pour les intégrer dans un projet existant mais ce serait peut être passer à coté de quelque chose :o)
Pierre:
Le niveau de connaissance pour PHP5 requis pour utiliser symfony n'est pas très élevé. Nous utilisons symfony au bureau et mes programmeurs n'avaient pas beaucoup de notions orienté objects et encore moins des designs & patterns. Si tu lis les chapires 7, 8, 9 et 10 du livre symfony (disponible sur le site de symfony) tu vas avoir une bonne base pour commencer.
Le tutorial Askeet est bien, mais n'est pas facile à faire puisque ça été fait pour des versions antérieur de symofny. Il y a donc plusieurs bugs qui vont te ralentir considérablement. Mais je te recommande quand même de le lire parce que tu vas assimiler des principes lu dans les chapitres du livre.
Tu peux lire mon article http://www.martinbittner.com/index.... sur les différents framework de développement dans lequel j'explique pourquoi j'ai choisi symfony.
Bactisme:
Il est vrai que symfony et les autres framework MVC aide énormément à mieux structurer son code et séparer le view du code, mais il ne faut pas programmer aveuglement en pensant que tout va etre parfait. Il reste quand même relativement facile de mettre du code aux mauvais endroits et de briser le model MVC.
Cheers!
Martin, je pense que tu pointes quelque chose de juste en parlant de rupture de la logique MVC. Et c'est bien en cela qu'il me semble nécessaire de bien avoir assimilé ce principe dans ses fondements et sa mise en pratique pour éviter les problèmes. Le nombre de développeurs "confirmés" que je vois balancer des appels à la session depuis le modèle ou mettre du HTML dans le contrôleur, c'est effarant.
En ce sens je suis malheureusement moins optimiste que toi, et pense que contrairement à ce que laisse percevoir l'apparente facilité de prise en main du framework dans les premiers pas, le niveau requis est tout de même relativement élevé sur la conduite d'un projet complet, surtout en regard du niveau moyen des développeurs PHP sur le marché...
C'est un billet intéressant et il est bon de rappeler que tout ces problèmes se posent avec n'importe quel framework de n'importe quel langage. Ca n'a rien de spécifique à Symfony.
Un framework c'est un "cadre de travail" qui impose des contraintes, il faut s'assurer au préalable que c'est en adéquation avec le projet, et que les personnes qui vont développer avec ont une bonne connaissance de la techno.
Je suis tombé ici car m'intéressant un peu à Symfony. Je suis beaucoup plus porté sur RoR, mais bon nombre de propos du post peuvent aussi s'y reporter.
L'aspect humain est effectivement important. Avoir un framework de qualité, pratique, productif,.... c'est bien, mais encore faut-il que les gens s'y intéressent, aient envie de s'y former, acceptent de farfouiller par eux-même sur le net pour aller plus loin que le bouquin qu'ils ont pu lire (survoler ?). Ce n'est pas toujours le cas ! Et c'est bien dommage, chacun a pourtant beaucoup à y gagner.
@Code34 : Et un minimum de planification, de reflexion, d'organisation et d'honnêteté vis à vis du client.
Une vision à court terme est bancale, voire suicidaire. Pour l'entreprise et pour les salariés.
Un peu d'ergonomie, d'organisation et de vision ne font pas de mal. Mieux, cela satisfait le client.
Un client satisfait est un très bon publicitaire.
Tu as des boîtes où des audits s'imposent. La techno ne fait pas tout, loin de là. Des mecs compétents, tu en as partout, des organisations apprenantes un peu moins.
@FC En même temps quand tu choisis d'utiliser un framework, par définition, tu ne peux pas avoir de vision à long terme. Tu ne sais pas quelle tournure prendra le développement du dit framework, quel choix techniques seront pris, tu n'auras certainement pas la capacité d'influencer le développement du framework etc (..) Et tu n'auras pas non plus la capacité de faire évoluer toi même le framework, sinon t'aurais tout aussi bien pu le développer en interne.
Utiliser un framework s'est aussi prendre un risque non négligeable qu'il faut savoir apprécier par rapport au gain que cela peut apporter. Je l'ai vu encore très récemment avec les frameworks ajax, rien ne nous permet de savoir ou en sera l'état de l'art d'ici quelques mois. Dure de choisir un framework dans ces conditions (..)
@code34 Je n'irais pas aussi loin que toi dans cette idée. Par contre ce qui est sur, c'est que monter une appli web sur un framework tel que Symfony nécessite par la suite, soit une installation sur dédié mais qui fini par contenir des librairies dépréciées, soit une maintenance continuelle au fil des mises à jour du framework. J'en essuie les platres sur un projet livré l'année dernière sans contrat de maintenance, et hébergé sur serveur mutu, avec Symfony préinstallé. L'hébergeur se tient à jour des releases, ce qui est tout à son honneur. Mais cela nécessite à chacune de ces mises à jour de revoir certaines portions de code où la BC a été cassée. Dernier exemple en date c'est l'utilisation du paramètre 'absolute' dans le helper link_to qui s'est transformé en 'absolute_url'. ça n'est pas forcément grand chose mais c'est assez désagréable d'avoir à retourner sur un projet pour lequel on pensait en avoir terminé.
Par contre pour un projet qu'on souhaite faire évoluer dans le long terme Symfony est me semble-t-il une pièce de choix.
@arnod'mental: Dans ton cas personnellement j'aurai bundlé une version dédiée de Symfony avec ton projet, avec un symfony-freeze par exemple Encore mieux, avec des externals, mais c'est rare d'avoir subversion à dispo sur un mutualisé.
Merci N1Ko. symfony-freeze est en effet la solution à mon problème.
Axiome chinois:
"Si c'est le bordel dans ta tête, c'est le bordel dans ton projet, valable avec Symfony et (encore plus) avec eZ Publish"
^_^
Salut,
ayant réalisé une dizaine de projets Symfony, j'ai été rapidement confronté à quelques petites lacunes de ce framework, le plus gros problème étant que la génération du modèle de classes est calqué sur le Modèle Physique de Données, il est ainsi quasiment impossible de définir des classes abstraites gérant une partie du modèle,
de plus, les plug'in proposés par la communauté sont souvent des usines à gaz trés peu fonctionnelles.
Sinon, c'est assez bien.
Un petit coucou à Damien au passage.
Jean-Phi: Tu devrais regarder du côté de l'ORM Doctrine ou des behaviors Propel pour tout ce qui est héritage, comportements génériques ou abstraction du modèle de données, généralement on s'en sort assez bien.
Par contre je te rejoins sur ce qui concerne la qualité des plugins contribués par la communauté, très inégale effectivement.
effectivement, les behaviors permettent un pseudo héritage, mais ce n'est pas vraiment l'idéal à mon goût, comme tu dis : "généralement on s'en sort assez bien".
Le framework de mes rêves serait un framework où l'on décrit, pour la génération, le modèle de classes et non le modèle de données... cf : http://www.jeanphi.fr/blog/show/str...
@Jean-Phi, c'est le concept présent dans Django/Rails ou j'ai raté un truc ?
Jean-Phi: Doctrine propose ça, d'ailleurs la syntaxe YAML que tu décris dans ton billet ressemble à celle proposée par Doctrine.
Effectivement, ca se rapproche de l'abstraction de données idéale, test en cours en vue d'adoption....
Merci pour ce tuyau!
Après plusieurs tests, il s'avère que Doctrine gère l'héritage d'une façon trés peu orientée objet.
Ex : si on définit deux class :ClassA(field1) et ClassB extends ClassA(field2),
Doctrine va générer deux tables :
TableA(id, field1)
TableB(id, field1, field2)
Or, dans un modèle objet cohérent, on aurait du avoir :
TableA(id, field1)
TableB(id, field2, id_table_A)
C'est bien dommage car le reste est plutôt interessant...
Jean-Phi> Ça mériterait de se rapprocher des équipes de devs de Doctrine pour le leur signaler et leur proposer éventuellement un patch
Effectivement, mais il me semble que ça coule de source.....
Pour faire un patch il faut du temps, or je n'en ai pas, sur notre petit framework perso, ca fonctionne déjà comme ca.
Pour aller plus loin, on genère les tables associatives automatiquement.
Exemple (relation n...n) :
ClassA :
ClassB :
constraints :
has_and_belong_to_many : ClassA
nous generons automatiquement la table associative TableAB....