Note de lecture : Refactoring to Patterns, par Joshua Kerievsky

Note : 6 ; Un grand sujet, traité avec acuité, mais parfois présenté de façon un peu fastidieuse !

Joshua Kerievsky est donc le premier à avoir franchi le fossé entre le refactoring et les patterns ! Nous devons lui en être reconnaissants. L’intérêt et l’expérience de l’auteur (notamment en tant que créateur du « new York patterns group ») l’ont conduit à aborder les patterns non pas comme des éléments initiaux de conception, mais comme des solutions à des problèmes, donc des éléments de conception émergentes, ce qui nous amène au refactoring ! La conception émergente via les patterns est le thème et l’intérêt central du livre et en font sa valeur.

Le sujet va nous occuper au long des 350 pages découpés en 11 chapitres que forme cet ouvrage. Au chapitre 1, l’auteur nous livre la démarche que l’a conduit à ce texte. En partant tout d’abord des patterns pour obliquer vers le refactoring et le cycle TDD, pour revenir enfin vers les patterns, pour améliorer la conception sans tomber dans l’over engineering. Le second chapitre est consacré au refactoring. Il ne s’agit pas là, en une douzaine de pages, de reprendre le propos de Martin Fowler, mais simplement de se focaliser sur l’intention et l’essence de cette démarche.

L’introduction aux patterns du chapitre 3 n’est ni vraiment utile, ni spécialement éclairante. Le chapitre est court mais assez vague sur la nature des patterns, le propos se concentrant plutôt sur l’histoire personnelle de l’auteur… Les Code Smells du chapitre 4 souffrent moins de ce défaut, Joshua Kerievsky nous gratifie ici des odeurs les plus rependues. Il s’agit plus d’un mini-catalogue que d’une introduction.

Lire la suite
Publicité

Note de lecture : Service Design Patterns, par Robert Daigneau

Note : 5 ; Des patterns qui sont plutôt des exemples d’implémentation…

Ce texte, ce devrait être en principe le complément des Enterprise Integration Patterns de Gregor Hope. Dans la pratique, il n’est pas à la hauteur de son ainé, même s’il nous permet d’apprendre certaines choses sur les web services, qu’ils soient SOAP ou REST.

En pratique, ce texte de 270 pages est découpé en 7 chapitres. Il faut aussi compter les annexes qui ajoutent une trentaine de pages de glossaire et référence de patterns. Les 10 pages du premier chapitre servant d’introduction ne nous apprennent pas grand chose, passons ! Le second chapitre est plus conséquent, en nombre de pages d’abord car on en compte 40, mais surtout par le contenu. C’est de « style de web services » dont il est question, de 3 styles plus précisément : RPC, orienté messages et orienté ressources. Ce chapitre focalise sur les considérations d’architecture liées à ces 3 styles, c’est donc en fait la véritable introduction au reste du livre ! En tout cas, le contenu est digne de Martin Fowler.

Lire la suite

Note de lecture : Architecting Enterprise Solutions, par Paul Dyson & Andy Longshaw

Note: 7 ; Un excellent “pattern language” d’approche très Alexandrienne. Dommage que l’aspect solution me laisse un peu sur ma faim.

Le titre de l’ouvrage est assez évocateur à cet égard: Il s’agit là de décrire le style architectural des systèmes d’information Internet à l’aide d’un pattern language, à la Christopher Alexander. Digne représentant de la « software design patterns series », cet ouvrage expose sur 290 pages découpées en 12 chapitres formant 3 parties des architectures de déploiement dédiées aux applications Internet. Bien sûr, vous allez me dire que le texte va accuser son âge, surtout dans le domaine où les plus grands progrès ont été faits au cours des 10 dernières années ! Si ce point est indéniable, il n’est pas aussi marqué que l’on pourrait le craindre car il se focalise bien plus sur les principes d’architecture que sur les solutions techniques !

