<?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-311550892563951795</id><updated>2012-02-16T17:30:25.993Z</updated><title type='text'>Adrian Mowat on Agile Data Integration</title><subtitle type='html'>Thoughts on data integration projects and Agile by Adrian Mowat</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-494533488868009871</id><published>2010-10-28T07:08:00.002+01:00</published><updated>2010-10-28T07:08:26.188+01:00</updated><title type='text'>Test Driven Development - Building a Magic Funnel</title><content type='html'>An automated data integration test suite is like a funnel that scoops up abstract, unstructured and downright weird knowledge from every corner of your problem domain, condenses it onto a concise form, and pipes it out to consumers (i.e. development teams) who turn it into a working system.&lt;br /&gt;&lt;br /&gt;It fulfils three important roles that are otherwise missing.&lt;br /&gt;&lt;br /&gt;* To define a complete and unambiguous specification held in a form that is directly useful to technical people (n.b. a spec is not directly useful because it is open to interpretation and assumes tacit knowledge about the problem)&lt;br /&gt;* To create single, well understood, vocabulary for discussing requirements and issues in development&lt;br /&gt;* To give ourselves fast, simple way to prove functional correctness&lt;br /&gt;&lt;br /&gt;So how do you build the funnel? &lt;br /&gt;&lt;br /&gt;Let's assume you a basic technical framework in place that allows you to store test cases and run them through the system under test. &amp;nbsp;The question we need to answer is how to integrate it into your project lifecycle in a cost effective manner. &amp;nbsp;The only way to do that is to use Test Driven Development (TDD). &amp;nbsp;Put very simply, write a failing test that describes a change before you write the code to implement that change. &lt;br /&gt;&lt;br /&gt;There is plenty of information out there on how to do TDD in Object Oriented systems. &amp;nbsp;I have worked through a lot of it and built &amp;nbsp;systems of my own to learn the techniques (and do other useful things as well). I found that Object Oriented languages allow much more modular code than ETL systems and give you much more control over the low-level details. &amp;nbsp;Many of the techniques do not map perfectly into the Data Integration world. &amp;nbsp;It's certainly impossible, or at least highly impractical, to start from a single test case and build up a system from there. &amp;nbsp;For a start, a large part of the system already exists in the form of source and target systems and interfaces.&lt;br /&gt;&lt;br /&gt;However, I have found that the principles and benefits of doing TDD are relevant and achievable to Data Integration when you tweak the practices a little. &amp;nbsp;Furthermore, data integration projects raise challenges around data quality and opaque interfaces to external systems that are not a concern on most OO systems. &amp;nbsp;I have found that building the funnel using TDD provides an elegant and proactive solution to these problems that integrates well with normal project activities and does not mandate an explicit 'phase','activity' or 'gate'.&lt;br /&gt;&lt;br /&gt;Here's how to do it.&lt;br /&gt;&lt;br /&gt;Before you write any code...&lt;br /&gt;&lt;br /&gt;1. Create an automated test harness. &lt;br /&gt;2. Work with technical team, business users and analysts to define an initial set of test cases based on the current understanding of the business problem. &amp;nbsp;Make sure you can run all your test cases in one pass and you don't need to run batches of test cases through the system under test.&lt;br /&gt;3. Roll technical test cases such as boundary conditions and known data quality issues into the test suite.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;- Do your initial data profiling here&lt;br /&gt;&lt;br /&gt;At this point, you will find that you have driven out a lot of problems in your understanding of the problem and the solution required by simply thinking through the problem at a detailed level. Some of these will be misunderstandings between the business and technical people, while others will be areas the business users and analysts had not considered in their initial discussions. &amp;nbsp;The test framework has already been valuable and you don't even have any code yet!&lt;br /&gt;&lt;br /&gt;You are now ready to start coding and you can move the test suite into "TDD" mode.&lt;br /&gt;&lt;br /&gt;For every modification...&lt;br /&gt;&lt;br /&gt;4. Check you have test cases for the feature. &amp;nbsp;If you don't, write them.&lt;br /&gt;5. Run the suite to ensure the test fails (this is how you "test the test")&lt;br /&gt;6. Write code to make the test pass - running the tests frequently to make sure you are on the right track&lt;br /&gt;7. Once all the tests pass, refactor your code to make it production ready&lt;br /&gt;8. Go to step (4) and start the next feature&lt;br /&gt;&lt;br /&gt;You must expect issues to arise once you start development. &amp;nbsp;Some will be technical, others business-related and the rest due to tests that were missed in the first pass. &amp;nbsp;It is very important to assign collective ownership of the test suite to the development team so everyone has the right and ability to make changes as soon as they find a problem. &amp;nbsp;In practical terms, you should have a version control strategy to ensure changes are propagated around the team in a controlled fashion, but you should avoid assigning ownership or setting up any sort of approval mechanism that will create a bottleneck.&lt;br /&gt;&lt;br /&gt;Periodically, you should run a smoke test with a full volume of production or production-like data through the system to drive out issues you have missed. &amp;nbsp;Similarly, if you have a lot of dependencies on other systems you should build your test suite to stub out those dependencies but run regularly in a fully integrated environment to find new cases that should be added to your automated suite.&lt;br /&gt;&lt;br /&gt;Footnote: Why you really can't create the tests after the code&lt;br /&gt;&lt;br /&gt;Apart from the fact you have already lost the benefits of the funnel during development, it's actually impossible to create a complete test suite after the event. &lt;br /&gt;&lt;br /&gt;Ask yourself a few of questions...&lt;br /&gt;&lt;br /&gt;* How can you validate the test suite tests what you think it does unless you have made the test fail?&lt;br /&gt;* How can you be sure the test suite tests everything the code base does unless it grew alongside the code base?&lt;br /&gt;* How can you inject test cases into a system that was never built to have test cases inserted into it? &amp;nbsp;Usually you will find a few tricky dependencies that you can't work around.&lt;br /&gt;&lt;br /&gt;I'm not saying you should not try to build a test suite if you have to manage a codebase that does not have tests, but you should understand the limitations. &amp;nbsp;You should certainly not plan to build the tests after the code if you have the option.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-494533488868009871?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/494533488868009871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=494533488868009871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/494533488868009871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/494533488868009871'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2010/10/test-driven-development-building-magic.html' title='Test Driven Development - Building a Magic Funnel'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-1844979404305068040</id><published>2010-09-17T12:36:00.001+01:00</published><updated>2010-09-19T11:10:27.511+01:00</updated><title type='text'>Fundamentals of data testing: Setup and Teardown Patterns</title><content type='html'>&lt;p style="font-size: 13px;"&gt;&lt;span style="font-size: medium;"&gt;﻿A good automated test suite can setup a new environment, run the tests while retaining enough information to debug failures, and then teardown, or reset, the environment ready for next time the test suite runs.  Data integration systems, by definition, deal with persistent data stores so the test suite needs to reflect that and deal with the inherent complications.&lt;/span&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;&lt;em&gt;&amp;gt;&amp;gt; Edit: As Nick pointed out in the comments, it's useful to defer teardown and leave the test data intact after the test runs so you can debug any failures.  I usually work on the cycle of teardown -&amp;gt; setup -&amp;gt; test&lt;/em&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;This article describes 3 patterns I have found useful for setup and teardown.&lt;/p&gt;&lt;ul style="font-size: medium;"&gt;&lt;li&gt;Truncate and Rebuild&lt;/li&gt;&lt;li&gt;Build from Copy&lt;/li&gt;&lt;li&gt;Test Data Set&lt;/li&gt;&lt;/ul&gt;&lt;p style="font-size: medium;"&gt;They are not mutually exclusive and can be mixed and matched as needed so, for example, you might use a truncate and rebuild strategy in the filesystem and a test keys approach in the database.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;﻿The Test Environment&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;The test environment consists of mixture of code, persistent storage, applications and libraries and tools including, but not limited to...&lt;/p&gt;&lt;ul style="font-size: medium;"&gt;&lt;li&gt;The system under test and libraries on which it depends&lt;/li&gt;&lt;li&gt;The test framework&lt;/li&gt;&lt;li&gt;Source code repositories&lt;/li&gt;&lt;li&gt;Example data sets and expected results&lt;/li&gt;&lt;li&gt;Source, target and intermediate databases and tables&lt;/li&gt;&lt;li&gt;Source, target and intermediate files and directories&lt;/li&gt;&lt;li&gt;Business applications&lt;/li&gt;&lt;li&gt;ETL environments/tools&lt;/li&gt;&lt;li&gt;Data transport software - e.g. MQSeries and FTP&lt;/li&gt;&lt;li&gt;Scheduling software&lt;/li&gt;&lt;/ul&gt;&lt;p style="font-size: medium;"&gt;The test suite must include enough of these elements to repeatedly verify the data-transformation logic and supporting infrastructure on-demand, at the touch of a button.  You should keep it as simple as possible by only including only the elements needed to perform the test.  For example, don’t bother running your tests within the scheduler unless the schedule is complex enough to justify the extra effort.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;It is important to build a test suite that can run at any time without impacting other teams’ work.  Unit test suites must be under the direct control of the developer(s) working on the code so they can build test cases and perform the TDD cycle for every change they make to the code base.  “Higher” test environments might run on a scheduled basis (every hour, or after each commit, for example), but they still should be made as accessible as possible.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;Real-world constraints&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;Unfortunately, it is not usually cost-effective to have dedicated access to all the elements needed (especially when first introducing these practices) so you will probably need to be a little creative about how you live alongside other users of the existing development and test systems at your disposal.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;The following patterns can be used to create a test environment that coexists happily with other teams.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;The “Truncate and Rebuild” Pattern&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;Overview:&lt;/strong&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;A brute force approach where the test suite assumes it has free reign to delete existing artifacts.  It deletes everything it finds, builds everything it needs from scratch and deletes it all afterwards.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;Mechanics:&lt;/strong&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;Delete all existing artifacts and re-create them from source as you would when deploying to a new environment.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;Very good at driving out deployment problems (missing files, bad checkins etc)&lt;/p&gt;&lt;ul style="font-size: medium;"&gt;&lt;li&gt;The environment is guaranteed to be clean&lt;/li&gt;&lt;li&gt;You are unlikely to impact anyone else’s work&lt;/li&gt;&lt;li&gt;Simplifies the test framework because it  does not need to worry about other users of a given resource.&lt;/li&gt;&lt;/ul&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;Disadvantages:&lt;/strong&gt;&lt;/p&gt;&lt;ul style="font-size: medium;"&gt;&lt;li&gt;Often not cost effective - especially if applied to elements with expensive licences&lt;/li&gt;&lt;li&gt;Can mask real world problems because real world systems need to coexist with other applications so a totally isolated test suite may miss defects caused by other system’s activities&lt;/li&gt;&lt;li&gt;Must be used with care to avoid accidentally deleting someone else's work or artefacts that cannot be easily recovered &lt;/li&gt;&lt;/ul&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;The “Build from Copy” Pattern&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;Overview:&lt;/strong&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;A close cousin of &lt;em&gt;Truncate and Rebuild&lt;/em&gt;.  Instead of building an element from scratch, it is created by copying from a master-location.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;Mechanics:&lt;/strong&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;Delete all existing artifacts and re-create them by copying from a master location.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;&lt;ul style="font-size: medium;"&gt;&lt;li&gt;As per &lt;em&gt;Truncate and Rebuild&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Easy to visualise and manage because the master copy of the artifact is available&lt;/li&gt;&lt;/ul&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;Disadvantages:&lt;/strong&gt;&lt;/p&gt;&lt;ul style="font-size: medium;"&gt;&lt;li&gt;As per &lt;em&gt;Truncate and Rebuild&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-size: medium;"&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;The “Test Data Set” Pattern &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-size: medium;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;Overview:&lt;/strong&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;The test framework is built to work alongside other users’ data by managing a data set that is easily distinguishable from, and does not overlap with, any other data in the system.  Thus it can be inserted, updated and deleted on demand without any undesirable side-effects.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;Mechanics:&lt;/strong&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;Records are ideally identified by primary key, or some compound combination of secondary keys.   If this is not possible, a value in a comment field can be used - but this is less than optimal because it means you need to change the system under test to allow the test framework to inject it’s own comment value(s).&lt;/p&gt;&lt;p style="font-size: medium;"&gt;Keys must be chosen very carefully to ensure you can always identify them.  A useful technique is to pick values that fall way outside the normal range.  For instance, if a product code is an 8 digit integer in production, you can use 4 digit product code for testing.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;&lt;ul style="font-size: medium;"&gt;&lt;li&gt; Cost effective because it uses existing resources.&lt;/li&gt;&lt;li&gt; Aids data discovery because the team need to think hard about the data to build the framework&lt;/li&gt;&lt;/ul&gt;&lt;p style="font-size: medium;"&gt;Disadvantages:&lt;/p&gt;&lt;ul style="font-size: medium;"&gt;&lt;li&gt; Adds complexity to the test framework&lt;/li&gt;&lt;li&gt; Risk that teardown may miss some data and pollute the next test run&lt;/li&gt;&lt;/ul&gt;&lt;p style="font-size: medium;"&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;A Worked Example&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;Consider an ETL process that reads a csv file pushed from a source system using FTP into a location on the ETL server and loads it into a data warehouse star schema.   The warehouse is an established system that has been live for a number of years.  It runs on a relational database and the new import job is being developed as part of the normal release cycle alongside a handful of other, distinct, projects that share the same physical production, development and test environments.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;Our new import populates a pre-existing fact table and adds 2 new dimensions.  We want to build a test framework for the import process that continues to be useful after the current project has finished so we must assume other users are going to hit the same tables at some point, even if it’s not an immediate concern.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;&lt;span style="font-size: 12px;"&gt;﻿&lt;img style="border: 0px initial initial;" title="DataWarehouseExample.jpg" src="http://lh6.ggpht.com/_AxH4nm6erBE/TJNSx7qTfhI/AAAAAAAAAF0/D2Vppb6oDg8/DataWarehouseExample.jpg?imgmax=800" border="0" alt="DataWarehouseExample.jpg" width="598" height="197" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-size: medium;"&gt;Starting with the source data, the test framework holds a set of input cases and corresponding result(s) for each case (how we store and manage them is beyond the scope of this article).  Let’s assume out ETL environment provides a mechanism for a tester to have a dedicated area of a filesystem to store test cases.  We can use &lt;em&gt;Build from Copy&lt;/em&gt; to recreate source_data.csv by taking a copy of the test framework’s input cases each time the test suite runs.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;Next, the ETL process under test is stored under version control.  Assuming we have a dedicated area where we can create working copies, we can simply delete all the code and re-create it from the version control system each time the test runs.  This is an example of &lt;em&gt;Truncate and Rebuild&lt;/em&gt;.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;Notice there is a subtle difference between &lt;em&gt;Truncate and Rebuild&lt;/em&gt; and &lt;em&gt;Build from Copy&lt;/em&gt;.  In the first case, we build the test environment programmatically as we would in a real deployment, while when employing &lt;em&gt;Build from Copy&lt;/em&gt; the build process is synthetic and only found in the test framework.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;Finally, the database that holds the warehouse is probably the most complicated part of the system because it is shared by all the project teams in the data warehousing group.  We need to solve 2 problems: and how to manage the test data, and how to test the DDL that adds columns to the Fact Table and creates the new Dimensions.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;First, the test data.  We use the &lt;em&gt;Test Data Set&lt;/em&gt; pattern to structure our input data set in such a way that it can be identified easily once it has been loaded to the data warehouse.  Thus we can can also delete it easily when we teardown the test environment.&lt;/p&gt;&lt;p style="font-size: medium;"&gt;The DDL is a bit more tricky.  The dimensions can be simply deleted and re-created using &lt;em&gt;Truncate and Rebuild&lt;/em&gt;.  We can also use &lt;em&gt;Truncate and Rebuild &lt;/em&gt;on the the fact table but the teardown script needs to be sophisticated enough to drop only the new columns.  In both cases, the DDL tests should be optional because future users of the test framework will be testing additions to your business logic in a future release so they can reasonably assume the star schema already exists.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-1844979404305068040?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/1844979404305068040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=1844979404305068040' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/1844979404305068040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/1844979404305068040'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2010/09/fundamentals-of-data-testing-setup-and.html' title='Fundamentals of data testing: Setup and Teardown Patterns'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_AxH4nm6erBE/TJNSx7qTfhI/AAAAAAAAAF0/D2Vppb6oDg8/s72-c/DataWarehouseExample.jpg?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-4425427785040214384</id><published>2010-08-23T10:01:00.001+01:00</published><updated>2010-08-23T19:24:28.862+01:00</updated><title type='text'>Fast Database Resets</title><content type='html'>The GOOS (Growing Object Oriented Systems guided by Tests) mailing list today included &lt;a href="http://groups.google.com/group/growing-object-oriented-software/browse_thread/thread/d40f2eb90ae347cb"&gt;a discussion on a method of quickly resetting a database using stored procs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It's Java focussed, but the ideas are useful on all projects doing automated database testing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-4425427785040214384?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/4425427785040214384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=4425427785040214384' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/4425427785040214384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/4425427785040214384'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2010/08/fast-databse-resets.html' title='Fast Database Resets'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-9517729459996614</id><published>2010-08-13T15:56:00.001+01:00</published><updated>2010-08-13T15:57:18.787+01:00</updated><title type='text'>New name for the blog</title><content type='html'>Gradually, I have started thinking about what I do as Data Integration rather than Data Management so I have changed the title of my blog accordingly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-9517729459996614?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/9517729459996614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=9517729459996614' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/9517729459996614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/9517729459996614'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2010/08/new-name-for-blog.html' title='New name for the blog'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-8635577989326566658</id><published>2010-08-13T15:48:00.004+01:00</published><updated>2010-08-13T15:52:36.246+01:00</updated><title type='text'>Fundamentals of data testing: Characteristics of a test suite</title><content type='html'>&lt;div&gt;An automated test suite should be a living thing that is easy to update and easy to run.  The test suite only adds value when it is run to find errors so it should be built to run many times in a day.  This is just normal Agile thinking.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;People who are not used to Agile sometimes think about creating an automated test suite that is open to a privileged few and used only at the end of the project when testing is traditionally performed.  At best, this leads to a situation where the suite cannot not deliver maximum return on investment because it has limited chances to catch defects.  At worst, the test suite will simply become an overhead that quickly falls out of use.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The most successful automated test solutions on data integration projects I have been involved with have been those that business users, analysts, developers, testers and other relevant parties all provide input to throughout the project. This means unexpected problems late in the project are easy to solve because everyone trusts the test suite covers all possibilities.  Just this reason alone is adequate return on the investment needed to setup the test suite.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The tests are run by the developers after every significant change and it’s not unusual for the test suite to be run 10 to 20 times in a day (as an aside unit test suites in object development are run much more frequently, but data integration test suites are limited in speed because they deal with files and databases and it’s often hard to isolate and run the lowest level code the developer writes).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here, at a high level, is what works for me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You need 3 things:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;An environment you can teardown and rebuild &lt;b&gt;repeatedly&lt;/b&gt; many times a day&lt;/li&gt;&lt;li&gt;A way of storing input data sets and expected results &lt;/li&gt;&lt;li&gt;A way of running the input data sets through the system and verifying the output matches the expected results&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I usually just build this in the development environment where we have most control over what we can setup and delete and who is able to use it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The nature of the test suite I suggest is difficult to categorise.  It’s like a unit test because it’s designed to be run by the developers and uses a small volume of data.  But it’s also like a system and/or user acceptance test because it often runs a sequence of related jobs and should include all the cases we expect to find in the production environment.  I suppose “unit test” is the most useful description for practical purposes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One thing it definitely &lt;b&gt;is not&lt;/b&gt; is an integration suite or a basis for application testing.  A common mistake is to try and test the flow of the data through a number of systems.  It can work under specific conditions, but usually it’s working at just too high a level for your tests to run quickly and you are at the mercy of changes in the internals, workflows and input/output interfaces of the applications and distracts you from the real goal of building good data transformation code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is an obvious dilemma, though; what happens if a change to an application has an impact on the data transformations?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, it’s OK to run the application interfaces every so often.  It’s just that you should try to avoid automating the testing through them.  In fact, I strongly recommend you make sure you run the whole application end to end regularly so you can get real feedback on how the system in behaving.  It can be manual and doesn’t need to be heavyweight - just enough to spot problems quickly and get enough detail to update the automated tests.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is actually a similar problem to making sure your tests cover edge cases in the data, but I’ll cover that in a future post.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-8635577989326566658?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/8635577989326566658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=8635577989326566658' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/8635577989326566658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/8635577989326566658'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2010/08/fundamentals-of-data-testing.html' title='Fundamentals of data testing: Characteristics of a test suite'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-2334846829572036662</id><published>2010-08-13T11:39:00.019+01:00</published><updated>2010-08-15T16:16:00.385+01:00</updated><title type='text'>Fundamentals of data testing: Deterministic vs Heuristic</title><content type='html'>&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style="font-size:16px;"&gt;&lt;span class="Apple-style-span"   style="font-family:Helvetica;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="font-size:12px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"   style="font-family:Helvetica;font-size:100%;"&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;The style of test automation I find most useful when testing data integration systems is largely based on the “deterministic” testing style popularised by Agile methods.  That means that for every value input, we need to be able to define an expected output from the system under test.  This is appropriate for testing most situations that arise in data integration solutions but we find that there are occasional cases we will need to borrow from techniques in systems based on heuristics.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;For example, consider the following mapping rules:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;table cellspacing="0" cellpadding="0" style="background-color: #ffffff; border-collapse: collapse"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" style="width: 149.2px; height: 14.0px; background-color: #bec0bf; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #000000 #000000 #000000 #000000; padding: 5.0px 5.0px 5.0px 5.0px"&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;&lt;b&gt;Source Column&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td valign="top" style="width: 149.2px; height: 14.0px; background-color: #bec0bf; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #000000 #000000 #000000 #000000; padding: 5.0px 5.0px 5.0px 5.0px"&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;&lt;b&gt;Rule&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td valign="top" style="width: 149.2px; height: 14.0px; background-color: #bec0bf; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #000000 #000000 #000000 #000000; padding: 5.0px 5.0px 5.0px 5.0px"&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;&lt;b&gt;Target Column&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" style="width: 149.2px; height: 28.0px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #000000 #000000 #000000 #000000; padding: 5.0px 5.0px 5.0px 5.0px"&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;/td&gt; &lt;td valign="top" style="width: 149.2px; height: 28.0px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #000000 #000000 #000000 #000000; padding: 5.0px 5.0px 5.0px 5.0px"&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;System date formatted as “YYYYMMDD HH24:MI:SS”&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td valign="top" style="width: 149.2px; height: 28.0px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #000000 #000000 #000000 #000000; padding: 5.0px 5.0px 5.0px 5.0px"&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;creation_date&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" style="width: 149.2px; height: 14.0px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #000000 #000000 #000000 #000000; padding: 5.0px 5.0px 5.0px 5.0px"&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;flight_number&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td valign="top" style="width: 149.2px; height: 14.0px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #000000 #000000 #000000 #000000; padding: 5.0px 5.0px 5.0px 5.0px"&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;==&gt;&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td valign="top" style="width: 149.2px; height: 14.0px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #000000 #000000 #000000 #000000; padding: 5.0px 5.0px 5.0px 5.0px"&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;flight_number&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" style="width: 149.2px; height: 14.0px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #000000 #000000 #000000 #000000; padding: 5.0px 5.0px 5.0px 5.0px"&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;destination&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td valign="top" style="width: 149.2px; height: 14.0px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #000000 #000000 #000000 #000000; padding: 5.0px 5.0px 5.0px 5.0px"&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;Convert to Sentence Case&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;td valign="top" style="width: 149.2px; height: 14.0px; border-style: solid; border-width: 1.0px 1.0px 1.0px 1.0px; border-color: #000000 #000000 #000000 #000000; padding: 5.0px 5.0px 5.0px 5.0px"&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span style="letter-spacing: 0.0px"&gt;dest_name&lt;/span&gt;&lt;/p&gt; &lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;The rules for populating flight_number and destination are deterministic.  Flight number is straightforward because the value from the source is simply copied to the target.  The rules for destination are slightly more involved but we easily construct test cases that define an expected result based on a given input - EDINBURGH -&gt; Edinburgh, gLasgow -&gt; Glasgow... and so on.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;The "creation_date" rule is quite different.  Timestamps taken from the system clock are non-deterministic because it’s impossible to define a value that will definitely match the system time at the moment the job is run.  In some cases, you can get round this by injecting a known value into the system under test using a parameter (or some similar method) but it’s not always possible so we need to take a leaf out of heuristic systems thinking.  &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;a href="http://en.wikipedia.org/wiki/Heuristic"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Heuristic&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; systems use a combination of rules and data gathered at runtime to make decisions.  A scheduling system used by an airline plots a schedule for the airline each day that takes into account the many factors that affect airline scheduling - plane location, crew availability, turnaround time, weather conditions, volcanic activity in iceland, and so forth.  There is no “right” answer to the question of how to arrange the planes so it’s hard to test deterministically.  Instead, the development team need to ensure that the correct decision making flow is executed when deciding the schedule rather than trying to predict an outcome.  Emily and Geoff Bache work on such as system and gave a &lt;/span&gt;&lt;/span&gt;&lt;a href="http://texttest.carmen.se/files/textbased_testing.pdf"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;presentation&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; at Agile2008 explaining how their test suite works.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Back to our system datetime.  We can borrow from heuristic concepts by plugging in a set of rules that allow us to validate the date generated.  A reasonable heuristic rule for the system date might be to check the date is correctly formatted and within a few minutes of the moment the test suite was run.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Take care though.  Heuristic tests make your test suite more complicated because you need capture and process more data in a heuristic style test than a deterministic test.  Sometimes it may just not be worth the effort.  Furthermore, it’s easy to write heuristic tests that are just as complex than the system being tested.  Let’s face it, the risk of getting the system date call wrong is pretty remote so maybe it’s just easier to ignore those fields and focus building watertight tests for rules you can test deterministically.  That’s usually where the real business benefits are found anyway.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="font-family:'trebuchet ms';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Above all, you should always try to find a deterministic solution and you should expect to do so at least 95% of the time.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-2334846829572036662?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/2334846829572036662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=2334846829572036662' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/2334846829572036662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/2334846829572036662'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2010/08/fundamentals-if-data-testing.html' title='Fundamentals of data testing: Deterministic vs Heuristic'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-8207638054633780551</id><published>2010-08-13T11:22:00.002+01:00</published><updated>2010-08-13T11:39:06.825+01:00</updated><title type='text'>Agile Data Testing</title><content type='html'>Those of you who avidly follow my blog :-) will have noticed that there have been one or two quiet spells lately.  I would love to say I have been living as a hermit living on seaweed and shellfish scraped from the rocks while building the perfect suite of tools for Agile Data Integration but, really, life just got in the way of writing the past couple of years.&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, I have not been idle.  I've been working hard to define strategies for creating automated test solutions for ETL/Data Integration projects for the past 4 years and I have a lot of knowledge I want to share.   Some of this has been captured in tools, but not as much as I would like so I am also looking for people to help me develop the tool capability in a warm, fuzzy, open-sourcy kind of way.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm about to publish some articles explaining what I have learned and where I am going.  I know time is valuable, but I really, really want your feedback so we can start to develop more of a community around this topic.   I'm going to start with the theory and get into the tooling once I have laid down my thoughts on the core concepts of what we are trying to achieve.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So please, please, please read the articles, be forthright in your comments and encourage me to write more.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My thanks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Adrian&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&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/311550892563951795-8207638054633780551?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/8207638054633780551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=8207638054633780551' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/8207638054633780551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/8207638054633780551'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2010/08/agile-data-testing.html' title='Agile Data Testing'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-3997735349576171259</id><published>2009-10-12T12:38:00.001+01:00</published><updated>2009-10-12T12:39:06.292+01:00</updated><title type='text'>Big Data/IT blog</title><content type='html'>Check out this new blog I found written by a member of the Big Data community...&lt;br /&gt;&lt;br /&gt;http://toastingit.blogspot.com/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-3997735349576171259?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/3997735349576171259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=3997735349576171259' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/3997735349576171259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/3997735349576171259'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2009/10/big-datait-blog.html' title='Big Data/IT blog'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-9032266009848140819</id><published>2008-12-20T11:06:00.003Z</published><updated>2008-12-20T11:23:35.464Z</updated><title type='text'>Agile Datawarehousing Book</title><content type='html'>I just received my copy of Agile Data Warehousing by Ralph Hughes from Amazon.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.amazon.co.uk/Agile-Data-Warehousing-World-Class-Intelligence/dp/0595471676/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1229771866&amp;amp;sr=8-1"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 240px;" src="http://1.bp.blogspot.com/_AxH4nm6erBE/SUzUKXR1hXI/AAAAAAAAAEI/kdXl8TseoJM/s320/adm_book_cover.jpg" alt="" id="BLOGGER_PHOTO_ID_5281829737511355762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;At last, someone has written this book!  I hope it is good. &lt;br /&gt;&lt;br /&gt;One of the problems we face moving the world of agile &lt;a href="http://adrianmowat.blogspot.com/2008/01/sentient-life-found-beyond-objects.html"&gt;beyond objects&lt;/a&gt; is that and managers in conservative companies need confidence that a different approach is tried and tested.  This book has the potential to help do just that.&lt;br /&gt;&lt;br /&gt;Since it's Christmas holiday season, I hope to have some time to read the book over the next couple of weeks and publish a review on this blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-9032266009848140819?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/9032266009848140819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=9032266009848140819' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/9032266009848140819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/9032266009848140819'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2008/12/agile-datawarehousing-book.html' title='Agile Datawarehousing Book'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_AxH4nm6erBE/SUzUKXR1hXI/AAAAAAAAAEI/kdXl8TseoJM/s72-c/adm_book_cover.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-7179490452965321155</id><published>2008-07-28T08:42:00.002+01:00</published><updated>2008-07-28T08:44:44.348+01:00</updated><title type='text'>Naked Agilists Conference Preview</title><content type='html'>The new Naked Agilists podcast is now available at &lt;a href="http://www.nakedagilists.com/"&gt;http://www.nakedagilists.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's been a little while since we have released anything new, but with the Agile year's main event approaching fast we thought it would be a good idea to get some of the Agile2008 conference organisers to tell us about what they have planned. First up we have Grigori Melnik who gives us a 15 minute overview of the conference as as a whole as well as an insight into the selection process introduced this year. This year's conference is organised into stages - rather like a music festival - so we then we have 5 individual, shorter, talks from the organisers of some of the stages who tell us in much more detail what their stages have to offer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-7179490452965321155?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/7179490452965321155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=7179490452965321155' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/7179490452965321155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/7179490452965321155'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2008/07/naked-agilists-conference-preview.html' title='Naked Agilists Conference Preview'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-8464384970841604890</id><published>2008-04-27T13:22:00.021+01:00</published><updated>2008-04-27T15:39:19.339+01:00</updated><title type='text'>It's much more than throwing out the documents</title><content type='html'>I was talking to a fellow Ab Initio developer the other day and he asked me a common question...&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;“Isn't all this Agile stuff just a case of not writing documentation?”&lt;br /&gt;&lt;br /&gt;It's true that Agile teams do less documentation, but it is always replaced with better alternatives. I'll put that another way because it is important. Agilists do not throw away documents for the sake of it - that would be a pointless short term fix - but we are passionate about reducing waste in our projects and we have found there are more effective ways of doing some things that every project needs and they happen not to need as much documentation. (Mary and Tom Poppendieck showed us how to use Lean principles to identify and eliminate waste in software projects, &lt;a href="http://www.infoq.com/interviews/poppendieck-lean-2007"&gt;this interview &lt;/a&gt;is a great place to start.)&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;This can be a little difficult to imagine if you are used to waterfall projects, so let's look at a couple of typical activities on data projects and the practices we can use to do them more effectively and reduce the documentation overhead.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Test Procedures&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Waterfall teams write test procedures to record the manual tests that need to run against each release. There are problems with this approach: the tests take a long time to run manually, they are subject to human error, and because natural language is imprecise and ambiguous technical details gets lost in translation by the tester.&lt;br /&gt;&lt;br /&gt;Agile teams use &lt;a href="http://www.agiledata.org/essays/tdd.html"&gt;Test Driven Development&lt;/a&gt; and &lt;a href="http://fit.c2.com/"&gt;executable specifications &lt;/a&gt;to create automated test environments that can be run quickly and easily by anyone on the project (including stakeholders). Automated tests are absolutely precise – they either pass or they fail, and if a bug occurs you can simply add a new test and that error can never happen again.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Requirements and design&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;In Waterfall, business analysts use requirements documents to capture what the customer needs, then the designers create another document that interprets the requirements in technical language. Again, there are two problems with this. It takes a long time, so requirements go out of date and because natural language is subject to human interpretation the customer's original need gets lost in translation.&lt;br /&gt;&lt;br /&gt;Agile teams are cross functional including business analysts, designers, developers and testers all of whom engage directly with an &lt;a href="http://www.mountaingoatsoftware.com/product_owner"&gt;empowered representative from the business&lt;/a&gt;. They work in short iterations of a month or less that deliver solutions to the most pressing business need at that time. There's no need to maintain detailed requirements definitions or design specs because the customer is able to communicate what is needed face to face and the tests accurately describe what the code does.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Requirements traceability comes for free because Agile teams never let requirements and code diverge. Put another way, the &lt;a href="http://en.wikipedia.org/wiki/V-Model_(software_development)"&gt;V model&lt;/a&gt;, never opens out into a V. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;Change Control and Risk Logs&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Honestly, does anyone enjoy working through these?&lt;br /&gt;&lt;br /&gt;Requirements and designs go out of date on waterfall projects, so they need a whole extra level of documentation and bureaucracy to track changes and uncertainty.&lt;br /&gt;&lt;br /&gt;Agile teams simply do not need any of this stuff because they are always working on immediate priorities and the chunks of work are small enough that they can actively address risks early in each iteration.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Look for the Principles&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Of course, I have really just scratched the surface, but if we look for the principles behind the practices we find ways to improve our thought processes.&lt;br /&gt;&lt;br /&gt;Documentation is a legitimate form of knowledge capture, but it's not always the best option. There are times when documents are necessary and useful, recording business metadata is an example that springs to mind, but next time someone asks you or your team to write a document, recognise it's a default position – the lowest common denominator of project communication – and everyone involved might find a better way of working if they were to kick the problem around for a while to address the root problem more effectively. Sometimes you will find a document is the best solution and other times you will not. In either case, you will reach a well considered decision based on a reality. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-8464384970841604890?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/8464384970841604890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=8464384970841604890' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/8464384970841604890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/8464384970841604890'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2008/04/its-much-more-than-throwing-out.html' title='It&apos;s much more than throwing out the documents'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-8301711233159869382</id><published>2008-04-26T18:37:00.002+01:00</published><updated>2008-04-26T18:40:04.195+01:00</updated><title type='text'>Something In Nottigham</title><content type='html'>The Nottingham Agile group has a new page at &lt;a href="http://somethinginnottingham.blogspot.com/"&gt;http://somethinginnottingham.blogspot.com&lt;/a&gt;.  You can use it to find out about upcoming meetings and link to the group's wiki from there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-8301711233159869382?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/8301711233159869382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=8301711233159869382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/8301711233159869382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/8301711233159869382'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2008/04/something-in-nottigham.html' title='Something In Nottigham'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-6625220416723611862</id><published>2008-02-28T17:16:00.003Z</published><updated>2008-02-28T17:24:32.179Z</updated><title type='text'>Agile at Dundee University</title><content type='html'>A few months ago, I was fortunate enough to bump into Janet Hughes who had the dubious pleasure of teaching me Software Engineering back when I was a funny looking undergraduate at &lt;a href="http://www.computing.dundee.ac.uk"&gt;The University of Dundee&lt;/a&gt;.  We exchanged a few email and, on Monday, I had the great pleasure of giving a talk on Agile Data Warehousing to Janet's 3rd year students and then to the local BCS group.&lt;br /&gt;&lt;br /&gt;There have been massive changes since I was last there.  Not least the fact that the Department of Applied Computing, as it was, has moved to a fantastic new building and become the School of Computing.  The &lt;a href="http://www.computing.dundee.ac.uk/study/undergrad/default.asp"&gt;range of courses&lt;/a&gt; has expanded to include degrees in E-commerce Computing, Computing with Electronics and Computing with  Interactive Media Design, along with the Applied Computing degree in which I graduated in 2000.&lt;br /&gt;&lt;br /&gt;The software engineering course has changed radically as well.  Janet clearly has a great feel for Agile and a passion for teaching it.  She told me how she discovered Agile through her own reading, was immediately taken by the way it is tune with the way that we really develop software - as opposed to waterfall; which isn't.  After attending a Scrum Master course to learn more, she has added a very strong Agile focus to the Software Engineering course I took all those years ago.  While I was there, her students got their marks back for a group project assignment.  Working with a real customer to write a scuba dive planning system for a mobile phone in C#, they used Scrum to manage their projects, co-located their teams and developed the code using pair programming and test driven development using nUnit.  Part of the final submission was a report from a Continuous Integration system one of the 4th years was writing as a final-year honours project.&lt;br /&gt;&lt;br /&gt;I am very impressed!  It is great to see a university department teaching Agile so successfully and I think it is encouraging for the development of Agile that students are starting to come out of universities equipped to work effectively on Agile teams and influencing their future colleagues and managers to adopt better practices.&lt;br /&gt;&lt;br /&gt;Both talks went well.  I was impressed by the students' knowledge of Agile practices when I ran a short discussion at the start of the talk in which I asked them to suggest practices that support each statement on the Agile Manifesto.  For example, one group identified working with a product owner as an example of a practice that values individuals and interactions over processes and tools.  One of the students asked a great question about how to organise multiple teams working together on the same code base.&lt;br /&gt;&lt;br /&gt;The second talk to the BCS was quite a different audience.  I was pleased that there was a good turnout for my talk – especially since the talk was at 5.30 on a Monday evening!  Many of the attendees professed no Agile experience at the start, but they asked lots of good questions showed a particular interest in Test Driven Development and if/how to integrate Agile with the wider process frameworks like Prince2 you tend to find in large organisations.&lt;br /&gt;&lt;br /&gt;I wanted to say thanks to everyone I met for a fantastic day and for looking after me so well.  Hopefully I will get the chance to come back again soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-6625220416723611862?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/6625220416723611862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=6625220416723611862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/6625220416723611862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/6625220416723611862'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2008/02/agile-at-dundee-university.html' title='Agile at Dundee University'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-7329865417251888660</id><published>2008-02-23T15:48:00.005Z</published><updated>2008-12-11T06:02:40.887Z</updated><title type='text'>Book Reviews Kick Off</title><content type='html'>My Agile/Technical/Consulting bookshelf is coming along nicely.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5193576387008687154" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_AxH4nm6erBE/SBNKNQ2CbDI/AAAAAAAAAA8/eb5v9xsfuNM/s320/bookshelf.JPG" border="0" /&gt;&lt;br /&gt;I have always been a bit of a book hoarder, and being introduced to Agile was more than enough encouragement! Christmas 2007 was especially fruitful since I pointed everyone in my family at my Amazon wish list and I got a nice little haul. &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5193576988304108610" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_AxH4nm6erBE/SBNKwQ2CbEI/AAAAAAAAABE/3JWdcBdzZEY/s320/Happy+Christmas+to+Adrian.JPG" border="0" /&gt;&lt;br /&gt;There are also a couple more titles that didn't make it in time for Christmas... &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Patterns Of Enterprise Application Architecture - Martin Fowler&lt;/li&gt;&lt;li&gt;Domain Driven Design - Eric Evans&lt;/li&gt;&lt;li&gt;The New Turing Omnibus (66 excursions in Computer Science) - A.K. Dewdney&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;In fact, it was my birthday last month and I took the unprecedented step of asking people &lt;strong&gt;not&lt;/strong&gt; to buy me any more books. I reckon I can make time to read about one a month so I'll be doing well if I finish this lot before next Christmas!&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Reviews&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;As I pointed out in my &lt;a href="http://adrianmowat.blogspot.com/2008/01/sentient-life-found-beyond-objects.html"&gt;previous post&lt;/a&gt;, most Agile technical literature is focused on software development using Object Oriented languages and I think it's important for the development of Agile that we publish research into how to apply this vast resource of knowledge and experience to Data Management.&lt;br /&gt;&lt;br /&gt;Now I have an influx of new books, I think now is a good time to start publishing reviews. I expect the format and structure of the reviews the evolve as I learn what works best but I think it will be helpful to the reader if I were to give each book a headline score that is easy to digest...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Overall Score - how much did I get out of the book. Ranges from 1 to 5&lt;/li&gt;&lt;li&gt;Relevance to Data Management - how much of this book is relevant to people on data management projects. Ranges from 1 to 5.&lt;/li&gt;&lt;li&gt;Technical vs Management - 1 pure management, 2 bit of both, 3 pure technical&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Let's see how we get on with that. I'm off to review a book now... &lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-7329865417251888660?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/7329865417251888660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=7329865417251888660' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/7329865417251888660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/7329865417251888660'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2008/02/book-reviews-kick-off.html' title='Book Reviews Kick Off'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_AxH4nm6erBE/SBNKNQ2CbDI/AAAAAAAAAA8/eb5v9xsfuNM/s72-c/bookshelf.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-8365430876870086228</id><published>2008-01-22T18:36:00.000Z</published><updated>2008-01-22T20:35:43.698Z</updated><title type='text'>Naked Agilist Podcast</title><content type='html'>The Naked Agilist conference podcast is now available at &lt;a href="http://www.nakedagilists.com/jan-08"&gt;http://www.nakedagilists.com/jan-08&lt;/a&gt; complete with my presentation on TDD on Data Management projects.&lt;br /&gt;&lt;br /&gt;While I am on the subject, I was very pleased that Brian Marick took the time to review &lt;a href="http://adrianmowat.blogspot.com/2008/01/sentient-life-found-beyond-objects.html"&gt;my previous post&lt;/a&gt; which was in response to his talk and &lt;a href="http://www.exampler.com/blog/2008/01/21/uncrossing-the-chasm/"&gt;advertise it on his blog&lt;/a&gt;. Thanks Brian!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-8365430876870086228?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/8365430876870086228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=8365430876870086228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/8365430876870086228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/8365430876870086228'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2008/01/naked-agilist-podcast.html' title='Naked Agilist Podcast'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-5327276515542439838</id><published>2008-01-22T17:37:00.000Z</published><updated>2008-01-22T18:32:49.764Z</updated><title type='text'>wevouchfor.org - A Community Approach To Certification</title><content type='html'>Certification is a controversial issue in the Agile community at the moment. Some people think its a great idea that is necessary for Agile to grow, while others argue it makes it harder to separate truly talented contributors from the rest of the pack.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.bossavit.com/thoughts/"&gt;Laurent Bossavit&lt;/a&gt; presented an alternative (complementary?) approach on January's &lt;a href="http://www.nakedagilists.com/jan-08"&gt;Naked Agilists mini-conference&lt;/a&gt; which he and &lt;a href="http://www.exampler.com/blog/"&gt;Brian Marick&lt;/a&gt; have cooked up with a little help from their friends.&lt;br /&gt;&lt;br /&gt;It's a website called &lt;a href="http://wevouchfor.org/"&gt;wevouchfor.org&lt;/a&gt; which borrows a few ideas from social networking sites to allow software people to publicly "certify" each other based on hard evidence of a job well done. For example, Clarke Ching certified Laurent as follows..&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://wevouchfor.org/users/cching"&gt;Clarke Ching&lt;/a&gt; certifies that Laurent Bossavit is qualified as a master, capable of innovating in the skill agile adoption, based on this evidence:&lt;br /&gt;&lt;br /&gt;I spoke with Laurent on the nakeagilists podcast and I was very impressed with his thinking, intentions and attitude: putting his spare time into producing this website wevouchfor.org (along with Brian)which benefits our community. The website speaks for itself and for both Laruent and Brian's skills and motivations. Well done!&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I think this is a wonderful approach, and very well executed too. One of Agile's strengths is its strong focus on team decision making as the only way to get reliably solid decisions on matters which affect the team's ability to deliver - your boss can only act on what he or she can see, but you can never pull the wool over your peers' eyes! This site is typical of that ethos and if it is widely supported it has the potential provide a very reliable indicator of an individual's true credentials. This would be as good for the individual as it would for his or her colleagues or potential employers.&lt;br /&gt;&lt;br /&gt;The first iteration is now live and Laurent promises more features are in the pipeline. The registration and certification process is extremely quick and easy so I hope you can find a moment to sign up and give some credit to people who have helped you in the past.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-5327276515542439838?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/5327276515542439838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=5327276515542439838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/5327276515542439838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/5327276515542439838'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2008/01/wevouchfororg-community-approach-to.html' title='wevouchfor.org - A Community Approach To Certification'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-8419763279340649053</id><published>2008-01-20T11:29:00.000Z</published><updated>2008-12-11T06:02:41.045Z</updated><title type='text'>Sentient Life Found Beyond Objects</title><content type='html'>Brian Marick made a bold statement in &lt;a href="http://www.nakedagilists.com/jan-08/let-them-eat-cake"&gt;his presentation&lt;/a&gt; on last night's Naked Agilists Skype conference. The podcast will be available soon but, put simply, his point was this.&lt;br /&gt;&lt;br /&gt;With reference to Moore's technology adoption life cycle, Agile methodologies have &lt;a href="http://en.wikipedia.org/wiki/Crossing_the_Chasm"&gt;crossed the chasm&lt;/a&gt; between visionaries and pragmatists only to find that, in his opinion, there are not many true pragmatists out there and the only option is to skip straight to the conservatives. He feels that the original visionaries are now spread very thinly across the world consulting with Conservative companies and the development of Agile would be better served if they were to retreat back to Visionary companies and work together on real projects creating new innovations.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_AxH4nm6erBE/R5Myb5qj5-I/AAAAAAAAAAQ/UNEVLABLYjQ/s1600-h/the+chasm.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5157521453186541538" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_AxH4nm6erBE/R5Myb5qj5-I/AAAAAAAAAAQ/UNEVLABLYjQ/s320/the+chasm.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Well done to Brian for sticking his neck out and making such a bold statement. As one of the original signatories on the &lt;a href="http://agilemanifesto.org/"&gt;Agile Manifesto&lt;/a&gt; and a consistent contributor and leader in the community, he is well qualified to comment on how Agile is being applied across the industry. Clearly, he has seen some things that have disturbed him greatly and has been moved to comment this strongly.&lt;br /&gt;&lt;br /&gt;He is also the first to admit (listen to the podcast) that he would love to discuss this much further so I would like to offer an opinion on a factor he might not have considered...&lt;br /&gt;&lt;br /&gt;&lt;em&gt;The Agile community is too heavily skewed towards Object Oriented languages and people believe it only works with Object Oriented languages.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Back in the day, the patterns community, who were the thought leaders in the objects community, met up with the leaders in the methodology community and created what we now know as Agile (OK, so I skipped a few steps along the way, but please run with it). Naturally, the technical practices on OO projects continued to evolve and the people involved wrote the definitive works on refactoring, TDD and Agile design.&lt;br /&gt;&lt;br /&gt;Let's be absolutely clear on something. I don't want to, even slightly, cast any doubt on the excellence and relevance of these books and I am certainly not trying to belittle the efforts or success of the people who wrote or have read them. But there is a problem. No one is writing technical books about anything other then OO technologies.&lt;br /&gt;&lt;br /&gt;So why is this important?&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Because Big Companies Are Conservative&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;The converse is not true (there are small conservative companies too), but in order for Agile to become truly mainstream it needs to establish itself in IT departments at multinationals like telcos, banks, media companies, major retailers and energy suppliers (the list is endless!)&lt;br /&gt;&lt;br /&gt;Big companies like these employ legions of programmers, designers, architects, testers, managers and support staff who don't know about objects, don't do UML and think Ruby is a sort of red diamond. It's not a problem though. They don't need to know about objects because they have built their careers with languages and environments like Ab Initio, COBOL, Siebel, SAP, SAS, PeopleSoft, Business Objects, Brio and Teradata to name but a very few.&lt;br /&gt;&lt;br /&gt;These technologies are the heart and lungs of the company and the latest J2EE or Rails website would be pretty useless without them quietly churning away in the background supporting the business's ability to deliver. Of course, we know that nothing really churns away quietly, so we need people to look after them and projects to update them and add new functions when the business environment changes - just like anything else.&lt;br /&gt;&lt;br /&gt;It's not glamorous or sexy, but it's still very challenging and often cutting-edge work which is subject to &lt;strong&gt;exactly the same project pressures&lt;/strong&gt; as the latest marketing initiative.&lt;br /&gt;&lt;br /&gt;Unfortunately, when the IT director at a multinational looks at Agile, his or her first reaction is not that of one of Moore's Visionaries who would wonder "will this help me achieve 10X productivity gains". It's more likely to be "how does this affect my ability to keep the lights on". And that's the right place to focus - failure to do so would be reckless, career ending and maybe even illegal (governments tend to take a dim view of telecoms operators that cannot reliably provide, for example, 999 emergency services).&lt;br /&gt;&lt;br /&gt;&lt;em&gt;So what can we do?&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Scrum, Crystal and DSDM have shown us how to work iteratively, Lean has taught managers how to think about software development, but a team cannot be truly Agile without the Extreme Programming technical practices that allow it to truly embrace change. It is essential that we can provide documented proof and guidance on how to apply the technical practices across a wide range of modern and legacy technologies rather than just the new era of OO toys.&lt;br /&gt;&lt;br /&gt;The adoption pattern is there to see from the OO world. We need expert visionaries from untried technical domains to stand forward, say "YES! This is possible using Product X", and then go and make it happen. We need blogs, articles, conference presentations, training courses and, ultimately, books to guide Agile virgins through the technical practices using a range of technologies. We need to show business software vendors that they can differentiate themselves by supporting their clients Agile development needs.&lt;br /&gt;&lt;br /&gt;That's what I am doing, but I can only work with what I know so I will end with a rallying call to the next generation of visionaries:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;If you are breaking ground in non OO environments - especially business software - please write about it! There has never been a better time to make a real difference and maybe a name for yourself too.&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-8419763279340649053?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/8419763279340649053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=8419763279340649053' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/8419763279340649053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/8419763279340649053'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2008/01/sentient-life-found-beyond-objects.html' title='Sentient Life Found Beyond Objects'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_AxH4nm6erBE/R5Myb5qj5-I/AAAAAAAAAAQ/UNEVLABLYjQ/s72-c/the+chasm.jpg' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-6746030923987629382</id><published>2008-01-16T19:50:00.000Z</published><updated>2008-01-20T16:09:15.045Z</updated><title type='text'>Naked Agilists: 19 Jan 2008</title><content type='html'>I am giving a talk at the &lt;a href="http://www.nakedagilists.com/"&gt;Naked Agilists&lt;/a&gt; skypecast on the 19th to talk about TDD on data management projects. My synopsis is as follows...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The conventional wisdom in the design and testing of Object Oriented systems is to isolate application functionality from the underlying data model. How then, do we adopt Test Driven Development for projects where the goal is to transform the raw data and Object Oriented languages are not used? This presentation introduces the TDD approach I have successfully pioneered on my own data management projects and FIT4Data - the FIT-based testing framework I wrote for the purpose.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;We are having a few problems getting Skypecast to work at the moment, so please &lt;a href="http://tech.groups.yahoo.com/group/NakedAgilists/"&gt;join the list&lt;/a&gt; to find out the new arrangements as they become clearer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-6746030923987629382?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/6746030923987629382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=6746030923987629382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/6746030923987629382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/6746030923987629382'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2008/01/naked-agilists-19-jan-2008.html' title='Naked Agilists: 19 Jan 2008'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-8248176436039356746</id><published>2008-01-16T19:46:00.000Z</published><updated>2008-01-16T19:49:48.823Z</updated><title type='text'>Yahoo Agile Data Management Group</title><content type='html'>I have started an Agile Data Management group on Yahoo.  It's at &lt;a href="http://tech.groups.yahoo.com/group/agile-datamgmt/"&gt;http://tech.groups.yahoo.com/group/agile-datamgmt/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This group is for the discussion of all aspects of applying Agile principles and practices to data management projects. It is intended to compliment the existing Agile Databases group and the key distinction between them is that this group covers situations where working with raw data is the primary focus of the project or application. For example, data warehousing, data migration, data cleansing and operational data transformations.&lt;br /&gt;&lt;br /&gt;The focus of the group is wide ranging covering both technical and management topics and is open to everyone from novices to experienced practitioners.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-8248176436039356746?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/8248176436039356746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=8248176436039356746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/8248176436039356746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/8248176436039356746'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2008/01/yahoo-agile-data-management-group.html' title='Yahoo Agile Data Management Group'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-311550892563951795.post-6083137169146539819</id><published>2008-01-04T15:16:00.000Z</published><updated>2008-01-04T17:33:43.234Z</updated><title type='text'>Hello and Welcome</title><content type='html'>&lt;div align="justify"&gt;Well 2008 is upon us and it's New Year's resolution time. Mine is to start a professional blog to record and make public the thoughts, musings, discoveries and general tribulations of my working life. I might get into a few other bits and bobs too - but let's see how things go.&lt;br /&gt;&lt;br /&gt;So what has led me to the (possibly rash) decision to take some time out of my busy schedule to maintain a blog?&lt;br /&gt;&lt;br /&gt;&lt;em&gt;A bit of background&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I am a professional software developer based in the UK who specialises in data management using &lt;a href="http://www.abinitio.com/"&gt;Ab Initio&lt;/a&gt;. I studied computing at &lt;a href="http://www.computing.dundee.ac.uk/"&gt;university&lt;/a&gt; for the simple reason that I liked it and was reasonably good at it and I joined the workplace as a graduate developer back in 2000 full of bright eyed enthusiasm for writing great solutions. Like many developers progressing through the ranks from graduate to seniority I became increasingly disillusioned with the reality of the politics and methods used in the real world. It was especially disheartening to find that developers are almost at the bottom of the food chain in most companies (apart from the testers who, as bearers of bad news, are often treated even worse). We were the people who were creating the system so surely everyone involved would be judged on the success of that system from initial release to eventual decommissioning. Why, therefore, was everyone not not lining up to support us?&lt;br /&gt;&lt;br /&gt;There had to be a better way! I just couldn't find it that's all.&lt;br /&gt;&lt;br /&gt;It's not that everything was bad, of course. I have worked on many projects, some were great, others were not and most fell somewhere in the middle. On every one of them, I worked beside some fantastic, heroic people who made real difference. Sometimes they were even recognised for it! However, my enthusiasm for the job was seriously waning. I had retained enough of a spark for technology to resist the gravitational pull towards management but I was seriously considering leaving the IT industry to do something completely different.&lt;br /&gt;&lt;br /&gt;Thankfully, everything changed when I was introduced to Lean Agile by the inspirational &lt;a href="http://www.leanagilepartners.com/"&gt;Nancy Van Schooenderwoert&lt;/a&gt;. She showed me there &lt;em&gt;is&lt;/em&gt; a better way and it's even better than I could have ever have imagined. The &lt;a href="http://www.agilealliance.org/"&gt;Agile principles and practices&lt;/a&gt; made immediate sense to me especially the way Lean thinking and Agile methods put the team at the centre of everything with spectacular improvements on quality, productivity and team satisfaction - my suspicions were confirmed!&lt;br /&gt;&lt;br /&gt;&lt;em&gt;That's all very interesting Adrian, but why the blog?&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;The problem we face as data management professionals is that the vast majority of the Agile thinking and literature is focused on developing UI based applications like websites and gadgets using Object Oriented technologies so it's not immediately apparent how to apply agile to data management projects like data warehouses. The purpose of this blog is to publish the findings of my work with Nancy and my company &lt;a href="http://www.m2consortium.com/"&gt;M2Consortium&lt;/a&gt; on how to bridge this knowledge gap and explore new ideas as they come up.&lt;br /&gt;&lt;br /&gt;Over the past year or so I have been greatly inspired by Jeff Attwood's blog &lt;a href="http://www.codinghorror.com/blog/"&gt;Coding Horror&lt;/a&gt;. It has nothing to do with data management or Ab Initio and only makes occasional references to Agile but many of his posts are stimulating I like the way his enthusiasm for what he does comes across very clearly. If I can be even a quarter as good as Jeff I will be very pleased but I am up for a challenge and on &lt;a href="http://www.codinghorror.com/blog/archives/000983.html"&gt;his advice&lt;/a&gt; I have decided to pick a schedule I can realistically expect to meet. So, drum roll please...&lt;br /&gt;&lt;br /&gt;I will post at least once every three weeks.&lt;br /&gt;&lt;br /&gt;... cue muted applause...&lt;br /&gt;&lt;br /&gt;OK, so it's not very often and I will try and do better, but I have no idea how this is going to work out so I would rather commit to something I can definitely manage than set the bar too high. Please watch this space and Happy New Year!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/311550892563951795-6083137169146539819?l=adrianmowat.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adrianmowat.blogspot.com/feeds/6083137169146539819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=311550892563951795&amp;postID=6083137169146539819' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/6083137169146539819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/311550892563951795/posts/default/6083137169146539819'/><link rel='alternate' type='text/html' href='http://adrianmowat.blogspot.com/2008/01/hello-and-welcome.html' title='Hello and Welcome'/><author><name>Adrian Mowat</name><uri>http://www.blogger.com/profile/09845126205768113190</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-7FJW5MIU0r4/TvRCeTn3XlI/AAAAAAAAAIk/M-mtE2lPySE/s220/profile2.jpg'/></author><thr:total>0</thr:total></entry></feed>
