<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8836872834499141113</id><updated>2012-01-02T23:48:49.357+01:00</updated><category term='alm france'/><category term='Dependancy Injection (DI)'/><category term='design patterns'/><category term='ddd'/><category term='TDD'/><category term='tfs'/><category term='Agile'/><category term='devpath'/><category term='Inversion of Control (IoC)'/><category term='playground'/><category term='organisation'/><category term='alm'/><category term='cqrs'/><category term='communication'/><category term='service bus'/><category term='Blog'/><category term='Application Architecture'/><category term='teaching'/><category term='nas'/><category term='Alt.NET'/><title type='text'>Software engineering blog of Clément Bouillier</title><subtitle type='html'>Microsoft technologies (and others), architecture, project methodology (Agile &amp;amp; others), tools...and more general IT subjects</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-3714384907057241202</id><published>2011-11-10T01:06:00.001+01:00</published><updated>2011-11-10T01:06:32.165+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='teaching'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Agile teaching thoughts</title><content type='html'>I come back from an event organized by &lt;a href="http://blog.institut-agile.fr/2011/10/enseignement-agile-le-9-novembre.html"&gt;Institut Agile&lt;/a&gt; (Paris). It was a first workshop on what could be done to leverage Agile learning in initial formation. First, we have shared visions in the afternoon (think big, too big some would say ;)), and we had not enough time to talk in detail about action plan (act small).&lt;br /&gt;I have to say that I appreciate that type of event, mostly for point of views diversity, which leads to lots of exchanges.&lt;br /&gt;&lt;br /&gt;Then in the evening, we had some experience feedback from &lt;a href="http://www.aubryconseil.com/"&gt;Claude Aubry&lt;/a&gt;,&amp;nbsp;Jean-Luc Lambert, &lt;a href="http://www.linkedin.com/pub/fr%C3%A9d%C3%A9ric-dufau-joel/15/9b6/889"&gt;Frédéric Dufau-Joël&lt;/a&gt;&amp;nbsp;and &lt;a href="http://www.agilex.fr/"&gt;Alexandre Boutin&lt;/a&gt;. Lots of interesting feedbacks, I keep in mind :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Avoid lecture, prefer interactive course, use lots of games (role playing)&lt;/li&gt;&lt;li&gt;In France, we have the challenge to change student mindset, which has been inculcated in until they get to (under-)graduate level. They have been too much protected and now they are not enough autonomous, confident and too naïve about reality and scared by errors, they need to be given sense of responsability and to let them do errors without reprimands&lt;/li&gt;&lt;li&gt;Avoid compartmentalized course, integrate them to make a coherent whole teaching project&lt;/li&gt;&lt;li&gt;Take care (avoid) of individual grading, encourage team collaboration and so team grading&lt;/li&gt;&lt;li&gt;Give real projects to lead using learned techniques&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;My current vision of Agile teaching&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;From our discussion, I would summarize the vision to adopt through answers to the following questions (it is my point of view, not necessarily shared with every members of the community) :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Why do we need to teach Agile ? &lt;/b&gt;To share Agile spirit that promotes fun, motivation, responsability, commitment, questionning..much more than techniques, it is a mindset. In the end, it would result for sure in a world with much more common sense than the one we live in.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Where do we like to go ?&lt;/b&gt; We need to influence public authorities, teaching program management through "lobbying" and why not leverage fundamental research in this field (even if I think it is partially covered with several human sciences and computer science researches)&lt;/li&gt;&lt;li&gt;&lt;b&gt;What is the content to teach ?&lt;/b&gt; We have to build sort of referential of Agile practices and techniques and requirements to be able to understand Agile.&lt;/li&gt;&lt;li&gt;&lt;b&gt;How do we teach Agile ?&lt;/b&gt;&amp;nbsp;We need to share teaching practices, to make more and more experience feedback (in fact, to apply Agile principle to our approach...).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Who is targeted ?&lt;/b&gt; Every student that could be involved in an IT project given its initial formation, from the "classic" software engineers to management/commercial profiles (and even any student if we want to spread only the Why...).&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Things I would like to dig&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, I would like to start teaching Agile with small courses. But then, I think it would be great to build incrementally a teaching project around following axes:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Around technical, behavioral and methodological integrated/related courses,&lt;/li&gt;&lt;li&gt;With lots of practice and games rather than lecture,&lt;/li&gt;&lt;li&gt;The whole applied through real projects that are needed by their customers (not fake ones)&lt;/li&gt;&lt;li&gt;With implication of professionals strongly related to teaching staff (ex: close relationship between almuni and teaching staff)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Now it is time for action. And I will continue to participate to this new community for sure. Thanks to all participants, I enjoy this moment.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-3714384907057241202?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/3714384907057241202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=3714384907057241202' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/3714384907057241202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/3714384907057241202'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2011/11/agile-teaching-thoughts.html' title='Agile teaching thoughts'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-7414724260194503165</id><published>2011-10-07T23:14:00.001+02:00</published><updated>2011-10-09T21:50:17.324+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='organisation'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Specialization in Agile (part 1) : other visions than hyperspecialization</title><content type='html'>&lt;p&gt;I would like to write a post on this subject for a while (amongst lots of other…), and a post of Mike Cohn about &lt;a href="http://blog.mountaingoatsoftware.com/agile-in-the-age-of-hyperspecialization"&gt;Agile in the Age of Hyperspecialization&lt;/a&gt; reminds me the subject (in addition it is also a recurring subject at work for me). I wrote some comments on his blog, but I would like to detail a little bit here.&lt;/p&gt;  &lt;p&gt;First of all, I am not confortable with the analogy done between manufacturing activities (or buildings and civil works) and IT industry, which basically leads to reduce developers to “simple” workers that could work in a production line (cf. Ford, with respect for manufacturing workers)…and I think that’s a point that is totally missed with hyper-specialisation. &lt;/p&gt;  &lt;p&gt;I prefer other visions more suitable to our industry. In this first post, I will talk about “cultivate your code” analogy, “mentofacturing”, and feature teams approach.   &lt;br /&gt;Then in a second post, I will dive into an illustration of what could be stereotypical organization nowadays with “hyperspecialization” and my vision (shared and applied in my team), which is best aligned with Agile and Lean principles from my point of view.&lt;/p&gt;  &lt;h2&gt;“Cultivate your code”, a refreshing analogy&lt;/h2&gt;  &lt;p&gt;Classic analogies applied to IT industry are with buildings and civil works or manufacturing. But IT industry is fundamentally different from these industries. I will expose some arguments of another analogy, called “&lt;a href="http://benoit.gantaume.net/il-faut-cultiver-son-code.html"&gt;cultivate your code&lt;/a&gt;” I discover through Benoît Gantaume (in French but page translation can help non French speaker).&lt;/p&gt;  &lt;p&gt;We often mimic processes of buildings and civil works. They are justified by the fact that once you have built a building, it is very hard to change it, it will not evolve as much as an application will. So they need to make lots of studies, to check every details before they lay the foundations. At the opposite, in software, it is very important to be able to build an application that can evolve quickly and potentially in depth (i.e not only on the surface). Moreover, an application that is not evolving will degrade through surface maintenance only, that’s why Benoît Gantaume compares it to vegetal with lots of comparison of day to day activities with those we can see in a garden (I let you read his post). The main idea is that a garden needs constant cares and a software is comparable in this way.&lt;/p&gt;  &lt;p&gt;We like (in IT industry) to use manufacturing wording, notably industrialization. Note also that products are completely different, in manufacturing, products are designed once and built several times on production line. Software is absolutely not in the same case, it is unique, designed once and built once. About industrialization, we apply recipes of the XXth century (or even XIXth) with industrialization through (overly-)manual production line adapted to IT through hyper-specialisation. We do not use enough tools and automation at the service of individuals in IT whereas it is far more simple and cheaper than in manufacturing (installing software versus building robots). These arguments are not covered by Benoît, but I think it is like using the good tools to maintain your garden, rather than using only your hands. Even worst, we often use tools that constrain individuals, as if you would try to dig with a rake…&lt;/p&gt;  &lt;h2&gt;“Mentofactoring” &lt;/h2&gt;  &lt;p&gt;I heard for the first this word at USI 2011 event (for those understanding french – even if you have an english traduction also – &lt;a href="http://bit.ly/pTuyM2"&gt;here is the webcast&lt;/a&gt;). It was presented by Vincent Lextrait. He started writing a book and first chapters are available at &lt;a href="http://www.mentofacturing.com/"&gt;http://www.mentofacturing.com/&lt;/a&gt;. I try to summarize key points, but encourage you to read at least home page, which give a good overview.&lt;/p&gt;  &lt;p&gt;The reasons why Adam Smith advises divison of labor was based on different parameters than those that characterize work today. First, there was a shift with computers, that minimize cost of loosing time by switching tools. Second, there is far more variations in intellectual productivity than in manual productivity. Third, there is far more interpersonal dependency in intellectual activities than in manual ones.&lt;/p&gt;  &lt;p&gt;It concludes that management (and so work organization) of these kind of activities cannot be the same as in classical industries (buildings or manufacturing typically).&lt;/p&gt;  &lt;h2&gt;Feature Teams&lt;/h2&gt;  &lt;p&gt;I read this from Craig Larman and Bas Voode book on Agile scaling about organizational tools &lt;a href="http://bit.ly/oFtSAM"&gt;http://bit.ly/oFtSAM&lt;/a&gt;, and specifically in chapter Feature Team (&lt;a href="http://www.craiglarman.com/wiki/downloads/scaling_lean/larman-vodde-feature-teams.pdf"&gt;accessible here&lt;/a&gt;). The authors focus on Lean manufactoring in their book (finally even manufacturing has new vision…). It is really well explained, I will just paraphrase some part.&lt;/p&gt;  &lt;p&gt;The main idea is “one single cross-functional team that completes end-to-end customer features”. It is justified by Lean theory : “In lean hinking, minimizing the wastes of handoff, waiting, WIP, information scatter, and underutilized people is critical”. They also insist on the fact that each team member has not only one speciality, each one has primary skills, but with help of other team members, each member can complete an end-to-end customer feature (reference to “&lt;a href="http://bit.ly/9AOqRL"&gt;generalizing specialist&lt;/a&gt;” introduced by Scott Ambler). Moreover, learning is at the center to share skills and knowledge.&lt;/p&gt;  &lt;p&gt;The difference between Feature Team and Feature Project is also very important. With Feature Team, you have less organizational noise due to needed coordination when several Feature Project are involved on one application. It also capitalize on a group that learn and does not break up at end of a project. And third, a Feature Team has shared ownership of code, process and skills.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;This three visions illustrate other visions than the mainstream that advocates hyperspecialisation. Next post will focus on an example.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-7414724260194503165?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/7414724260194503165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=7414724260194503165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/7414724260194503165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/7414724260194503165'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2011/10/specialization-in-agile-part-1-other.html' title='Specialization in Agile (part 1) : other visions than hyperspecialization'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-4637663006247541127</id><published>2011-01-03T00:36:00.000+01:00</published><updated>2011-01-03T00:36:17.030+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='playground'/><category scheme='http://www.blogger.com/atom/ns#' term='nas'/><title type='text'>Data backup solution based on RSync with a NAS</title><content type='html'>&lt;p&gt;I have once experienced in the past some limited data loss due to a hard disk crash, and lastly, my first external hard drive starts to have some issues…I can just reiterate popular recommendations to think seriously to backup previous data as soon as you got more and more alerts, like repeated hard drive scans at startup (or when you plug it for external drives), suspicious behavior when reading data on drive…that’s what I have done lastly and I avoid lost of plenty of personal photos and videos…    &lt;br /&gt;From that moment forward, I decided to set a permanent backup solution. After having a look at web hosted solutions (not convinced completely convinced), I finally went for my own NAS, a DLink DNS-323, which is really easy to configure and extend (Linux embedded). It was also a chance to get hands dirty with Linux toys &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sourire" src="http://lh3.ggpht.com/_Kb4ZcvI6rXc/TSEL702m_6I/AAAAAAAAAE0/jJyw1OCxzGc/wlEmoticon-smile%5B2%5D.png?imgmax=800" /&gt; (long time…), but don’t be afraid to try! (except if you are just able to write documents and mails with a computer…else it could take you several long nights to get it running)&lt;/p&gt;  &lt;h3&gt;Rsync over SSH as the main toys&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Rsync"&gt;Rsync&lt;/a&gt; is an incremental files synchronization software for Unix systems. It is command-line based, but could be really powerful along with scripts. I let you search over the web for details on this tools, I will only show how I use it for backup. Note that there is several shared solutions around RSync. I was particularly inspired by &lt;a href="http://wiki.dns323.info/howto:backup_-_pc"&gt;wiki.dns323.info&lt;/a&gt; and &lt;a href="http://backupnetclone.sourceforge.net/"&gt;BackupNetClone&lt;/a&gt;. I created my own scripts since the first one is too minimalist (based on BAT scripts…outch) and I found the second one too intrusive on clients computer (need SSH deamon and RSync server on each).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://fr.wikipedia.org/wiki/Secure_Shell"&gt;SSH&lt;/a&gt; will be used to secure RSync file synchronization.&lt;/p&gt;  &lt;p&gt;To use it with Windows clients, the first thing is to install &lt;a href="http://www.cygwin.com/"&gt;Cygwin&lt;/a&gt; (or other Linux emulator), really simple, you just have to click Next until package selection, then you select RSync and OpenSSH packages (just the main, dependencies will be grabbed automatically), and then you click Next until the end.&lt;/p&gt;  &lt;p&gt;I will come back to client set up (don’t be afraid, it is just script that will have to be scheduled…) after a quick view on the server side, i.e. the NAS.&lt;/p&gt;  &lt;h3&gt;Set up NAS&lt;/h3&gt;  &lt;p&gt;My NAS, a DLink DNS-323, is Linux based. You have to use a fun_plug script that will be loaded at NAS startup. You can use ffp that includes some applications, particularly SSH and RSync daemons. Follow instructions in the following link to install it: &lt;a href="http://wiki.dns323.info/howto:ffp"&gt;wiki.dns323.info/howto:ffp&lt;/a&gt;.&lt;/p&gt;  &lt;h5&gt;&lt;font style="font-weight: normal"&gt;Typically, you will set up a backup account on DNS-323 through admin interface (&lt;/font&gt;&lt;font style="font-weight: normal"&gt;http://[NAS IP&lt;/font&gt;&lt;font style="font-weight: normal"&gt;]), add a &amp;quot;backup&amp;quot; account in the Advanced tab. Next, you can c&lt;/font&gt;hange home and shell in /etc/passwd.&lt;/h5&gt;  &lt;h3&gt;Set up clients&lt;/h3&gt;  &lt;p&gt;First, you have to configure the client once, then you would probably change configuration of which folders to backup.&lt;/p&gt;  &lt;h5&gt;First time set up&lt;/h5&gt;  &lt;p&gt;I explain here what you have to do once for each client computer (i.e. one to backup):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;1. generate SSH keys that will be used next:&lt;/p&gt; &lt;/blockquote&gt;  &lt;pre class="csharpcode"&gt;ssh-kengen -t dsa –b1024&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;You can let the default key path. Do not provide any passphrase if you want to automate your backups (it would ask it each time you want to backup).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;  &lt;p&gt;2. copy SSH public key of client to the NAS with:&lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;ssh-copy-id -i ~/.ssh/id_dsa.pub backup@[dns-323 IP]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I have packaged this in a script along with some simple configuration (IP, backup user name…).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;&lt;/h5&gt;&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;What to backup?&lt;/h5&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;My scripts (explained below) will search for configuration files, each giving one path to backup with its destination path on the NAS:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;# Local path to backup, use /cygdrive/[drive letter]/... syntax&lt;/span&gt;&lt;br /&gt;LOCAL_PATH_TO_BACKUP=&lt;span class="str"&gt;&amp;quot;/cygdrive/c/testbackup&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;# [Optional] Target Rsync module -&amp;gt; override global settings&lt;/span&gt;&lt;br /&gt;&lt;span class="rem"&gt;#TARGET_MODULE=&amp;quot;backup&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="rem"&gt;# Target path in module&lt;/span&gt;&lt;br /&gt;TARGET_PATH=&lt;span class="str"&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;Launch a backup&lt;/h5&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I have a launchBackup.bat script that launches the backup.sh script through Cygwin. In this script, I load configuration from setup, I set up a SSH tunnel, then start rsync and finally close SSH tunnel.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;RSync command is:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;rsync -aivx --port ${SSH_TUNNEL_LOCAL_PORT} --chmod +rwx ${LOCAL_PATH_TO_BACKUP} 127.0.0.1::${TARGET_MODULE}/${TARGET_PATH}&lt;/pre&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt;	font-size: small;&lt;br /&gt;	color: black;&lt;br /&gt;	font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt;	background-color: #ffffff;&lt;br /&gt;	/*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt;	background-color: #f4f4f4;&lt;br /&gt;	width: 100%;&lt;br /&gt;	margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Parameters name talk by themselves, –aivx are some common options of rsync. I don’t have yet set up incremental backup with --link-dest (hard linking option) and I am wondering about using –-delete that removes on server also what have been removed from your client folders (then you have to make sure that one server path is only used by one client to avoid massive deletions…).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Don’t forget to check your Firewall settings if you get some “Connection refused”-like errors.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;Scheduling&lt;/h5&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;You can simply rely on Windows Tasks scheduler. And you are done!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Assessment…&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Not so pricy, I got the NAS for 100€ + 70€ for 1,5To hard disk drive. It is quite easy to set up, open as you are the only master of your backup, and then easily configurable/extendable and with unlimited possibilities.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;About security, it removes hardware failure but do not protect from other more serious domestic risks like burglary, fire…but for that I got an idea, it is to build a small network of NAS like that (two to start…) with some parents for example, providing us a backup solution by the way &lt;img style="border-bottom-style: none; border-right-style: none; border-top-style: none; border-left-style: none" class="wlEmoticon wlEmoticon-smile" alt="Sourire" src="http://lh3.ggpht.com/_Kb4ZcvI6rXc/TSEL702m_6I/AAAAAAAAAE0/jJyw1OCxzGc/wlEmoticon-smile%5B2%5D.png?imgmax=800" /&gt;…&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;And a final word about environment impacts, I have bough an energy meter and it consumes only 10 Watts when idle (most of the time), quite good finally.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-4637663006247541127?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/4637663006247541127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=4637663006247541127' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/4637663006247541127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/4637663006247541127'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2011/01/data-backup-solution-based-on-rsync.html' title='Data backup solution based on RSync with a NAS'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_Kb4ZcvI6rXc/TSEL702m_6I/AAAAAAAAAE0/jJyw1OCxzGc/s72-c/wlEmoticon-smile%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-7487120058179614737</id><published>2011-01-02T01:10:00.000+01:00</published><updated>2011-01-02T01:32:00.935+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tfs'/><category scheme='http://www.blogger.com/atom/ns#' term='alm'/><title type='text'>Combine Hierarchy/Work Item/Date dimensions in TFS 2010 cube</title><content type='html'>&lt;div style="text-align: left"&gt;I start using TFS 2010 cube to make a Product Burndown chart based on Story Points (Y axis) over time (X axis) and State (series) of User Story and Defect work item types of our custom process template (customized from User Story and Bug ones found in MSF Agile process template).&lt;/div&gt;  &lt;div&gt;   &lt;div style="text-align: center"&gt;&amp;#160;&lt;/div&gt;    &lt;div&gt;&lt;b&gt;&lt;font style="font-size: large" class="Apple-style-span"&gt;Basics...&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;    &lt;div&gt;With Excel, it was really simple to do it: connect to the cube, use Date and Work Item Dimensions with Story Points Measure and tada, it is done. Ok, well, in fact, it was not exactly what we would like, because we work on a legacy application...so we have User Stories and Defects on different subjects, what we have modelled using a Project work item type that contains related User Stories and Defects. &lt;/div&gt;    &lt;div&gt;For example, we have a &amp;quot;Maintenance&amp;quot; Project (not really ending btw...) which contains all production bugs we are fixing, and &amp;quot;Project A&amp;quot; and &amp;quot;Project B&amp;quot; Projects, each ones classically having a given budget and start/end dates.&lt;/div&gt;    &lt;div&gt;&amp;#160;&lt;/div&gt;    &lt;div&gt;&lt;b&gt;&lt;font style="font-size: large" class="Apple-style-span"&gt;...deeper...outch ! Problem !&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;    &lt;div&gt;My team has several Projects on one application at the same time, each from 20 man days up to several hundreds man days, but we keep only one iteration/product backlogs for the whole team on this application. Then, each Product Backlog item is related to one Project.&lt;/div&gt;    &lt;div&gt;Then, I would like to have a Product Burndown chart restricted to items related to a particular Project. It would help to see how its Product Backlog items are evolving over time and to manage effort needed to keep this Project on track.&lt;/div&gt;    &lt;div&gt;I would think that Work Item Tree Dimension would help me...but trying to add it as filter to my Excel report, it does nothing !&lt;/div&gt;    &lt;div&gt;In fact, it is an expected behaviour. I understand it digging into SQL Server Analysis Services features (I never had a look at before...) and TFS 2010 cube configuration. There are several explanations:&lt;/div&gt; &lt;/div&gt;  &lt;ul&gt;   &lt;li&gt;Dimensions are associated to one/several Measure Group, and the 3 dimensions I 'd like to use are not all together in a same Measure Group, Measure Group examples:     &lt;ul&gt;       &lt;li&gt;Work Item includes Work Item and Date Dimensions, but not Work Item Tree one&lt;/li&gt;        &lt;li&gt;Work Item To Tree includes Work Item and Work Item Tree Dimensions, but not Date one&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Story Points Measure is a calculated member associated with Work Item History Measure Group, and it is calculated based on hidden Story Points Measure of this Measure Group&lt;/li&gt; &lt;/ul&gt;  &lt;p align="center"&gt;&lt;a href="http://lh5.ggpht.com/_Kb4ZcvI6rXc/TR_Hb9v24gI/AAAAAAAAAEU/2OSWpOd2qFw/s1600-h/TFSCube-MeasureGroups%5B3%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="TFSCube-MeasureGroups" border="0" alt="TFSCube-MeasureGroups" src="http://lh3.ggpht.com/_Kb4ZcvI6rXc/TR_Hcqr5qgI/AAAAAAAAAEY/wrksXjSMAGk/TFSCube-MeasureGroups_thumb%5B1%5D.png?imgmax=800" width="505" height="242" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div align="left"&gt;Trust me that other Measure Groups do not include at least 2 of these Dimensions...and none include the 3.&lt;/div&gt;  &lt;div&gt;&amp;#160;&lt;/div&gt;  &lt;div&gt;&lt;b&gt;&lt;font style="font-size: large" class="Apple-style-span"&gt;Solution&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;  &lt;div&gt;So the solution was:&lt;/div&gt;  &lt;ul&gt;   &lt;li&gt;to add a view to TFS datawharehouse combining Fact tables containing Work Item facts and Hierarchy facts (no change to datawharehouse loading process!)&lt;/li&gt; &lt;/ul&gt; &lt;code&gt;   &lt;div&gt;ALTER VIEW vFactWorkItemHistoryToTree&lt;/div&gt;    &lt;div&gt;AS&lt;/div&gt;    &lt;div&gt;SELECT wih.*, witt.WorkItemTreeSk&lt;/div&gt;    &lt;div&gt;FROM dbo.FactWorkItemHistory wih&lt;/div&gt;    &lt;div&gt;&lt;font style="white-space: pre" class="Apple-tab-span"&gt; &lt;/font&gt;INNER JOIN dbo.DimWorkItem wi1 on wih.WorkItemSK = wi1.WorkItemSK&lt;/div&gt;    &lt;div&gt;&lt;font style="white-space: pre" class="Apple-tab-span"&gt; &lt;/font&gt;INNER JOIN dbo.DimWorkItem wi2 on wi2.System_Id = wi1.System_Id&lt;/div&gt;    &lt;div&gt;&lt;font style="white-space: pre" class="Apple-tab-span"&gt; &lt;/font&gt;INNER JOIN dbo.vFactWorkItemToTree witt on wi2.WorkItemSK = witt.WorkItemSK&lt;/div&gt;    &lt;div&gt;GO&lt;/div&gt; &lt;/code&gt;  &lt;ul&gt;   &lt;li&gt;to change TFS cube DataSource to add the new view and link it to related Dim tables (derived from FactWorkItemHistory for example), just use the designer included in Business Intelligence Studio (you open Analysis Services database directly on server with it)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_Kb4ZcvI6rXc/TR_HdGDLevI/AAAAAAAAAEc/aztpCqjbez8/s1600-h/DataSourceViewDesigner%5B7%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="DataSourceViewDesigner" border="0" alt="DataSourceViewDesigner" src="http://lh6.ggpht.com/_Kb4ZcvI6rXc/TR_HdumcPGI/AAAAAAAAAEg/rhNkOaIHW2s/DataSourceViewDesigner_thumb%5B5%5D.png?imgmax=800" width="418" height="394" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;to add a new Measure Group with the 3 Dimensions I need (derived from Work Item History Measure Group for example, with Work Item Tree dimension added)&lt;/li&gt; &lt;/ul&gt;  &lt;p align="center"&gt;&lt;a href="http://lh4.ggpht.com/_Kb4ZcvI6rXc/TR_HeNRUoJI/AAAAAAAAAEk/jY01LskGwD0/s1600-h/TFSCubeModified-MeasureGroups%5B7%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="TFSCubeModified-MeasureGroups" border="0" alt="TFSCubeModified-MeasureGroups" src="http://lh4.ggpht.com/_Kb4ZcvI6rXc/TR_He4JNIuI/AAAAAAAAAEo/9VC1ZlUVX2U/TFSCubeModified-MeasureGroups_thumb%5B3%5D.png?imgmax=800" width="381" height="214" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;to add a calculated member based on hidden Story Points Measure of the new Measure Group (within Business Intelligence Studio, open Team System cube –&amp;gt; Calculations tab to add the new calculated member, and associate it with Measure Group with Calculation Properties icon)&lt;/li&gt; &lt;/ul&gt; &lt;code&gt;   &lt;div&gt;-- Story Points with Hierarchy Tree dimension&lt;/div&gt;    &lt;div&gt;-- Just a part of MDX request to show we use vFactWorkItemHistoryToTree member of our new measure group...&lt;/div&gt;    &lt;div&gt;CREATE MEMBER CURRENTCUBE.[Measures].&lt;/div&gt;    &lt;div&gt;&lt;/div&gt;    &lt;div&gt;[Microsoft_VSTS_Scheduling_StoryPoints_Tree] AS &lt;/div&gt;    &lt;div&gt;...&lt;/div&gt;    &lt;div&gt;Sum&lt;/div&gt;    &lt;div&gt;(&lt;/div&gt;    &lt;div&gt;[Date].[Date].[Date].MEMBERS.Item(0) : [Date].[Date].CurrentMember&lt;/div&gt;    &lt;div&gt;,[Measures].[vFactWorkItemHistoryToTree Microsoft_VSTS_Scheduling_StoryPoints]&lt;/div&gt;    &lt;div&gt;)&lt;/div&gt;    &lt;div&gt;...&lt;/div&gt; &lt;/code&gt;  &lt;div&gt;&amp;#160;&lt;/div&gt;  &lt;div&gt;&lt;a href="http://lh4.ggpht.com/_Kb4ZcvI6rXc/TR_HfZFDnHI/AAAAAAAAAEs/wRBHBFLjOuo/s1600-h/CalculatedMember%5B11%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="CalculatedMember" border="0" alt="CalculatedMember" src="http://lh5.ggpht.com/_Kb4ZcvI6rXc/TR_Hf4RinSI/AAAAAAAAAEw/lYjBXgm1aNc/CalculatedMember_thumb%5B5%5D.png?imgmax=800" width="499" height="186" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div&gt;&amp;#160;&lt;/div&gt;  &lt;div&gt;&lt;b&gt;&lt;font style="font-size: large" class="Apple-style-span"&gt;...even deeper with the same solution&lt;/font&gt;&lt;/b&gt;&lt;/div&gt;  &lt;div&gt;Then, I can do what I wanted with Excel, i.e filter on each Project to have a Burndown chart on each.&lt;/div&gt;  &lt;div&gt;Note it can be declined with any work item hierarchy. For example, we also have a Release work item type in our process template, allowing to manage releases contents. Then we can follow how Release backlog evolves through a Burndown chart.&lt;/div&gt;  &lt;div&gt;&amp;#160;&lt;/div&gt;  &lt;div align="center"&gt;&lt;a href="http://lh5.ggpht.com/_Kb4ZcvI6rXc/TR-5Iaqg9oI/AAAAAAAAAD0/mKwMKZ9xUlU/s1600-h/project%20burndown%20chart%5B4%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="project burndown chart" border="0" alt="project burndown chart" src="http://lh5.ggpht.com/_Kb4ZcvI6rXc/TR-5JNINjzI/AAAAAAAAAD4/lvONCh7LVsw/project%20burndown%20chart_thumb%5B2%5D.png?imgmax=800" width="646" height="259" /&gt;&lt;/a&gt;&lt;/div&gt;  &lt;div&gt;&amp;#160;&lt;/div&gt;  &lt;div&gt;Don't be afraid to look at TFS cube, it took me 2 days to find out what I need (starting with no skills in SSAS...). It can be very powerful.&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-7487120058179614737?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/7487120058179614737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=7487120058179614737' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/7487120058179614737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/7487120058179614737'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2010/11/combine-hierarchywork-itemdate.html' title='Combine Hierarchy/Work Item/Date dimensions in TFS 2010 cube'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_Kb4ZcvI6rXc/TR_Hcqr5qgI/AAAAAAAAAEY/wrksXjSMAGk/s72-c/TFSCube-MeasureGroups_thumb%5B1%5D.png?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-2830549611885434615</id><published>2010-11-30T21:40:00.003+01:00</published><updated>2010-11-30T23:52:01.697+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='service bus'/><category scheme='http://www.blogger.com/atom/ns#' term='Alt.NET'/><title type='text'>Alt.Net Paris session summary : "Build your own service bus" by Romain Verdier &amp; Julien Lavigne du Cadet</title><content type='html'>&lt;div&gt;&lt;a href="http://codingly.com/"&gt;Romain&lt;/a&gt; and &lt;a href="http://www.thedotnetfrog.fr/"&gt;Julien&lt;/a&gt; made a presentation/feedback about their experience in implementing their own Service Bus in ABC Arbitrage (thanks for the commodities). In addition to this summary, I encourage you to have a look at &lt;a href="http://prezi.com/ezeeeo6xysbz/altnet-build-your-own-service-bus/"&gt;their (impressive Prezi) presentation&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They started with an overview of the context in which service bus notion is considered, reviewing some low-level concepts of MOM (Message Oriented Middleware) and giving a quick view on EAI/ESB concepts. These are the two exterme sides of the subject and set their implementation around two goals:&lt;/div&gt;&lt;div&gt;- add an abstraction layer to the MOM solutions, with lot of wanted conventions that help to simplify configuration, but keeping the power of these tools like interoperability, reliable message infrastructure...&lt;/div&gt;&lt;div&gt;- make far more simpler than EAI/ESB solutions and platform specific&lt;/div&gt;&lt;div&gt;Obviously, this subject is around Message driven architecture.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Next they went deeper in service bus concepts, that some solution they cited also implement. As they said, they did not invent anything.&lt;/div&gt;&lt;div&gt;First subject was about Message dispatching (how):&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;send: a message to one conterparty waiting a response&lt;/li&gt;&lt;li&gt;publish: a message to anyone who wants to pull it without any response&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;From these two methods, we see that there is two sorts of Message that they implements with two distinct Message concepts:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Command that are sent -&gt; tell someone to do something (note the imperative tense)&lt;/li&gt;&lt;li&gt;Event that are published -&gt; tell anyone wants to listen that something happened (note the passive tense)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Next, they talked about Sagas that allow to take care of long-running transactions. Their example of a trading application was judicious to understand it. Basically, it receives a "complex" trading order that will be decomposed in simpler orders (in order to accomplish the requested order without revealing the whole intention to the market...). &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;A Saga is initiated by a Command or an Event&lt;/li&gt;&lt;li&gt;It starts a process that send Command/publish Events&lt;/li&gt;&lt;li&gt;It goes to sleep until waken by another Command or Event&lt;/li&gt;&lt;li&gt;...and it starts over, until the Saga determines it has reached its goal, then it ends.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;They also quickly talked about some other (important) details like Pipelines for cross-cutting concerns, Time Service to manage Saga time out typically, Prototype Buffer for interoperable message serialization...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The main thing I would remind about implementation is the convention based aspect. It simplifies configuration (5 lines as they said) and hides some technical details, and then it allows to build the software with a bigger insight in Business value that any software should give to their users. It could be seen as a restrictive framework (just two concepts), but I truely think that it helps abstract from technical topics and focus on business value, and that these concepts are well suited to describe business goals.&lt;/div&gt;&lt;div&gt;Note that we did not talk about lots of related subjects like Event Sourcing, DDD...perhaps the next time :)...but we can say that Message driven architecture does not exclude other paradigms.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-2830549611885434615?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/2830549611885434615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=2830549611885434615' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/2830549611885434615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/2830549611885434615'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2010/11/altnet-paris-session-summary-build-your.html' title='Alt.Net Paris session summary : &quot;Build your own service bus&quot; by Romain Verdier &amp; Julien Lavigne du Cadet'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-2690838844410304491</id><published>2010-11-30T21:13:00.004+01:00</published><updated>2010-11-30T23:51:32.375+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='devpath'/><title type='text'>error MSB6006: "ResGen.exe" exited with code -532459699</title><content type='html'>I write my first tip blog post to talk about the following error I got stuck one hour (far too long...) without any search results on Google:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;error MSB6006: "ResGen.exe" exited with code -532459699&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I got this error when compiling a project targeting 3.5 framework with VS2010, which includes some resource file with CustomAction set to generate associated code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In fact, I was doing some change to my configuration. Long time ago, I had set up the use of DEVPATH (configure it in the machine.config on dev machine). Due to a problem explained next, I have removed the DEVPATH environement variable, but keeping machine.config as is (to avoid full reconfiguration in case I would need temporarily the DEVPATH...ok I am really lazy :)). &lt;/div&gt;&lt;div&gt;Then, I discover that ResGen.exe fails, I find it when I launched compilation from command line with MSBuild and it was clear in exception trace details...really bad! (note that it works when you do not have RESX files...)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By the way, you should avoid using DEVPATH. It tries to replace GAC, but in fact it fails since it does not take care of DLL versions. But do not through it away to quickly, it could be useful to debug tier DLL for example without modifying all your references...&lt;/div&gt;&lt;div&gt;I found it when I have to install EntLib 5.0 side to side with EntLib 4.1...then only DLL found in first path referenced in DEVPATH was taken in account.&lt;/div&gt;&lt;div&gt;So 2 solutions: you are not lazy and you remove configuration in machine.config OR you are lazy and you set DEVPATH environment variable to something else than empty one  (for example "D:").&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-2690838844410304491?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/2690838844410304491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=2690838844410304491' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/2690838844410304491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/2690838844410304491'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2010/11/error-msb6006-resgenexe-exited-with.html' title='error MSB6006: &quot;ResGen.exe&quot; exited with code -532459699'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-3203215462256865298</id><published>2010-11-23T22:20:00.005+01:00</published><updated>2010-11-30T23:50:03.934+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tfs'/><category scheme='http://www.blogger.com/atom/ns#' term='alm'/><title type='text'>Team Foundation Server Check In Policy Pack</title><content type='html'>I search over the web for some Check In Policies for TFS, and some were founds, some really interesting in my case. I think to:&lt;div&gt;&lt;ul&gt;&lt;li&gt;old reference but interesting &lt;a href="http://msmvps.com/blogs/vstsblog/archive/2006/12/08/available-check-in-policies-for-team-foundation-server.aspx"&gt;http://msmvps.com/blogs/vstsblog/archive/2006/12/08/available-check-in-policies-for-team-foundation-server.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;newer references &lt;a href="http://checkinpolicypack.codeplex.com/"&gt;http://checkinpolicypack.codeplex.com/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;But there are several drawbacks:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;TFS Power Tools Check In Policy pack is lacking open source...you cannot contribute, too bad when you miss just an adjustment to an existing policy&lt;/li&gt;&lt;li&gt;Configurability go from none to too much&lt;/li&gt;&lt;li&gt;Too much packages with different heterogeneous deliverables (package, docs...)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;So why not an open sourced Check In Policy pack, on codeplex for example...I think we can gain from homogenization of development practices for Check-In Policies.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here are some practices I think to:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;MSI deployment with Wix : one feature by policy for example to allow flexible installation&lt;/li&gt;&lt;li&gt;Policy configuration management unified&lt;/li&gt;&lt;li&gt;Encapsulate common functionnalities in shared components (path exclusion...)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;I was thinking to this pack to share my first Check In policy around Work Items, when I discovered that TFS bundled one and TFS Power Tools one are really basic and not contributable (do not allow link/hierarchy query) !! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Could be great if several projects could merge in one...&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-3203215462256865298?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/3203215462256865298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=3203215462256865298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/3203215462256865298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/3203215462256865298'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2010/11/team-foundation-server-check-in-policy.html' title='Team Foundation Server Check In Policy Pack'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-5085246652229693270</id><published>2010-11-04T23:07:00.004+01:00</published><updated>2010-11-30T23:58:07.605+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='alm france'/><category scheme='http://www.blogger.com/atom/ns#' term='alm'/><title type='text'>First ALM France UG session</title><content type='html'>&lt;div&gt;&lt;b&gt;The session&lt;/b&gt;&lt;/div&gt;I do not remember how I found this new user group, but I was really happy to assist to this first session.&lt;div&gt;Contents were "ecumenical", differents points of view and different communities represented (ok a little bit more of .NET one...oddly...). It was a first good point :).&lt;/div&gt;&lt;div&gt;Next, very important, I meet and talk with interesting people, and I hope we will share more in the future through this group.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quickly about content, what is ALM? François Merand gives 3 major axes : Governance, Dev and Exploitation. Simple, great. So it is not just source control or continuous integration...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then, Lucian Precup and Arnaud Heritier have made a quick overview of Open Source ALM ecosystem : Maven, IDE, IceScrum, Mantis, Git...and many more.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Daniel Cohen-Zardi followed with a presentation of his company and their product Code Fluent Entities, that proposes a DSL abstracting languages (he does not use the term DSL...but it seems like that to me). &lt;/div&gt;&lt;div&gt;The main points were around 3 concepts : agility, model-driven and executable models. I agree with him on these points. But for the solution, I remain to be convinced for now by this type of product...I prefer coding approach around DDD architecture.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally, François Tonic talked about his vision of ALM.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;The group&lt;/b&gt;&lt;/div&gt;&lt;div&gt;To start, for french people, go to http://blog.alm-france.org/, for others hope it will develop in other countries ! :)&lt;/div&gt;&lt;div&gt;I am looking forward to Google Group discussion list to continue discussions...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Some ideas/reflexions to discuss...&lt;/b&gt;&lt;/div&gt;&lt;div&gt;1) We heard a lot the word "industrialization"...opposed to "craftsmanship"...we have to take care of these words use, there are a lot of misconception around industrialization...like over-standardization/normalization (quality ivory tower), over-specialization (like in classic industry)...to be discussed in the group :)&lt;/div&gt;&lt;div&gt;2) I consider ALM practices as central in day to day work, and badly initial formation are lacking in this field (at least mine and some of my colleagues...). There is certainly something to do about that.&lt;/div&gt;&lt;div&gt;3) I would like to share my current experience around ALM, and more importantly to have feedback...my boss and me were thinking about that...perhaps a good chance to try...:)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thanks again for the creation of this group !&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-5085246652229693270?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.alm-france.org/' title='First ALM France UG session'/><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/5085246652229693270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=5085246652229693270' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/5085246652229693270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/5085246652229693270'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2010/11/first-alm-france-ug-session.html' title='First ALM France UG session'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-9157456432429001995</id><published>2010-04-09T00:13:00.007+02:00</published><updated>2010-11-30T23:52:32.013+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ddd'/><category scheme='http://www.blogger.com/atom/ns#' term='cqrs'/><title type='text'>DDD and CQRS resources</title><content type='html'>I see CQRS as a great  extension of DDD approach. Some people say that you cannot do DDD without...I am not convinced yet.&lt;br /&gt;DDD and CQRS are a lot discussed on the web, but I would like to try to keep in this post a list of resources that are really useful to start...but it depends from where you start.&lt;br /&gt;&lt;br /&gt;DDD is becoming more and more known by the community, based on the "bible" of Eric Evans. You could go through the book and other conceptual resources, but I have to admit that it is not always easy to conceptualize without concrete application. That's why I point you to some resources that lead you to enter in DDD and CQRS world through really concrete examples starting from what most people knows.&lt;br /&gt;&lt;br /&gt;Today, I think that Anemic Domain Model along with Transactional Script "business services" are a wide spread use of how OOP is used in enterprise (talking about Java and .NET world mainly).&lt;br /&gt;&lt;br /&gt;First you can start with great series &lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2010/04/08/strengthening-your-domain-domain-events.aspx"&gt;"Strenghtening your model" of Jimmy Bogard &lt;/a&gt;to understand DDD basics, and what are the differences with OOP basics. In his last post, you will see the reference to a great article of Udi Dahan about the concept of Domain Events.&lt;br /&gt;Obviously, there are a lot of DDD concepts that are not covered (bounded contexts for example), but I think that starting from what people knows is a really great approach. You could then dig in other concepts of DDD.&lt;br /&gt;&lt;br /&gt;From there, you would better understand CQRS. I think these DDD basics are all shared by CQRS leaders, in addition to the fact that CQRS prones the segregation of Query and Command in two parallel "layers", i.e Query to display some information and Command to treat business users' actions (through Domain Model).&lt;br /&gt;As &lt;a href="http://codebetter.com/blogs/gregyoung/archive/2010/02/20/why-use-event-sourcing.aspx"&gt;said by Greg Young&lt;/a&gt;, I see today mainly two major differences between CQRS proposed implementation, it concerns domain model persistence :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Event Sourcing, a &lt;a href="http://martinfowler.com/eaaDev/EventSourcing.html"&gt;pattern originally described by Martin Fowler&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ORM persistence, as in "classic" data access layer&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Main resources are some blogs of "concept leaders" :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://codebetter.com/blogs/gregyoung/"&gt;Greg Young&lt;/a&gt; &lt;a href="http://codebetter.com/blogs/gregyoung/archive/2009/08/13/command-query-separation.aspx"&gt;proposes first the CQRS term&lt;/a&gt; derived from the old CQS concept by Bertrand Meyer, he advocates for Event Sourcing approach on persistence&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.udidahan.com/?blog=true"&gt;Udi Dahan&lt;/a&gt; advocates for "classic" ORM persistence, he is also leader of NServiceBus ESB&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://elegantcode.com/author/mark-nijhof/"&gt;Mark Nijhof&lt;/a&gt; has done a &lt;a href="http://github.com/MarkNijhof/"&gt;full CQRS example "à la Greg Young"&lt;/a&gt; (explained on his blog)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://jonathan-oliver.blogspot.com/"&gt;Jonathan Oliver&lt;/a&gt; gives several implementation tips around CQRS&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://thinkbeforecoding.com/"&gt;Jérémie Chassaing&lt;/a&gt; (Think Before Coding) also gives several implementation tips around CQRS, and he represents Frenches in the field ;)&lt;/li&gt;&lt;/ul&gt;To start, Greg, Jonathan and Udi have published theirs presentations of CQRS (video). It is a good start before reading blogs. Here is some of these :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.infoq.com/presentations/greg-young-unshackle-qcon08"&gt;Greg at QCon Nov 2008 on InfoQ&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.vimeo.com/8944337"&gt;Udi at Victoria .net Dev SIG&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=8836872834499141113&amp;amp;postID=9157456432429001995#%20http://jonathan-oliver.blogspot.com/2010/03/cqrs-session-video-utah-code-camp-2010.html%20#"&gt;Jonathan at Utah Code Camp&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Let's try now...for french people, Alt.Net France community has started a sort of Dojo Design around CQRS, we are also trying Google Wave for this. Join &lt;a href="http://groups.google.com/group/parisaltnet"&gt;Alt.Net France to follow&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;PS : Rinat Abdullin has tried to summarize and give some key points to &lt;a href="http://abdullin.com/journal/2010/3/23/dddd-cqrs-and-other-enterprise-development-buzz-words.html"&gt;start with DDD, CQRS and others buzz words&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-9157456432429001995?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/9157456432429001995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=9157456432429001995' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/9157456432429001995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/9157456432429001995'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2010/04/ddd-and-cqrs-resources.html' title='DDD and CQRS resources'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-126119036268922080</id><published>2010-02-16T22:36:00.003+01:00</published><updated>2010-02-16T22:47:00.727+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>About communication mediums in general, but especially in enterprise</title><content type='html'>&lt;p&gt;&lt;span style="font-family:Arial;"&gt;I'd like to give my point of view about the subject of &lt;b&gt;communication&lt;/b&gt; &lt;b&gt;mediums&lt;/b&gt; in general, It is just a first try on this subject. I will dig &lt;b&gt;communication mediums in enterprise&lt;/b&gt; through communication tooling. The goal of this post is to &lt;b&gt;analyse which communication medium should be for which purpose&lt;/b&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;This post is quite general and focused on concepts (even if I am not an expert in the field), I will publish an example of what I mean with an example around tools that can implement what I explain in this post.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Arial;"&gt;Note : I do not talk about how people can change communication according to their behaviour, which is more psychology, I just talk about means, even it is sure that the way you communicate is also an important subject.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Arial;"&gt;I think communication as &lt;b&gt;the main factor of success in any project in general&lt;/b&gt;, because a project is rarely a personal one but the one of a community in general (which could be a couple, a team, a service, a department, an enterprise, and so on...). Good communication leads to more efficiency and comprehension.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;&lt;span style="font-family:Arial;"&gt;A quick analysis of common communication mediums&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Arial;"&gt;Since I am not an expert in sociology, psychology or communication mediums history, I just give a quick analysis of my understanding of what communication is becoming today.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Arial;"&gt;Our society is called today "information society", because more and more information is exchanged between more and more people. &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Arial;"&gt;I see several main technologies that bring us to it:&lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;span style="font-family:Arial;"&gt;In first days, there were just physical meeting and mail (and carrier pigeon...) &lt;/span&gt;&lt;/li&gt;    &lt;li&gt;&lt;span style="font-family:Arial;"&gt;The first major discoveries that make evolve communication were radio and phone, which allow long distance communication with voice only (first unidirectional and broadcast, and then bidirectional)&lt;/span&gt;&lt;/li&gt;    &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Then there was television that allows broadcasting a communication with voice and image &lt;/span&gt;&lt;/li&gt;    &lt;li&gt;&lt;span style="font-family:Arial;"&gt;And lastly, there were computer, networks and internet that allow to communicate with voice, image, writing...and disclosed to everyone today and with many means (email, chat, community sites, twitter, blogs,...), which makes communication so important in our society&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;span style="font-family:Arial;"&gt;But if we look at the means that are used today, we can see that email has a place of choice in our communications mediums, even more in professional world. Innovation in communications mediums are mainly spread on the internet and mostly by younger people who were born with them.    &lt;br /&gt;I think last point is a major reason why communications mediums in entreprise are so badly developed and late, since there, there is people from 20 to 70 years old. But it is time to change our use of technology in entreprise to avoid what I call "email trash for all" syndrom, i.e using your email box as the only "last generation" communications mediums (I do not take in account phone in this category), which leads to too many email boxes with hundreds emails a day...&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Arial;font-size:130%;"&gt;&lt;b&gt;Some characteristics of communications mediums&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Arial;"&gt;I see 3 main characteristics of communications mediums. I do not take them from reading, just from situation analysis, so it must be incomplete. They are important to define in order to analyse how to use which communications medium for which purpose:&lt;/span&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Delay between messages of a communication &lt;/span&gt;      &lt;ul&gt;       &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Synchronous: the most interactive way, quick message exchanges (ex: phone, face to face conversation)&lt;/span&gt;&lt;/li&gt;        &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Asynchronous: there is different level of latency in the exchange, from seconds (ex: chat) to months or years (ex: documents that persist...)&lt;/span&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Basic characteristics&lt;/span&gt;      &lt;ul&gt;       &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Presence: perception of people reactions and feelings, possibility to share concrete material (for example goods, paper documents or board) &lt;/span&gt;&lt;/li&gt;        &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Sight: perception of some people reactions, possibility to share visual aid &lt;/span&gt;&lt;/li&gt;        &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Speech: perception of some people reactions, limited expression if you have not sight &lt;/span&gt;&lt;/li&gt;        &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Dynamic visual aid: people can interactively exchange through it, with two distinct types&lt;/span&gt;          &lt;ul&gt;           &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Free to make any representation (text, graph, diagram, drawing...)&lt;/span&gt;&lt;/li&gt;            &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Constrained to some representation&lt;/span&gt;&lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Static visual aid: people can only exchange asynchronously on it&lt;/span&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Types of organisation&lt;/span&gt;      &lt;ul&gt;       &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Presentation: very directive, poor interactivity (ex: lecture...) &lt;/span&gt;&lt;/li&gt;        &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Interactive presentation: restricted number of participants, directed by a leader but more interactive, self-censorship because of the group and given direction by leader (ex: committee, meeting, class...) &lt;/span&gt;&lt;/li&gt;        &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Group discussion: directed by the group, even more interactive, less self-censorship since there is no imposed direction (ex: workshop, open session...) &lt;/span&gt;&lt;/li&gt;        &lt;li&gt;&lt;span style="font-family:Arial;"&gt;Face to face:  (ex: with your manager, with someone of your staff, interview...)&lt;/span&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;span style="font-family:Arial;"&gt;Given these definitions, I can try to explain why and how communication must not be reduced to meeting, phone and email, especially in entreprise world. Moreover, about meeting, they need more formality and simplicity.   &lt;br /&gt;&lt;/span&gt;&lt;b&gt;   &lt;br /&gt;&lt;span style="font-family:Arial;"&gt;About delay between messages in a communication&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family:Arial;"&gt;, meeting and phone are good mediums for synchronous communications, but &lt;b&gt;email cannot be the only medium for all asynchronous communications!&lt;/b&gt; First, because the purpose is too much different between an instant communication and an entreprise directive to be followed for example. Second, because our email boxes are exploding, and I do not believe that search and incoming email rules could be enough to bypass the problem (even if, of course, it is a good practice to use it!)&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;b&gt;About basic characteristics&lt;/b&gt;, meeting, phone and email combine all of these. However, nowadays, there are more and more distributed teams, and more and more interactions, so these three "old" mediums have to complemented. Solutions exist, just have to implement and distribute it.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;b&gt;About types of organisation&lt;/b&gt;, there are all used more or less depending on people involved and on corporate culture. I think there is nothing really new about that. But, what is interesting is to see how they are used, for example: how is a meeting prepared? how are meeting minutes spread? how actions are tracked? And for that, I think we can win in simplicity with new mediums.&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:Arial;"&gt;Now it's time to see how to implement these principles with real tools. I will propose this in a future post mainly around Microsoft products.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-126119036268922080?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/126119036268922080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=126119036268922080' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/126119036268922080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/126119036268922080'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2010/02/about-communication-mediums-in-general.html' title='About communication mediums in general, but especially in enterprise'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-635783612037697851</id><published>2010-02-13T21:40:00.012+01:00</published><updated>2010-11-30T23:52:41.623+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='playground'/><category scheme='http://www.blogger.com/atom/ns#' term='Blog'/><title type='text'>My technological playground...</title><content type='html'>Well, it has been a long time since my last published post...in fact, I got several post waiting to be finalized...about application architecture, conception and communication.&lt;br /&gt;&lt;br /&gt;Waiting for these post to be published, I would like to blog on the last evolution of my "technological playground".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;"&gt;My technological playground&lt;/span&gt;&lt;br /&gt;For a little more than 5 years, I have done technological survey through web review, beta software test, community frameworks discovery...and I always consider this activity as a necessity to leverage my competencies.&lt;br /&gt;&lt;br /&gt;For 2 years, I also maintain my own personal web site, using last Microsoft technology. It is a good way to dig some technologies (even if sometimes my wife complains of instability of our site...).&lt;br /&gt;&lt;br /&gt;And now, for 1 year, I got a MSDN licence with Visual Studio Team Developer. With it, I can make tests environment. Now, I plan to build several virtual tests environments.&lt;br /&gt;&lt;br /&gt;So today my technological playground is made of:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A computer with several virtual test environment (see below for details)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A Google Reader account to follow RSS and share great technological news grab here and there (&lt;a href="http://www.google.fr/reader/shared/clement.bouillier"&gt;shared items RSS&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A &lt;a href="http://delicious.com/clement.bouillier"&gt;Delicious account&lt;/a&gt; to organize my bookmarks&lt;/li&gt;&lt;li&gt;Some &lt;a href="http://www.altnetfr.org/"&gt;Alt.Net meetings in Paris&lt;/a&gt; &lt;span style="text-decoration: underline;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;or starting &lt;span style="text-decoration: underline;"&gt;&lt;span&gt;&lt;a href="http://groups.google.fr/group/dddugparis/"&gt;DDD Paris user group&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;And...this blog to try to make synthesis of my thoughts on IT&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I am not on Twitter yet...but wondering, I see Google Buzz coming out or just Comment Sharing on Google Reader.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;"&gt;My virtual&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;"&gt; tests environments &lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;I used to have a robust computer but a little undersized to be used as an efficient playground...but it was enough for the minimum. Now I reach a point where I need a little more powerful environment.&lt;br /&gt;&lt;br /&gt;So I buy a new laptop, briefly Asus UL80vt boosted with an Intel Postville SSD drive, using hard drive in an external USB box for VMs as well as two hot USB keys (16Go Corsair Flash Voyager GT). Work well, great autonomy and powerfull...just a deception : I haven't an eSATA port, I have to rely only on USB...what a shame. But it is just what I need to support my plans.&lt;br /&gt;&lt;br /&gt;So with this configuration, I can run several virtual machines given the 4Go RAM and 64bits host OS. For now, I am using VMWare Player as virtual hosting environment (mainly because Virtual PC does not support 64bits guests).&lt;br /&gt;&lt;br /&gt;VMs allow me to separate tests. For now, for instance, I got the following VMs:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Windows Server 2008 with TFS2010 Beta2 (I need to upgrade to just released RC I know...)&lt;/li&gt;&lt;li&gt;Windows 7 with VS2010 Beta2&lt;/li&gt;&lt;li&gt;Windows 7 with VS2008&lt;/li&gt;&lt;/ul&gt;To build these VMs, I always keep a clean copy of each OS VM with base software I am used to. It is a little bit as if I do snapshot with VMWare Workstation.&lt;br /&gt;Moreover, I track what I installed on each VMs (software version) in an Excel sheet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;"&gt;My Google Reader &amp;amp; Delicious accounts &lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;I use it to track RSS feeds on the web. There are mainly of three types:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Community lists/forums &lt;span lang="fr"&gt;&lt;span style="color: rgb(31, 73, 125);font-family:Calibri;"&gt;&lt;/span&gt;&lt;/span&gt;(&lt;a href="http://groups.google.com/group/nhusers"&gt;NHibernate&lt;/a&gt;, &lt;a href="http://tech.groups.yahoo.com/group/domaindrivendesign/"&gt;DDD&lt;/a&gt;, &lt;a href="http://groups.google.fr/group/dddugparis/"&gt;DDD Paris&lt;/a&gt;, &lt;a href="http://tech.groups.yahoo.com/group/testdrivendevelopment/"&gt;TDD&lt;/a&gt;, &lt;a href="http://tech.groups.yahoo.com/group/altdotnet/"&gt;Alt.net&lt;/a&gt;, &lt;a href="http://groups.google.com/group/parisaltnet"&gt;Alt.net Paris&lt;/a&gt;…) &lt;span lang="fr"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Individual blogs (&lt;a href="http://weblogs.asp.net/scottgu/default.aspx"&gt;ScottGu&lt;/a&gt;, &lt;a href="http://www.udidahan.com/"&gt;Udi Dahan&lt;/a&gt;, &lt;a href="http://martinfowler.com/"&gt;Martin Fowler&lt;/a&gt;, &lt;a href="http://ayende.com/Blog/Default.aspx"&gt;Ayende Rahien&lt;/a&gt;…)&lt;/li&gt;&lt;li&gt;Blog community (&lt;a href="http://codebetter.com/blogs/"&gt;CodeBetter&lt;/a&gt;, &lt;a href="http://www.lostechies.com/blogs/"&gt;Los Techies&lt;/a&gt;, &lt;a href="http://devlicio.us/blogs/"&gt;devlicious&lt;/a&gt;...)&lt;/li&gt;&lt;li&gt;Feed agregators &amp;amp; news site (&lt;a href="http://www.dotnetguru.org/"&gt;DotNetGuru.org&lt;/a&gt;, &lt;a href="http://dotnetshoutout.com/"&gt;Dotnetshoutout&lt;/a&gt;, &lt;a href="http://www.infoq.com/"&gt;InfoQ&lt;/a&gt;...)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I use my Share Items to share news. I prefer Delicious to bookmark and share my favorite web pages. On Delicious, I can better and simpler organize bookmarks through tags.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;"&gt;Participating in community&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;That the part I discovered last year with Alt.Net Paris community starting. It is the best place to learn and share with maximum interactivity. You learn a lot from others experiences, you meet some great people with rich experience.&lt;br /&gt;Definitively a great experience!! Come to join us.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;"&gt;And finally this blog&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;I started this blog one year ago, and I experience difficulty to post regularly...I try my best and hope I will improve.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-635783612037697851?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/635783612037697851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=635783612037697851' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/635783612037697851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/635783612037697851'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2010/02/my-technological-playground.html' title='My technological playground...'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-3817121995147507842</id><published>2009-07-02T23:52:00.016+02:00</published><updated>2009-07-21T01:13:35.401+02:00</updated><title type='text'>Expression Trees and Reflection performances</title><content type='html'>&lt;span style="font-weight: bold;font-size:130%;" &gt;Context&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lots of people think Reflection is evil for performance, but if you can tune your code to avoid some problems, and even better, you can write code as quick as "good old fashion C# code" (I mean writing code without Reflection).&lt;br /&gt;&lt;br /&gt;Beware, I am not justifying use of Reflection in any application to implement the "graal of generic code". I think that Reflection could be used in some frameworks, but application code must be strongly typed for readability and maintainability. Example of framework is Object/Relational Mapping, and that's why I would like to talk here of Reflection and performance, because ORM performance can be a performance bottle-neck in an enterprise application.&lt;br /&gt;&lt;br /&gt;I worked on a project that uses a "home maid" ORM, which one uses Reflection to create object instances (entities) and to hydrate them. Working on performance with a memory profiler, I saw that a lot of time was spent in Type.GetProperty PropertyInfo.SetValue method (both in same proportion). So I had a look at code and saw that first I could cache the PropertyInfo retrieved by Type.GetProperty, which give me a 50% performance win relative to overhead time spent in Reflection.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;It is a first lesson on Reflection performance, cache Reflection objects relative to objects you use.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Then, I think about the old time when we only have Reflection.Emit to improve more this piece of code : you can reduce the overhead&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;to zero using it, I let you find it on the web or see the implementation in NHibernate that uses this, because it seems a little bit painful since it is IL generation, i.e "improved assembler" more or less ;).&lt;span style="font-weight: bold;"&gt; Second lesson, time spent in Reflection could be reduce to the time taken to setup your application, and then with a zero overhead due to Reflection after that.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Finally, I had a look at new features of C#3.0 and .NET3.5 API, around LINQ and lambda expressions, then I was free from using Reflection.Emit. The main class is Expression found in System.Linq.Expressions. I am not sure, but probably it is less powerful than Reflection.Emit&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;(I think of complex method generation...).&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Now let's go into code with a simple case of setting a property one one million objects.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;First try (lesson one learned)&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;I give you the following simple code : first &lt;/span&gt;&lt;span&gt;with &lt;/span&gt;&lt;span&gt;GetProperty and SetValue inside the iteration, and second, with GetProperty outside the iteration. Here is the code:&lt;/span&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="rem"&gt;// Set using GetProperty + SetValue&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;init = DateTime.Now;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;start = DateTime.Now;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (SimpleObjectA o &lt;span class="kwrd"&gt;in&lt;/span&gt; objects)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    prop = o.GetType().GetProperty(&lt;span class="str"&gt;"Name"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    prop.SetValue(o, &lt;span class="str"&gt;"plip"&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;end = DateTime.Now;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;Console.WriteLine(&lt;span class="str"&gt;"Set using GetProperty + SetValue : {0} + {1}"&lt;/span&gt;, start.Subtract(init), end.Subtract(start));&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&lt;span class="rem"&gt;// Set using GetProperty only once + SetValue&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;init = DateTime.Now;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;prop = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(SimpleObjectA).GetProperty(&lt;span class="str"&gt;"Name"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;start = DateTime.Now;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (SimpleObjectA o &lt;span class="kwrd"&gt;in&lt;/span&gt; objects)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    prop.SetValue(o, &lt;span class="str"&gt;"plip"&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;}&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;end = DateTime.Now;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;Console.WriteLine(&lt;span class="str"&gt;"Set using GetProperty only once + SetValue : {0} + {1}"&lt;/span&gt;, start.Subtract(init), end.Subtract(start));&lt;/pre&gt;&lt;/div&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Second try&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Then, I tried to make it with Linq.Expressions. And it gives me some interesting thoughts about how to prepare the setter at initialization.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;First, I thought to create a strongly typed Expression of the type Action&lt;t,&gt; where T is the object which has a property to set, PT is the type of the property to set, in my example, it was very simple, but in ORM context for example, it could be a little bit more tricky. Here is the code for example:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;/t,&gt;&lt;/span&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="rem"&gt;// Set using typed LambdaExpression (Action&amp;lt;T,I&amp;gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;init = DateTime.Now;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;param = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(SimpleObjectA), &lt;span class="str"&gt;"x"&lt;/span&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;value = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt;), &lt;span class="str"&gt;"y"&lt;/span&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;setter = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(SimpleObjectA).GetProperty(&lt;span class="str"&gt;"Name"&lt;/span&gt;).GetSetMethod();&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;Expression&amp;lt;Action&amp;lt;SimpleObjectA, &lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; typedExpression = Expression.Lambda&amp;lt;Action&amp;lt;SimpleObjectA, &lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;(Expression.Call(param, setter, value), param, value);&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;Action&amp;lt;SimpleObjectA, &lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; set = typedExpression.Compile();&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;start = DateTime.Now;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (SimpleObjectA o &lt;span class="kwrd"&gt;in&lt;/span&gt; objects)&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;{&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    set(o, &lt;span class="str"&gt;"plip"&lt;/span&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;end = DateTime.Now;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;Console.WriteLine(&lt;span class="str"&gt;"Set using typed LambdaExpression (Action&amp;lt;T,I&amp;gt;) : {0} + {1}"&lt;/span&gt;, start.Subtract(init), end.Subtract(start));&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;span&gt;&lt;br /&gt;In fact, when doing mapping, you do not know the T type, then I think to use Action (Delegate in fact). Now you have to use Delegate and DynamicInvoke which far more bad than SetValue, so I searched for an other solution. For example, here is the code:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="rem"&gt;// Set using LambdaExpression + DynamicInvoke&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;init = DateTime.Now;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;param = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(SimpleObjectA), &lt;span class="str"&gt;"x"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;value = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt;), &lt;span class="str"&gt;"y"&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;setter = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(SimpleObjectA).GetProperty(&lt;span class="str"&gt;"Name"&lt;/span&gt;).GetSetMethod();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;LambdaExpression dynamicExpression = Expression.Lambda(Expression.Call(param, setter, value), param, value);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;Delegate dynamic = dynamicExpression.Compile();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;start = DateTime.Now;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (SimpleObjectA o &lt;span class="kwrd"&gt;in&lt;/span&gt; objects)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    dynamic.DynamicInvoke(o, &lt;span class="str"&gt;"plip"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;end = DateTime.Now;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;Console.WriteLine(&lt;span class="str"&gt;"Set using LambdaExpression + DynamicInvoke : {0} + {1}"&lt;/span&gt;, start.Subtract(init), end.Subtract(start));&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;So I found this article from Nate Kohari on Late Bound Invocation with Expression Trees. Then we use an Action&lt;object,&gt; and bound to real types inside the expression tree (which can be cached). Now, performance are equivalent to use the property setter directly. Here is the code:&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;/object,&gt;&lt;/span&gt;&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="rem"&gt;// Set using typed LambdaExpression (Action&amp;lt;object,object&amp;gt;) -&amp;gt; late bound&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;init = DateTime.Now;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;param = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;object&lt;/span&gt;), &lt;span class="str"&gt;"x"&lt;/span&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;value = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;object&lt;/span&gt;), &lt;span class="str"&gt;"y"&lt;/span&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;setter = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(SimpleObjectA).GetProperty(&lt;span class="str"&gt;"Name"&lt;/span&gt;).GetSetMethod();&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;Expression&amp;lt;Action&amp;lt;&lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; lateBoundTypedExpression = Expression.Lambda&amp;lt;Action&amp;lt;&lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;(Expression.Call(Expression.Convert(param, setter.DeclaringType), setter, Expression.Convert(value, setter.GetParameters()[0].ParameterType)), param, value);&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;Action&amp;lt;&lt;span class="kwrd"&gt;object&lt;/span&gt;, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt; lateBoundSet = lateBoundTypedExpression.Compile();&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;start = DateTime.Now;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (SimpleObjectA o &lt;span class="kwrd"&gt;in&lt;/span&gt; objects)&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;{&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    lateBoundSet(o, &lt;span class="str"&gt;"plip"&lt;/span&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;end = DateTime.Now;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;Console.WriteLine(&lt;span class="str"&gt;"Set using typed LambdaExpression (Action&amp;lt;object,object&amp;gt;) -&amp;gt; late bound : {0} + {1}"&lt;/span&gt;, start.Subtract(init), end.Subtract(start));&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;In conclusion, you will find time in ms I got on my laptop : &lt;/span&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Strategy&lt;/td&gt;&lt;td&gt;Initialization time&lt;/td&gt;&lt;td&gt;One million iterations time&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;GetProperty + SetValue inside iteration&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;2891&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GetProperty once &amp;amp; SetValue inside iteration&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1953&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Delagate + DynamicInvoke&lt;/td&gt;&lt;td&gt;187&lt;/td&gt;&lt;td&gt;6234&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Latebound Lambda Expressions&lt;/td&gt;&lt;td&gt;0&lt;br /&gt;&lt;/td&gt;&lt;td&gt;31&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Strongly typed Lambda Expressions&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;31&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Property setter directly&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;31&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;I tried to go with 10 millions iterations, and I got approximatively 10x time in the previous table.&lt;br /&gt;With 60 millions iterations, I try only the three most performant solutions and we starting to see little differences between them (I could have tried a realist situation with several properties bound, but in fact, I would try 10 millions iterations with 6 properties and it should give the same results):&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Strategy&lt;/td&gt;&lt;td&gt;Initialization time&lt;/td&gt;&lt;td&gt;60 million iterations time&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Latebound Lambda Expressions&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;2219&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Strongly typed Lambda Expressions&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1797&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Property setter directly&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1578&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-3817121995147507842?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/3817121995147507842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=3817121995147507842' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/3817121995147507842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/3817121995147507842'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2009/07/expression-trees-and-reflection.html' title='Expression Trees and Reflection performances'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-8475331951313104618</id><published>2009-04-09T05:00:00.014+02:00</published><updated>2009-04-09T08:11:10.867+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inversion of Control (IoC)'/><category scheme='http://www.blogger.com/atom/ns#' term='Application Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Dependancy Injection (DI)'/><title type='text'>Applying IoC/DI in application architecture</title><content type='html'>IoC and DI are two patterns more or less equivalent, I let &lt;a href="http://martinfowler.com/articles/injection.html"&gt;Martin Fowler explains the details&lt;/a&gt;. IoC stands for Inversion of Control and DI for Dependancy Injection.&lt;br /&gt;We will see in this post how to use effectively this pattern inside an application architecture, and which are the benefits of its use.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Application Architecture&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;There are a lot of architecture styles, but here we will focus on common approches : the layered architecture with generally 3 principal layers (that could be splitted in other layers themself, but we do not talk about it in this post...).&lt;br /&gt;There are several approches :&lt;ul&gt;&lt;li&gt;in "classical" approach (Microsoft UI/BLL/DAL or Java Struts/Bean/DAO), we often talk about Presentation (or UI)/Business/Data&lt;/li&gt;&lt;li&gt;in DDD (Domain Driven Design), if I simply we have UI/Application Core/Infrastructure (I take the word of &lt;a href="http://jeffreypalermo.com/blog/the-onion-architecture-part-1/"&gt;Jeffrey Pallermo in its "Onion architecture"&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;The "Onion architecture as described by Jeffrey Pallermo certainly leads to implement some good practices as IoC and DI, but it is also possible to do it in "classical" app&lt;/span&gt;roach. I will come back on one project of my first project (starting at end of 2005) where I have to lead the application architecture (it was in .NET/C# but all in this post could apply to any OO language).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;A little project story&lt;/span&gt;&lt;br /&gt;When I started , I was aware of some good practices (thanks to &lt;a href="http://www.dotnetguru.org/"&gt;DotNetGuru.org&lt;/a&gt; French community) like interfacing your classes, splitting in layers, using POCO, persistance ignorance, applying patterns (principally &lt;a href="http://www.dofactory.com/Patterns/Patterns.aspx"&gt;GoF patterns&lt;/a&gt; at this time)...but I wasn't aware of "Onion Architecture" approach then, so I try to implement a "classical" architecture (for the background, we do not use TDD).&lt;br /&gt;This architecture was a little bit heavy to manipulate : for each new Web page, we need to create 3 interfaces and the 3 implementations, adding instanciation in some "home maid" Abstract Factory...and what we can notice it is that we do not realize why exactly we were coding this way, a little bit like robots in fact just because "it was the good practices".&lt;br /&gt;And now I am working again on this project and nothing has changed, and it is great. Why ? Because I have learned some things I did not heard about 3 years ago, and I think it legitimates this architecture (and more over the Onion one in fact). It is what we will see next, but before have a quick overview of IoC/DI.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Overview of IoC/DI&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;I already give a reference to Martin Fowler post on the subject, but I would like to draw an overview of IoC/DI here for the purpose of the post. I will take an example with interfaces which represents the best exemple of IoC/DI use (even if you could imagine other use cases).&lt;br /&gt;Typically, you have a class Client that relies on an interface IMyInterfaceA, which have an implementation MyImplA which one relies on IMyInterfaceB, which have an implementation MyImplB. So to link all these classes together, I have either:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;to call MyImplA constructor in Client and MyImplB constructor in MyImplA, which create dependancy between all the implementations, loosing the benefits of interfacing (even if it is possible to enforce "localized" instanciation...but it needs to carefully control code which could be more )&lt;br /&gt;&lt;/li&gt;&lt;li&gt;to implement AbstractFactory pattern (I do not detail this point...)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;or to use a IoC/DI framework&lt;/li&gt;&lt;/ul&gt;The IoC/DI framework will use the configuration file or configuration code to inject the dependancy of MyImplA when needing IMyInterfaceA and so on. Another thing to note is that it will inject recursively the dependancies, then when in Client class, I will request a IMyInterfaceA object, it will inject MyImplA as IMyInterfaceA, and MyImplB as IMyInterfaceB on which relies MyImplA class. I invite you to see details of the different injection mecanism : constructor injection, setter injection, method injection, interface injection...&lt;br /&gt;So now, I think you should start to understand where I would like to go...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Applying IoC/DI&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;To resume, we have (or we need if starting) :&lt;ul&gt;&lt;li&gt;a layered application architecture using interfaces to separate layers (or even sub-layers)&lt;/li&gt;&lt;li&gt;one of the numerous IoC/DI frameworks (&lt;a href="http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx"&gt;see here&lt;/a&gt; for .NET, Spring for Java...)&lt;/li&gt;&lt;/ul&gt;We are near done : we just have to use an IoC/DI framework in our application. We can certainly create a dependance on the framework everywhere we need it, but I would &lt;span style="font-weight: bold;"&gt;prefer creating a simple class that will be the only one that relies on the framework&lt;/span&gt;.&lt;br /&gt;Then, for example (I do not assert that it is the best architecture), if we have consider the following layers :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;UI&lt;/li&gt;&lt;li&gt;Business&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Business Services which take care of business processes = 2 projects, one for interfaces, one for implementation&lt;/li&gt;&lt;li&gt;Business Entities which bring business rules = 2 projects, one for interfaces, one for implementation&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Data Access Services which manage data access and manipulates Business Entities  = 2 projects, one for interfaces, one for implementation&lt;/li&gt;&lt;/ul&gt;We can have the following hard dependancies :&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Kb4ZcvI6rXc/Sd1_R5kyXaI/AAAAAAAAAAU/3bCCRfdX1Jw/s1600-h/example-architecture.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 399px; height: 351px;" src="http://1.bp.blogspot.com/_Kb4ZcvI6rXc/Sd1_R5kyXaI/AAAAAAAAAAU/3bCCRfdX1Jw/s320/example-architecture.png" alt="" id="BLOGGER_PHOTO_ID_5322550280111414690" border="0" /&gt;&lt;/a&gt;We can add some dependancies, for example from BusinessEntityImpl to IBusinessService or from AnotherBusinessService to IBusinessService, but then a central point is that we have to take care of &lt;span style="font-weight: bold;"&gt;circular dependancies &lt;/span&gt;that could be made (for example if BusinessService depends on IAnotherBusinessService).&lt;br /&gt;Nota that finally you no more need any &lt;span style="font-style: italic;"&gt;new&lt;/span&gt; statement!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Ok ! But why using this finally ?&lt;/span&gt;&lt;br /&gt;Yes, you are right if you are asking this question, but I have some answers beside the "ivory tour architect" answer : "because it is the right way" ;).&lt;br /&gt;Since instanciation is delegated to the IoC/DI framework, you can then imagine a lot of things, but the one I prefer &lt;span style="font-weight: bold;"&gt;sounds like &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;AOP&lt;/a&gt;&lt;/span&gt; (Aspect Oriented Programming). But it is not AOP with combined byte code, i.e byte code of generic cross-cutting concerns and your business byte code, it is done at runtime (yes then it could leads to performance issues but only in special cases...).&lt;br /&gt;I give you an example in .NET with &lt;a href="http://www.codeplex.com/entlib"&gt;EntLib&lt;/a&gt; Policy Injection AB, it is really simple to add AOP if you already had IoC/DI :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In your Factory class that is the only one dependent on IoC/DI framework, rather than just calling the IoC/DI framework, call Wrap&lt;t&gt; method of EntLib PolicyInjection class (&lt;a href="http://codebetter.com/blogs/david.hayden/archive/2007/04/29/dependency-injection-and-policy-injection-application-block-caching-and-structuremap-example.aspx"&gt;David Hayden for more details&lt;/a&gt;)&lt;/t&gt;&lt;/li&gt;&lt;li&gt;Add in EntLib PolicyInjection AB configuration all the cross-cutting concerns you care applying only to a 'defined perimeter" (via policy, matching rules, &lt;a href="http://msdn.microsoft.com/en-us/library/cc309507.aspx"&gt;see MSDN for more details&lt;/a&gt;).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;Oh great ! How can I apply it to my project ?&lt;/span&gt;&lt;br /&gt;If you are starting a new project, consider all the elements given in this post and be sure to understand what you are doing else it could lead to a disaster...&lt;br /&gt;If you have an existing application, I see 2 cases :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;either you are in a similar situation to the one I described (using interfaces, layers and other good practices...) and then it would be relatively easy to change your application step by step to reduce the &lt;a href="http://martinfowler.com/bliki/TechnicalDebt.html"&gt;technical debt&lt;/a&gt; (if considered like that).&lt;/li&gt;&lt;li&gt;either you are far from this situation, then consider a technical refactoring or if not possible, bear, cry or leave it depends ;)...but note that a technical refactoring could be done step by step also (but each step costs more than in the first case).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;Hum...and what about performance ?&lt;/span&gt;&lt;br /&gt;I think the performance problem should not be up front problematic to take care. Certainly, you should try to envision the performance issues you could encounter during developement to avoid starting again if the performance issue comes, but we should never say "I will never  use this or that because it could lead to performance issues", it has to be studied in every cases.&lt;br /&gt;Then I give here some advices to study performance impacts that could IoC/DI could have :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;it is the "dynamic" instanciation (it does not necessarily use reflection since configuration could be done in code or configuration files could be loaded once at start) that costs more than a new, then consider instanciation strategies&lt;br /&gt;&lt;/li&gt;&lt;li&gt;consider using singleton pattern, it will avoid several instanciation when your class does support any state management&lt;/li&gt;&lt;li&gt;consider IoC/DI just for some of your objects, the relevant ones, but do not ban IoC/DI because one of your objects does not allow to use it&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;If I apply this in my last example, I could for example say that I would use IoC/DI for Business Services and Data Access Services classes with singleton strategy and do not use it for Business Entities (but then notice you will need dependancies to Business Entities implementation from Business and Data Access Services...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-8475331951313104618?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/8475331951313104618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=8475331951313104618' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/8475331951313104618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/8475331951313104618'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2009/04/applying-iocdi-in-application.html' title='Applying IoC/DI in application architecture'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Kb4ZcvI6rXc/Sd1_R5kyXaI/AAAAAAAAAAU/3bCCRfdX1Jw/s72-c/example-architecture.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-1733005537546489436</id><published>2009-03-27T22:48:00.004+01:00</published><updated>2009-04-09T04:59:50.934+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alt.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>TDD meeting at Alt.NET France</title><content type='html'>On wednesday March, 25th, we have a meeting on TDD at Alt.NET France. It was animated by two Octo consultants, Frédéric Schäfer and Djamel Zouaoui. Again, we reach a new assistance record, around 30 people.&lt;br /&gt;&lt;br /&gt;You can find a more &lt;a href="http://www.altnetfr.org/2009/03/26/"&gt;detailed minutes&lt;/a&gt; I wrote in French on &lt;a href="http://www.altnetfr.org/"&gt;Alt.NET France&lt;/a&gt; site. I give here a quick synthesis of the conclusion I take from this meeting.&lt;br /&gt;&lt;br /&gt;The presentation started with an overview on why testing or why not testing? The discussion raises a lot of stereotypes : "longer", "more expensive", "I'll make them later" (=never ;)) and so on...&lt;br /&gt;&lt;br /&gt;Then we get to when testing is useful (and indeed more or less why) :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;get code that just reveals developer intention (not more),&lt;br /&gt;&lt;/li&gt;&lt;li&gt;test at the right granularity,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;protect yourself against inevitable application changes (regression),&lt;br /&gt;&lt;/li&gt;&lt;li&gt;loss of time in repetitive debugging and other test console applications which are not reusable.&lt;/li&gt;&lt;/ul&gt;Frédéric and Djamel presented some code samples around MasterMind game to underline how to apply TDD. Main points were :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;make test first else you never will...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;make simple test first, and increment complexity step by step,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;don't try to conceptualize/develop the perfect thing on first try (let iterations drive you to the most accurate design),&lt;/li&gt;&lt;li&gt;use some UML diagrams to guide your global intention but do not lose yourself in details,&lt;/li&gt;&lt;li&gt;use the following virtuous circle : intention &gt; test code (do not compile) &gt; code to compile test code that fails the test (red test) &gt; code that passes the test (green) &gt; refactor (your code or your tests, not both in the same iteration)&lt;/li&gt;&lt;li&gt;write test correctly = AAA : Actor, Act, Assertions (be careful of tests without assertions)&lt;/li&gt;&lt;li&gt;a declared bug needs a test to ensure its correction&lt;/li&gt;&lt;li&gt;always run all the tests (which should be automatic and fast)&lt;/li&gt;&lt;/ul&gt;Finally, we get to deeper subjects, and I conclude that TDD is a practice that lead developers to a set of well-known and good design practices :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Apply patterns : &lt;a href="http://martinfowler.com/articles/injection.html"&gt;dependency injection&lt;/a&gt;, &lt;a href="http://www.dofactory.com/Patterns/Patterns.aspx"&gt;GoF&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/magazine/dd419663.aspx"&gt;M-V-VM for WPF&lt;/a&gt; was some of the examples, &lt;a href="http://domaindrivendesign.org/books/"&gt;DDD&lt;/a&gt;...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Use &lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;mocks/stubs&lt;/a&gt; to isolate tested objects,&lt;/li&gt;&lt;li&gt;&lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;Continuous integration&lt;/a&gt; : to build and run tests continuously (and much more...),&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Code_coverage"&gt;Code coverage&lt;/a&gt; : beware of 100% coverage illusion, it does mean that your code is perfect because of entry data combinations problem.&lt;/li&gt;&lt;/ul&gt;I was already convienced with TDD, but I think I get a more precise vision of it now. To conclude, I think TDD brings :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;code documentation (executable specifications),&lt;/li&gt;&lt;li&gt;protection againts regressions and during refactoring,&lt;/li&gt;&lt;li&gt;accurate and flexible design for your code.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Thanks again to Octo company, Frédéric and Djamel for hosting and organizing this meeting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-1733005537546489436?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/1733005537546489436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=1733005537546489436' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/1733005537546489436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/1733005537546489436'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2009/03/tdd-meeting-at-altnet-france.html' title='TDD meeting at Alt.NET France'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-3748017556049323223</id><published>2009-03-05T10:03:00.003+01:00</published><updated>2009-03-27T23:39:58.817+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Alt.NET'/><title type='text'>ALT.NET France is more and more active</title><content type='html'>I am pleased to participate to ALT.NET France since August 2008, it beguns a little bit earlier on the impulsion of some people that continue to spend time on this great technical social community : &lt;a href="http://strangelights.com/blog/"&gt;Robert Pickering&lt;/a&gt;, &lt;a href="http://www.thedotnetfrog.fr/"&gt;Julien Lavigne du Cadet&lt;/a&gt;, &lt;a href="http://www.altnetfr.org/"&gt;Gauthier Segay&lt;/a&gt;, &lt;a href="http://codingly.com/"&gt;Romain Verdier&lt;/a&gt; and more (do not offuscate if I forget some people :o))...&lt;br /&gt;&lt;br /&gt;We start with a &lt;a href="http://groups.google.com/group/parisaltnet"&gt;Google group list&lt;/a&gt; and some informal meetings once a month in a bar, and since november, we meet around a defined subject presented by one of the community members. You can find on several blogs some comments about these meetings.&lt;br /&gt;&lt;br /&gt;We know reach another step, Julien has setup a &lt;a href="http://www.altnetfr.org/"&gt;new web site&lt;/a&gt;, it will (or have to and/or should) be updated by the community.&lt;br /&gt;&lt;br /&gt;So enjoy and join us, even if you are not fluent in French, you will be able to share with us, we have several not french members.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-3748017556049323223?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/3748017556049323223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=3748017556049323223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/3748017556049323223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/3748017556049323223'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2009/03/altnet-france-is-more-and-more-active.html' title='ALT.NET France is more and more active'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-4893341706842123876</id><published>2008-09-06T11:07:00.005+02:00</published><updated>2009-02-03T12:31:34.811+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design patterns'/><title type='text'>Object to object mapping : a painful task</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;Remark :&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt; &lt;/span&gt;I have to refine this post, but I publish it since there is some news on the subject : AutoMapper has been published on CodePlex (see &lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/01/22/automapper-the-object-object-mapper.aspx?CommentPosted=true#commentmessage"&gt;this post&lt;/a&gt; on Jimmy Bogard blog).&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;Context&lt;/span&gt;&lt;br /&gt;In August 2008, I have got the same needs as Jimmy, so I have started to search on the community, I did not find any existing tool but I found these three links :&lt;br /&gt;&lt;a href="http://blog.jagregory.com/2008/05/06/futility-transforming-entities-into-dtos/"&gt;http://blog.jagregory.com/2008/05/06/futility-transforming-entities-into-dtos/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tech.groups.yahoo.com/group/altdotnet/message/14263"&gt;http://tech.groups.yahoo.com/group/altdotnet/message/14263&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ayende.com/Blog/archive/2007/12/05/Object--Object-mapping.aspx"&gt;http://ayende.com/Blog/archive/2007/12/05/Object--Object-mapping.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I also have a look at "the other side" (i.e. Java), and it exists a framework named &lt;a href="http://dozer.sourceforge.net/"&gt;Dozer&lt;/a&gt;. It makes implicit mapping as you explain, but for more complicated mapping, you make the mapping in XML files like (N)Hibernate does.&lt;br /&gt;&lt;br /&gt;I would like here to detail a little bit the why I found this type of tool useful.&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;br /&gt;&lt;br /&gt;Requirements&lt;/span&gt;&lt;br /&gt;In the first link I give, James Gregory talked about three requirements:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Refactoring friendly. No strings for property names, changing names should give compiler errors.&lt;/li&gt;&lt;li&gt;Must simplify code.&lt;/li&gt;&lt;li&gt;Must improve maintainability.&lt;/li&gt;&lt;/ol&gt;So, on the first requirement, configuration approach fails more or less, because in fact, you will unit test your classes which make use of the mapper (and not make unit tests for string inspection, that have no value as said by James). More over, I have got a feedback from a Alt.net meeting that was I should add a fluent interface, which makes configuration much more reliable and refactoring friendly. I am more and more open to this type of API.&lt;br /&gt;&lt;br /&gt;On the second requirement, it is the one I prefer because I am bored to write mapping code, and implicit mapping simplify it. There is a difference between mapping code and configuration complexity because in mapping code, you have to create object instances, to recurse on collections, to handle inheritance mapping (and that code is very boring), whereas with configuration, I just declare mapping between types and fields and I have implicit mapping.&lt;br /&gt;&lt;br /&gt;On the third requirement, I think configuration is simpler than code, even if it needs to understand mapping framework.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Implementation&lt;/span&gt;&lt;br /&gt;The central point of my first implementation was a huge use of Lambda expression and it simplifies a lot the code of the mapper.&lt;br /&gt;The principal features I have implemented for now are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;explicit mapping through XML configuration (fluent interface or at least API in mind)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;implicit mapping based on properties name&lt;/li&gt;&lt;li&gt;recursive mapping&lt;/li&gt;&lt;li&gt;inheritance mapping (in progress)&lt;/li&gt;&lt;li&gt;conversion during mapping (through Convert class)&lt;/li&gt;&lt;li&gt;types in scope : basic types, nullables, all enumerables (including generic ones), classes with public properties&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I have several elements in an Excel sheets...I will share it.&lt;br /&gt;I try to use a TDD approach so unit tests exists for these features.&lt;br /&gt;&lt;br /&gt;I am very impatient to have a look at the Jimmy implementation (&lt;a href="http://www.codeplex.com/AutoMapper"&gt;AutoMapper&lt;/a&gt;) and perhaps to participate to this tool improvement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-4893341706842123876?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/4893341706842123876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=4893341706842123876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/4893341706842123876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/4893341706842123876'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2008/09/object-to-object-mapping-painful-task.html' title='Object to object mapping : a painful task'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-8767635235505383194</id><published>2008-08-28T22:56:00.000+02:00</published><updated>2011-11-07T23:33:16.210+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blog'/><title type='text'>Subjects I would like to blog...</title><content type='html'>In this post, I will keep a list of some subjects on which I would like to blog (&lt;i&gt;in italic drafted ones&lt;/i&gt;):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;General purpose&lt;br /&gt;- Alt.Net Meeting Feedback : Object Oriented : an historical mistake or to be continued&lt;br /&gt;- Software vendors: opened on communities Vs proprietarism&lt;br /&gt;- Software quality: technical VS process ?&lt;br /&gt;&lt;i&gt;- Agile and Team organization&lt;br /&gt;- &lt;/i&gt;Classify items : hierarchical Vs relational (ex mails, docs...)&lt;/li&gt;&lt;li&gt;Technical&lt;br /&gt;- &lt;i&gt;Object graph consistency, querying and (lazy) loading&lt;/i&gt;&lt;br /&gt;- Object Application Cache&lt;br /&gt;- SOA and legacy applications concrete integration by example: objectives, solutions, advantages/disavantages (how to integrate read/write operations)&lt;br /&gt;- Application architecture: taking best pratices together&lt;br /&gt;- Web State Management : client and server side (sessions, cache...)&lt;/li&gt;&lt;li&gt;Process &amp;amp; Tools&lt;br /&gt;- Test Strategy : automation of Unit + Functional Tests (both coded, not recorded)&lt;br /&gt;- Functional Test with Fitnesse and configuration management processes&lt;br /&gt;&lt;i&gt;- TFS Agile Process Template&lt;br /&gt;- TFS customization&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;I will try to write on these subjects "shortly"...;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-8767635235505383194?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clem-it.blogspot.com/feeds/8767635235505383194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8836872834499141113&amp;postID=8767635235505383194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/8767635235505383194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/8767635235505383194'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2008/08/subjects-i-would-like-to-blog.html' title='Subjects I would like to blog...'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8836872834499141113.post-2344261356849213557</id><published>2008-08-28T22:48:00.007+02:00</published><updated>2011-11-09T23:56:22.374+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blog'/><title type='text'>Blog content</title><content type='html'>I would to open a blog for long time, but I think I have more to learn from others reading their blogs until now. Today, I am always learning a lot from others in the community, but I would like to give my 2 cents on some subjects :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Microsoft technologies and others (because I think there is a lot to learn from other technologies)&lt;/li&gt;&lt;li&gt;Software architecture, including every levels : business, functional, applicative, technical&lt;/li&gt;&lt;li&gt;"Software world" industrialisation, around tooling and quality&lt;/li&gt;&lt;/ul&gt;My inspiration will come from :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"Software world" actualities&lt;/li&gt;&lt;li&gt;Reflexion about my job and the working environment&lt;/li&gt;&lt;li&gt;Community activities (forums, informal meetings, blogs...)&lt;/li&gt;&lt;/ul&gt;I would like to warn you that I could scratch english sometimes (since it is not my mother tongue, which is the french), please be indulgent but let me know when it is unsupportable ;), I would like to improve my english also.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;I often say things bluntly, it is volunteer, in order to emphasize the message I want to share, and then must not be interpreted as opinionated behavior. I have some conviction I like to talk about, but I would like to change them if I am truly convinced by any other points of view.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now, it is time to read some posts...do not hesitate to share your thoughts, but stay correct.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8836872834499141113-2344261356849213557?l=clem-it.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/2344261356849213557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8836872834499141113/posts/default/2344261356849213557'/><link rel='alternate' type='text/html' href='http://clem-it.blogspot.com/2008/08/blog-content.html' title='Blog content'/><author><name>Clem</name><uri>http://www.blogger.com/profile/18356931115238798506</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