Je passe sur le premier chapitre qui ne nous apprend rien pour aborder la première partie « Architecture, Patterns and Internet Technology » qui comprend 4 chapitres sur 60 pages. Le premier d’entre-eux (donc le second chapitre) « system architecture » mérite que l’on ne passe pas trop vite dessus. Ses 15 pages sont consacrées aux propriétés non-fonctionnelles des architectures. Intéressant. Le point sur les technologies de l’Internet que nous propose le chapitre 3 sur 17 pages est un peu superficiel, mais pas aussi démodé que l’on pourrait le croire. Mais il apporte peu. Le chapitre 4 est en quelque sorte la table des matières patterns du livre. C’est un incontournable pour ce genre d’ouvrage. Pour clore cette première partie, les auteurs présentent l’étude de cas fictive sur laquelle ils ont choisi de s’appuyer. On y fait le tour des propriétés non-fonctionnelles que l’on avait énumérées au chapitre 2. C’est bien fait.

Avec 167 pages, la seconde partie est le gros de la troupe du bouquin, et de loin ! Il faut dire que cette partie qui ne compte pourtant que 4 chapitres s’intitule « The Patterns ». Et l’on commence fort logiquement au chapitre 6 par un chapitre « fundamental patterns » de 18 pages. Il présente deux patterns, le très classique « application server architecture » encore largement majoritaire aujourd’hui et un moins convainquant « péripheral specialist elements » dont la symétrie est questionnable du fait de la BDD unique… Le chapitre 7 nous offre un gros morceau avec les « system performance patterns » qui couvrent 45 pages. Les patterns architecturaux de ce chapitre sont particulièrement intéressants et bien décrits dans leur essence (load balancing, redondance, failover, appliance, replication, resource pooling, cache, offlining), il ne manque guère que le sharding des bases NoSQL ! Les diverses variantes de ces stratégies sont abordées ainsi que des considérations d’équilibrage de charge CPU, etc… Bref un chapitre riche qui justifierai le livre à lui tout seul !

Lire la suite

Note de lecture : Pattern Languages of Program Design vol. 3 – Robert Martin, Dirk Rhiele & Frank Buschmann edt.

Note : 8 ; Une compilation de patterns de très bonne qualité.

Ce troisième volume de la série PLOP-D a complètement redynamisé la série ! Alors que je reprochais aux volumes précédents la portion de matériel utile, il n’y a rien de tel ici : la substance utilisable directement dans nos projets y est importante. J’ai trouvé la sélection clairement orientée vers les patterns de conception, ce qui n’est pas pour me déplaire. Cependant, même les patterns organisationnels peuvent s’avérer utiles ou inspirants, tel que le “Patterns for pattern writters”. Malgré cette orientation, le volume est quand même découpé en plusieurs parties, en fait plus de parties même que les opus précédents, car on en compte 10 ici, mais elles sont aussi plus finement ciblées. Il était aussi question d’opérer un découpage valable pour un livre qui compte maintenant 575 pages.

La première partie traite des patterns à usage généraux. Cette première partie n’est certainement pas à ignorer. On y trouve le très utile « null object », l’excellent « extension object » qui est une des très rares contributions d’Erich Gamma. Le « manager » de Peter Sommerlad a plutôt une coloration historique, car c’est le pattern universellement utilisé aujourd’hui pour les DAO.

La seconde partie couvre des variations sur les patterns. Elle va d’avantage intéresser le praticien expérimenté. Les trois sont intéressants, les variations sur le state pattern peuvent être utilisées presque tel quel dans une formation.

J’ai trouvé les deux patterns architecturaux qui forment la troisième partie du même nom assez peu convainquants. Tant pis.

La quatrième partie est consacrée aux patterns liés aux architectures distribuées. Les 5 patterns qui la constituent sont plutôt musclés. Ma préférence va au très élégant « asynchronous completion token ». L’ « acceptor connector » vaut certainement le détour, mais il est quelque peu complexe et la présentation à l’aide diagramme en notation Booch n’aide pas.

Ce sont deux patterns qui constituent la cinquième partie consacrée à la persistance. Le « serializer » a surtout un intérêt documentaire, tandis que « accessing relational database » bien que bien construit n’offre plus qu’un intérêt mitigé aujourd’hui.

On ne trouve qu’un seul pattern dans la sixième partie qui cible les interfaces utilisateur. Il s’agit plutôt d’un pattern language d’ailleurs, mais je lui ai trouvé peu d’intérêt.

La septième partie traite de patterns de programmation et il ne faut pas la rater, même si elle ne contient que deux de ces patterns (presque des idiomes). Le premier d’entre eux est le désormais célèbre « double-check locking », tandis que l’« external polymorphism » qui s’apparente beaucoup au décorateur n’est pas dénué d’intérêt.

