<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Large Software Projects - Blog</title>
	<atom:link href="http://largesoftwareprojects.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://largesoftwareprojects.wordpress.com</link>
	<description>For people who love building software</description>
	<lastBuildDate>Tue, 17 Nov 2009 05:27:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='largesoftwareprojects.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Large Software Projects - Blog</title>
		<link>http://largesoftwareprojects.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://largesoftwareprojects.wordpress.com/osd.xml" title="Large Software Projects - Blog" />
	<atom:link rel='hub' href='http://largesoftwareprojects.wordpress.com/?pushpress=hub'/>
		<item>
		<title>The Power of Visibility</title>
		<link>http://largesoftwareprojects.wordpress.com/2009/11/16/the-power-of-visibility/</link>
		<comments>http://largesoftwareprojects.wordpress.com/2009/11/16/the-power-of-visibility/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 10:35:09 +0000</pubDate>
		<dc:creator>largesoftwareprojects</dc:creator>
				<category><![CDATA[Data Warehouse]]></category>

		<guid isPermaLink="false">http://largesoftwareprojects.wordpress.com/2009/11/16/the-power-of-visibility/</guid>
		<description><![CDATA[“By Guest Author: Mr. Mohsin Naqvi (mohsinraza1555@yahoo.com)&#8221; Visibility as literal as it may sound gives us a path to source of information, which in turn gives way to align ourselves in accordance to that information so that accurate and timely decisions making can become a reality. Information visibility becomes a major issue when considered in [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=44&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>“By Guest Author: Mr. Mohsin Naqvi (<a title="blocked::mailto:mohsinraza1555@yahoo.com" href="mailto:mohsinraza1555@yahoo.com">mohsinraza1555@yahoo.com</a>)&#8221;</p>
<p>Visibility as literal as it may sound gives us a path to source of information, which in turn gives way to align ourselves in accordance to that information so that accurate and timely decisions making can become a reality.</p>
<p><strong>Information visibility</strong> becomes a major issue when considered in the context of a corporate environment. Problem becomes worst when information visibility is required beyond the boundaries of single organization. Let’s consider a traditional supply chain, where a manufacture procures raw material from its suppliers, delivers finished good to a distributor. Distributor later resells those good throw wholesalers and retailers and finally good are delivered to end user /consumer.</p>
<p><strong>Suppliers Manufacturers Distributors Wholesaler Retailer Consumer</strong></p>
<p>Every member of this supply chain forecasts the future demand and prepares themselves to meet that demand by maintaining a certain level of inventory, this stocked inventory is known as <strong>safety stock.</strong> Customer demand is rarely stable and as a consequence participates of supply chain from retailer to raw material supplier make forecasting errors. Even with a stable demand downstream member (retailer and wholesalers) increase there orders in anticipation of increased demand and so upstream members (manufactures and distributors) are forced to produce and maintain high level of safety stock.</p>
<p>This process of amplification of demand (which in turn increases the level of inventory) based on forecast errors as one move upstream in the supply chain is known as <strong>Bullwhip Effect</strong>. This effect was first demonstrated by the MIT Sloan School of Management in the form of a Beer Distribution Game.</p>
<p>The key to resolve these complex problems is collaborative planning of all the important functions and processes of various stake holders (within the organization and beyond the boundaries of organizations) based on the near-real time sharing of information, in other words <strong>Integration Business Planning</strong> is the need of the hour.</p>
<p>There are some prerequisites to Integration Business Planning.</p>
<p>Willingness to share the information.</p>
<p>Ability to share information.</p>
<p>Often companies are extremely conservative when it comes to sharing their crucial information (customer centric information, supplier’s raw material details etc), but there is a need to realize that their reluctance to share information can lead to far serious consequences such as ineffective production, excessive inventory, increased cost , financial losses and overall inaccurate decision making. Beside this, information visibility may also expose certain intentional or unintentional departmental blunders in front of management, which can lead to unnecessary explanation and at the extreme level can result in firing of the relevant managers.</p>
<p>Once different stake holders have agreed to share information, focus has to shift toward there ability to share information. When it comes to there ability of sharing information the major challenge lies in the intra and inter-organizational <strong>Data Integration</strong>.</p>
<p>Data integration is the process of combining <a href="http://en.wikipedia.org/wiki/Data">data</a> residing at different sources and providing the user with a unified view of these data. There are two stages of data integration</p>
<p>Internal Data Integration</p>
<p>External Data Integration</p>
<p>Organizations find it difficult to share information because there the internal processes and systems are not properly aligned and information/data resides in departmental files, legacy systems or other transaction processing systems.</p>
<p><a href="http://largesoftwareprojects.files.wordpress.com/2009/11/image001.jpg"><img class="alignnone size-full wp-image-45" title="image001" src="http://largesoftwareprojects.files.wordpress.com/2009/11/image001.jpg?w=470&#038;h=216" alt="image001" width="470" height="216" /></a></p>
<p><strong>Internal Data Integration </strong></p>
<p>As depicted in the diagram, enterprise-wide data warehouse is the path toward enterprise-wide information visibility, but life is never simple. When effort are made to initiate such huge project (enterprise-wide data warehouse), usually such initiates are abandon because these initiatives pose enormous cost, time and resource constraints before they yield some results.</p>
<p>A better approach to resolve such issues as such suggested by Ralph Kimball, (often referred to as GOD of data warehousing) is to start with one or two major departments, that is <strong>extract </strong>information from their information repository, then <strong>transform</strong> the extracted data in accordance with the agreed standards and finally <strong>load</strong> that information into the data warehouse. In this manner some fruitful conclusions can be derived, in a relatively short time span and considerably small cost, further it will give other functions motivation to join hands in this project.</p>
<p>Let focus our attention toward external data integration, coming back to supply chain, as portrayed in the figure, there is a continuous requirement of data sharing between supply chain member, for instance raw material supplier needs access to manufacturer’s production plans, distributors have a need to examine end-customer’s demand available only with the retailer and so on.</p>
<p><a href="http://largesoftwareprojects.files.wordpress.com/2009/11/image002.jpg"><img class="alignnone size-full wp-image-46" title="image002" src="http://largesoftwareprojects.files.wordpress.com/2009/11/image002.jpg?w=470&#038;h=274" alt="image002" width="470" height="274" /></a></p>
<p><strong>External Data Integration </strong></p>
<p>Again data integration provides a guiding light, as depicted there is a need to build a central information repository, data from all the supply chain participants have to be <strong>extracted </strong>and is to be <strong>loaded </strong>into a central data warehouse after applying various business rules and validations in the form of <strong>transformations</strong>. This central data repository will act as a data warehouse, where information would be uploaded as per business requirements in a periodic (daily or weekly) manner. All supply chain participants can have access each other’s information in the form of reports.</p>
<p>Internal or external data integration is usually performed by the dominant stake holder, who uses its influence to enforce the necessary alterations in the internal processes of other stake holder. Better way to initiate such a project is to consult a separate entity, whose core business revolves around data warehousing. This approach will not only reduce dominant member hypocrisy, future it will ensure that business intelligence/data warehousing professional will analyze and resolve all the data integration complexity and produce a best of breed solution.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/largesoftwareprojects.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/largesoftwareprojects.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/largesoftwareprojects.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/largesoftwareprojects.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/largesoftwareprojects.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/largesoftwareprojects.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/largesoftwareprojects.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/largesoftwareprojects.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/largesoftwareprojects.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/largesoftwareprojects.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/largesoftwareprojects.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/largesoftwareprojects.wordpress.com/44/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/largesoftwareprojects.wordpress.com/44/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/largesoftwareprojects.wordpress.com/44/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=44&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://largesoftwareprojects.wordpress.com/2009/11/16/the-power-of-visibility/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cdbc6dd08d83f4f174a44b5e623655ed?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">largesoftwareprojects</media:title>
		</media:content>

		<media:content url="http://largesoftwareprojects.files.wordpress.com/2009/11/image001.jpg" medium="image">
			<media:title type="html">image001</media:title>
		</media:content>

		<media:content url="http://largesoftwareprojects.files.wordpress.com/2009/11/image002.jpg" medium="image">
			<media:title type="html">image002</media:title>
		</media:content>
	</item>
		<item>
		<title>Data Modeling Galore</title>
		<link>http://largesoftwareprojects.wordpress.com/2009/10/30/data-modeling-galore/</link>
		<comments>http://largesoftwareprojects.wordpress.com/2009/10/30/data-modeling-galore/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 03:34:55 +0000</pubDate>
		<dc:creator>largesoftwareprojects</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://largesoftwareprojects.wordpress.com/2009/10/30/data-modeling-galore/</guid>
		<description><![CDATA[Story It was a bit late in the evening and I was staring at a large diagram that has a mishmash of rectangular shapes, many of them joined by lines criss-crossing across the whole diagram. What started out as a simple data model has become a smallish monster of a diagram! I started to have [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=40&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3><strong>Story</strong></h3>
<p>It was a bit late in the evening and I was staring at a large diagram that has a mishmash of rectangular shapes, many of them joined by lines criss-crossing across the whole diagram. What started out as a simple data model has become a smallish monster of a diagram!</p>
<p>I started to have second thoughts about my data modeling: Am I over-designing everything? Why are they so many tables? I started muttering the names of the tables: Book, BookFormatType, BookPresentationType, BookCategory, BookPrice, BookPriceType, BookRatingType, BookPrice…</p>
<p>How can I get rid of so many tables that are classifying and qualifying the main entities? Having attributes instead of separate tables would introduce the classic problems of anomalies in data that normalization generally solves. This could be eliminated by putting constraints on the domain of possible values against these attributes but that would mean that any alterations on these value would require a redefinition of the constaint.</p>
<p>I have spent a significant amount of time in painstakingly describing all the tables, their descriptions, and their relationships to parent tables and as a consequence have extended the scope of the work by introducing new screens to maintain those tables.</p>
<p>My though process was interrupted by Zafar who almost hollered at me: “What are you doing?” I said “Nothing. Usual stuff”. I was a bit reluctant to discuss this with him because of my professional pride as I was supposed to be the software designer and The Data Modeling Person while he was a Consultant cum Project Manager. However, on his insistence, I discussed my beef with the model I was working on.</p>
<p>With his eyes lit, he said: “My friend, you need a type and type class here”. Not understanding what he meant, I just stared at his face. He explained that he has noticed that all these reference/type tables are using a code and a description as attributes. “What you need is instead of all these tables, what you need are two tables or entities, let’s call them Type and Type Class. Type Class will keep a list of all these reference table names that you have and the other entity ‘Type’ will have the actual instances or records against each Type Class row.” He said.</p>
<p>I took a couple of minutes to digest his idea and fired my questions: “How would you ensure referential integrity”?</p>
<p>Zafar smiled: “Well. The table where these type records are referred exactly knows what type class they belong to. Either you can put database level constraint on the attribute so that type records belonging to the intended type class are the available values or you do this in the application code”.</p>
<p>“Hmm.” This is clever, but I had my next question ready: “There are some maintainable tables and some ready-only tables in my original design. How do you tackle that in the maintenance screens”.</p>
<p>“That’s simple. In the Type Class table, you keep a flag of what data class is maintainable. Tell you what. I have requirements where certain preset records were immutable whereas the rest can be amended or deleted. You can handle them with another flag in the ‘Type’ table”.</p>
<p>“This is awesome. Is this your idea?” I had to ask him this question. “Well, this is something that I have done with Tooraj and Tara”*. Zafar replied.</p>
<p><em>[* The writer would like to acknowledge that he was introduced to this pattern during one of the development projects in 1996 where Zafar Omar, Tooraj Dervish and Tara Collinson were the principle business analysts and data modelers. Whether this was borrowed from somebody else’s idea is not known and is for the purposes of this acknowledgement, beside the point]</em></p>
<h3><strong>Design Pattern</strong></h3>
<p>TBA</p>
<p>Formal Definition</p>
<p>Alternate Terms/Synonyms (Enumeration and Enumeration Values; PeopleSoft calls it Translate Values)</p>
<p>Eligibility Criteria</p>
<p>Sample</p>
<p>Restrictions &amp; Possible Cons</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/largesoftwareprojects.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/largesoftwareprojects.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/largesoftwareprojects.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/largesoftwareprojects.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/largesoftwareprojects.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/largesoftwareprojects.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/largesoftwareprojects.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/largesoftwareprojects.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/largesoftwareprojects.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/largesoftwareprojects.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/largesoftwareprojects.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/largesoftwareprojects.wordpress.com/40/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/largesoftwareprojects.wordpress.com/40/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/largesoftwareprojects.wordpress.com/40/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=40&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://largesoftwareprojects.wordpress.com/2009/10/30/data-modeling-galore/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cdbc6dd08d83f4f174a44b5e623655ed?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">largesoftwareprojects</media:title>
		</media:content>
	</item>
		<item>
		<title>Dictionary History</title>
		<link>http://largesoftwareprojects.wordpress.com/2009/10/30/dictionary-history/</link>
		<comments>http://largesoftwareprojects.wordpress.com/2009/10/30/dictionary-history/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 03:31:57 +0000</pubDate>
		<dc:creator>largesoftwareprojects</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://largesoftwareprojects.wordpress.com/2009/10/30/dictionary-history/</guid>
		<description><![CDATA[The Problem Consider the following design for exchange rate storage: The Currency table holds the list of currencies whereas the exchange rate holds the rate of exchange between two currencies. The ‘Effective From’ date is part of the primary key so that history of rates (as well as future rates) can be kept in the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=36&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3><strong>The Problem</strong></h3>
<p>Consider the following design for exchange rate storage:</p>
<p><a href="http://largesoftwareprojects.files.wordpress.com/2009/10/image002.gif"><img class="alignnone size-full wp-image-37" title="image002" src="http://largesoftwareprojects.files.wordpress.com/2009/10/image002.gif?w=470" alt="image002"   /></a></p>
<p>The Currency table holds the list of currencies whereas the exchange rate holds the rate of exchange between two currencies. The ‘Effective From’ date is part of the primary key so that history of rates (as well as future rates) can be kept in the same table.</p>
<p>This is just a hypothetical design and probably not a very suitable example: where do we ever have future rates? Why keep exchange rates between US$ and UK£ and between US$ and € separately when you can derive exchange rates, etc. However let’s disregard these issues for now. The key point is the use of effective date in the primary key.</p>
<p>Now, let’s try and write SQL to get the current (today’s) exchange rate between US$ and UK£.</p>
<p>Select Rate</p>
<p>From ExchangeRate</p>
<p>Where FromCurrency = ‘USD’ and ToCurrency = ‘GBP’</p>
<p>And EffectiveFrom = (today’s date)</p>
<p>The above assumes that exchange rates are maintained on a daily basis. If not, the query becomes:</p>
<p>Select Rate</p>
<p>From ExchangeRate</p>
<p>Where FromCurrency = ‘USD’ and ToCurrency = ‘GBP’</p>
<p>And EffectiveFrom = (</p>
<p>Select Max(EffectiveFrom)</p>
<p>From ExchangeRate</p>
<p>Where FromCurrency = ‘USD’</p>
<p>And ToCurrency=’GBP’</p>
<p>And EffectiveFrom &lt;= (today’s date)</p>
<p>)</p>
<p>Similar is the query for getting exchange rate for a particular date. This is tedious to write and could have serious performance implications. How do you solve this problem?</p>
<h3><strong>Solution: Use Current</strong></h3>
<p>In situations where the current row is of primary concern, consider using the following design:</p>
<p><a href="http://largesoftwareprojects.files.wordpress.com/2009/10/image004.gif"><img class="alignnone size-full wp-image-38" title="image004" src="http://largesoftwareprojects.files.wordpress.com/2009/10/image004.gif?w=470" alt="image004"   /></a></p>
<p>In the above design, a new Yes/No (Boolean) column called ‘Current’ is introduced. Only one row against each from-to currency combination is set to ‘Yes’, signifying the current rate. With this the query to get current rate becomes:</p>
<p>Select Rate</p>
<p>From ExchangeRate</p>
<p>Where FromCurrency = ‘USD’ and ToCurrency = ‘GBP’</p>
<p>And Current = 1 (Yes)</p>
<p>The above is only useful when bulk of the enquiries are for current rate as getting rates other than current rates is still tedious. Also, for systems that hold future rates as well, a batch job is required to point to the correct current row.</p>
<h3><strong>Solution: Introduce EffectiveTo</strong></h3>
<p>Another solution is to use an ‘Effective To’ date, as illustrated below:</p>
<p><a href="http://largesoftwareprojects.files.wordpress.com/2009/10/image006.gif"><img class="alignnone size-full wp-image-39" title="image006" src="http://largesoftwareprojects.files.wordpress.com/2009/10/image006.gif?w=470" alt="image006"   /></a></p>
<p>The query becomes:</p>
<p>Select Rate</p>
<p>From ExchangeRate</p>
<p>Where FromCurrency = ‘USD’ And ToCurrency = ‘GBP’</p>
<p>And EffectiveFrom &gt;= (current date)</p>
<p>And EffectiveTo &lt;= (current date)</p>
<p>*************** End of post *****************</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/largesoftwareprojects.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/largesoftwareprojects.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/largesoftwareprojects.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/largesoftwareprojects.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/largesoftwareprojects.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/largesoftwareprojects.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/largesoftwareprojects.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/largesoftwareprojects.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/largesoftwareprojects.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/largesoftwareprojects.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/largesoftwareprojects.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/largesoftwareprojects.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/largesoftwareprojects.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/largesoftwareprojects.wordpress.com/36/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=36&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://largesoftwareprojects.wordpress.com/2009/10/30/dictionary-history/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cdbc6dd08d83f4f174a44b5e623655ed?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">largesoftwareprojects</media:title>
		</media:content>

		<media:content url="http://largesoftwareprojects.files.wordpress.com/2009/10/image002.gif" medium="image">
			<media:title type="html">image002</media:title>
		</media:content>

		<media:content url="http://largesoftwareprojects.files.wordpress.com/2009/10/image004.gif" medium="image">
			<media:title type="html">image004</media:title>
		</media:content>

		<media:content url="http://largesoftwareprojects.files.wordpress.com/2009/10/image006.gif" medium="image">
			<media:title type="html">image006</media:title>
		</media:content>
	</item>
		<item>
		<title>Shifting Complexity to UI (from logic) to Improve Performance</title>
		<link>http://largesoftwareprojects.wordpress.com/2009/10/29/shifting-complexity-to-ui-from-logic-to-improve-performance/</link>
		<comments>http://largesoftwareprojects.wordpress.com/2009/10/29/shifting-complexity-to-ui-from-logic-to-improve-performance/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 11:22:24 +0000</pubDate>
		<dc:creator>largesoftwareprojects</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://largesoftwareprojects.wordpress.com/2009/10/29/shifting-complexity-to-ui-from-logic-to-improve-performance/</guid>
		<description><![CDATA[Sometimes we need to do a set of processing based on groups, for example, we want to offer discounts on books of categories “fiction” and “self help” during a particular promotion season. Usually we tend to design using the following approach; we create a promotion entity and tie it with book categories by creating the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=33&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Sometimes we need to do a set of processing based on groups, for example, we want to offer discounts on books of categories “fiction” and “self help” during a particular promotion season.</p>
<p>Usually we tend to design using the following approach; we create a promotion entity and tie it with book categories by creating the following entities to handle inclusion of categories and exclusion within “included” categories:</p>
<p>TABLE: PROMOTION {Primary key: PromotionID}</p>
<p>Sample Data</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top"><strong>PromotionID</strong></td>
<td valign="top"><strong>Description</strong></td>
<td valign="top"><strong>Discount %</strong></td>
<td valign="top"> </td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top">Summer08</td>
<td valign="top">Promotion for the Summer of 2008 for book lovers (non-Fiction)</td>
<td valign="top">5%</td>
<td valign="top"> </td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top">Summer09</td>
<td valign="top">Promotion for the Summer of 2009 for book lovers(non-Fiction)</td>
<td valign="top">6%</td>
<td valign="top"> </td>
<td valign="top"> </td>
</tr>
</tbody>
</table>
<p>TABLE: BOOK {Primary key: BookCode}</p>
<p>Sample Data</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top"><strong>BookCode</strong></td>
<td valign="top"><strong>Name</strong></td>
<td valign="top"><strong>Category</strong></td>
<td valign="top"><strong>Author</strong></td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top">000001</td>
<td valign="top">Creating a world without Poverty</td>
<td valign="top">Non-fiction</td>
<td valign="top">Muhammad Yunus</td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top">000002</td>
<td valign="top">5 Dysfunctions of a Team</td>
<td valign="top">Leadership</td>
<td valign="top">Patrick Lencioni</td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top">000003</td>
<td valign="top">Lord of the Rings</td>
<td valign="top">Fiction</td>
<td valign="top">Tolkein</td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top">000004</td>
<td valign="top">Death by Meeting</td>
<td valign="top">Leadership</td>
<td valign="top">Patrick Lencioni</td>
<td valign="top"> </td>
</tr>
</tbody>
</table>
<p>TABLE: PROMOTION-CATEGORY {Primary key: PromotionID + CategoryID}</p>
<p>Sample Data</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top"><strong>PromotionID</strong></td>
<td valign="top"><strong>CategoryID</strong></td>
<td valign="top"><strong>Active </strong></td>
<td valign="top"> </td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top">Summer09</td>
<td valign="top">Non-Fiction</td>
<td valign="top">Y</td>
<td valign="top"> </td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top">Summer09</td>
<td valign="top">Management</td>
<td valign="top">Y</td>
<td valign="top"> </td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top">Summer09</td>
<td valign="top">Leadership</td>
<td valign="top">Y</td>
<td valign="top"> </td>
<td valign="top"> </td>
</tr>
</tbody>
</table>
<p>PROMOTION-CATEGORY-EXCEPTION {Primary key: PROMOTIONID+CategoryID+BookCode}</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top"><strong>PromotionID</strong></td>
<td valign="top"><strong>CategoryID</strong></td>
<td valign="top"><strong>BookCode</strong></td>
<td valign="top"><strong>Active</strong></td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top">Summer09</td>
<td valign="top">Leadership</td>
<td valign="top">000004</td>
<td valign="top">Y</td>
<td valign="top"> </td>
</tr>
</tbody>
</table>
<p>This approach though straight forward is difficult to program. When we try to launch a PROMOTION with a particular discount rate we need to be able to process at BookCode level. When a customer purchases a book you want the system to pick the correct PROMOTIONID (if any is applicable) and then apply the discount rate on the book based on the above setup.</p>
<p>In certain cases an easier way to handle this is to add PROMOTIONID to the Book entity. The program will then be a very simple and efficient one. All it has to do is check whether a PROMOTIONID is applied to the particular book.</p>
<p>Sample Data</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top"><strong>BookCode</strong></td>
<td valign="top"><strong>Name</strong></td>
<td valign="top"><strong>Category</strong></td>
<td valign="top"><strong>Author</strong></td>
<td valign="top">PromotionID</td>
</tr>
<tr>
<td valign="top">000001</td>
<td valign="top">Creating a world without Poverty</td>
<td valign="top">Non-fiction</td>
<td valign="top">Muhammad Yunus</td>
<td valign="top">Summer09</td>
</tr>
<tr>
<td valign="top">000002</td>
<td valign="top">5 Dysfunctions of a Team</td>
<td valign="top">Leadership</td>
<td valign="top">Patrick Lencioni</td>
<td valign="top">Summer09</td>
</tr>
<tr>
<td valign="top">000003</td>
<td valign="top">Lord of the Rings</td>
<td valign="top">Fiction</td>
<td valign="top">Tolkein</td>
<td valign="top"> </td>
</tr>
<tr>
<td valign="top">000004</td>
<td valign="top">Death by Meeting</td>
<td valign="top">Leadership</td>
<td valign="top">Patrick Lencioni</td>
<td valign="top"> </td>
</tr>
</tbody>
</table>
<p>This creates a problem for the end user who may find it very difficult to maintain PROMOTIONID at book level. To help out the end user, you can design a screen which gives an easy interface to the end user. So the end user has the flexibility to add book categories to Promotions and just define the exclusions. The system will need to additionally file the (un-normalize) field of PromotionID to BookCodes at the time of “Save”. This is more work for the UI but less work for the Sales Order form (because now it has to check at the BookCode level whether a promotion is applicable or not).</p>
<p>End of the day, you can argue that the complexity has not been circumvented. Instead it has just been shifted from the processing to the screen. It will be the decision of the software designer/architect to choose which one works for the particular scenario.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/largesoftwareprojects.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/largesoftwareprojects.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/largesoftwareprojects.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/largesoftwareprojects.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/largesoftwareprojects.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/largesoftwareprojects.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/largesoftwareprojects.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/largesoftwareprojects.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/largesoftwareprojects.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/largesoftwareprojects.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/largesoftwareprojects.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/largesoftwareprojects.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/largesoftwareprojects.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/largesoftwareprojects.wordpress.com/33/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=33&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://largesoftwareprojects.wordpress.com/2009/10/29/shifting-complexity-to-ui-from-logic-to-improve-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cdbc6dd08d83f4f174a44b5e623655ed?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">largesoftwareprojects</media:title>
		</media:content>
	</item>
		<item>
		<title>Designing Control into Financial Applications &#8211; Part 2</title>
		<link>http://largesoftwareprojects.wordpress.com/2009/10/27/designing-control-into-financial-applications-part-2/</link>
		<comments>http://largesoftwareprojects.wordpress.com/2009/10/27/designing-control-into-financial-applications-part-2/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 07:21:38 +0000</pubDate>
		<dc:creator>largesoftwareprojects</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://largesoftwareprojects.wordpress.com/2009/10/27/designing-control-into-financial-applications-part-2/</guid>
		<description><![CDATA[Introduction A point which would seem obvious to an accountant but is not so obvious to technical people is that, we cannot let any transaction be “edited” in a double entry system. If for any reason it must be edited then the original transaction should be fully reversed and a new transaction should be created. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=27&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Introduction</strong></p>
<p>A point which would seem obvious to an accountant but is not so obvious to technical people is that, we cannot let any transaction be “edited” in a double entry system. If for any reason it must be edited then the original transaction should be fully reversed and a new transaction should be created. This is necessitated by the fact that each financial period should be reconcilable with the detailed transactions.</p>
<p><strong>Example</strong></p>
<p>Let’s say that in the month of January we generated the revenue of Rs. 1,000,000. We received cash payments of Rs. 8,00,000 against the revenue and the rest is receivable</p>
<p>The accounting transactions would be as follows</p>
<p>Cash &amp; Bank (Debit) 8,00,000</p>
<p>Receivable (Debit) 2,00,000</p>
<p>Revenue (Credit) 1,000,000</p>
<p>Now suppose on the 3rd of February there is a need to edit a transaction of 31st January and the GL Journal/batch is already uploaded to GL. What would happen if we go and change a revenue transaction of Rs. 1000 to Rs. 2000? The GL Journal will not reconcile because the Journal is frozen at month end.</p>
<p>One way to handle this is by leaving the original transaction untouched. Instead you can create two transactions on 3rd February, one for Rs. -1000 and the other for Rs. 2000. There are ways to keep track of the original transaction if it has been later reversed. It is up to the software designer to design the UI in such a way that the process is easy for the system user. For example, you may design the screen in such a way that the user just goes and pulls an old transaction and edits it. The system does the necessary prompting but once the go ahead is given (by the user) then it generates the reversal transaction and new transaction without requiring any user intervention.</p>
<p><strong>Conclusion</strong></p>
<p>The above approach will ensure a reconcilable system which serves as the subsidiary ledger to the GL. The examples quoted here are quite simplistic for the purpose of illustration and real life is never that simple. Sometimes the transaction load of a double entry system could be quite taxing on the hardware and certain architecture/design decisions need to be taken up early in the project.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/largesoftwareprojects.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/largesoftwareprojects.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/largesoftwareprojects.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/largesoftwareprojects.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/largesoftwareprojects.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/largesoftwareprojects.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/largesoftwareprojects.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/largesoftwareprojects.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/largesoftwareprojects.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/largesoftwareprojects.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/largesoftwareprojects.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/largesoftwareprojects.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/largesoftwareprojects.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/largesoftwareprojects.wordpress.com/27/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=27&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://largesoftwareprojects.wordpress.com/2009/10/27/designing-control-into-financial-applications-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cdbc6dd08d83f4f174a44b5e623655ed?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">largesoftwareprojects</media:title>
		</media:content>
	</item>
		<item>
		<title>Designing Control into Financial Applications &#8211; Part 1</title>
		<link>http://largesoftwareprojects.wordpress.com/2009/10/27/designing-control-into-financial-applications-part-1/</link>
		<comments>http://largesoftwareprojects.wordpress.com/2009/10/27/designing-control-into-financial-applications-part-1/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 07:17:39 +0000</pubDate>
		<dc:creator>largesoftwareprojects</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://largesoftwareprojects.wordpress.com/2009/10/27/designing-control-into-financial-applications-part-1/</guid>
		<description><![CDATA[Introduction Most financial systems like billing, accounts payables, accounts receivables, etc. write Journals / Batches to the General Ledger application on a daily or monthly basis. These journals are expected to balanced, meaning that the total figure of debit and credit should match Example A typical accounts payable system which write daily journals to the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=26&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Introduction</strong></p>
<p>Most financial systems like billing, accounts payables, accounts receivables, etc. write Journals / Batches to the General Ledger application on a daily or monthly basis. These journals are expected to balanced, meaning that the total figure of debit and credit should match</p>
<p><strong>Example</strong></p>
<p>A typical accounts payable system which write daily journals to the general ledger, will write at the time of voucher creation for an expenditure of Rs. 100/-</p>
<p>Stationary Expense (Debit) = 100</p>
<p>Accounts Payables (Credit) = 100</p>
<p>At the time of payment the transaction would be</p>
<p>Accounts Payables (Debit) = 100 {this entry is a contra entry which will reduce the account payable figure in the accounting books/ledger}</p>
<p>Cash &amp; Bank (Credit) = 100</p>
<p>If you look at the above account types the stationary expense is an expense and is a debit line. Similarly the accounts payable is a liability and is a credit line. The Cash &amp; Bank is an asset and is a debit line.</p>
<p>When looking at the above transactions one can work out that if the above transaction was the only transaction in the whole day, then the daily journal will be balanced.</p>
<p><strong>Challenge</strong></p>
<p>How do you ensure that the system will always generate balanced transactions?</p>
<p>One way to approach it is that at the time of transaction you build rules in the system that the system will only allow selection of accounts (for example stationary expense in the above example) which are debit lines at the time of voucher creation. This makes sense because at the time of voucher creation the system will automatically generate the balancing transaction of accounts payable (credit line).</p>
<p><strong>Another Example</strong></p>
<p>In a guest billing system for a hospitality concern could have transactions such as</p>
<p>Receivable (Debit line) = 100</p>
<p>Revenue (Credit line) = 100</p>
<p>At the time of payment the transaction would be</p>
<p>Cash &amp; Bank (Debit line) = 100</p>
<p>Receivable (Credit line) = 100 {contra entry which will reduce the receivable)</p>
<p>In the above case we need to build controls in the system that all services given to the guest have to have a Credit line (revenue) behind them (in the dictionary setup). In this case the receivable is automatically generated (which is a debit line).</p>
<p><strong>Conclusion</strong></p>
<p>In the above cases we have managed balanced transaction in systems like accounts payables and billing which are traditionally double entry systems. Meaning that they need to send balanced accounting transactions to the general ledger.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/largesoftwareprojects.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/largesoftwareprojects.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/largesoftwareprojects.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/largesoftwareprojects.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/largesoftwareprojects.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/largesoftwareprojects.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/largesoftwareprojects.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/largesoftwareprojects.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/largesoftwareprojects.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/largesoftwareprojects.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/largesoftwareprojects.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/largesoftwareprojects.wordpress.com/26/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/largesoftwareprojects.wordpress.com/26/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/largesoftwareprojects.wordpress.com/26/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=26&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://largesoftwareprojects.wordpress.com/2009/10/27/designing-control-into-financial-applications-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cdbc6dd08d83f4f174a44b5e623655ed?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">largesoftwareprojects</media:title>
		</media:content>
	</item>
		<item>
		<title>Avoid locking issues by using centralized queues</title>
		<link>http://largesoftwareprojects.wordpress.com/2009/10/26/avoid-locking-issues-by-using-centralized-queues/</link>
		<comments>http://largesoftwareprojects.wordpress.com/2009/10/26/avoid-locking-issues-by-using-centralized-queues/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 10:13:39 +0000</pubDate>
		<dc:creator>largesoftwareprojects</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://largesoftwareprojects.wordpress.com/2009/10/26/avoid-locking-issues-by-using-centralized-queues/</guid>
		<description><![CDATA[Introduction Sometimes in an integrated system, there is a need to segregate the system from various modules or third-party systems through the use of queues. It is possible that in this case you have a background program which reads from the queue and posts the transactions to the integrated system. Sometimes there are programs within [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=22&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2><strong><em>Introduction</em></strong></h2>
<p>Sometimes in an integrated system, there is a need to segregate the system from various modules or third-party systems through the use of queues. It is possible that in this case you have a background program which reads from the queue and posts the transactions to the integrated system. Sometimes there are programs within the system which also want to post these type of transactions and hence a locking mechanism needs to be incorporate. This complicates the overall system. In certain cases it is possible to take a slightly different approach which is given as follows:</p>
<h2><strong><em>Transferring Data from other modules</em></strong></h2>
<p>1) These modules should write to the centralized queue using a common executable library (for example, DLL in Windows applications)</p>
<p>2) They should not write directly to the system to avoid locking issues</p>
<h2><strong><em>Generating Data from local module/system</em></strong></h2>
<p>3) Any programs local to the integrated application should also write to the centralized queue instead of directly posting the transaction from within the system</p>
<p>4) This will allow for only one background program to read from the queue and serially post transactions into the system, hence by-passing the locking issues</p>
<h2><strong><em>The Issue of Latency </em></strong></h2>
<p>5) It is possible that the requirement of the system may be that the transactions generated from within the system should be given higher priority for the purpose of speeding up a particular customer order, etc.</p>
<p>6) In that case we will have to create a mechanism in the queue to give priority to such transactions at the time of queue reading and posting</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/largesoftwareprojects.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/largesoftwareprojects.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/largesoftwareprojects.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/largesoftwareprojects.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/largesoftwareprojects.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/largesoftwareprojects.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/largesoftwareprojects.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/largesoftwareprojects.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/largesoftwareprojects.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/largesoftwareprojects.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/largesoftwareprojects.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/largesoftwareprojects.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/largesoftwareprojects.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/largesoftwareprojects.wordpress.com/22/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=22&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://largesoftwareprojects.wordpress.com/2009/10/26/avoid-locking-issues-by-using-centralized-queues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cdbc6dd08d83f4f174a44b5e623655ed?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">largesoftwareprojects</media:title>
		</media:content>
	</item>
		<item>
		<title>Handling the “SAVE” button</title>
		<link>http://largesoftwareprojects.wordpress.com/2009/10/26/handling-the-%e2%80%9csave%e2%80%9d-button/</link>
		<comments>http://largesoftwareprojects.wordpress.com/2009/10/26/handling-the-%e2%80%9csave%e2%80%9d-button/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 10:04:29 +0000</pubDate>
		<dc:creator>largesoftwareprojects</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://largesoftwareprojects.wordpress.com/2009/10/26/handling-the-%e2%80%9csave%e2%80%9d-button/</guid>
		<description><![CDATA[Most programmers believe that business rules should be segmented and some of these should be handled/implemented at the field level (of the screens) typically as soon as the event of “lose focus” happens. This means that we will enforce most checks e.g existence of parent rows or data type checking or format checks when the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=21&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Most programmers believe that business rules should be segmented and some of these should be handled/implemented at the field level (of the screens) typically as soon as the event of “lose focus” happens. This means that we will enforce most checks e.g existence of parent rows or data type checking or format checks when the cursor leaves a specific field.</p>
<p>When we perform such field level checks, we forget some basic common sense checking such as re-checking for the existence of parent/master rows at the time of the actual saving. (I have intentionally taken this simple example to illustrate the point). The point being that these business rules that we implement on field level should also be re- implemented on the SAVE button.</p>
<p>It seems like extra work and extra load on the machine but depending on the application it could mean lost revenue. Consider the example of a computer store inventory. During check-out a certain computer was available for purchase as it is indeed in the inventory. However, if it is purchased by another concurrent user at another check-out, it is no longer available when we finalize the sale.</p>
<p>This is especially important in web based applications where you may not trust whether your java script will always run at the field level or you have a stable connection.</p>
<p>Another reason why we recommend keeping all business rules behind the SAVE button is that it simplifies the code and maintains a single code base (read: maintenance). How many times have we wished that all the checks were placed in a single location after a programmer’s exit so we would not have to look behind each field and open up each event?</p>
<p>No matter which approach you choose, remember that consistent user experience is the holy grail of application development. Do not subject your user to field level checking on one screen and then SAVE button checking on another screen.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/largesoftwareprojects.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/largesoftwareprojects.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/largesoftwareprojects.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/largesoftwareprojects.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/largesoftwareprojects.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/largesoftwareprojects.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/largesoftwareprojects.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/largesoftwareprojects.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/largesoftwareprojects.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/largesoftwareprojects.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/largesoftwareprojects.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/largesoftwareprojects.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/largesoftwareprojects.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/largesoftwareprojects.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=21&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://largesoftwareprojects.wordpress.com/2009/10/26/handling-the-%e2%80%9csave%e2%80%9d-button/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cdbc6dd08d83f4f174a44b5e623655ed?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">largesoftwareprojects</media:title>
		</media:content>
	</item>
		<item>
		<title>Distributing Processing Load between Application Server and Database Server</title>
		<link>http://largesoftwareprojects.wordpress.com/2009/10/26/distributing-processing-load-between-application-server-and-database-server/</link>
		<comments>http://largesoftwareprojects.wordpress.com/2009/10/26/distributing-processing-load-between-application-server-and-database-server/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 05:49:32 +0000</pubDate>
		<dc:creator>largesoftwareprojects</dc:creator>
				<category><![CDATA[Performance versus Server Load]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://largesoftwareprojects.wordpress.com/?p=13</guid>
		<description><![CDATA[Introduction Some design decisions need to be taken up early whether you are developing a Product or a customized solution.  The decisions are easier in the customized solution case because there is less market research involved.  You basically need to assess the current strength the application servers and the database servers and then decide how [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=13&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Introduction</strong></p>
<p>Some design decisions need to be taken up early whether you are developing a Product or a customized solution.  The decisions are easier in the customized solution case because there is less market research involved.  You basically need to assess the current strength the application servers and the database servers and then decide how much load can be placed on each cluster.</p>
<p><strong>Example</strong></p>
<p>For example, you are developing a heavy report which the client insists should respond within 2 minutes of invocation.  You have looked at the business scenario and it seems that the 2 minute requirement is a fair one.</p>
<p><strong>Approach</strong></p>
<p>For the example above you may start by considering the following</p>
<p>1. Write a stored procedure which would give a very good turn around but it will load the DB server beyond acceptable parameters</p>
<p>2. Develop a memory record set based approach where the whole output is first prepared in memory and then passed to the reporting engine (like Crystal Reports, Jasper etc.) to print.  This will also perform quite well (perhaps not as well as the first approach) but the down side with this is that it will load the Application server beyond acceptable parameters</p>
<p>3. Develop a temporary physical table where the whole output is first prepared and then passed to the reporting engine to print.  This is most feasible because it does not load the Application or the DB servers.  The only problem is that it may not be able to meet the 2 minute turn-around time requirement of the client</p>
<p>4. Develop using some hybrid of the above and also doing some processing on crystal (app server) but usually report engines are  very slow</p>
<p>5. Develop statistical tables</p>
<ol>
<li>In certain cases it can be beneficial to populate statistical tables at the time of transaction posting.  This slows down the post process but greatly improves the report turn-around time</li>
<li>Another way to do it is to write a background job which runs at midnight; that way there is no additional load at the time of transaction posting.  The downside it that the customer will not get up-to-the-minute results, instead the results will reflect the position as of last night</li>
</ol>
<p>6. Add data redundancy into your tables to avoid too many query joins</p>
<p><strong>Challenge</strong></p>
<p>How do you achieve this without a Production level UAT hardware?</p>
<p>How best to write diagnostic utilities which will ensure the integrity of statistical tables or redundant field values?</p>
<p><strong>Conclusion</strong></p>
<p>For the purpose of simplicity we have not brought the web server in the discussion above.  The thinking pattern would be similar and this chapter would have hopefully provided some options to consider.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/largesoftwareprojects.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/largesoftwareprojects.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/largesoftwareprojects.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/largesoftwareprojects.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/largesoftwareprojects.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/largesoftwareprojects.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/largesoftwareprojects.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/largesoftwareprojects.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/largesoftwareprojects.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/largesoftwareprojects.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/largesoftwareprojects.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/largesoftwareprojects.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/largesoftwareprojects.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/largesoftwareprojects.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=13&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://largesoftwareprojects.wordpress.com/2009/10/26/distributing-processing-load-between-application-server-and-database-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cdbc6dd08d83f4f174a44b5e623655ed?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">largesoftwareprojects</media:title>
		</media:content>
	</item>
		<item>
		<title>Programming Checklist -&gt; What each programmer should consider for each programming unit</title>
		<link>http://largesoftwareprojects.wordpress.com/2009/10/24/programming-checklist-what-each-programmer-should-consider-for-each-programming-unit/</link>
		<comments>http://largesoftwareprojects.wordpress.com/2009/10/24/programming-checklist-what-each-programmer-should-consider-for-each-programming-unit/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 10:31:39 +0000</pubDate>
		<dc:creator>largesoftwareprojects</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Programming Checklist]]></category>

		<guid isPermaLink="false">http://largesoftwareprojects.wordpress.com/2009/10/24/programming-checklist-what-each-programmer-should-consider-for-each-programming-unit/</guid>
		<description><![CDATA[User Interface Look n Feel 1) Tab ordering is correct 2) Capitalization standards are followed (Title case vs. Sentence case in different controls) 3) The use of controls should be standardized, if such a standard exists. For instance, if the project demands or requires the use of a particular Grid Control (True DB Grid or [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=7&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong><span style="text-decoration:underline;">User Interface Look n Feel</span></strong></p>
<p>1) Tab ordering is correct<br />
2) Capitalization standards are followed (Title case vs. Sentence case in different controls)<br />
3) The use of controls should be standardized, if such a standard exists. For instance, if the project demands or requires the use of a particular Grid Control (True DB Grid or Infragistics Ultra Grid), it should be used throughout.<br />
4) The names &amp; position of controls should be consistent between screens.<br />
         a. Standard Names and icons for buttons, for e.g., Add, Edit/Update, Delete, Save, Cancel/Close/Exit<br />
        b. If search is provided at the top of the screen, it should be at the top everywhere.<br />
5) Mandatory fields are handled.<br />
6) Correct field lengths are used and set.<br />
7) Hour glass or a progress dialog (with an ability to cancel) is provided for long operations.<br />
8. Enable and Disable controls properly so that actions that are not applicable or valid are not available to the user. This reduces a lot of validation code.<br />
<strong></strong></p>
<p><strong><span style="text-decoration:underline;">User Interface Design</span></strong></p>
<p>1) Consider creating a common control (control class) for visual controls that are common across multiple screens.<br />
2) If the development platform allows inheritance of forms, use it.<br />
3) Common validation routines should be put in a common class and should be re-used rather than each developer making their own function to validate a date etc.<br />
<strong></strong></p>
<p><strong><span style="text-decoration:underline;">Application Code</span></strong></p>
<p>1) Compliance with coding standards including variable prefixes, class, file and function names, commenting standards, use of constants (vs. magic numbers)<br />
2) Appropriate handling of null values, especially when null values are returned from the database<br />
3) Ensure that exceptions are caught by the application code and handled as per the case may be. This may be in the form of:<br />
   a. Corrective action, in order to continue program execution<br />
   b. the user is provided with an appropriate user-friendly message<br />
   c. the application or the module is stopped with a graceful exit<br />
4) Ensure that user exceptions are thrown as per the agreed standards and guidelines.<br />
5) Ensure that appropriate error logging library is used and appropriate error priority is set for different error conditions or as a result of different exceptions.<br />
6) Handle concurrent access cases as per the design.<br />
7) Handle deadlock errors.<br />
8. Use transactions where required.<br />
9) Ensure that connections are closed after use. Use disconnected record sets unless a connected record set is absolutely required.</p>
<p><strong><span style="text-decoration:underline;">Class Design</span></strong></p>
<p>1) Ensure that appropriate classes and interfaces are design in compliance with the application architecture (n-tier, etc.).</p>
<p><strong><span style="text-decoration:underline;">Database Queries</span></strong></p>
<p>1) Avoid using Select * (use specific column names instead)</p>
<p><strong><span style="text-decoration:underline;">Other Checks</span></strong></p>
<p>1) Ensure that code is checked in to the central source control system (almost daily).<br />
2) Ensure that each version or release can be traced back to its source code.<br />
3) Ensure that all required post-analyzers are run on the code:<br />
    a. No warnings or hints are outstanding during compilation<br />
    b. FxCop is run and there are no outstanding warnings or errors<br />
4) If using NDoc or any other tool to generate documentation, ensure that it is run and produces the correct output.<br />
5) If using NUnit/JUnit or any other unit testing framework, ensure that it is run and all tests are successful.<br />
6) Ensure that all documentation, including use case description, data dictionary, and program specifications are updated.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/largesoftwareprojects.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/largesoftwareprojects.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/largesoftwareprojects.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/largesoftwareprojects.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/largesoftwareprojects.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/largesoftwareprojects.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/largesoftwareprojects.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/largesoftwareprojects.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/largesoftwareprojects.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/largesoftwareprojects.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/largesoftwareprojects.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/largesoftwareprojects.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/largesoftwareprojects.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/largesoftwareprojects.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=largesoftwareprojects.wordpress.com&amp;blog=10077327&amp;post=7&amp;subd=largesoftwareprojects&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://largesoftwareprojects.wordpress.com/2009/10/24/programming-checklist-what-each-programmer-should-consider-for-each-programming-unit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cdbc6dd08d83f4f174a44b5e623655ed?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">largesoftwareprojects</media:title>
		</media:content>
	</item>
	</channel>
</rss>
