<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		
		<title>Developing the ITP Document Platform</title>
		<link>http://www.aia-itp.com/</link>
		<description>Tales from the ITP Document Platform development, by Aia Research & Development</description>
		<language>en</language>
		<image>
			<title>Developing the ITP Document Platform</title>
			<url>http://www.aia-itp.com/EXT:tt_news/ext_icon.gif</url>
			<link>http://www.aia-itp.com/</link>
			<width></width>
			<height></height>
			<description>Tales from the ITP Document Platform development, by Aia Research & Development</description>
		</image>
		<generator>TYPO3 - get.content.right</generator>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		
		
		
		<lastBuildDate>Thu, 15 Jul 2010 08:36:00 +0200</lastBuildDate>
		
		
		<item>
			<title>Refactoring the workplace</title>
			<link>http://www.aia-itp.com/en/blogs/itp-ccm/article//refactoring-the-workplace.html?cHash=7f8f6e777a</link>
			<description>After working on a program for some while, pieces of code tend to end up on the place where they...</description>
			<content:encoded><![CDATA[<p class="bodytext">After working on a program for some while, pieces of code tend to end up on the place where they were first conceived - not where they would logically belong. Also, the ways some problems are solved may be obsoleted by new developments. In short: the result is a mess. It may be a working mess, but a mess nevertheless.</p>
<p class="bodytext">One can leave it at that, noting that the program works &quot;and that's what counts.&quot; This is an attitude that is fostered by laziness and pressure to deliver value alike. If given in to, this will lead to extra work and less value later, when changes in the system or the environment cause the code to break, and the poor maintenance developer has to slash his way through illogical and brittle code.</p>
<p class="bodytext">So, the smart next step after initial development is to clean up the mess: reorganize and partly rewrite the code so that the functional working&nbsp;stays the same, but it is also pleasant to behold and easy to maintain. This process is called &quot;refactoring,&quot; and is recommended if not outright mandated by many (agile) methodologies.</p>
<p class="bodytext">As so often, the business of software has not invented the concept, although it may have given it this particular name. For example, work processes are reviewed and changed to remove inefficiencies or redundant tasks, a couple may receive marital counselling to rebuild part of their relationship, and once in a while I rearrange the content of my shed so I can again move within it without being impaled on misplaced garden tools. All this intends to keep the functional aspect intact, while improving the chance of surviving on the longer term.</p>
<p class="bodytext">We develop our software in teams. Sometimes - regularly - we change team composition. Team members should be located close to each other to facilitate communication. (Being engineers, we need all stimulation we can get to make sure we actually communicate.) Add to this that we have nonstandard workplaces - desks in different sizes and heights, pictures of different spouses or pets on those desks - and you can imagine that swapping team members means moving around a lot off stuff.</p>
<p class="bodytext">Today, this refactoring of the workplace was on a larger scale than usual. Also other departments had decided to move people from the places where they had ended up to places where they ought to be. The difference with moving code around is that you tend to look for people not where they &quot;logically belong,&quot; but where you were used to find them previously. The next couple of weeks I'll probably be entering a lot of wrong offices.</p>
<p class="bodytext">So, a lot of desks were carried around today. And because I program with head and hands only, the fact that I dropped a desk on my foot will not functionally change the working of the R&amp;D department.</p>]]></content:encoded>
			
			<author>j.ter.hofstede@aia-itp.com</author>
			<pubDate>Thu, 15 Jul 2010 08:36:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Quirks in the SQL Server Database Engine Tuning Advisor</title>
			<link>http://www.aia-itp.com/en/blogs/itp-ccm/article//quirks-in-the-sql-server-database-engine-tuning-advisor.html?cHash=9a534b2d80</link>
			<description>Our enterprise customer corrspondence management product ITP/CCM uses a database to keep...</description>
			<content:encoded><![CDATA[<p class="bodytext">Our enterprise customer corrspondence management&nbsp;product&nbsp;ITP/CCM uses a database to keep track of things.&nbsp;Of course, we try to optimize the performance of our&nbsp;database design:&nbsp;it's very easy to create a slow database, but&nbsp;it takes actual effort&nbsp;to create a fast one.</p>
<p class="bodytext">The <i>Microsoft SQL Server Database Engine Tuning Advisor</i> (DTA)&nbsp;is a very useful tool to help us in our quest for performance. In our development infrastructure, we've implemented&nbsp;automated trace file generation for typical workloads, and we've also managed to run the tuning advisor automatically every night (using the dta.exe command line tool). However, the tool has a lot of quirks, especially when used in conjunction with Microsoft's&nbsp;Entity Framework.</p>
<h4>Quirk 1</h4>
<p class="bodytext">The&nbsp;<b>sp_executesql</b> construct is not supported by the DTA. And Entity Framework generates pretty much all queries wrapped in sp_executesql calls!</p>
<h4>Quirk 2</h4>
<p class="bodytext">Statements of the following form are not supported by the tuning advisor:</p><div class="indent"><p class="bodytext">DECLARE&nbsp;@x type, @y type</p></div><div class="indent"><p class="bodytext">SELECT @x=value, @y=value</p></div><div class="indent"><p class="bodytext">UPDATE/INSERT/SELECT/DELETE &lt;...&gt;</p></div><h4>Quirk 3</h4>
<p class="bodytext">Ever since we upgraded from SQL Server 2005 to SQL Server 2008, the tuning advisor kept giving&nbsp;us errors like <i>&quot;59% of consumed workload has syntax errors. Check tuning log for more information.&quot;</i>. The tuning log then told us that perfectly fine queries contained an&nbsp;&quot;Invalid object name dbo.Something&quot;. And running those queries through the tuning&nbsp;advisor invididually actually went just fine!</p>
<p class="bodytext">We eventually found a workaround, which was to update&nbsp;&nbsp;the queries to reference [Database name].[dbo].[Something] instead of just [dbo].[Something].&nbsp;This was in a situation that worked in the 2005 version, we passed only a single database for optimization, and we also passed a database to connect to -- and still it couldn't find the objects.</p>
<h4>So, the workaround?</h4>
<p class="bodytext">Well, we're programmers, so&nbsp;we wrote a tool. The on-disk trace file format is not documented, but the trace table format is, so we loaded the trace file into a trace table. We then wrote a tool to go through that table, and to&nbsp;replace all sp_executesql calls with expanded versions of the same statements. The tool does&nbsp;something similar for the DECLARE...SELECT... statements (or at least for&nbsp;the limited forms of such statements spewed out by Entity Framework). And finally, it replaces &quot;[dbo].&quot; by &quot;[Database name].[dbo].&quot;. And voilà: the number of syntax errors went down into the single digits. There still are some minor&nbsp;queries that the tuning advisor doesn't understand, but at least the majority of our queries are analyzed and included in the tuning advice.</p>
<p class="bodytext">&nbsp;</p>
<p class="bodytext">&nbsp;</p>]]></content:encoded>
			
			<author>b.samwel@aia-itp.com</author>
			<pubDate>Mon, 12 Jul 2010 16:27:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Why is there a pair of unused shoes in the team room?</title>
			<link>http://www.aia-itp.com/en/blogs/itp-ccm/article//why-is-there-a-pair-of-unused-shoes-in-the-team-room.html?cHash=f32c2292d4</link>
			<description>Teams have had stranger mascottes. But alas, these shoes aren’t mascottes: they are the sad and...</description>
			<content:encoded><![CDATA[<p class="bodytext"><span lang="EN-US">Teams have had stranger mascottes. But alas, these shoes aren’t mascottes: they are the sad and lonely remnants of one team member’s attempt at getting a driver’s license. The driving lessons took place mostly during work hours, and this particular team member normally wore shoes with way too much grip, leading to all sorts of issues when operating the car’s pedals. The solution was to buy a pair of less comfortable but more slippery shoes, and to store&nbsp;them at work. The driver’s license has long since been obtained, but the shoes remain – sad, lonely and uncomfortable.</span></p>]]></content:encoded>
			
			<author>b.samwel@aia-itp.com</author>
			<pubDate>Tue, 06 Jul 2010 16:30:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Keeping Track</title>
			<link>http://www.aia-itp.com/en/blogs/itp-ccm/article//keeping-track.html?cHash=d8bb209340</link>
			<description>With software development comes a myriad of things to keep track of. Each of these can be done the...</description>
			<content:encoded><![CDATA[<p class="bodytext"><span lang="EN-US">With software development comes a myriad of things to keep track of. Each of these can be done the high-tech, low-tech, and/or the blu-tack way. Within our R&amp;D department, we have to keep track of bugs, planned features and roadmaps, release notes, agendas, program source code (including history and including which-revision-went-into-which-shipped-product-version), documentation (including similar history), sprint backlogs, who spent how much time on what task, holiday planning, employee vacation days balance, archives full of shipped releases, individuals’ e-mail conversations, helpdesk issues including the matching e-mail, helpdesk schedules, and automated test results (including history). And then I’ve probably missed some.</span></p>
<p class="bodytext"><span lang="EN-US">&nbsp;</span>So, how do we handle all this stuff? Well, some of it is distinctly low-tech: shipped releases are stored on a network drive somewhere, and holiday planning is handled using a simple spreadsheet on the network. There’s also some physical blu-tack involved, or at least some sort of real-world adhesives: one of our sprint teams keeps track of sprint items and progress using post-it notes. On the other hand, another team uses a home-grown administration tool for the same purpose. As time progresses, and Aia grows, our tool set expands, and we are forced to adopt more technologically advanced solutions. Let me give you some examples. These are just some of the things that are happening at the Aia Software R&amp;D department to further optimize and professionalize how we keep track of things. It’s an ongoing effort, and things are continuously improving!</p>
<p class="bodytext"><span lang="EN-US">&nbsp;</span>Let’s start with test results. At first, our automated test results were verified by manual log checking, with totals entered into a spreadsheet. The spreadsheet retained the history of test result totals, but no individual test information. As the test sets expanded, and as the number of test platforms increased, this became increasingly difficult to keep up with. Then one of my colleagues came up with a log parser tool which automatically calculated the totals, written in perl. That was step one, and it saved a lot of work. Still, gathering the totals was still a manual process. Then at some point I wrote a gathering tool in C# that wrote the results into a database, on a test-by-test basis. No more manual intervention was required. A spreadsheet with pivot tables could be used to aggregate error statistics by platform, product, etcetera. Furthermore, it allowed easy access to the failure history of a test – there is a lot of value in knowing the time when a failure first occurred.</p>
<p class="bodytext"><span lang="EN-US">&nbsp;</span><span lang="EN-US">As for documentation, we used to keep track of that in Microsoft Word. Nothing fancy – just the docs please. The documentation was stored in our regular revision control system that was also used for the program source code. Again, at some point this became hard to use: there could easily be multiple people who would want to work on the same manual, and that would be impossible. Therefore, this solution has now been replaced with a proprietary document authoring system, that we can also use to author help files. Multiple users can log into the authoring system at once, and edit different topics in the same manual without interfering with each other. As an added benefit, the new tool allowed us to publish our documentation in HTML format for our </span><span lang="EN-US"><a href="http://www.aia-itp.com/support_itp3.5/" target="http://www.aia-itp.com/support_itp3.5/" >Aia&nbsp;ITP&nbsp;Knowledge Center</a></span><span lang="EN-US">.</span></p>
<p class="bodytext"><span lang="EN-US"></span></p>
<p class="bodytext"><span lang="EN-US">&nbsp;</span>As a final example, consider revision control. This is such an essential part of the software development tool chain that it is easy to get into holy wars. We currently use PVCS, which was chosen a long time ago and which at the time was considered a more stable choice than, say, SourceSafe. But we are now frequently stretching the limits of what PVCS can do. For instance, we simulate “streams” or branches using PVCS labels. That’s nice, but if you rename files frequently your folders will be full of files that are actually no longer in use. Other wishes include better support for assisted porting (merging) of changes between branches (e.g. for back- or forward-porting of hotfixes), better performance, atomic commit, and integration with bug tracking systems. For that reason we are probably going to move to a new revision control system at some point. When? That’s hard to predict. Probably after the holy wars have been settled – and those haven’t even started yet. But I for one can’t wait!</p>]]></content:encoded>
			
			<author>b.samwel@aia-itp.com</author>
			<pubDate>Tue, 08 Jun 2010 17:14:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>ADO.NET Entity Framework 3.5 Performance Bottlenecks (And How We Worked Around Them)</title>
			<link>http://www.aia-itp.com/en/blogs/itp-ccm/article//adonet-entity-framework-35-performance-bottlenecks.html?cHash=a8422ebea0</link>
			<description>When we started developing ITP/CCM, our enterprise customer correspondence management solution, we...</description>
			<content:encoded><![CDATA[<p class="bodytext"><span lang="EN-US">When we started developing ITP/CCM, our enterprise customer correspondence management solution, we chose to use the Microsoft ADO.NET Entity Framework as a database persistence layer. This has given us lots of advantages. For starters, changing the database schema has much less impact than when we would have used raw SQL. And because manipulating objects in the Entity Framework looks just like manipulating regular in-memory C# objects, we could use developers with little or no knowledge of SQL databases.</span></p>
<p class="bodytext">Unfortunately, as we found out later, the Entity Framework also comes at a cost. In particular, performance is an issue. You won’t notice this if you’re only querying or updating a couple of records in an interactive application, but if you’re doing bulk processing, you are <i>definitely</i> going to notice. And what does ITP/CCM do? Right: it does lots of bulk processing, so we noticed. Big time.</p>
<p class="bodytext">Let’s start with some background on ITP/CCM. We aim for the system to scale to extremely large numbers of processed envelopes. Because of this, we use a loosely coupled design centered around a database. Processing agents, which run on multiple servers, bulk fetch a set of objects that are in a certain stage, and process them to produce a set of objects a subsequent stage, which are then written back to the database. Clearly, performance of bulk database access is of the utmost importance in this design. So, where did the Entity Framework fail us and where did it hold up?</p>
<p class="bodytext"><b><span lang="EN-US">Bulk inserting / updating:</span></b><span lang="EN-US"> Frankly, the Entity Framework performance for inserts and updates is dreadful. Why? Well, apparently it takes a huge amount of CPU to figure out what exactly has changed, and what SQL statements have to be executed, in which particular order. And then those statements are executed one… by… very slow… one. We updated one particular processing agent to use plain SQL INSERT statements instead of Entity Framework. The effect? An instant speedup of our benchmark run for this agent from about 90 seconds to about 7 seconds, including all of the reading and processing. We then applied an extra “special sauce” abstraction layer which submitted the SQL queries to SQL Server in batches of several dozens of statements, to reduce the time taken by round trips. This brought the time back to less than 5 seconds.</span></p>
<p class="bodytext"><span lang="EN-US"></span></p>
<p class="bodytext"><b><span lang="EN-US">Data Reading:</span></b><span lang="EN-US"> For data reading, we’re still actually using the Entity Framework quite a lot. In the preceding example, the bottleneck was in write performance, not read performance. We did have some read performance issues though, a couple of which I’d like to share.</span></p>
<p class="bodytext"><span lang="EN-US"></span></p>
<p class="bodytext"><span lang="EN-US">&nbsp;</span><b><span lang="EN-US">ISSUE 1: <i>Overuse of the Include() function.</i></span></b><span lang="EN-US"> It turns out that if you use Include() to preload relationships, this works fine for one or two relationships, but once you get past that, you may suddenly get nonlinear decreases in performance. For instance, we had a query which preloaded about 6 relations, and that took about a minute. Removing one relationship – ANY relationship – from the Include() list reduced the run time to about 10 ms.</span></p>
<p class="bodytext"><span lang="EN-US"></span></p>
<p class="bodytext"><span lang="EN-US">&nbsp;</span>So what happens here? Well, it turns out that every Include() adds significant complexity to the query generated by Entity Framework. Especially because of the Relationship Span feature (see below), each Include() may add several tables. And when the number of tables increases, the database query planner’s task becomes intractable (because query planning is VERY hard), and it will make weird decisions. We had one case where SQL Server would produce a plan to first join a 3-million-row table with a 25-million-row table, then join the result of that several times, and then join the end result to a table which had three rows in it. Doing the exact reverse would probably have been wiser, but of course there is no way to tell that to SQL Server. So instead, we removed the Include() which added the 25-million-row table to the query, and loaded that part separately. Poof! Performance problem gone.</p>
<p class="bodytext"><span lang="EN-US">&nbsp;</span>So, what’s the general advice here? Well: do not Include() multiple relationships that are 1:N, because each of these will multiply the result set size by N. Do not Include() more than a couple of relationships, and Load() the remaining relationships.</p>
<p class="bodytext"><span lang="EN-US">&nbsp;</span><b><span lang="EN-US">ISSUE 2: <i>Relationship Span versus NoTracking.</i></span></b><span lang="EN-US"> Does the LINQ query </span><span lang="EN-US">(from o in database.MyEntity select o)</span><span lang="EN-US"> translate to the SQL query </span><span lang="EN-US">SELECT * FROM MyEntity</span><span lang="EN-US">? The answer is NO. Entity Framework has a feature called <i>Relationship Span</i>, which basically means that it will already pre-fetch the entity keys for all related objects that have an x:1 relationship with the queried object. So, if MyEntity has a relationship with MyOtherEntity modeled by a foreign key in MyOtherEntity, this LINQ query will translate to something like </span><span lang="EN-US">SELECT MyEntity.*, MyOtherEntity.MyID FROM MyEntity LEFT OUTER JOIN MyOtherEntity ON MyOtherEntity.FK = MyEntity.MyID</span><span lang="EN-US">. Nice, no? Well, no indeed. For performance this can have very nasty effects. And this feature interacts with the Include() feature described earlier: it will do this for the objects in the included relationships as well! So, if you use Include(“A.B”), then you will actually get Include(“A and all its x:1 relationships”), Include(“A.B and all its x:1 relationships”). That results in a <i>lot</i> more tables in the generated SQL query, and a greatly increased chance that the query optimizer will no longer know what to do.</span></p>
<p class="bodytext"><span lang="EN-US"><b></b></span></p>
<p class="bodytext"><span lang="EN-US">&nbsp;</span>So is there a solution? Well, you can turn on the NoTracking option before querying, and this will turn off relationship span. Unfortunately, it will also turn off some other features which you might want, including “tracking”, which means that the objects are not attached to the object context. This means you can’t modify and save the objects that you retrieved, you can’t use Load() to load additional relationships that you didn’t Include(), and duplicate objects in the result set are not deduplicated. For us, this was not an issue. First of all, we no longer use Entity Framework to perform updates, so that is not a problem. Furthermore, it turned out that when Relationship Span was turned off, we could once again Include() everything without much performance impact, because the number of tables in the generated queries was much lower, and the SQL Server query optimizer once again understood how things were to be done.</p>
<p class="bodytext"><span lang="EN-US">&nbsp;</span><b><span lang="EN-US">ISSUE 3: <i>Database Tuning</i>.<i> </i></span></b><span lang="EN-US">Entity Framework generated SQL queries are hard to tune, because the SQL Server 2005 Database Engine Tuning Advisor does not recognize the queries generated by Entity Framework. This is because the Entity Framework queries use </span><span lang="EN-US">sp_executesql</span><span lang="EN-US"> to promote query plan reuse. So, how did we work around this issue? Well, we now use the SQL Server tracing facilities to trace to a table, then run a home-made tool which transforms the queries into something that the tuning advisor understands, and then run the tuning advisor on that. We have automated the entire tuning process so that it runs every night. This works very well and gives us decent query performance, but it must be said that this is not a solution that can be used by mere mortals – we hope that Microsoft will eventually improve the tuning advisor so that it will understand the Entity Framework queries. Perhaps SQL Server 2008 works, but we haven’t had time to try that yet, and we weren’t willing to upgrade our performance test machines because we try to test on the lowest common denominator.</span></p>
<p class="bodytext"><span lang="EN-US"></span></p>]]></content:encoded>
			
			<author>b.samwel@aia-itp.com</author>
			<pubDate>Wed, 12 May 2010 13:32:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>R &amp; Dunglish</title>
			<link>http://www.aia-itp.com/en/blogs/itp-ccm/article//r-dunglish.html?cHash=97371e1693</link>
			<description>English is the language of software. Apart from unpronounceable punctuation (!.?), sexy curves...</description>
			<content:encoded><![CDATA[<p class="bodytext">English is the language of software. Apart from unpronounceable punctuation (!.?), sexy curves ({}), or plain bad language (#$%&amp;*), keywords in programming languages tend to be in English. System programming languages mostly are terse, with the flow of symbols interjected with short words like do, if and void. Languages designed for education or for &quot;end user programming&quot; are a bit more eloquent, and even dare to use more than one syllable: begin, procedure. You may have noticed that the ITP language does not shun big words, witnessing its latest neologism <i>DATASTRUCTURE</i>.</p>
<p class="bodytext">English is the language of Aia Software to the outside world, at least as far as the international market is concerned. Of course. If you want to sell your solutions and services around the globe, you'll talk in the language most potential customers understand.<br />&nbsp;<br />The education system of The Netherlands is eager to give all Dutch a firm grasp of the English language, starting in the childhood. With the usual lack of effectiveness of this system, however, learning English starts after the age that children will learn a language naturally, from being exposed to it, but before they have a proper command of their native language. The effect is, predictably, that in the end they will not be fluent in English, nor be able to use their mother tongue flawlessly. College and university will worsen this situation by insisting to use English for half or all of the lessons. As the teachers are not native speakers either, in the end we're all learning each other some pidgin dialect of the English language. Anglophone readers may have been amused or annoyed in this respect by the documentation shipped with ITP or by this very blog entry itself. (Hey, we're doing our best!)</p>
<p class="bodytext">Talking about English-eagerness: today I saw a Dutch newspaper translate the German word “Müll” for their Dutch readers as “trash”. The translation is correct, but it would have been so much logical to translate it to the Dutch word “vuilnis”…</p>
<p class="bodytext">English is also the language of the R&amp;D department of Aia, since a couple of months. When the development team was reinforced with a new member who was non-Dutch speaking, it was decided that the entire department would switch to English as the day-to-day language. The team was not only expected to talk English to the new member, but also when talking to other team members. The idea is that one can learn a lot from overheard conversations. As a side note I might add that many of us wear headphones playing music to be able not to involuntarily overhear every conversation. We have a lot of them, and team members share a single room, and sometimes it is just necessary to be able to concentrate on the task at hand. </p>
<p class="bodytext">The switch to English was triggered by the new team member's arrival, but not really caused by it, as the possibility to use English internally was already thought about before. Anyhow, the entire organization was informed about the rule of the new language, and funny language signs were posted on the doors to the R&amp;D rooms. (<i># BEGIN language_code(&quot;ENG&quot;)</i>, which is ITP-speak for <i>Lasciate ogni speranza, voi ch'entrate</i>). </p>
<p class="bodytext">And we started speaking English. From 8 am. Up to 6 pm. Which appeared much harder than we thought, and especially much more tiring. A new member needs to be brought up to speed with a lot of technical knowledge. Sessions lasting an hour and a half, explaining nontrivial concepts and details in the architecture of ITP is tough already when done in Dutch. Speaking English is much different from writing it. You don't have the time to think for words or look them up, nor do you have time to ponder the correctness of your grammatical constructions. This is only partially compensated for by not having to look up the spelling of the words. Not only do you have to suffer from the awful accent of your colleagues, you also hear your own awful accent the entire day, which is much worse. On the other hand, you do actually learn from each other, because even through the accents you get to hear a lot of nice idiomatic expressions. </p>
<p class="bodytext">In time, our resolve to speak English continually began to erode. In a room where the new team member was not present, people would look cast around a quick suspicious glance before starting some small talk about the children, politics, or sports in Dutch. In some more time, small talk could even be Dutch with the new team member within earshot. Currently, sometimes even R&amp;D topics get a Dutch treatment in presence of the new team member, if we are sure it would not interest her. We enter into temptation: the spirit indeed is willing, but the tongue is weak. </p>
<p class="bodytext">Still I think speaking English in the department is a good idea apart from being able to communicate with all team members. I sincerely hope that it in time will help us raise the standard of language usage in our documentation. And of course, all R&amp;D meetings still are held in English. </p>
<p class="bodytext">Our new team member thinks we hate her guts because we're forced to speak English because of her. Her study of the Dutch language is progressing rapidly. Perhaps these two statements are related.</p>]]></content:encoded>
			
			
			<pubDate>Thu, 22 Apr 2010 14:41:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Modeling Business Rules using ITP/CCM Plug-ins</title>
			<link>http://www.aia-itp.com/en/blogs/itp-ccm/article//modeling-business-rules-using-itpccm-plug-ins.html?cHash=170d54faf7</link>
			<description>At Aia Software, we have ample experience modeling the document output business rules of our...</description>
			<content:encoded><![CDATA[<p class="bodytext"><span lang="EN-US">At Aia Software, we have ample experience modeling the document output business rules of our customers. However, when designing ITP/CCM, we explicitly chose to assume that we <i>cannot possibly know</i> all of the business rules that our future customers will want to implement using ITP/CCM. This had a strong influence on our solution architecture. Normally, we would implement each possible business rule as a separate feature, based on customer requirements, and we would then keep expanding the product until we had a complete feature set. Instead, in ITP/CCM we chose to put all business rules sensitive processing into trusted plug-ins, which can be adapted on a customer-by-customer basis. When ITP/CCM is implemented for a particular customer, we can then implement the business rules of the customer by simply adapting the plug-in, without any changes to the core product.</span></p>
<p class="bodytext"><span lang="EN-US">Here are some examples of business rules that can now be controlled by plug-ins in ITP/CCM:</span></p>
<p class="bodytext"><b><i><span lang="EN-US">Communication rules.</span></i></b><span lang="EN-US"> These rules define what envelopes are sent, to which recipients, and through which channels, containing which documents. </span></p>
<p class="bodytext"><span lang="EN-US"></span><span lang="EN-US">In our view of how ITP/CCM will be used, these rules are based on communication profiles that are taken from CRM. Therefore, we will be providing a default implementation which can integrate with Microsoft’s CRM solution. However, the plug-in architecture allows for any source of such communication profiles. But even if an organization uses our default implementation, their business rules may vary wildly, depending on e.g. agreements with agents. </span></p>
<p class="bodytext"><b><i><span lang="EN-US">Combined output streams. </span></i></b><span lang="EN-US">These rules<b><i> </i></b>determine which documents are combined into output streams for which output device.</span></p>
<p class="bodytext"><span lang="EN-US">Each and every organization has their own very distinct business rules regarding the composition of output streams. For instance, an organization’s envelope inserting machine might require separate streams of 1-page envelopes, 2-page envelopes, and so on. The local postal service may require documents to be sorted by postal code. The organization might want separate streams for full-color and black-and-white output, or for duplex and simplex output.</span></p>
<p class="bodytext"><b><i><span lang="EN-US">Envelope bundling.</span></i></b><span lang="EN-US"> These rules determine whether multiple envelopes for the same recipient can be bundled into a single envelope.</span></p>
<p class="bodytext"><span lang="EN-US">Bundling of output into a single envelope provides many opportunities for savings. However, this is yet another area where business rules are unique for each organization. For instance, large enterprises may not want to bundle correspondence from different business units, even though they share a single document output infrastructure. Some organizations may simply bundle the envelopes and include all cover letters for the separate envelopes, while other organizations may want to replace individual cover letters with a single cover letter that describes the entire bundled envelope contents. Also, the maximum size of bundled envelopes may be different for each recipient: a large agent may gladly receive boxes containing 5000 pages each, while Joe Customer would like envelopes to fit in his mail box. All of these business rules can be implemented using the ITP/CCM plug-in architecture.</span></p>
<p class="bodytext"><span lang="EN-US">Of course, a plug-in architecture introduces some difficulties as well. For instance, in the design of ITP/CCM we have always tried to honor the mantra “configure, don’t program”. The use of plug-ins seems to violate this mantra. However, we think we have found a proper balance, and that we have minimized the amount of programming required for the implementation complex business rules and e.g. integration with CRM systems. &nbsp;Because:</span></p>
<p class="bodytext"><b><i><span lang="EN-US">It’s simple</span></i></b><i><span lang="EN-US">:</span></i><span lang="EN-US"> XML in, XML out. Plug-ins only need to implement the business rules on the input XML, and write out the results to another XML stream. That’s all! All the behind-the-scenes bookkeeping, which includes retrieving all relevant information from the ITP/CCM database, storing the results, and scheduling further processing, is handled by ITP/CCM.</span></p>
<p class="bodytext"><b><i><span lang="EN-US">Plug-ins can have configuration:</span></i></b><span lang="EN-US"> We promote the use of configuration in plug-ins, by allowing <i>PluginConfig XML</i> to be attached to all ITP/CCM configuration objects. These PluginConfig XMLs are free XML fragments which are passed to all plug-ins that require them. For instance, the PluginConfig for a correspondence pack may provide additional information to a plug-in regarding which of the documents in the correspondence pack should be distributed to agents, and which documents should be left out (e.g. Terms and Conditions, cover letters). In our view, a well-written plug-in should implement only the <b><i>mechanisms</i></b> for the business rules, but should leave plenty of room for configuration, so that the actual decisions of when-to-apply-which-rule are left to business analysts.</span></p>
<p class="bodytext"><span lang="EN-US">All in all, the ITP/CCM plug-in architecture provides implementers with an unsurpassed level of flexibility without requiring them to do everything themselves, and it provides our customers with reduced time-to-market for business rule changes (since no core ITP/CCM product changes are required for new or updated business rules). In addition, it frees up the ITP/CCM development team to work on the core of ITP/CCM, to the benefit of all ITP/CCM users, free from the distractions of working on specific business rules that benefit only a limited number of customers.&nbsp;</span>&nbsp;</p>]]></content:encoded>
			
			
			<pubDate>Mon, 14 Dec 2009 10:08:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>A GUI for ITP/CCM</title>
			<link>http://www.aia-itp.com/en/blogs/itp-ccm/article//a-gui-for-itpccm.html?cHash=f0130d1483</link>
			<description>As mentioned in an earlier post ITP/CCM ‘weight’ 7.730.245 bytes: roughly 7MB. This is quite small...</description>
			<content:encoded><![CDATA[<p class="bodytext">As mentioned in an earlier post ITP/CCM ‘weight’ 7.730.245 bytes: roughly 7MB. This is quite small compared to most other applications that are around these days. In most modern applications a large portion of the size is related to user interface code. ITP/CCM currently only provides an engine to run the processing. All administration is done via XML files. </p>
<p class="bodytext">Often people ask me why we haven’t added any GUIs yet, after all, modern tools provide features for rapid GUI development. Well, the answer is rather simple: we do not want just any other GUIs, we want a good GUI. Let me explain what I mean by that.</p>
<p class="bodytext">With ITP/CCM we try to keep the technical concepts as close as possible to the concepts known by the user. We are continuously spending time on designing, mapping, refining and remapping these technical concepts to high level user identifiable concepts. Having concepts in the product that are aligned with real world concept as close as possible should help us create a good GUI. This is necessary as one of our goals is to make ITP/CCM as business managed as possible.</p>
<p class="bodytext">But even when the high level concepts are right, it isn’t that easy to create good GUIs. For instance one of the common mistakes is to have a programmer design the GUI with his or her assumptions on the users perspective. A good example of this can be seen in our own ITP/MDK Repository. At some point we’ve added a menu option to run a model and named that option “Run Model”. This was done under the assumption that users want to run model. Looking at the problem from a programmer model this makes sense. But in the user’s model “running a model” is almost meaningless. No model developer wants to run a model for the sake of running a model. The only reason for them to run the model is to test it. Therefore the menu option should have better been named “Test” instead.</p>
<p class="bodytext">And that is only one example of what can go wrong with quick GUI design. To be able to design good GUIs we need to know our users. Not only what their regular daily function is but also what their mindset is when working with the product, how often they use the product, etc. We also have to be aware that there are different types of users with different roles involved with ITP/CCM. They all require different GUIs with different requirements. So we can only create a good GUI if we know what user will use that specific GUI.</p>
<p class="bodytext">One decision has already been made about the GUI: it is going to be web based. Parts of the GUI might be integrated with or provided by a CRM system. We are currently working on the design of the GUI and coming up with the proper GUI concepts and metaphors. Once we have that developing the GUI will probably go in a rapid pace, assisted by the modern tools and technologies that are at our disposal. From then on not only the functionality, which we are extending constantly, but also the number of bytes in ITP/CCM will grow rapidly.</p>]]></content:encoded>
			
			
			<pubDate>Sat, 14 Nov 2009 16:20:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Separate content and infrastructure</title>
			<link>http://www.aia-itp.com/en/blogs/itp-ccm/article//separate-content-and-infrastructure.html?cHash=ec37661100</link>
			<description>Anyone who has created complex documents, whether in Microsoft Word of by developing ITP models,...</description>
			<content:encoded><![CDATA[<p class="bodytext"><span lang="EN-US">Anyone who has created complex documents, whether in Microsoft Word of by developing ITP models, had to make design decisions in regards to the output infrastructure: Layout may differ if a document will be printed in duplex or simplex. Paper trays need to be set for different sections of the document. OMR codes are added to control the mail system. Separator pages are needed for the print operator or the archive. Page numbering can differ depending on the output channel. Some of this information might get lost depending on the output format, like paper tray information in a PDF document. Moreover the number of output channels, and with it the number and complexity of business rules, is growing.</span></p>
<p class="bodytext"><span lang="EN-US">Besides setting these properties in the document, macros and scripts need to be developed to set or change these settings ones more when many different hardware components are used within the organization. Some users feel right at home being in full control of the final output. Most however, have limited knowledge of the company infrastructure and advanced techniques in their word processor.</span></p>
<p class="bodytext"><span lang="EN-US">In all its products, Aia Software strives to separate concerns. Key is this is the adagio “Business owned, IT controlled”. This is also true for ITP/CCM. The product will allow all roles involved to concentrate on their field of expertise. The business user can focus on the content. The business manager can configure correspondence packs, defining a set of documents. The model developer creates document templates and the mail room or IT department configures the infrastructure.</span></p>
<p class="bodytext"><span lang="EN-US">Besides the adagio there is also a functional reason to separate these concerns. In ITP/CCM many decision will be made at run-time. Therefore it will not be possible to control them upfront from within the document. Some possible run-time event or decisions: Page numbering may depend on the final correspondence pack. Page numbering might continue over all or part of the set. Third party print streams can be included. Fonts and location might need alignment. OMR codes will only be needed for print, not email. The requirement may even change ones more when document are bundled before distribution.</span></p>
<p class="bodytext"><span lang="EN-US">ITP/CCM will introduce two main objects that allow the configuration of all these properties, The correspondence type and devices. The first defines the document sets and its properties, this includes page numbering properties and default devices. Devices define technical aspects like addresses, duplex settings and spool file size. But also the post processing steps to be done, including OMR settings can be defined on a device level. Only when the content differs per output channel this needs to concern the user defining the document. ITP/CCM will facilitate the optimal use of resources, whether staff, knowledge or devices.</span></p>]]></content:encoded>
			
			
			<pubDate>Wed, 14 Oct 2009 16:57:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>ITP/CCM was born</title>
			<link>http://www.aia-itp.com/en/blogs/itp-ccm/article//itpccm-was-born.html?cHash=b0d5a0fc2b</link>
			<description>Yesterday afternoon ITP/Customer Correspondence Management formerly known as ITP/Envelopes was...</description>
			<content:encoded><![CDATA[<p class="bodytext">Yesterday afternoon ITP/Customer Correspondence Management formerly known as ITP/Envelopes was born.</p>
<p class="bodytext">We will call her ITP/CCM for short.</p><ul><li>Date: 30th september 2009</li><li>Time: 16:50 pm</li><li>Weight: 7.730.245 bytes</li></ul><p class="bodytext">The parents will be resting from october 1st to october 12th. ;-)</p>
<p class="bodytext">&nbsp;</p>]]></content:encoded>
			
			
			<pubDate>Thu, 01 Oct 2009 16:38:00 +0200</pubDate>
			
		</item>
		
	</channel>
</rss>