Je n’ai jamais vraiment été soulevé d’enthousiasme par les « business patterns ». Peu d’entre-eux trouvent grâce à mes yeux. Cette huitième partie en contient 3 et j’avoue qu’ils ne m’ont pas marqué.

On n’échappe pas facilement aux « process patterns ». Nous en avons 4 dans cette neuvième partie. Le « pattern for evolving frameworks » est un pattern language qui met bien en exergue les aspects fondamentaux de la conception d’un framework. Le « pattern for designing in teams » contient les frémissements de l’avènement d’XP. Le « pattern for system testing » est le plus intéressant du lot, à mon avis. Là encore un pattern language qui mérite la lecture.

Si vous vous sentez l’âme d’un auteur, le « pattern language for patterns writing » sera votre amis. Il est le seul membre de cette dixième partie consacrée aux « patterns on patterns ». Ecrire un pattern, le soumettre (et être accepté) en conférence n’est pas si simple, j’en ai l’expérience. Rétrospectivement, je trouve qu’il s’agit-là d’un bon guide.

On ne peut espérer un score de 100% de matière utile à une compilation de patterns issus d’une conférence. Cela dit la sélection est vraiment très bonne, c’est un très bon livre, je ne l’ai pas lu en pensant « vivement que cela finisse » que cela a été parfois le cas avant. Je garde précieusement ce volume et le recommande.

PLOPD-vol3

Référence complète : Pattern Languages of Program Design, vol. 3 – Robert Martin, Dirk Rhiele, Frank Buschmann edt. – Addison Wesley / Software Patterns series 1998 – ISBN: 0-201-31011-2

Pattern Languages of Program Design 3

http://www.goodreads.com/book/add_to_books_widget_frame/0201310112?atmb_widget%5Bbutton%5D=atmb_widget_1.png&atmb_widget%5Bhide_friends%5D=on

Note de lecture : Design Patterns, par Erich Gamma, Richard Helm, Ralph Johnson & John Vlissides

Note : 10+ ; LE livre de la décennie 90 !! Book of the year 1995 & Book of the decade ‘90!

Il y a un « avant » et un « après » Design Patterns. Il y a tellement de choses à dire sur ce livre emblématique qu’il est même difficile de trouver par où commencer. Commençons par « avant ».

Dans les années 80, jusqu’au début des années 90, on parlait bien d’activité de conception (par opposition à l’activité d’analyse) mais sans parvenir vraiment à identifier ce en quoi cela consistait. « montre-moi ton arbre d’héritage » était alors l’aulne à laquelle on mesurait la qualité d’une conception objet. Evidemment un arbre large et profond était jugé meilleur qu’un arbre rabougri. Pour certains gourous, seuls les objets issus du domaine métier étaient des éléments valides de conception. Je garde un souvenir vivace de m’être fait tancé vertement pour avoir introduit dans ma conception des objets qui n’en étaient pas. Bref l’activité de conception était alors généralement considéré comme le tartinage de code dans les classes identifiées en analyse. Sauf pour quelques uns qui se disaient qu’il y avait plus…

Puis est arrivé le Design Patterns. Un ouvrage tellement emblématique qu’il porte même un nom alternatif dans la communauté des patterns : le GoF, c’est à dire le « gang of four » par référence à ses quatre auteurs.

Lire la suite

Note de lecture : The Joy of Patterns, par Brandon Goldfedder

Note : 3 ; Un workshop pour Design Patterns vraiment léger  !

Cet ouvrage est dans la même lignée que “Design Patterns Explained”. Ce livre aborde les patterns pour les nouveaux venus, mais avec perspicacité. Il mise beaucoup sur l’apprentissage par l’exemple et 3 gros exemples en Java, C++ et Visual basic y sont développés.

L’ouvrage débute par ce que sont les patterns, leur nature et leur structure, avec un petit détour vers les patterns language. Plus surprenant, le chapitre dédié aux concepts de base de l’orienté objet. Je pense que cibler les nouveaux venus à l’objet pour un ouvrage, même d’introduction, aux patterns est assez questionnable.

Globalement, même s’il est agréablement écrit, cet ouvrage est quand même un peu léger, avec ses 110 pages hors annexes (volumineuses, qui contiennent le code source), et même 65 pages si je ne compte que ce qui est vraiment le cœur du livre !

