<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>2Paths &#187; Lorill</title>
	<atom:link href="http://www.2paths.com/author/lcrees/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.2paths.com</link>
	<description>Custom Software Technical Architecture, Design and Development in Vancouver, BC, Canada</description>
	<lastBuildDate>Mon, 27 Sep 2010 01:15:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SolutionsIQ&#8217;s Certified Product Owner Course</title>
		<link>http://www.2paths.com/2009/06/19/solutionsiqs-certified-product-owner-course/</link>
		<comments>http://www.2paths.com/2009/06/19/solutionsiqs-certified-product-owner-course/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 16:17:59 +0000</pubDate>
		<dc:creator>Lorill</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Featured]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[certification]]></category>
		<category><![CDATA[product owner]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://www.2paths.com/?p=1003</guid>
		<description><![CDATA[Working as both a Developer and as a ScrumMaster has skewed my perspective a bit to be dev-team centric, so I recently took SolutionsIQ&#8217;s Certified Product Owner course to learn more about the scrum software development process through the eyes of a Product Owner.
The course was laid out in a novel way &#8211; as a [...]]]></description>
			<content:encoded><![CDATA[<p>Working as both a Developer and as a ScrumMaster has skewed my perspective a bit to be dev-team centric, so I recently took <a href="http://www.solutionsiq.com/services/course-catalog.php#cspo">SolutionsIQ&#8217;s Certified Product Owner course</a> to learn more about the scrum software development process through the eyes of a Product Owner.</p>
<p>The course was laid out in a novel way &#8211; as a scrum project itself! As Product Owners we were asked to compose User Stories capturing what we hoped to learn from the course, and at the end of each &#8220;iteration&#8221; within the two-day course, were asked to re-prioritize these, knowing time was tight and we may not get to all topics. This helped us to have hands-on experience with Story creation and re-prioritization, with the added bonus of us each being personally invested in the outcome instead of it being a theoretical scenario.</p>
<p>One of the topics I was interested in was how to adapt the scrum process for a Product Owner that is not only not on site, but is overseas and in a different time zone. At 2Paths, one of our larger projects that was recently completed involved a client overseas. This project was very successful, and we accredited much of its success to our client&#8217;s buy-in and participation to our scrum process. We had, however, modified the traditional scrum process to accommodate our client&#8217;s schedule and time availability. Because they were quite busy with other projects, and due to the large time difference, the client didn&#8217;t attend our daily scrum as is recommended. Instead we had weekly phone check-ins which augmented our regular email communication to discuss issues as needed.</p>
<p>I was hoping in the course to see if there would be a more recommended way for this sort of Product Owner to be involved in a project, and how we could try to more closely follow the traditional scrum process. However, the course was more geared towards an internal Product Owner. This type of Product Owner would be a lot more hands on, would physically attend the daily scrum, and spend time sitting within the dev team to facilitate clearer communication. It also seemed that many of the other course attendees had similar project roles where the Product Owner was in-house. From what I could gather, I think we handled our process as well as we could given the circumstances.</p>
<p>The course was well organized, and the two presenters Bryan Stallings and Skip Angel were quite knowledgeable and helpful. We had many good group discussions and participants actively participated, sharing their own war stories. I&#8217;d recommend this course for other ScrumMasters wanting to get a better sense of what is required by a Product Owner, and how they fit into the scrum process.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.2paths.com/2009/06/19/solutionsiqs-certified-product-owner-course/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lead Yourself Before Leading Others</title>
		<link>http://www.2paths.com/2009/06/19/lead-yourself-before-leading-others/</link>
		<comments>http://www.2paths.com/2009/06/19/lead-yourself-before-leading-others/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 15:50:08 +0000</pubDate>
		<dc:creator>Lorill</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.2paths.com/?p=997</guid>
		<description><![CDATA[That was the biggest take away I got when recently reading &#8220;Powerful Project Leadership&#8221; by Wayne Strider. As I&#8217;ve been taking on some more Project Leadership responsibilities, I wanted to read some material that focused more on Project Leadership than simply Project Management, and this book came highly recommended.
After sifting through some of the more [...]]]></description>
			<content:encoded><![CDATA[<p>That was the biggest take away I got when recently reading &#8220;Powerful Project Leadership&#8221; by Wayne Strider. As I&#8217;ve been taking on some more Project Leadership responsibilities, I wanted to read some material that focused more on Project Leadership than simply Project Management, and this book came highly recommended.</p>
<p>After sifting through some of the more flaky and new-agey aspects of the book (such as the suggestion to carry wishing wand and courage stick icons around in your pocket for empowerment), I found some good solid concepts laid out in the book that would be useful for any Project Leader. Some of these included taking the &#8220;Zeroeth Step&#8221;, response filters and being understood.</p>
<p>Strider talks of laying a good foundation, especially on a personal level, for any new project. He calls this taking the &#8220;Zeroeth Step&#8221;. This is taking time to reflect on a new project, considering both your own needs and the needs of others, and understanding the context of your project. Without honouring your own needs within the context of the project, you can become disconnected and less effectual, and thus your project could suffer.</p>
<p>Response filters was another interesting topic, in regards to dealing with difficult people. This flips the situation around where it is not the &#8220;difficult&#8221; person that causes a difficult situation, but instead your own personal response filters. Basically, &#8220;difficult&#8221; is your own interpretation, and a response filter is the way you react to certain types of people. By becoming aware of your response filters, you can start to change how you respond. Sure, easier said than done, but with work this can be possible.</p>
<p>Being understood is key to successful Project Leadership. Without clear communication your project becomes susceptible to failure. Strider talks of the five levels of communication: cliché, information, opinions, feelings, and total truth. Communicating at the &#8220;total truth&#8221; level is not always easy to do, as it can leave you feeling vulnerable. An example of communicating the total truth in the context of a project is, say, admitting to not being able to meet a critical, yet impossible to meet deadline. Ultimately, admitting this feels like failure, but alternate solutions can be brainstormed as soon as this is apparent instead of hiding this fact and then failing even more miserably when the deadline is missed.  The closer you get to communicating at the highest level, or total truth, the more effectual your project becomes.</p>
<p>I highly recommend this book, albeit with caveats to take some of the aforementioned flaky portions with a grain of salt. Then again, if carrying a wishing wand icon in your pocket makes you feel like a stronger Project Leader, then all the power to you!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.2paths.com/2009/06/19/lead-yourself-before-leading-others/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integration with Legacy Systems</title>
		<link>http://www.2paths.com/2009/01/15/integration-with-legacy-systems/</link>
		<comments>http://www.2paths.com/2009/01/15/integration-with-legacy-systems/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 20:35:14 +0000</pubDate>
		<dc:creator>Lorill</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[legacy systems]]></category>
		<category><![CDATA[OECD]]></category>

		<guid isPermaLink="false">http://www.2paths.com/?p=468</guid>
		<description><![CDATA[Working on new solutions for large organizations can have many challenges, one of the most frequent is the need to integrate a new solution with legacy software solutions. In 2008 we embarked on a journey to make a software solution for the OECD to allow for a more user-friendly experience when searching for Aid data [...]]]></description>
			<content:encoded><![CDATA[<p>Working on new solutions for large organizations can have many challenges, one of the most frequent is the need to integrate a new solution with legacy software solutions. In 2008 we embarked on a journey to make a software solution for the <a href="http://www.oecd.org">OECD</a> to allow for a more user-friendly experience when searching for Aid data with their various datasets. Our solution was to provide a way to hide the complexity of the data structures and to provide one unified &#8220;Query Wizard&#8221; to help point the user to the appropriate dataset based on their search criteria.</p>
<p>Because the OECD already had a mature system with a soap interface to query data, we not only didn&#8217;t want to reinvent the wheel, but we also didn&#8217;t want our solution to be intrusive or impose changes to the legacy system.</p>
<p>When coming up with our design, we strived to keep a clear delineation between the legacy system and the new application via an abstraction layer.  We made use of the existing legacy heavyweight soap API and wrapped it with a lightweight restful API. This way we were able to create a stand-alone API sitting on top of the legacy system with loose coupling between the two. We were able to create our solution without interfering with the existing infrastructure.</p>
<p>Of course, integration even in this loose-coupled way was not without pain points. Because we did not have any control over the underlying legacy soap service implementation, the solution was tricky to optimize. Fortunately, we were able to identify some areas of concern early in the process and work with the OECD to fix these issues.</p>
<p>Another important element of legacy system integration is the need to closely communicate with the legacy system maintainers to coordinate rollout of any legacy changes. Because our application was mostly designed to be independent of the legacy system, this did not greatly affect our project. However, an in-person visit to the OECD headquarters for a meeting with the legacy system maintainers to get buy-in for our project was invaluable for opening the flows of communication in this regard.</p>
<p>Legacy system integration can be challenging, but by prioritizing loose-coupling between the systems and maintaining good communication between all parties, legacy system integration can be attained very successfully!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.2paths.com/2009/01/15/integration-with-legacy-systems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Going Agile with Large Organizations</title>
		<link>http://www.2paths.com/2009/01/15/going-agile-with-large-organizations/</link>
		<comments>http://www.2paths.com/2009/01/15/going-agile-with-large-organizations/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 20:34:58 +0000</pubDate>
		<dc:creator>Lorill</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[OECD]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://www.2paths.com/?p=471</guid>
		<description><![CDATA[We, here at 2Paths, are avid Agile Software Development and SCRUM practitioners. SCRUM works very well in the ideal project: from five to nine developers and one on-site Product Owner.
But how well does this work with large organizations, especially those that are overseas?
We recently had the pleasure of working on a project with the OECD, [...]]]></description>
			<content:encoded><![CDATA[<p>We, here at 2Paths, are avid <a href="http://agilemanifesto.org/">Agile Software Development</a> and <a href="http://www.2paths.com/2008/10/07/scrum-101/">SCRUM</a> practitioners. SCRUM works very well in the ideal project: from five to nine developers and one on-site Product Owner.<br />
But how well does this work with large organizations, especially those that are overseas?</p>
<p>We recently had the pleasure of working on a project with the <a href="http://www.oecd.org">OECD</a>, a large international non-profit organization based in Paris. This was a year-long project with a team of five to seven developers to create a user-friendly web-based query wizard interface to the OECD’s Development data. The OECD had an existing legacy application allowing users access to their data, but it required expert knowledge of the underlying datasets in order to access the information. The query wizard was to hide this complexity from the user and to provide one unified view to the various Development datasets.</p>
<p>An integral part of SCRUM is that there is one Product Owner that is available and vested in the SCRUM process. As the OECD is a large organization based overseas and a nine-hour time difference, this was seemingly going to be difficult.</p>
<p>The OECD Development Co-operation Directorate presented two excellent Product Owners &#8211; one representing the technical side and one representing the business side &#8211; who provided a unified front to the OECD&#8217;s vision and user requirements. 2Paths decided upon a two- week iteration schedule. Because of the nine-hour time difference and the busy schedules of the OECD employees, we decided upon a schedule of weekly video-assisted teleconferences with the OECD team, the third-party funders, and the 2Paths project team. We conducted bi-weekly iteration reviews, alternated with bi-weekly checkins in lieu of face-to-face stand-up meetings.</p>
<p>In addition to the weekly teleconferences, we established a good email rapport with the Product Owners, and corresponded via email throughout the iteration to clarify any outstanding issues or requirements. This process worked well for the most part, as the Product Owners were very decisive; they knew what they wanted or decided fairly quickly what they wanted. We also kept a well-organized Wiki site to hold all relevant information and documentation surrounding the project to which the OECD had access. This assisted in coordinating work and kept information in a known central location. We at 2Paths took care not to bombard the OECD with technical terms, keeping the language appropriate to their technical savviness.</p>
<p>Occasionally the time zone difference was a hindrance to our process as this necessitated a twenty-four hour turnaround in email responses, which sometimes was not quick enough for our liking. However, for any critical issues that needed to be resolved, we were mostly able to set up impromptu after-hours calls to the OECD to sort them out on the spot.</p>
<p>Having a team of two Product Owners instead of just one Product Owner also didn&#8217;t end up presenting any problems. They seamlessly provided one unified voice to represent the OECD. They were careful to come to agreement amongst themselves before presenting any decision on any issue to 2Paths.</p>
<p>The OECD admitted that if they had their choice, they would have preferred to have a 2Paths developer on-site in Paris throughout the life of the project (I would have volunteered!), but in general the teleconferences and email discussions were sufficient to get through any issues that arose. It was helpful that 2Paths representatives were on-site in Paris both for the initial requirements- gathering phase, and for the final project handover at the end of the project. The OECD Product Owners were also able to meet with 2Paths in person in Seattle mid-project.</p>
<p>When embarking on this project, we were unsure of how receptive the OECD would be to our agile processes, as traditionally large organizations can be more inert and resistant to change. We were very pleasantly surprised as the OECD embraced our processes wholeheartedly. They were very glowing about our &#8220;refreshing&#8221; agile process, and how they could quickly and often see tangible results of our development. They felt they got value from their ability to have constant input into the evolution of the software. They were use to having longer rollout times due to heavier weight processes in-house, so were very impressed by the progress each iteration.</p>
<p>The OECD also got some extra fringe benefits. Through our software development process, the OECD was able to identify and work on areas in their own process that had room for improvement.</p>
<p>Another key to the success of this project was that the two chosen Project Owners were very knowledgeable of their business and their requirements. 2Paths spent a good chunk of time working with them at the start of the project to establish a good solid high-level design of the product. There was also up-front time invested into the User Design of the application, and 2Paths with the aid of sub-contractors <a href="http://www.designstamp.com/">DesignStamp</a>, came up with detailed user personas. Feedback revealed that OECD found this process extremely useful.</p>
<p>Take aways for 2Paths from this project were that it IS possible to work in an agile way with large organizations, especially when knowledgeable and open- minded Product Owners are chosen to represent the organization. Providing tangible results early and often to generate feedback can be a refreshing change for employees working in a large organization. Instead of arrogantly preaching the Agile software development process, being sensitive to the way that large organizations work and working WITH them as a team will ensure buy-in and aid in the success of the project.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.2paths.com/2009/01/15/going-agile-with-large-organizations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building GRAILS app on Debian using Maven GRAILS Plugin</title>
		<link>http://www.2paths.com/2008/12/23/building-grails-app-on-debian-using-maven-grails-plugin/</link>
		<comments>http://www.2paths.com/2008/12/23/building-grails-app-on-debian-using-maven-grails-plugin/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 23:07:54 +0000</pubDate>
		<dc:creator>Lorill</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Under the hood]]></category>
		<category><![CDATA[Utilities]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Grails ended with a non null return code]]></category>
		<category><![CDATA[grails maven plugin]]></category>
		<category><![CDATA[hudson]]></category>

		<guid isPermaLink="false">http://www.2paths.com/?p=432</guid>
		<description><![CDATA[We&#8217;re now using GRAILS in one of our Maven-ized projects, and have it building using the Maven GRAILS plugin. We needed to roll this integration out to Husdon, our CI server which is running on a Debian box. We ran into a couple of snags.  
We had downloaded and installed the debian package grails_1.0.4-1_all.deb [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re now using GRAILS in one of our Maven-ized projects, and have it building using the <a href="http://forge.octo.com/maven/sites/mtg/grails-maven-plugin/">Maven GRAILS plugin</a>. We needed to roll this integration out to Husdon, our CI server which is running on a Debian box. We ran into a couple of snags.  </p>
<p>We had downloaded and installed the debian package <code>grails_1.0.4-1_all.deb</code> from the <a href="http://grails.org/Download">GRAILS site</a>, configured the GRAILS_HOME environment variable for our build target, and attempted to  build it. We got this error:<br />
<code>Grails ended with a non null return code: 127</code><br />
After some digging, it turns out that the debian package installs GRAILS but puts the actual executable in /usr/bin instead of just a symlink from the GRAILS_HOME.  The Maven GRAILS plugin appears to be calling grails using the GRAILS_HOME path. Making a symlink to the grails executable in the bin dir of the GRAILS_HOME fixed this problem (although the symlink really more correctly belongs in the /usr/bin dir).</p>
<p>Trying to build again we came across a different problem, where the GRAILS version was showing up as null, causing build errors. After some googling I found <a href="http://code.google.com/p/ant-deb-task/issues/detail?id=19#c1">this useful post</a>, and re-installed GRAILS with the updated <a href="http://code.google.com/p/ant-deb-task/downloads/detail?name=grails_1.0.4-2_all.deb&amp;can=2&amp;q=">grails_1.0.4-2_all.deb</a> package, repeating the steps for the GRAILS executable.  Now we&#8217;re all up and running in Hudson!  I hope this might alleviate some pain for anyone trying to troubleshoot this problem.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.2paths.com/2008/12/23/building-grails-app-on-debian-using-maven-grails-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LiquiBase-ifying your Grails Application</title>
		<link>http://www.2paths.com/2008/12/23/liquibase-ifying-your-grails-application/</link>
		<comments>http://www.2paths.com/2008/12/23/liquibase-ifying-your-grails-application/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 21:46:27 +0000</pubDate>
		<dc:creator>Lorill</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Under the hood]]></category>
		<category><![CDATA[Utilities]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[LiquiBase]]></category>

		<guid isPermaLink="false">http://www.2paths.com/?p=401</guid>
		<description><![CDATA[At 2Paths we&#8217;ve got some pretty good processes in place: we practice agile software development and scrum, have all our projects set up in Continuous Integration. We try to do test-driven development where at all possible. One area that has slipped through the cracks though is database change management. What company hasn&#8217;t run into the [...]]]></description>
			<content:encoded><![CDATA[<p>At 2Paths we&#8217;ve got some pretty good processes in place: we practice agile software development and scrum, have all our projects set up in Continuous Integration. We try to do test-driven development where at all possible. One area that has slipped through the cracks though is database change management. What company hasn&#8217;t run into the problem of ensuring all database environments in a project (dev, staging, production, test) are in sync and in source control? Without this, it becomes an onerous if not impossible task to rollback a set of databases to a known state, or to recreate one from scratch to a known state.</p>
<p>Enter <a href="http://liquibase.org">LiquiBase</a>, an open source database-agnostic tool for tracking, managing and applying database changes. We recently worked on a small Grails project and decided to give this tool a try and I was duly impressed.</p>
<p>LiquiBase functionality is built around a main changelog.xml file containing changesets representing incremental database changes to be applied to a database. LiquiBase manages which changesets have been run through a DATABASECHANGELOG table it creates in each database. </p>
<p>We used the <a href="http://www.liquibase.org/manual/grails">grails plugin</a> which gave us most of the full LiquiBase functionality, albeit a little less than mature.  There were a couple of gotchas and bugs with the plugin, but nothing we couldn&#8217;t work around.</p>
<p>LiquiBase buys us the ability to store database change in source control, easily sync databases in multi-environments in an automated and controlled fashion, tag database states upon iteration-end releases, auto-generate rollback sql to tagged states, diff databases, and much more.</p>
<h2>LiquiBase-ifying Your Application</h2>
<p>With your database in a known state, you can use the grails plugin to create your changelog.xml. First you need to install the grails LiquiBase plugin:<br />
<code>grails install-plugin liquibase</code><br />
Once installed simply run this from the root of your grails app:<br />
<code>grails generate-changelog grails-app/changelog.xml</code></p>
<p>This will generate the changelog.xml from your development database (specified in DataSource.groovy) and write it to the path specified in the command.  <code>grails-app/changelog.xml</code> is the default path where the grails plugin will be expecting the changelog to be. If you need to read from a different database environment like staging for example, just add the -Dgrails.env=staging option to the command.</p>
<p>To propagate this changelog to other databases (say, test), run<br />
<code>grails -Dgrails.env=test migrate</code>. This runs all the sql necessary to upate the database to match the changelog. Any new changes from here on will be appended as new changesets, and can be migrated with the same command as above.  You can also use the migrate-sql command instead if want to generate the sql and run it yourself.  Most LiquiBase commands come in tuples: one to generate the sql for you and one to just run the sql directly against your database.</p>
<p>If you&#8217;re integrating LiquiBase mid-project and already have all your databases set up, you&#8217;ll need to run sql against them to update the LiquiBase DATABASECHANGELOG table to show all the changes as run.  First, make sure that the databases are all in sync. To do this, you can use the handy LiquiBase diff tool. Unfortunately, the grails plugin for this diff tool is not very robust and will only diff your development database against your test database &#8211; the plugin has those two environments hard-coded. You can either mess with your DataSource.groovy db environments to do the diff setting the two dbs in question to dev and test temporarily, or <a href="http://www.liquibase.org/download">install LiquiBase</a> itself and run the <a href="http://www.liquibase.org/manual/diff">diff</a> passing the db parameters to the diff command. Using the grails plugin you would run:<br />
<code>grails db-diff</code> which will spit to the screen any differences as changesets to be applied. Strangely, there is no documentation for this command in the <a href="http://www.liquibase.org/manual/grails">LiquiBase Grails plugin page</a>.</p>
<p>Once your database are in sync, run<br />
<code>grails changelog-sync-sql</code> with the appropriate <code>-Dgrails.env</code> switch to generate the sql to update the DATABASECHANGELOG table, then run the sql in your database.</p>
<h2>LiquiBase and Continuous Integration</h2>
<p>We use Hudson at 2Paths for our CI, and have added the simple <code>grails -Dgrails.env=test migrate</code> command as part of our build process to migrate the test database upon every checkin. This ensures that the test db is always the most up-to-date.</p>
<h2>Rolling LiquiBase into our Dev Process</h2>
<p>We&#8217;ve adopted on a trial basis the following process for database change management as part of our agile software development, taking into consideration Grails development (which uses hibernate) which can auto-generates schemas based on domain objects:</p>
<ol>
<li>Generate changelog from initial schema and commit to svn</li>
<li>Rollout schema to other databases by migrating from changelog</li>
<ol>
<li>if the schema already exists and it needs &#8220;LiquiBase-ifying&#8221;, generate changelog-sync-sql and run it</li>
</ol>
<li>Add every schema change via new changeset from hereon in by generating changelogs via grails <a href="http://www.liquibase.org/manual/diff">db-diff</a></li>
<ol>
<li>add / change domain objects in project</li>
<li>set hiberante ddl mode to update</li>
<li>start app and grails will automatically update the db</li>
<li>generate new changelogs using db-diff (against the test db)</li>
<li>append changelogs to changelog.xml</li>
<li>run <code>grails changelog-sync-sql</code> to generate the sql that will mark all these new changes as ran on your db, then run the sql</li>
<li>checkin changes. this will be applied to test</li>
</ol>
<li>provide explicit rollback sql for any custom sql</li>
<li>tag each iteration end with a &#8220;tagDatabase&#8221; changelog in the changelog.xml</li>
</ol>
<h2>Gotchas</h2>
<p>We ran into some gotchas with LiquiBase. One of the first things we started doing before fully understanding how LiquiBase worked was to update existing changesets when changing the schema. LiquiBase generates checksums for each changeset to ensure they don&#8217;t change, and altering existing changelogs will cause future migrations to fail. Even though LiquiBase gives you some tools to get around this, it&#8217;s generally a better practice to just add a new changeset for every database change. There is a good blog on the LiquiBase site explaining  <a href="http://blog.liquibase.org/2008/10/dealing-with-changing-changesets.html">how to deal with changing changesets</a>.</p>
<p>Another gotcha is that the rollback-sql command won&#8217;t magically generate rollback scripts for hand-coded sql (obviously!) You must to generate your own rollback sql for these custom sql tags, otherwise not only will you not get rollback sql for those particular changesets, but the rollback functionality won&#8217;t spit out sql for any other changeset either until you do.</p>
<p>Tagging was a little fussy as well. The command line <code>grails tag</code> can only tag a given state once &#8211; future tags will overwrite the earlier ones unless you&#8217;re at a different changeset. I found it better to add a tag changeset explicitly in the changelog.xml. The Grails plugin for tagging also seems to be problematic with spaces in the tag name. We decided to just use underscores as a convention.</p>
<p>We also ran across some broken functionality:</p>
<ul>
<li>The <code>grails generate-changelog</code> command generates some extraneous information that breaks sql for data type numeric(19,0) if that type has auto-increment on.  It generates this in the changelog:<br />
&lt;column autoIncrement=&#8221;true&#8221; name=&#8221;id&#8221; type=&#8221;numeric()(19,0)&#8221;&gt; (notice the extra empty brackets).  We needed to manually remove these to get it to work.</li>
<li>The <code>grails rollback-to-date-sql</code> command writes to a file with the datestamp instead of to console like the other rollbacks do, even though the docs say it writes to STDOUT (<code>rollback-count-sql</code> also has issues, but <code>rollback-sql</code> for tags works just fine). The code for these plugin commands doesn&#8217;t seem to do the right thing with the args. Time permitting, we may provide a patch for this.</li>
<li>db-doc generation doesn&#8217;t work with large amount of columns in a table because it uses the table description including column names for the html file name.  Too many db columns make the file names too long.</li>
</ul>
<h2>Moving Forward</h2>
<p>Although there&#8217;s a bit of grumbling amongst the developers here that using LiquiBase with the above process is a little onerous, it buys us a lot more certainty for knowing what state our databases are in, making sure changes are in source control, and knowing what updates have or haven&#8217;t been run. It&#8217;s a whole lot easier than hand-coding a bunch of sql, and easily accommodates the possibility of migrating to other DBMS&#8217;s in the future without having to re-write DBMS-specific sql. There&#8217;s even talk of trying to go a step or two further to automate even more of the process so a developer doesn&#8217;t have to think about generating changesets upon changing of a grails domain model. We&#8217;ll see how that goes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.2paths.com/2008/12/23/liquibase-ifying-your-grails-application/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Can Database Refactoring be Agile?</title>
		<link>http://www.2paths.com/2008/11/11/can-database-refactoring-be-agile/</link>
		<comments>http://www.2paths.com/2008/11/11/can-database-refactoring-be-agile/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 01:49:53 +0000</pubDate>
		<dc:creator>Lorill</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[much ado about agile]]></category>
		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://www.2paths.com/?p=259</guid>
		<description><![CDATA[I was fortunate enough to partially attend the Much Ado About Agile Conference held recently in Vancouver, and was immediately drawn to the session &#8220;Database Development in Agile World&#8221; led by Marc Munro. This was a very timely session as we have recently begun a project that involves refactoring a legacy database and developing a [...]]]></description>
			<content:encoded><![CDATA[<p>I was fortunate enough to partially attend the <a href="http://www.agilevancouver.ca/?p2=/modules/agilevancouver/conference.jsp&amp;id=3">Much Ado About Agile Conference</a> held recently in Vancouver, and was immediately drawn to the session &#8220;Database Development in Agile World&#8221; led by Marc Munro. This was a very timely session as we have recently begun a project that involves refactoring a legacy database and developing a new application to replace the legacy system. A data migration from the legacy system to the new system would also of course be necessary.  We had only been working on the new application for a week or so but had already been running into problems and I was looking for some advice. We do things in an agile way here at 2Paths, and we were struggling with how to coordinate the database refactor / data migration with the creation of a new application. </p>
<p>After some discussion of whether we should start development on the database or application first, we decided to tackle the database first.  We had started out by re-designing the database to allow for some sorely-needed normalization of some relationships. We came up with a new normalized schema through a mixture of requirements gathering with the client and reverse-engineering the legacy database.  We focussed on areas where we could generalize and abstract out relationships and left the details for last.  With our new schema, we then worked on migrating the legacy data into the new schema to ensure everything was accommodated. </p>
<p>Using our new schema we began application development with Grails. We began having difficulties where the application was changing rapidly, necessitating corresponding changes in the schema and data migration script. We were having a disconnect between the schema changes and the application changes.  It was at this point that I attended Marc&#8217;s session.</p>
<p>The main point that he drove home which we already knew too well was that Database refactoring is expensive.  Databases have <strong>no source code</strong>, databases resist change, databases need to be coordinated with corresponding applications, and teams usually have many databases to coordinate (ie: dev, staging, production).  Marc stressed the first point of there being no source code as one of the major problems. Database creation and maintenance are usually done as &#8216;patch scripts&#8217;. </p>
<p>Enter <a href="http://www.liquibase.org/">LiquiBase</a>. Marc neglected to mention this very handy library that we decided to try out with our new project. LiquiBase is DBMS-agnostic and allows us to manage database change much more cleanly than ever before. I haven&#8217;t fully explored all of the LiquiBase functionality yet but so far am very pleased with what I have explored. There is a LiquiBase Grails plugin and also a LiquiBase IntelliJ Idea plugin that we&#8217;ve been using.</p>
<p>Back to Marc&#8217;s presentation. Because we&#8217;re already convinced that Database refactoring is very expensive, he made a case to do Big Picture database modeling up-front, most importantly capturing all the areas where generalizations and abstractions can be made.  It is much more expensive to refactor something specific into something general than to refactor something general into something specific.  Adding objects rarely if ever affects existing functionality, but removing them usually does.</p>
<p>Start by modeling the entities and relationships only.  Don&#8217;t worry about the attributes or details &#8211; these can be fleshed out during implementation.</p>
<p>Marc had some Dogmas to impart: </p>
<ul>
<li>Use subtypes: they&#8217;re great for recording extra knowledge about a logical model</li>
<li>Hate NULLs: allow no optional relationships. This usually requires using a linked entity which may seem uglier but makes a whole lot more sense</li>
<li>Allow no implied participants in transactions</li>
</ul>
<p>And then there was Pragma:</p>
<ul>
<li>Don&#8217;t invent when you can copy</li>
<li>Use standard models. He highly recommended Len Silverston&#8217;s Data Model Resource Books which we also refer to here at 2Paths</li>
<li>Reuse models when you can</li>
</ul>
<p>So far in the presentation, it didn&#8217;t seem like we were in an &#8220;Agile&#8221; session, but finally Marc roped us back into the subject at hand.  Just because we&#8217;ve done up front design doesn&#8217;t mean we have to implement everything at once.  Using the up front design we can do iterative development.  We don&#8217;t need to have the up front model be 100% correct &#8211; we can do iterative refinement to it as the project progresses.</p>
<p>For an agile implementation, revisit and refine the model at the start of each iteration. Make explicit documented decisions on each of the design decisions that are made so that down the road it&#8217;s known why certain decisions were made.</p>
<p>In summary, Marc reiterated that because databases are so expensive to refactor, it&#8217;s important to get as much right the first go around as possible. Getting it right first will make agile development and subsequent refactors much easier.  Design for change by generalizing and abstracting relationships.</p>
<p>Relating Marc&#8217;s advice back to our project, I realized that we hadn&#8217;t done too badly with our process after all.  We had made generalizations and abstractions where we could, getting the Big Picture logical design done up front.  We then began application development based only on the stories included in the current iteration. The problems we were having in syncing the application to the database were mainly mapping to physical design issues, and not logical design issues. </p>
<p>In hindsight, it may have been easier if we took the logical model that we had designed and implemented this in Grails first and seen what schema Grails produced from that model.  We could then have tweaked this schema and associated mappings to be the physical implementation we wanted, instead of producing the physical model in the database first.</p>
<p>When we had started the process of our up front design we had had many discussions about whether this was the right thing to do, and if it was really agile.  It was good to have confirmation that others have thought of this too and that it IS okay to do Big Picture up front design. This will hopefully save us some pain and suffering in the future.  Hopefully we&#8217;ve made our future database refactoring less expensive.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.2paths.com/2008/11/11/can-database-refactoring-be-agile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrum 101</title>
		<link>http://www.2paths.com/2008/10/07/scrum-101/</link>
		<comments>http://www.2paths.com/2008/10/07/scrum-101/#comments</comments>
		<pubDate>Tue, 07 Oct 2008 23:13:32 +0000</pubDate>
		<dc:creator>Lorill</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[certification]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://www.2paths.com/?p=146</guid>
		<description><![CDATA[I&#8217;m known as the ScrumMistress around the office, but as of the end of August I&#8217;ve actually officially earned the name. I attended a ScrumMaster course put on by the Software Productivity Center &#38; Winnow Management and am now a certified ScrumMaster.
Scrum is an iterative, incremental, Agile process for developing any product or managing any [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m known as the ScrumMistress around the office, but as of the end of August I&#8217;ve actually officially earned the name. I attended a ScrumMaster course put on by the <a href="http://www.spc.ca/">Software Productivity Center</a> &amp; <a href="http://www.winnowmanagement.com/">Winnow Management</a> and am now a certified ScrumMaster.</p>
<p>Scrum is an iterative, incremental, Agile process for developing any product or managing any work. It is a project management process, but certainly not a methodology as that would be too heavy. The key to Scrum is having self-managed teams. A ScrumMaster is the person in a project team that is responsible for Scrum values and practices within the team.</p>
<p>At 2Paths we live and breath the Agile Manifesto:</p>
<blockquote><p>&#8220;We are uncovering better ways of developing software by doing it and helping others do it. Through this work we have come to value:</p>
<ul>
<li>Individuals and interactions over processes and tools</li>
<li>Working software over comprehensive documentation</li>
<li>Customer collaboration over contract negotiation</li>
<li>Responding to change over following a plan</li>
</ul>
<p>That is, while there is value in the items on the right, we value the items on the left more.*&#8221;</p></blockquote>
<p>*<a href="http://www.agilemanifesto.org">www.agilemanifesto.org</a></p>
<p>When signing up for the ScrumMaster course I had expectations of learning &#8220;New Great Things&#8221; that I could bring back to 2Paths to implement to augment our current Scrum and Agile practices. It was refreshing to instead have it confirmed that at 2Paths we&#8217;re actually pretty much already following the Scrum process to a T.</p>
<h3>Scrum Roles</h3>
<p>There are three roles in play in Scrum: the Team, the ScrumMaster, and the Product Owner.</p>
<h4><strong>The Team</strong></h4>
<p>The team is usually around 5-9 <strong>self-managed</strong> people who are responsible for the actual work to implement product functionality. Team members are accountable to the team, not to a manager.</p>
<h4><strong>The ScrumMaster</strong></h4>
<p>The ScrumMaster is responsible for Scrum values and practices in the team. The ScrumMaster is a &#8220;Process Manager&#8221;, not a &#8220;Project Manager&#8221;. They establish key scrum meetings, protect the team from interruptions, and facilitate removal of any blockages facing the team.</p>
<p>A ScrumMaster should be a good facilitator, be open-minded, tactful, and deal well with conflict.</p>
<h4><strong>The Product Owner</strong></h4>
<p>The Product Owner is usually the Client, but could also be internal to a company. They are responsible for the Product backlog, establish and promote the vision of product, and are responsible for the ROI by prioritizing work. Scrum dictates that this should be only one person.</p>
<h3>The Scrum Lifecycle</h3>
<p>The Scrum Lifecycle of a project differs widely from traditional software development lifecycles in that work is done in fixed time-boxed iterations, or &#8220;Sprints&#8221;, yet the scope of work done in the project is variable.</p>
<h4><strong>Scrum Planning</strong></h4>
<p>In this phase, high-level requirements are gathered and compiled into User Stories. A User Story is a requirement formulated as one or two sentences in the everyday language of a user. The deliverable from this phase is the Product Backlog (list of User Stories), which is owned and prioritized by the Product Owner. The Product Owner can re-prioritize items in the product backlog at any time.</p>
<h4><strong>Sprint Planning Pt. 1 (selection)</strong></h4>
<p>The highest priority User Stories from the product backlog are chosen for inclusion in the current Sprint Backlog. The Product Owner cannot re-prioritize items inside the Sprint Backlog, only items in the Product Backlog.</p>
<h4><strong>Spring Planning Pt. 2 (decomposition)</strong></h4>
<p>User Stories from the Sprint Backlog are decomposed into tasks and the team will negotiate estimates for each of these tasks.</p>
<h4><strong>Daily Scrum</strong></h4>
<p>This is a daily standup meeting for the project team, facilitated by the ScrumMaster. The daily scrum should take no more than 15 minutes. In the daily scrum three simple questions are asked of each team member:</p>
<ol>
<li> What did you work on yesterday?</li>
<li> What will you work on today?</li>
<li> Are you stuck?</li>
</ol>
<p>The team will then look at the Sprint burndown chart &#8211; a graph showing how much estimated time is remaining in the Sprint. Daily re-estimation of task effort is also key to Scrum.</p>
<p>The goal of the daily scrum is to ensure good communication between team members and to ensure all team members have the information and tools they need to carry out their work. The ScrumMaster is responsible for facilitating removal of any roadblocks facing the team or team members.</p>
<h4><strong>Sprint Review</strong></h4>
<p>In the Sprint review, the team demonstrates the work completed in the Sprint to the Product Owner and other stakeholders. A main idea behind Scrum is to show results soon and show results often.</p>
<h4><strong>Potential Deployment</strong></h4>
<p>At this point stakeholders decide if they want the latest Sprint results deployed.</p>
<h4><strong>Sprint Retrospective</strong></h4>
<p>At the end of each Sprint, the team members and Product Owner have a meeting to reflect on the pluses (what went well) and deltas (suggested changes or improvements) of the Sprint. The deltas will be recorded as actionables for future Sprints, and deltas from the previous Sprint will be reviewed. The Sprint Lifecycle restarts from here to Sprint Planning of the next Sprint.</p>
<h3>Scrum à la 2Paths</h3>
<p>We at 2Paths were already pretty much following the above scrum process to a T, although we had been letting a couple aspects slip. We had started neglecting the Iteration-end Team Retrospectives, which we&#8217;ve since resurrected.  These sessions have been invaluable for constructive feedback in the way we do things, and helping us strive to constantly improve.</p>
<p>We had also been a little slack in the daily scrums in terms of team members giving full descriptive details of their current and future tasks. The team was getting use to answering their daily questions in extremely general terms which was not very useful to other team members, and ultimately to the team itself. We&#8217;re trying to change this so that team members&#8217; daily input has enough detail to be constructive to the scrum process. As usual it comes down to team cohesion and productivity hinging on good communication.</p>
<p>In the course I learned a couple of other ideas that we’ve since implemented at 2Paths, such as drafting a Team Charter. The team sits down at a brainstorming session to draft a list of rules to which each team member needs to adhere. These are rules made by the team for the team to foster a cohesive, communicating, and respectful atmosphere. These rules can span any topic from personal conduct to philosophy to technical considerations.</p>
<p>We’ve also begun playing “Planning Poker”, which is an innovative way of estimating time for tasks by the team. We had formerly used a rock/paper/scissors method where on the count of three each team member put out their fingers indicating their time estimates for a task, but it’s been too easy to let other team-members’ estimates influence one&#8217;s own estimate. With planning poker we all have to chose a card representing our estimate, then all turn over our card simultaneously.</p>
<p>In my ScrumMaster course one of the best things I learned was how good we have it here at 2Paths. We have a lot less red tape it seems than a lot of my fellow ScrumMaster classmates which makes it a lot easier to get things done. We already have our Scrum and Agile practices in place, and have clients who have quickly become Scrum and Agile converts.  Oh, and I almost forgot about the other best thing I learned &#8211; the secret ScrumMaster handshake. Who knew?!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.2paths.com/2008/10/07/scrum-101/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No Fluff Just Stuff, April 2008</title>
		<link>http://www.2paths.com/2008/06/17/no-fluff-just-stuff-april-2008/</link>
		<comments>http://www.2paths.com/2008/06/17/no-fluff-just-stuff-april-2008/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 23:04:13 +0000</pubDate>
		<dc:creator>Lorill</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Conferences]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Under the hood]]></category>

		<guid isPermaLink="false">http://blog.2paths.com/no-fluff-just-stuff-april-2008.html</guid>
		<description><![CDATA[With forecasts of April snow, our 2Paths contingent of two headed off at the crack of dawn one Friday for Bellevue, WA to attend the No Fluff Just Stuff &#8211; Pacific Northwest Software Symposium (NFJS).  Having only spent 10 minutes at the border (whew!), we arrived early enough in the Seattle area to fit [...]]]></description>
			<content:encoded><![CDATA[<p>With forecasts of April snow, our 2Paths contingent of two headed off at the crack of dawn one Friday for Bellevue, WA to attend the No Fluff Just Stuff &#8211; Pacific Northwest Software Symposium (NFJS).  Having only spent 10 minutes at the border (whew!), we arrived early enough in the Seattle area to fit in some Fluff (aka shopping and dining) before getting into the Stuff.</p>
<p>After a quick introduction by Evangelist Scott Davis, and with hopes of winning an IPhone by the end of the weekend, I headed right into his double-bill of sessions about Groovy.  The first one entitled &#8220;Groovy, the Blue Pill: Writing Next Generation Java Code in Groovy&#8221; was a good gentle introduction to neophytes like myself on Groovy basics.  Now that my interest was piqued, I was eager to continue on with Scott&#8217;s next session &#8220;Groovy, The Red Pill: Metaprogramming, the Groovy Way to Blow a Buttoned-Down Java Developer&#8217;s Mind&#8221;.  Never mind the Blue Pill &#8211; the Red Pill is where it&#8217;s at!</p>
<p>Scott&#8217;s enthusiasm for Groovy was definitely contagious, and my mind started churning, trying to think of ways to start introducing Groovy into current projects or future projects at 2Paths.  An allure of Groovy is that it&#8217;s a dynamic language and can be run on the JVM.  Groovy is implemented in Java, so the two languages offer seamless interoperability.  Groovy compiles down to Java bytecode, so Groovy code can call Java code, and vice-versa.  This would make integration into our existing infrastructure much simpler.</p>
<p>The Blue Pill was starting to take effect, as Scott showed us the terseness of the language.  No need to labouriously write getters and setters, amongst other many nifty language shortcuts.  Who needs semicolons or parentheses anymore?  Because Groovy really <strong>is</strong> Java under the hood, programmers unwilling to let go of that extra baggage can continue to use it and nothing will break.  We were then shown demos on how much more quickly we could bang out Unit Tests in Groovy.</p>
<p>In the next session, the Red Pill stuff <strong>was</strong> pretty mind-blowing.  Introducing method pointers, closures, the ExpandoMetaClass.  Method pointers make our code more readable and understandable by allowing us to alias methods with semantics tailored to our own business logic.  Closures are an exciting and powerful inclusion in Groovy that aren&#8217;t available in Java, allowing us to pass around executable snippets of code.  And last but certainly not least, there&#8217;s the ExpandoMetaClass that lets us either do a lot of really cool stuff, or get ourselves into a heap of trouble.  With the ExpandoMetaClass we can intercept methods and inject methods into any Class. Scott showed us some fun examples that got us all fired up wanting to try more!</p>
<p>With my introduction to Groovy setting the stage for the weekend, I went on to choose more sessions on Groovy (Design Patterns, Testing, Groovy with Spring), but also attended other sessions such as Spring Configuration, Regular Expressions, and GIS for Web Developers.  I found most of the other sessions mostly affirming knowledge I already had, but augmenting it with good snippets here and there that were new to me.  Venkat Subramaniam was the other main Groovy Prophet, and I came home with his book &#8220;Programming Groovy&#8221; in hand, eager to start integrating Groovy at least into our testing infrastructure.</p>
<p>The atmosphere at NFJS was inspiring, as the speakers all had great enthusiasm for the technologies they were touting, and the audience was generally equally as keen.  It felt great to be in a large conference hall amongst so many other like-minded programmers, all sharing, and getting fired up about what we do, and our seemingly unlimited potential.  I fully recommend NFJS (regardless of me not winning an IPhone), and would love the opportunity to go again!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.2paths.com/2008/06/17/no-fluff-just-stuff-april-2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Persistence</title>
		<link>http://www.2paths.com/2008/04/11/persistence/</link>
		<comments>http://www.2paths.com/2008/04/11/persistence/#comments</comments>
		<pubDate>Sat, 12 Apr 2008 00:24:34 +0000</pubDate>
		<dc:creator>Lorill</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[newbies]]></category>

		<guid isPermaLink="false">http://blog.2paths.com/persistence.html</guid>
		<description><![CDATA[Any developers working on projects involving databases will need to be aware of persistence strategies, and take these into consideration at design time. Persistence strategies are tailored to specific projects depending on a variety of circumstances such as if they are read-only or read/write, how important the timeliness of data is within the application, and [...]]]></description>
			<content:encoded><![CDATA[<p>Any developers working on projects involving databases will need to be aware of persistence strategies, and take these into consideration at design time. Persistence strategies are tailored to specific projects depending on a variety of circumstances such as if they are read-only or read/write, how important the timeliness of data is within the application, and how likely it is for data-collisions, etc. If coupled units of work involve writes to various tables, the units of work will need to be wrapped in transactions to avoid data corruption, and have proper rollback strategies in place. Optimistic or pessimistic locking strategies need to be put in place where there are possibilities of data collisions.  Appropriate isolation levels need to be associated with the transactions.</p>
<p>These concepts are all database-agnostic, but there are specific tools for use with Java, Hibernate, and Spring to assist in persistence strategy integration. For more information, see the wiki here:<br />
<a href="https://dev.2paths.com/wiki/display/2pathsTECH/Persistence"></p>
<p>https://dev.2paths.com/wiki/display/2pathsTECH/Persistence</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.2paths.com/2008/04/11/persistence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