Du côté des bonnes nouvelles, le texte est concis et l’auteur excelle à expliquer ses raisonnements. Beaucoup de diagrammes UML émaillent l’ouvrage, en taille « pour aveugles » mais ils n’aident pas tellement à l’exception des quelques diagrammes de séquence qui sont bienvenus.

joy-of-patterns

Référence complète : The Joy of Patterns: Using Patterns for Enterprise Development – Brandon Goldfedder – Addison Wesley / Software Patterns Series 2001 – ISBN: 0-201-65759-7

The Joy of Patterns: Using Patterns for Enterprise Development


http://www.goodreads.com/book/add_to_books_widget_frame/0201657597?atmb_widget%5Bbutton%5D=atmb_widget_1.png&atmb_widget%5Bhide_friends%5D=on

Note de lecture : Pattern Languages of Program Design vol. 2, Vlissides, Coplien & Kerth edt

Note : 5 ; Quelques bon (et même très bons patterns), toutefois noyés dans nombre de patterns de moindre intérêt.

Ce volume regroupe une sélection des contributions à la seconde conférence PLOP. La formule reste la même que pour le premier volume, avec une sélection de patterns ou de patterns languages regroupés par thèmes. La communauté se développant, la qualité de la matière utile progresse d’autant.

Une nouveauté, la première partie parle désormais d’idiomes, c’est à dire de patterns de bas niveau spécifiques à des langages. Toutefois il n’y a là rien de bien remarquable : les idiomes de Tom Cargill auront du mal à soutenir la comparaison avec ceux de Jim Coplien dans son ouvrage éponyme.

La seconde partie, les « general purpose patterns » regroupent ce que l’ouvrage a de mieux à proposer, avec spécifiquement deux patterns remarquables : Le Shopper de Jim Doble, mais surtout le Command Processor de Peter Sommerlad. Ce dernier n’est pas seulement désormais un classique, il est aussi simple, puissant et élégant.

La troisième partie « special purpose patterns » tait celle consacrée aux domaines métiers dans le volume précédent. On y trouve surtout des pattern languages qui sont intéressants sans être transcendants.

Peu de patterns dans la quatrième partie dédiée aux patterns architecturaux. Juste trois, seul « reflection » de Frank Buschmann retiendra mon attention.

Je ne suis toujours pas fan des patterns organisationnels qui nous sont proposés en cinquième et sixième parties. L’organisational Patterns for Team prélude certaines pratiques agiles. Episodes de Ward Cunningham est souvent référencé d’une part à cause du nom de l’auteur et d’autre part car certains patterns seront repris par Kent Beck dans l’extreme programming.

Le « concurrent programming / distributed systems » de la partie 7 est une excellente fournée. Je citerais juste le « half sync / Half-async » de Douglas C. Schmidt et Charles Cranor.

En comparaison, la partie 8 sur les « reactive systems » m’a parue un peu pauvre.

Si l’ouvrage est loin d’être indispensable, il pourra intéresser à ceux qui portent un intérêt actif aux patterns. Et un nombre non négligeable des patterns présentés sont loin d’être dénués d’intérêt.

PLOPD-vol2

Référence complète : Pattern Languages of Program Design, vol. 2 –  John Vlissides, James Coplien & Norman L. Kerth edt – Addison Wesley 1996 – ISBN : 0-201-89527-7

Pattern Languages of Program Design 2


http://www.goodreads.com/book/add_to_books_widget_frame/0201895277?atmb_widget%5Bbutton%5D=atmb_widget_1.png&atmb_widget%5Bhide_friends%5D=on

Note de lecture : Pattern Language of Program Design, James Coplien & Douglas Schmidt edt

Note : 4 ; Pour les “accros” des patterns, exclusivement.

Le mouvement des “Design Patterns” a donné naissance aux conférences PLOP d’abord (aux Etats-Unis, à l’université d’Urbana Champain, Illinois), puis EuroPLOP (Kloster Irsee, Allemagne). Ce volume regroupe une sélection des papiers soumis par les participants à la première conférence PLOP. C’était alors le début de cette conférence, en conséquence la sélection n’est pas sévère, les patterns soumis peu ou pas “compétitifs”, souvent très généraux, plus centrés sur les concepts (ce que l’on qualifie parfois d’approche Alexandrienne) que sur le design. Enfin, une place importante est prise par les patterns “organisationnels”.

Sans rentrer dans les détails, voici une idée générale de la structure de cette compilation :

La première partie « frameworks et composants » regroupe des patterns et patterns languages de niveau très conceptuels pour architecturer des applications.

La seconde partie « systems and distributed processing » regroupe des patterns à caractères architecturaux. C’est l’une des plus intéressante du livre.

Dans la troisième partie « business objects » on retrouvera des patterns et pattern language liés à des domaines métier.

La quatrième partie « process and organization » regroupe exclusivement des patterns languages. C’est celle qui m’a le moins accroché.

La cinquième partie « design patterns and catalogs » est dédiée aux papiers ayant trait à l’étude des patterns : catégorisation, mise en évidence, documentation. C’est intéressant dans le principe, mais hélas ennuyeux dans les faits.

La sixième partie « architecture and communication » promettait d’être intéressante, mais le traitement des patterns qui y figurent est trop littéraire à mon goût pour présenter un réel intérêt. Le « POSA book » adressera cela beaucoup mieux !

La septième partie « object usage and style » ne donne pas tellement lieu à commentaire, si ce n’est que les patterns qui y figurent ne resteront pas dans les annales.

La dernière partie « events and events handlers » a je pense été créée car plusieurs patterns apparaissaient dans cette catégorie.

Certains patterns se détachent du lot, par exemple :

  • Half-object + protocol de Gerard Meszaros
  • Master-Slave pattern de Frank Buschmann
  • Reactor de Doug Schmidt
  • Le CHECKS pattern language de Ward Cunningham qui est l’un des rares pattern language de cette édition à mériter le détour.
  • Dans les patterns organisationnels, une petite curiosité : le « Lifecycle and Refactoring Patterns that Support » qui est en fait une prémice du futur « Refactoring » paru en 1999.

Certes la substance utile est plus importante que celle que j’ai cité. Mais beaucoup des patterns et surtout des patterns languages sont plus des essais à l’intérêt académique que de la matière exploitable. Pour qui veut se plonger dans l’étude des Patterns, ce volume a un intérêt ne serait-ce qu’historique. C’est mon cas. Mais pour beaucoup, ce volume sera à la fois trop aride et pas assez pourvu de matière exploitable en regard de ses 550 pages.

En vérifiant sur Amazon, j’ai la surprise de constater que ce livre est toujours disponible 17 après sa parution ! Je ne le recommande toutefois qu’exclusivement aux aficionados des patterns ! 

PLOPD

Référence complète : Pattern Language of Program Design – James Coplien & Douglas Schmidt edt – Addison Wesley / Software Patterns series 1995 – ISBN: 0-201-60734-4

Pattern Languages of Program Design


http://www.goodreads.com/book/add_to_books_widget_frame/0201607344?atmb_widget%5Bbutton%5D=atmb_widget_1.png&atmb_widget%5Bhide_friends%5D=on

Note de lecture : Patterns for Parallel Programming, par Mattson, Sanders & Massingill

Note: 5 ; Le grid computing sous forme de patterns, mais pas à l’usage des débutants!

Difficile de classer ce livre! De prime abord, il est destiné à aborder le grid computing sous l’angle conceptuel, plutôt que par le biais d’une technologie particulière. Cela dit, le texte s’appuie de façon extensive sur 2 environnements parallèles: OpenMP et MPI. Ils sont d’ailleurs introduits de façon conséquente en annexe, pour ceux qui (comme moi) n’ont pas une culture “parallèle” étendue. Pour mener à bien leurs propos, les auteurs proposent une démarche en 4 étapes:

  • Les “finding concurrency” patterns: il ne s’agit pas vraiment de patterns ici, mais d’étape d’analyse, tel qu’on peut les trouver dans une méthode prescriptive.
  • Les “algorithm structure” patterns: ressemblent eux d’avantage à des patterns et proposent des solutions architecturales de traitement, telles que le “divide & conquer”, le “pipeline” ou le “event-based coordination”
  • Les “supporting structure patterns” décrivent les constructions logicielles, les briques de conception permettant la mise en oeuvre des architectures parallèles. La plupart d’entre elles peuvent être utilisées dans le cadre de plusieurs architectures, bien qu’avec des adéquations inégales. Ce sont probablement les “vrais patterns” de cet ouvrage, ils se nomment “master / worker” ou “fork / join”. A ce niveau, les patterns sont illustrés par du code en C, et discutés de façon plutôt exhaustive sur les détails.
  • L’”implémentation mechanism design space” décrit les mécanismes élémentaires sur lesquelles les briques de conception précédemment décrites vont s’appuyer. Nous parlons ici de gestion de threads, d’exclusion mutuelle, de partage mémoire ou de passage de messages, entre autre. Ces mécanismes sont décrits séparément pour les environnements OpenMP et MPI.

En conclusion, j’ai trouvé le livre plutôt “dense”, ce qui est probablement normal vu le sujet traité. Toutefois, il est plus difficile qu’il ne devrait être pour les non initiés, car on plonge trop vite dans les détails de code, et la conceptualisation manque cruellement, ou elle est en tout cas insuffisante, car ce devrait être le propre des patterns.

patterns-parallel-programming

Référence complète : Patterns for Parallel Programming – Timothy G. Mattson, Beverly A. Sanders & Berna L. Massingill – Addison Wesley / Software Patterns Series 2004 – ISBN: 0-321-22811-1

Patterns for Parallel Programming


http://www.goodreads.com/book/add_to_books_widget_frame/0321228111?atmb_widget%5Bbutton%5D=atmb_widget_1.png&atmb_widget%5Bhide_friends%5D=on

Note de lecture : Patterns of Enterprise Application Architecture, par Martin Fowler & al.

Note: 8 ; J’ai des scrupules à le juger excellent …

Franchement, rien que la première partie justifie l’achat du livre. En une centaine de pages, l’auteur parvient à faire le tour des aspects sur lesquels il faut opérer des choix d’architecture et les contraintes qui peuvent nous guider vers telle ou telle solution. Le tout est exposé clairement et simplement, avec limpidité devrai-je même dire, par comparaison aux autres ouvrages dédiés à l’architecture logicielle. Voilà qui devrait être une saine source d’inspiration pour les auteurs des pavés de 1000 pages !

L’auteur prend des positions nettes par rapport à ces choix, et c’est tant mieux. Cette première partie, par sa qualité et son narratif me rappelle “UML distilled” du même auteur.

En revanche c’est à “Refactoring” que me fait penser la seconde partie du livre, car Martin Fowler a utilisé ici la même présentation pour ses patterns. C’est plutôt une qualité, car j’avais déjà trouvé cette présentation claire et intéressante, même si elle tend à mettre beaucoup d’emphase sur le code (nous avons le droit à du Java – essentiellement – et aussi du C#) et parfois pas assez l’accent sur l’essence de la solution. Ces patterns (il y en a tout de même 51) sont regroupés en “thèmes” qui font le pendant aux chapitres de la première partie :

  • Organisation de la logique métier.
  • Architecture des sources de données
  • Mapping comportemental objet-relationnel
  • Mapping structural objet-relationnel
  • Mapping objet-relationnel des métadonnées
  • Présentation Web
  • Distribution des traitements
  • Gestion transactionnelle
  • Gestion des états
  • Patterns de base

Ce qui m’a certainement le plus troublé (et même choqué, devrais-je dire), c’est l’absence de référence aux autres ouvrages ! Et pourtant il devrait y en avoir. Pire : nombre de patterns présentés ici ne sont guère que des reprises de patterns déjà publiés. Les indécrottables de la galaxie Patterns (j’en fais partie) s’en offusqueront. C’est ce dernier point qui m’incite à ne pas attribuer un 10 à cet excellent livre. Il y a toutefois un aspect pratique : nous avons un livre complet et auto-suffisant de patterns applicatifs dans lesquels faire notre marché pour les applications d’entreprise. Et cet ouvrage est de haute qualité, cela mérite certainement quelques concession… Martin Fowler nous a plus ou moins suggéré qu’il pourrait y avoir un second volume: nous l’attendons toujours…

patterns-enterprise-architecture

Référence complète : Patterns of Enterprise Application Architecture – Martin Fowler with David Rice, Matthew Foemmel, Edward Hieatt, Robert Mee and Randy Stafford – Addison Wesley / Signature series 2002 – ISBN: 0-321-12742-0

Patterns of Enterprise Application Architecture


http://www.goodreads.com/book/add_to_books_widget_frame/0321127420?atmb_widget%5Bbutton%5D=atmb_widget_1.png&atmb_widget%5Bhide_friends%5D=on