<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-14503818</id><updated>2011-12-02T03:43:41.908-08:00</updated><title type='text'>The Franciscan Report</title><subtitle type='html'>Agile Software Development, Patterns &amp; Practices, .Net, Java, SOA</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>44</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-14503818.post-117641503171459098</id><published>2007-04-12T14:56:00.000-07:00</published><updated>2007-04-12T14:57:11.723-07:00</updated><title type='text'>VS.Net template for Test Driven Development</title><content type='html'>I've found this template to be very useful for codegen TDD classes for me. &lt;br /&gt;&lt;br /&gt;http://blogs.ipona.com/dan/archive/2007/01/02/SimpleTDDVisualStudioTemplates.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-117641503171459098?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/117641503171459098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=117641503171459098' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/117641503171459098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/117641503171459098'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2007/04/vsnet-template-for-test-driven.html' title='VS.Net template for Test Driven Development'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-115877687819823263</id><published>2006-09-20T11:27:00.000-07:00</published><updated>2006-09-20T11:27:58.270-07:00</updated><title type='text'>Jay Fields Thoughts: Ruby Form Template Method Using Extend</title><content type='html'>&lt;a href="http://jayfields.blogspot.com/2006/09/ruby-form-template-method-using-extend.html"&gt;Jay Fields Thoughts: Ruby Form Template Method Using Extend&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One of Ruby's feature is the introduction of 'mixin' as demonstrated by Jay's article. &lt;br /&gt;&lt;br /&gt;I have a mix feeling about using this feature (no pun intended). To me mixin sounds too close to global function as popularized by language such as C++.&lt;br /&gt;&lt;br /&gt;In C++ you can use this "global" function in your class with the right syntax and inclusion. Obviously one would argue what's so bad about that. In the beginning if you have small codebase maybe the drawback is not as obvious, but maintaining this type of code years from now could be hassle in my opinion.&lt;br /&gt;&lt;br /&gt;I guess what I'm trying to say things could go out of hand quickly by incorporating this practice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-115877687819823263?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/115877687819823263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=115877687819823263' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/115877687819823263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/115877687819823263'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/09/jay-fields-thoughts-ruby-form-template.html' title='Jay Fields Thoughts: Ruby Form Template Method Using Extend'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-115567571262561839</id><published>2006-08-15T14:01:00.000-07:00</published><updated>2006-08-16T06:29:12.183-07:00</updated><title type='text'>Suzanne Cook's .NET CLR Notes : New Assembly, Old .NET (and Vice-Versa)</title><content type='html'>&lt;a href="http://blogs.msdn.com/suzcook/archive/2005/01/26/361092.aspx"&gt;Suzanne Cook's .NET CLR Notes : New Assembly, Old .NET (and Vice-Versa)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To load the assembly compiled using the previous version of .Net framework such as 1.1, or lower, from a .Net 2.0, you don't have to do any extra effort.&lt;br /&gt;&lt;br /&gt;However, things are not the same the other way around, to be able to load a .Net 2.0 assembly from a previous version of .Net you have to add this into your App.config&lt;br /&gt;&lt;br /&gt;&lt;pre&gt; &lt;br /&gt;&amp;lt;startup&amp;gt; &lt;br /&gt;    &amp;lt;supportedRuntime version=&amp;quot;v2.0.50727&amp;quot; /&amp;gt; &lt;br /&gt;    &amp;lt;supportedRuntime version=&amp;quot;v2.0.50215&amp;quot; /&amp;gt; &lt;br /&gt;    &amp;lt;supportedRuntime version=&amp;quot;v2.0.40607&amp;quot; /&amp;gt; &lt;br /&gt;    &amp;lt;supportedRuntime version=&amp;quot;v1.1.4322&amp;quot; /&amp;gt; &lt;br /&gt;    &amp;lt;supportedRuntime version=&amp;quot;v1.0.3705&amp;quot; /&amp;gt; &lt;br /&gt;    &amp;lt;requiredRuntime version=&amp;quot;v1.0.3705&amp;quot; /&amp;gt; &lt;br /&gt;&amp;lt;/startup&amp;gt; &lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This will allows such case, assuming you have the required version of .Net and the supported runtime version of .net 2.0&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-115567571262561839?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/115567571262561839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=115567571262561839' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/115567571262561839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/115567571262561839'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/08/suzanne-cooks-net-clr-notes-new.html' title='Suzanne Cook&apos;s .NET CLR Notes : New Assembly, Old .NET (and Vice-Versa)'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-115410289672728992</id><published>2006-07-28T09:08:00.000-07:00</published><updated>2006-07-28T09:08:16.776-07:00</updated><title type='text'>Data Segregation</title><content type='html'>Enterprise applications usually use some type of framework to support their underlying applications. Framework can vary from a simple reusable components such as a Math library to a more complex solution such as a mechanims to handle Messaging, Security, etc. Some of the more complex framework requires access to external data storages such as database or a queue, etc. &lt;br /&gt;&lt;br /&gt;There are two options on how applications code deploy with this framework's external resouces. One solution is to share the framework's resources amongts all applications, thus data specific to those applications will be stored in the same storages/tables.&lt;br /&gt;&lt;br /&gt;The other solution is to store data specific to the application into its own database domain, thus creating a physical boundaries between different applications.&lt;br /&gt;&lt;br /&gt;There are pros and cons of both approaches which I will discuss as follows;&lt;br /&gt;&lt;br /&gt;The benefits of using the same physical storage for all data are:&lt;br /&gt;- Easy to implement&lt;br /&gt;- Development/Support teams will only have to look at one place to find the data.&lt;br /&gt;- Easy to maintain from the sense where update to data schema will only need to be applied in limited places.&lt;br /&gt;&lt;br /&gt;The disadvantages of such solution are:&lt;br /&gt;- Data from different applications are tighly located in the same place.&lt;br /&gt;- No way to protect the integrity of the data of other applications, since different team could potentially affect other team/application data.&lt;br /&gt;- Depends on certain situation/application behavior, there could be performance impact since all applications will be using the same data storage.&lt;br /&gt;&lt;br /&gt;The benefit of using segregated data storage:&lt;br /&gt;- No need to worry about affecting other application data, when doing updates/modification to the tables&lt;br /&gt;- If security is a concern, using database to enforce sensitive data between applications is easier to implement.&lt;br /&gt;- No data violation could happen, in a case where some record could have the same values but different meanings, but if the data are stored in the same table, there could be some constraint violations.&lt;br /&gt;&lt;br /&gt;The disadvantages of this approach:&lt;br /&gt;- More work for support team, when they have to maintain all applications, thus tools need to be created to leverage this problem.&lt;br /&gt;- Upgrade of data schema need to be applied to more places, but depends on how you implement the schema changes this could work for the benefit of the applications that couldn't afford to have the update yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-115410289672728992?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/115410289672728992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=115410289672728992' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/115410289672728992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/115410289672728992'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/07/data-segregation.html' title='Data Segregation'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-115228285609815076</id><published>2006-07-07T07:34:00.000-07:00</published><updated>2006-07-07T07:41:56.440-07:00</updated><title type='text'>#region ... #endregion</title><content type='html'>#region my rant&lt;br /&gt;&lt;br /&gt;Microsoft introduces a keyword #region ... #endregion that supposedly can be used to organize "like" codes into   itsown region.&lt;br /&gt;&lt;br /&gt;However, lately I have been encountering that it's also used as a somewhat of an excuse to have big classes. Somehow the use of #region makes it a little tolerable to have big classes. &lt;br /&gt;&lt;br /&gt;I don't know if this is what Microsoft intends or not, but it's clearly not an appropriate solution to say the least.&lt;br /&gt;&lt;br /&gt;The problem with big classes not only because it's not pretty to our eyesight, but there are some other basic problems with them:&lt;br /&gt;1. Big classes are usually hard to test.&lt;br /&gt;2. Big classes are usually error prone, because regardless of how we divide it up in regions, we still have to understand details of the class, and most humans usually comprehend things as smaller chunks better than one large chunk.&lt;br /&gt;3. The use of region itself should have triggered the fact that the class might have low cohesiveness, thus they could be broken up to smaller classes.&lt;br /&gt;&lt;br /&gt;The problems with region are:&lt;br /&gt;1. It's another thing that we have to maintain to make sure things in the region are all "related", I have seen many times, that region starts out well but become "stink" over time.&lt;br /&gt;2. Who's deciding what region to create, which code should go to which region, etc. This is left to each developer interpretation, should we have code review for the region ;-)&lt;br /&gt;&lt;br /&gt;#endregion my rant&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-115228285609815076?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/115228285609815076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=115228285609815076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/115228285609815076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/115228285609815076'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/07/region-endregion.html' title='#region ... #endregion'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-115103709655367958</id><published>2006-06-22T21:31:00.000-07:00</published><updated>2006-06-22T21:31:36.556-07:00</updated><title type='text'>SQL Injection Attacks</title><content type='html'>Ways to prevent SQL Injection Attacks&lt;br /&gt;&lt;br /&gt;A few ways to avoid SQL Injection attacks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;In .Net&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Instead of&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;using( SqlConnection con = (acquire connection) ) {&lt;br /&gt;    con.Open();&lt;br /&gt;    using( SqlCommand cmd = new SqlCommand("SELECT * FROM users WHERE name = '" + userName + "'", con) ) {&lt;br /&gt;       using( SqlDataReader rdr = cmd.ExecuteReader() ){&lt;br /&gt;           ...&lt;br /&gt;       }&lt;br /&gt;    }      &lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Use the following&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;using( SqlConnection con = (acquire connection) ) {&lt;br /&gt;    con.Open();&lt;br /&gt;    using( SqlCommand cmd = new SqlCommand("SELECT * FROM users WHERE name = @userName", con) ) {&lt;br /&gt;   &lt;br /&gt;       cmd.Parameters.Add("@userName", userName);&lt;br /&gt;&lt;br /&gt;       using( SqlDataReader rdr = cmd.ExecuteReader() ){&lt;br /&gt;           ...&lt;br /&gt;       }&lt;br /&gt;    }      &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;In Java.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Instead of&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Connection con = (acquire Connection)&lt;br /&gt;Statement stmt = con.createStatement();&lt;br /&gt;ResultSet rset = stmt.executeQuery("SELECT * FROM users WHERE name = '" + userName + "';");&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Use the following&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Connection con = (acquire Connection)&lt;br /&gt;PreparedStatement pstmt = con.prepareStatement("SELECT * FROM users WHERE name = ?");&lt;br /&gt;pstmt.setString(1, userName);&lt;br /&gt;ResultSet rset = pstmt.executeQuery();&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-115103709655367958?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/115103709655367958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=115103709655367958' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/115103709655367958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/115103709655367958'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/06/sql-injection-attacks.html' title='SQL Injection Attacks'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-115034516420125377</id><published>2006-06-14T21:19:00.000-07:00</published><updated>2006-06-14T21:19:24.260-07:00</updated><title type='text'>Data Driven Design</title><content type='html'>Data Driven Design is generated based on the need to provide users of the system with a set of data. &lt;br /&gt;&lt;br /&gt;The common flow of the system will be as follows;&lt;br /&gt;1. A data access object or a business entity object will retrieve the particular data from a database either through stored procedures or dynamic sql statements.&lt;br /&gt;2. The resulting query result will then be mapped to a collection of data objects (usually an anemic model, ie. model with data only, no behavior) representing the information requested by the user.&lt;br /&gt;3. Logics can be embedded to the business entity object  (usually contain just behavior with no data member) or the data access object if necessary to act on the data object.&lt;br /&gt;4. This data object will then be passed along to the user to be displayed in the presentation tier. If it needs to cross multiple physical tiers, then this data object is usually called a Data Transfer Object.&lt;br /&gt;5. If the user can resubmit the data back to the server, then the aforementioned business entity object or the data access object can be used to validate user entries.&lt;br /&gt;&lt;br /&gt;Benefits of this approach are:&lt;br /&gt;1. It's a more procedural approach in software development, thus doesn't require deep domain expertise.&lt;br /&gt;2. It's easier to implement since data objects are created based on user requirements.&lt;br /&gt;&lt;br /&gt;Disadvantages of this approach are:&lt;br /&gt;1. Business logics could be scattered around the system, thus could potentially create accidental duplications (root of all evil).&lt;br /&gt;2. No ubiquitous language and understanding between development team and the business folks, since nobody speaks in term of the actual business domain.&lt;br /&gt;3. No logical boundary exists between inter-related objects, thus could potentially lead to a highly coupled systems.&lt;br /&gt;4. Most of the cases the data objects will be closely mapped to tables in the database, thus it might not take advantages of what Object Oriented Design principles give, ie. polymorphism, inheritance, composition, etc.&lt;br /&gt;&lt;br /&gt;Compare this approach to a Domain Driven approach which value system as a set of domain objects and how they are inter-related with each other, which can be defined/contained within their own boundary.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-115034516420125377?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/115034516420125377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=115034516420125377' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/115034516420125377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/115034516420125377'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/06/data-driven-design.html' title='Data Driven Design'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-115022350662900104</id><published>2006-06-13T11:31:00.000-07:00</published><updated>2006-06-22T21:31:05.830-07:00</updated><title type='text'>Stored Procedure vs Object Relational mapper</title><content type='html'>Enterprise application team has a constant battle of whether to use stored procedure or OR mapper.&lt;br /&gt;&lt;br /&gt;Despite some common myths about O/R mapping framework such as performances, sql injection attacks, one to one mapping between tables and classes, which are not true of course.&lt;br /&gt;&lt;br /&gt;Here are my takes on the subject&lt;br /&gt;&lt;br /&gt;Benefits of using Stored Procedure&lt;br /&gt;- SQL codes are precompiled thus can improve performance&lt;br /&gt;- Prevent SQL injections.&lt;br /&gt;- Works very well with data intensive operations that return huge datasets.&lt;br /&gt;&lt;br /&gt;Disadvantages of using Stored Procedures&lt;br /&gt;- Developers need to know the language, thus becoming language dependent.&lt;br /&gt;- Need to implement complex mapping layers between the returned data and domain objects&lt;br /&gt;- Need to maintain the SQL codes&lt;br /&gt;- Business logics could leak into the stored procedures.&lt;br /&gt;- No tool supports for debugging, refactoring, code coverage.&lt;br /&gt;&lt;br /&gt;Benefits of using OR Mapper&lt;br /&gt;- Developers deal with domain objects directly instead of having to write their own SQL codes.&lt;br /&gt;- Eliminate repetitive database access codes&lt;br /&gt;- Most OR Mappers (NHibernate, iBatis, etc.) provide caching, lazy loading, optimistic locking, dirty saves, business transaction mechanisms.&lt;br /&gt;- SQL injection is never an issue, since most of the underlying frameworks prevent it&lt;br /&gt;- Support for inheritance, composition, one-one and many-one, many-many associations&lt;br /&gt;- Support transaction updates across tables/rows/objects.&lt;br /&gt;- Objects dependency ordering during DB operations.&lt;br /&gt;- Paging supports&lt;br /&gt;- Cascading updates/deletes are supported out of the box.&lt;br /&gt;- SQL statement batching, sending multiple statements to the database in one shot.&lt;br /&gt;&lt;br /&gt;Disadvantage of using OR Mapper&lt;br /&gt;- Have to maintain the mapper schemas&lt;br /&gt;- More performance impacts compares to using Stored Procedure, in particular, if the application is a data intensive operations, ie. batch processes, projection types queries, etc.&lt;br /&gt;&lt;br /&gt;I believe both methods have their places, if you want complex logic in a user interaction then using domain objects with O/R mapper is the way to go. On the other hand, use stored procedures if you need to perform large dataset queries, or batch jobs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-115022350662900104?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/115022350662900104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=115022350662900104' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/115022350662900104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/115022350662900104'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/06/stored-procedure-vs-object-relational.html' title='Stored Procedure vs Object Relational mapper'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114979614847003072</id><published>2006-06-08T12:49:00.000-07:00</published><updated>2006-06-09T08:03:32.953-07:00</updated><title type='text'>Layered Architecture structure in .Net</title><content type='html'>Common .Net practice is to write software in a solution file consists of multiple project files. A project file corresponding to a dll. &lt;br /&gt;&lt;br /&gt;There are two options where one could structure his layered-architecture concept in .Net projects.&lt;br /&gt;&lt;br /&gt;One is to structure the layering to corresponds to individual project, thus one layer per project. The benefits of this approach are:&lt;br /&gt;- It allows flexibility in swapping dlls in and out of an application.&lt;br /&gt;- It's quite easy to separate the work between development group, particularly in an organization where developers are segregated to different area, ie. DB developer, Service developer, domain developer, thus each group can develop their own module independently.&lt;br /&gt;- Each individual layer can potentially be deployed in different physical tiers.&lt;br /&gt;- It allows creation of patches to fix defects that only affect certain area of the applications, thus it promotes faster build time and "minimal" risk.&lt;br /&gt;&lt;br /&gt;The disadvantages of such approach are:&lt;br /&gt;- We lost the advantage of encapsulation, for example, as different layers are package to different dll, there's no way to limit other projects from referencing dll that they are not supposed to.&lt;br /&gt;- It's easier to adopt the concept of SOA, where the only way to gain "business access" is through external service call, instead of allowing direct access to a particular business objects or data access layers in the worst case.&lt;br /&gt;- The effort to maintain dll's dependencies as the application grows larger could create maintenance nightmare.&lt;br /&gt;&lt;br /&gt;The other approach is to use namespace to produce the logical layering. This technique has some benefits, such as:&lt;br /&gt;- It allows the use of assembly level access to limit direct access to layers that other dlls are not supposed to have.&lt;br /&gt;- It allows the use of tools such as NDepend to set up dependency structure between different layers.&lt;br /&gt;&lt;br /&gt;In conclusion both approaches have their places in an application development.&lt;br /&gt;&lt;br /&gt;Separating module to different dll works well for a module that's being shared across physical tiers, for example the domain objects module.&lt;br /&gt;&lt;br /&gt;Common components could probably be separated into their-own dlls, to some degree, since applications that use web component probably doesn't need to include windows component. The rule of thumb is "things that work/used together stay together".&lt;br /&gt;&lt;br /&gt;As far as some of the benefits listed above for separting layers to different dlls, one must ask the following questions:&lt;br /&gt;- How often have we ever swapped dlls in and out of applications in practice?&lt;br /&gt;I'm a big supporter of Simplicity and Minimalist concepts, therefore we do things the simplest way now, and when we need to use separate modules in the future we can still do it with ease, since we have separated those layers into different namespaces.&lt;br /&gt;- We have bigger issues on hand if an organization is more accustomed to specialist developer rather than generalist developer in my opinion.&lt;br /&gt;- Deploying different modules in different tiers only make sense in some cases, for example, presentation tier and server tier, but in other cases we have to question the benefit and the performance impact of doing so.&lt;br /&gt;- Fixing defects rarely only touch one logical layer. Also, most of the time spent when promoting patches is not in the build process but in the QA testing (manual or scripted). Continous integration and TDD practices can minimize any risk associated with "patching" a portion of codebase vs. the whole codebase.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114979614847003072?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114979614847003072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114979614847003072' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114979614847003072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114979614847003072'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/06/layered-architecture-structure-in-net.html' title='Layered Architecture structure in .Net'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114926174497572488</id><published>2006-06-02T08:22:00.000-07:00</published><updated>2006-06-02T08:24:21.780-07:00</updated><title type='text'>Brad Appleton's ACME Blog: Simple ain't Easy: Myths and Misunderstandings about Simplicity</title><content type='html'>&lt;a href="http://bradapp.blogspot.com/2006/05/simple-aint-easy-myths-and.html"&gt;Brad Appleton's ACME Blog: Simple ain't Easy: Myths and Misunderstandings about Simplicity&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My favorite quotes from the blog.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;table cellpadding="3" border="1"&gt;&lt;tbody&gt;&lt;tr style="COLOR: rgb(102,0,0)"&gt;&lt;td&gt;Everything should be made as simple as possible, but not simpler.&lt;br /&gt;&lt;cite&gt;-- Albert Einstein&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,0,102)"&gt;&lt;td&gt;Three Rules of Work: Out of clutter find simplicity; From discord find harmony; In the middle of difficulty lies opportunity.&lt;br /&gt;&lt;cite&gt;-- Albert Einstein&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,51,102)"&gt;&lt;td&gt;For every problem there is a solution which is simple, clean and wrong.&lt;br /&gt;&lt;cite&gt;-- Henry Louis Mencken&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,102,0)"&gt;&lt;td&gt;Think simple as my old master used to say - meaning reduce the whole of its parts into the simplest terms, getting back to first principles.&lt;br /&gt;&lt;cite&gt;-- Frank Lloyd Wright&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,0,0)"&gt;&lt;td&gt;Beauty of style and harmony and grace and good rhythm depend on simplicity.&lt;span style="FONT-STYLE: italic"&gt;&lt;br /&gt;&lt;/span&gt;&lt;cite&gt;-- Plato&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,0,102)"&gt;&lt;td&gt;The ability to simplify means to eliminate the unnecessary so that the necessary may speak.&lt;br /&gt;&lt;cite&gt;-- Hans Hofmann&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,51,102)"&gt;&lt;td&gt;Making the simple complicated is commonplace; making the complicated simple, awesomely simple, that's creativity.&lt;br /&gt;&lt;cite&gt;-- Charles Mingus&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,102,0)"&gt;&lt;td&gt;Everything is both simpler than we can imagine, and more complicated that we can conceive.&lt;br /&gt;&lt;cite&gt;-- Goethe&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,0,0)"&gt;&lt;td&gt;The whole is simpler than the sum of its parts.&lt;br /&gt;&lt;cite&gt;-- Willard Gibbs&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,0,102)"&gt;&lt;td&gt;The pure and simple truth is rarely pure, and never simple.&lt;br /&gt;&lt;cite&gt;-- Oscar Wilde&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,51,102)"&gt;&lt;td&gt;Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius--and a lot of courage--to move in the opposite direction.&lt;span style="FONT-STYLE: italic"&gt;&lt;br /&gt;&lt;/span&gt;&lt;cite&gt;-- E. F. Schumacker&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,102,0)"&gt;&lt;td&gt;Besides the noble art of getting things done, there is the noble art of leaving things undone. The wisdom of life consists in the elimination of nonessentials.&lt;br /&gt;&lt;cite&gt;-- Lin Yu Tang&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,0,0)"&gt;&lt;td&gt;Very often, people confuse simple with simplistic. The nuance is lost on most&lt;span style="FONT-STYLE: italic"&gt;.&lt;br /&gt;&lt;/span&gt;&lt;cite&gt;-- Clement Mok&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,0,102)"&gt;&lt;td&gt;You can't force simplicity; but you can invite it in by finding as much richness as possible in the few things at hand. Simplicity doesn't mean meagerness but rather a certain kind of richness, the fullness that appears when we stop stuffing the world with things.&lt;br /&gt;&lt;cite&gt;-- Thomas Moore&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,51,102)"&gt;&lt;td&gt;The point of philosophy is to start with something so simple as not to seem worth stating, and to end with something so paradoxical that no one will believe it.&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;cite&gt;-- Bertrand Russell&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,102,0)"&gt;&lt;td&gt;The aspects of things that are most important to us are hidden because of their simplicity and familiarity.&lt;br /&gt;&lt;cite&gt;-- Ludwig Wittgenstein&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,0,0)"&gt;&lt;td&gt;Manifest plainness, Embrace simplicity, Reduce selfishness, Have few desires.&lt;span style="FONT-STYLE: italic"&gt;&lt;br /&gt;&lt;/span&gt;&lt;cite&gt;-- Lao-Tzu, Tao Te Ching&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,0,102)"&gt;&lt;td&gt;Simple things should be simple and complex things should be possible.&lt;br /&gt;&lt;cite&gt;-- Alan Kay&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,51,102)"&gt;&lt;td&gt;The key to performance is elegance, not battalions of special cases. The terrible temptation to tweak should be resisted unless the payoff is really noticeable.&lt;span style="FONT-STYLE: italic"&gt;&lt;br /&gt;&lt;/span&gt;&lt;cite&gt;-- Jon Bentley and Doug McIlroy&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,102,0)"&gt;&lt;td&gt;... the purpose of abstraction is not to be vague, but to create a new semantic level in which one can be absolutely precise.&lt;br /&gt;&lt;cite&gt;-- Edsger W. Dijkstra&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,0,0)"&gt;&lt;td&gt;Simplicity and elegance are unpopular because they require hard work and discipline to achieve and education to be appreciated.&lt;br /&gt;&lt;cite&gt;-- Edsger W. Dijkstra&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,0,102)"&gt;&lt;td&gt;Beauty is more important in computing than anywhere else in technology because software is so complicated. Beauty is the ultimate defense against complexity.&lt;span style="FONT-STYLE: italic"&gt;&lt;br /&gt;&lt;/span&gt;&lt;cite&gt;-- David Gelernter&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,51,102)"&gt;&lt;td&gt;Fools ignore complexity; pragmatists suffer it; experts avoid it; geniuses remove it.&lt;br /&gt;-- Alan Perlis&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,102,0)"&gt;&lt;td&gt;Technical skill is mastery of complexity, while creativity is mastery of simplicity.&lt;span style="FONT-STYLE: italic"&gt;&lt;br /&gt;&lt;/span&gt;&lt;cite&gt;-- E. Christopher Zeeman&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,0,0)"&gt;&lt;td&gt;Architect: Someone who knows the difference between that which could be done and that which should be done.&lt;br /&gt;&lt;cite&gt;-- Larry McVoy&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,0,102)"&gt;&lt;td&gt;One of the great enemies of design is when systems or objects become more complex than a person - or even a team of people - can keep in their heads. This is why software is generally beneath contempt.&lt;br /&gt;&lt;cite&gt;-- Bran Ferren&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,51,102)"&gt;&lt;td&gt;A complex system that works is invariably found to have evolved from a simple system that worked.&lt;br /&gt;&lt;cite&gt;-- John Gall&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,102,0)"&gt;&lt;td&gt;The most powerful designs are always the result of a continuous process of simplification and refinement.&lt;br /&gt;&lt;cite&gt;-- Kevin Mullet&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,0,0)"&gt;&lt;td&gt;There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.&lt;br /&gt;&lt;cite&gt;-- C.A.R. Hoare&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(0,0,102)"&gt;&lt;td&gt;Perfection (in design) is achieved not when there is nothing more to add, but rather when there is nothing more to take away.&lt;br /&gt;&lt;cite&gt;-- Antoine de Saint-Exupéry&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="COLOR: rgb(102,51,102)"&gt;&lt;td&gt;Simple, clear purpose and principles give rise to complex intelligent behavior. Complex rules and regulations give rise to simple stupid behavior.&lt;br /&gt;&lt;cite&gt;-- Dee Hock&lt;/cite&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This Brad's assessment of what "simplicity" means,&lt;br /&gt;&lt;br /&gt;I think that true simplicity is about minimizing and managing overall complexity. Complexity in software design and development comes from the sheer size and complexity of the problem we are being asked to solve, and the richness and vastness of the interconnected maze of interactions within the system and between the system and its environment. The overall complexity of the system is dominated far more by the interactions between the parts that makeup the whole than it is by the parts alone. For any non-trivial system, simplicity often has less to do with the number and kind of different things involved and more to do with the number and kind of interdependencies between them. So achieving simplicity is less about managing "parts" of "things" or individual point-solutions, and is more about managing rules and relationships between the parts and things and solution-sets.&lt;br /&gt;&lt;br /&gt;When dealing with large or complex systems (like most software, and software processes) the number of things (scale) and different types of things (diversity) that need to be managed is overwhelming. If we can come up with a modicum of modest, simple rules &amp; principles to govern our design decisions in ways that help us minimize and manage interdependencies, eliminate constraints, and remove waste, then we are on the path to solving the real problem and meeting stakeholder needs in a way that is both simple and sustainable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114926174497572488?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114926174497572488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114926174497572488' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114926174497572488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114926174497572488'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/06/brad-appletons-acme-blog-simple-aint.html' title='Brad Appleton&apos;s ACME Blog: Simple ain&apos;t Easy: Myths and Misunderstandings about Simplicity'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114910561305339087</id><published>2006-05-31T13:00:00.000-07:00</published><updated>2006-06-01T12:38:12.816-07:00</updated><title type='text'>Framework Abuse - Dragos Manolescu</title><content type='html'>&lt;a href="http://micro-workflow.com/node/4"&gt;Framework Abuse - Dragos Manolescu&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I couldn't agree more with Drago's accessment on this subject. Problems that I have seen in the past were:&lt;br /&gt;- People don't know the meaning of "framework", the best definition of framework is the one written by Prof. Ralph Johnson (one of the GoF). He wrote that, a framework is a reusable design of all or part of a system that is represented by a set of abstract classes and the way their instances interact.&lt;br /&gt;&lt;br /&gt;- From the misconceptual thinking of the framework, people tend to put "everything" in the framework, things that might not even be related.&lt;br /&gt;&lt;br /&gt;- Rarely did I find framework with good referential implementation. As a result, either the consumer of the framework misuse it or doesn't even know such a feature exists.&lt;br /&gt;&lt;br /&gt;- Frameworks were rarely updated, this of course can cause problems, since a stale framework might not serve the need of the consumer anymore down the line.&lt;br /&gt;&lt;br /&gt;- Not enough "publication" or "evangelism" effort for the framework causing the framework to be abandoned.&lt;br /&gt;&lt;br /&gt;- Not working together with the consumer causing people to develop frameworks that were hard to use, and didn't serve the consumer needs.&lt;br /&gt;&lt;br /&gt;I'm sure there are a lot of things that I could have list here ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114910561305339087?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114910561305339087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114910561305339087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114910561305339087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114910561305339087'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/05/framework-abuse-dragos-manolescu.html' title='Framework Abuse - Dragos Manolescu'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114900312371761083</id><published>2006-05-30T08:32:00.000-07:00</published><updated>2006-05-30T08:32:03.750-07:00</updated><title type='text'>ArticleS.MichaelFeathers.ItsTimeToDeprecateFinal</title><content type='html'>&lt;a href="http://blogs.objectmentor.com/ArticleS.MichaelFeathers.ItsTimeToDeprecateFinal"&gt;ArticleS.MichaelFeathers.ItsTimeToDeprecateFinal&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I couldn't agree more with Michael Feathers. Martin Fowler have discussed this in the past also. In his article he mentioned that there are two types of developers, the enabling one and the disabling one. An enabler, would probably be the type that would not restrict his code by introducing final excesively. &lt;br /&gt;&lt;br /&gt;This is not to say that restriction is bad, because some restriction like private modifier is good for encapsulation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114900312371761083?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114900312371761083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114900312371761083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114900312371761083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114900312371761083'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/05/articlesmichaelfeathersitstimetodeprec.html' title='ArticleS.MichaelFeathers.ItsTimeToDeprecateFinal'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114893467921179849</id><published>2006-05-29T13:31:00.000-07:00</published><updated>2006-05-29T13:31:19.300-07:00</updated><title type='text'>Importance of error message</title><content type='html'>On the weekend I was experiencing the problem in my .net code.&lt;br /&gt;&lt;br /&gt;Here's a snippet of the code&lt;br /&gt;&lt;br /&gt;System.Reflection.Assembly lib = System.Reflection.Assembly.LoadFrom("MyAssembly.dll");&lt;br /&gt;&lt;br /&gt;object obj = lib.CreateInstance("MyType");&lt;br /&gt;&lt;br /&gt;The obj instance turns out to be NULL, so I was really surprised, since I was able to find the MyType inside the MyAssembly.dll.&lt;br /&gt;&lt;br /&gt;After spending hours of debugging, it turns out the "real" problem is, MyAssembly.dll depends on other assembly that I didn't include in the path.&lt;br /&gt;&lt;br /&gt;Obviously any good developer should know, that returning a null doesn't really tell you or help you out, where as throwing exception with the exact information might. I would expect better code written especially for a Framework that's widely used.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114893467921179849?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114893467921179849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114893467921179849' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114893467921179849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114893467921179849'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/05/importance-of-error-message.html' title='Importance of error message'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114805994890883785</id><published>2006-05-19T10:32:00.000-07:00</published><updated>2006-05-19T10:32:28.980-07:00</updated><title type='text'>Action vs. reaction</title><content type='html'>In life we're always faced with a decision whether to react to something when it happens, or create a governance to prevent the thing to happen in the first place.&lt;br /&gt;&lt;br /&gt;Pros and cons of reaction&lt;br /&gt;- Reaction allow you to react on things, thus it gives you opportunity to come up with simple solution just enough to solve problems at hand.&lt;br /&gt;- Sometimes it could cost a lot of money if we miss handled things that are critical to business operations.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pros and cons of preventive action&lt;br /&gt;- Preventive action is good to prevent things that we think might happen from happening based on our previous experience, etc.&lt;br /&gt;- It can be overkill since every situation/environment is unique, and sometimes preventive actions introduced might not be suitable and it can be come overkill at worst. There's nothing more frustrating than come up with an overkill solution that slow down the process, and it will be even worse if people try to solve it by adding more preventive actions&lt;br /&gt;&lt;br /&gt;My preference is to start with simple preventive action, based on the things that we know might break under common conditions, and react to any problems later when we face them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114805994890883785?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114805994890883785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114805994890883785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114805994890883785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114805994890883785'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/05/action-vs-reaction.html' title='Action vs. reaction'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114720371269333139</id><published>2006-05-09T12:41:00.000-07:00</published><updated>2006-05-09T12:41:52.756-07:00</updated><title type='text'>Abstract vs. Interface</title><content type='html'>Interface based programming has been around for a while, but yet, the adoption of it hasn't been widely accepted by most developers. &lt;br /&gt;&lt;br /&gt;When people think of interface, they think of all the disadvantage of using it such as;&lt;br /&gt;- adding new methods/changing existing methods to an interface forces implementer of the interfaces to have to implement the new methods too&lt;br /&gt;- once interface is published it's thus set and we can only extend the interface by creating newer interface that will extend the old one&lt;br /&gt;&lt;br /&gt;Although these are all valid points, but the benefit of using interface outweight the risks.&lt;br /&gt;&lt;br /&gt;Some of the benefits are:&lt;br /&gt;- Open and Close Principle&lt;br /&gt;- Dependency Injection&lt;br /&gt;- Interface Segregation Principle&lt;br /&gt;&lt;br /&gt;As we all know from old principle that we usually use the interface more than we actually extend it ourselves. &lt;br /&gt;&lt;br /&gt;One solution we could incorporate to ease the risk mentioned above (only if you need to extend the interface) is to always provide a base class together with the interface that we provide, thus user of the system has freedom to choose.&lt;br /&gt;&lt;br /&gt;In most cases clients are only referring to the interfaces instead of extending them&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114720371269333139?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114720371269333139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114720371269333139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114720371269333139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114720371269333139'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/05/abstract-vs-interface.html' title='Abstract vs. Interface'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114719661085709942</id><published>2006-05-09T10:43:00.000-07:00</published><updated>2006-05-09T10:43:30.903-07:00</updated><title type='text'>Aggregate Component Pattern</title><content type='html'>Microsoft Framework team introduces a pattern called "Aggregate Component" which has a similarity to a Facade pattern.&lt;br /&gt;&lt;br /&gt;The purpose of this pattern is to enable user of the framework to only deal with one simple component to accomplish a particular task, ie. message queueing etc.&lt;br /&gt;&lt;br /&gt;User of the API doesn't have to care about other components that have been encapsulated inside the "aggregate" component.&lt;br /&gt;&lt;br /&gt;Some concerns of this approach are:&lt;br /&gt;- It allows users to create object in inconsistent state, which can be remedied by throwing an exception when a user try to call the object with invalid state.&lt;br /&gt;- The component settings need to be done in simple way, providing a lot of default value, otherwise, the benefit is reduced.&lt;br /&gt;- It works well for entry level user, since, some of the default settings might not promote the most efficient way of using the framework.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114719661085709942?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114719661085709942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114719661085709942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114719661085709942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114719661085709942'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/05/aggregate-component-pattern.html' title='Aggregate Component Pattern'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114710365103249906</id><published>2006-05-08T08:54:00.000-07:00</published><updated>2006-05-08T08:54:11.060-07:00</updated><title type='text'>Answering the "Where is the Proof That Agile Methods Work" Question</title><content type='html'>&lt;a href="http://www.agilemodeling.com/essays/proof.htm"&gt;Answering the "Where is the Proof That Agile Methods Work" Question&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"Agilists don't write documentation"&lt;br /&gt;This is further from the truth, although I agree that some of the "extremme" Agilist do ignore documentation. But that's not the point, the point is Agilist believes in DRY principle (www.agilemodeling.com/essays/singleSourceInformation.htm). Agilist actually have a lot more documentation, such as the unit tests, acceptance tests, and if the stakeholders are willing to pay, Agilist will definitely provide a high level overview, system models, user documentation, etc. The key is not to get lost in just providing documentations without a real software, and to always keep track of where the time/money goes in software development phase (sometimes documentation time is not tracked)&lt;br /&gt;&lt;br /&gt;"Agile teams don't need project managers, quality assurance people or architects"&lt;br /&gt;This is only half true, Agilist support the notion of "Object should be specialist, and Developer should be generalist", member of Agile team should be able to wear multiple hats. Every one should be part of ensuring the quality of the system, and design is more of a collaborated effort than something bestow by an ivory tower architect team. (www.agilemodeling.com/essays/agile Architecture.htm)&lt;br /&gt;&lt;br /&gt;"Agile cost-of-change curve is flat"&lt;br /&gt;This is supported by the fact that Agile methodologies adopt short iterative cycle releases, thus any problems should be detected sooner and client feedback is a must in every iteration leading up to the release. (www.agilemodeling.com/essays/costOfChange.htm) The key to agile success is always feedback and the sooner we get the feedback of the system the better chance we have for the success. Feedback comes from the developer to proof that his/her idea works, from the tester, from the client. (www.ambysoft.com/essays/whyAgile WorksFeedback.htm)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Reference&lt;br /&gt;&lt;br /&gt;Crossing the Chasm, Scott W. Ambler, SDMagazine May 2006&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114710365103249906?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114710365103249906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114710365103249906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114710365103249906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114710365103249906'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/05/answering-where-is-proof-that-agile.html' title='Answering the &quot;Where is the Proof That Agile Methods Work&quot; Question'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114710210880388320</id><published>2006-05-08T08:28:00.000-07:00</published><updated>2006-05-08T08:28:28.886-07:00</updated><title type='text'>Project 911</title><content type='html'>The three most common questions asked by your boss/client before you undertake a project are;&lt;br /&gt;&lt;br /&gt;1. Can you do it?&lt;br /&gt;2. When can you do it?&lt;br /&gt;3. How much it will cost me?&lt;br /&gt;&lt;br /&gt;These questions are hard to answer because there are different obstacles facing a project during its lifetime, such as;&lt;br /&gt;1. Change is sometimes inevitable&lt;br /&gt;2. How can we handle the unknown?&lt;br /&gt;3. Can we get commitment and clear direction from all stakeholders?&lt;br /&gt;&lt;br /&gt;In order to ensure that a project will be on track, we must:&lt;br /&gt;1. Assemble the right project team, people on the team should have a good working harmony&lt;br /&gt;2. Have support from all stakeholders&lt;br /&gt;3. Ability to control the scope, decide which one is a must have or nice to have, and capture nice to have for later release&lt;br /&gt;4. Must have iterative releases, since it will give the stakeholders a sense of progress and opportunity to provide feedback&lt;br /&gt;5. Must have active client involvment&lt;br /&gt;&lt;br /&gt;Reference&lt;br /&gt;&lt;br /&gt;Project 911, Donna L.Davis, SD Magazine May 2006&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114710210880388320?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114710210880388320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114710210880388320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114710210880388320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114710210880388320'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/05/project-911.html' title='Project 911'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114497989517251506</id><published>2006-04-13T18:58:00.000-07:00</published><updated>2006-04-13T18:58:15.206-07:00</updated><title type='text'>The need for public method vs. published method</title><content type='html'>A public method is relying on a language syntax to make it public, usually a concrete class that contains public method will&lt;br /&gt;mark its methods signature with a "public" keyword. &lt;br /&gt;&lt;br /&gt;A published method is relying on a language interface to make it published. Usually a concrete class will implement some interfaces&lt;br /&gt;that will contain methods, and in it is a contract that the particular class will abide.&lt;br /&gt;&lt;br /&gt;The need for published method arise when different client will be exposed to different "public" method, ie. instead of exposing the&lt;br /&gt;concrete class, we're only exposing certain methods to the client based on what the client "need" or allowed to access. When design&lt;br /&gt;correctly published methods in interfaces can decouple client with concrete implementation of the class while supporting the Open Close&lt;br /&gt;Principle.&lt;br /&gt;&lt;br /&gt;For example, when using class to just expose its data for setter/getter to a client front end, to be mapped to user fields, the creator&lt;br /&gt;of the class doesn't need to make other state changing methods that would otherwise be called by the layer where it isn't supposed to. Thus&lt;br /&gt;exposing only the interface for getter/setter to the presentation layer, will prevent client on the layer to perform any business logic that&lt;br /&gt;would have to be done in the other layer.&lt;br /&gt;&lt;br /&gt;This idea was introduced by Robert Martin in his Seggregated Interface Pattern. The pattern was created to support the idea that different clients&lt;br /&gt;will have their own need and concerns, thus they don't have to / shouldn't be exposed to just "one" interface, ie. the concrete implementation of&lt;br /&gt;the class.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114497989517251506?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114497989517251506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114497989517251506' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114497989517251506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114497989517251506'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/04/need-for-public-method-vs-published.html' title='The need for public method vs. published method'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114425386537877601</id><published>2006-04-05T09:17:00.000-07:00</published><updated>2006-04-05T09:17:45.426-07:00</updated><title type='text'>Why big upfront design will never work.</title><content type='html'>- According to McConnell, design effort consume about 75% of the whole development effort, thus investing that much time without proving that it works &lt;br /&gt;make the whole effort very risky&lt;br /&gt;- design with UML can't be verified, the best we can do is peer review, but without automated verification tool, and relying on human effort also increase&lt;br /&gt;the risk of design correctness, esp. since design is largest effort in the whole software development&lt;br /&gt;- nature of human being is to work best when dealing with multiple smaller things instead of big thing at once in order to lower the risk of incorrectness&lt;br /&gt;- unpredictable requirements due to designer understanding of the problems to be solved, the analyst effort of their gathered requirements, the customer&lt;br /&gt;needs of what he/she wants are not perfect from the get go. Business also evolves what's good now might not be good in the future&lt;br /&gt;&lt;br /&gt;This doesn't mean that there isn't a case where big upfront design can be made to work, such case where it can work are as follows:&lt;br /&gt;- software migration development in which all requirements are solid and will not change, assuming the analyst, customer and development team had worked&lt;br /&gt;with previous product that needs to be migrated&lt;br /&gt;- governmental type of project where they could afford to spend a lot of money and a lot of time and also be able to absorb any losses necessary, think about&lt;br /&gt;big weapons or airplane project that had cost billions of dollars but were never used&lt;br /&gt;&lt;br /&gt;The best thing is to be able to recognize how agile we can be, or how much plan do we need to have without stranglehold the development process and become&lt;br /&gt;inefficient. How agile measure sucesful project is by how much business value the system adds for the customer, while also keeping the cost and budget&lt;br /&gt;reasonable.&lt;br /&gt;&lt;br /&gt;"A late change in requirements is a competitive advantage" - Mary Poppendieck&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114425386537877601?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114425386537877601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114425386537877601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114425386537877601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114425386537877601'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/04/why-big-upfront-design-will-never-work.html' title='Why big upfront design will never work.'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114288944857357513</id><published>2006-03-20T13:17:00.000-08:00</published><updated>2006-03-20T13:17:28.670-08:00</updated><title type='text'>The Joel on Software Discussion Group - Why I Hate Frameworks</title><content type='html'>&lt;a href="http://discuss.joelonsoftware.com/default.asp?joel.3.219431.12"&gt;The Joel on Software Discussion Group - Why I Hate Frameworks&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The problems with building framework are you can't satisfy all the requirements required by all stakeholders. Good frameworks will have these characteristics:&lt;br /&gt;&lt;br /&gt;- It has to be reusable without over-engineered the framework. Start small and let it grow, only implement things that are needed by common team without the extra bells and whistles.&lt;br /&gt;- Good framework team should solicit feedback from the clients (user of the framework) and provide only necessarily extensions per request&lt;br /&gt;- Good framework should provide documentations and samples for easy usage&lt;br /&gt;- Good framework should provide well defined extensions point and don't expose things that aren't suppose to be extended. This practice will prevent&lt;br /&gt;   - misuse of frameworks that can cause performance issues&lt;br /&gt;   - misuse of frameworks that made it harder for user to upgrade it in the future&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114288944857357513?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114288944857357513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114288944857357513' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114288944857357513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114288944857357513'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/03/joel-on-software-discussion-group-why.html' title='The Joel on Software Discussion Group - Why I Hate Frameworks'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114245851023979911</id><published>2006-03-15T13:32:00.000-08:00</published><updated>2006-03-16T12:07:52.440-08:00</updated><title type='text'>How to scale Agile Methodology?</title><content type='html'>There are different techniques you could use to make agile methodology work for large organization, and the key to it all is "Divide and Conquer".&lt;br /&gt;&lt;br /&gt;A few tips you could do are as follows:&lt;br /&gt;- create multiple sub-teams, each working on separate sub-systems&lt;br /&gt;- have a well-defined interfaces that different systems are communicating with&lt;br /&gt;- all project teams involved must support the methodology&lt;br /&gt;- have a small design session to hash out high level architecture&lt;br /&gt;- have daily status meeting b/w representative of each team in addition to within the team itself&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114245851023979911?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114245851023979911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114245851023979911' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114245851023979911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114245851023979911'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/03/how-to-scale-agile-methodology.html' title='How to scale Agile Methodology?'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114245714201022076</id><published>2006-03-15T13:12:00.000-08:00</published><updated>2006-03-15T13:31:23.736-08:00</updated><title type='text'>SOA vs. ESB</title><content type='html'>ESB approach has become more favorable in comparison to SOA these days. Some of the supporters arguments about the benefits of ESB are as follows:&lt;br /&gt;- it decouples the client interactions to the source systems&lt;br /&gt;- it will maintain the data mapping, transformation and translation internally thus freeing each sub-system from those responsibilities&lt;br /&gt;&lt;br /&gt;However ESB also posts the following challenges:&lt;br /&gt;- it hides the spaghetti interaction inside its blackbox&lt;br /&gt;- it can further erodes and turn into another point of integration due to the following cases:&lt;br /&gt;   - organizational decision to get things done quickly&lt;br /&gt;   - performance or optimization to bypass the ESB layer&lt;br /&gt;   - law of entrophy&lt;br /&gt;- it's not easily customizable according to individuals client needs&lt;br /&gt;&lt;br /&gt;A few benefits of SOA are:&lt;br /&gt;- it still provide loose coupling&lt;br /&gt;- it's quicker response time as far as having another "team" to do it&lt;br /&gt;- interfaces can be customized to individuals application needs&lt;br /&gt;- different SLA can be applied to different interfaces&lt;br /&gt;- it's easier to change interfaces b/c you don't need to worry about affecting other&lt;br /&gt;client's system&lt;br /&gt;&lt;br /&gt;SOA approach however is not without its short coming either:&lt;br /&gt;- it can potentially creates duplication of logic as different systems will be connected directly&lt;br /&gt;- number of services created can go exponentially large and harder to keep tracks of&lt;br /&gt;&lt;br /&gt;In order to make SOA more favorable, we need to consider the following&lt;br /&gt;- it's good to have inventory of all SOA services&lt;br /&gt;- you can always refactor the SOA services that could go together to a new SOA service thus it will encapsulate the services interactions&lt;br /&gt;- versioning problem can be handled by the following&lt;br /&gt;   - treat data transfered as document centric&lt;br /&gt;   - if there's a need to maintain backward compatibility, set an expiration date on previous versions&lt;br /&gt;   - mark the SOA message with version number, and try to keep away from maintaining a lot of versions&lt;br /&gt;- sometimes it's better to provide SOA service specifics to clients need and only consider reuse if it's actually reusable, b/c afterall reusablity is not free&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114245714201022076?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114245714201022076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114245714201022076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114245714201022076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114245714201022076'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/03/soa-vs-esb.html' title='SOA vs. ESB'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114183939780913726</id><published>2006-03-08T09:36:00.000-08:00</published><updated>2006-03-08T09:36:37.846-08:00</updated><title type='text'>Agile Legacies: Using Iterative Methods to Import Legacy Data</title><content type='html'>&lt;a href="http://today.java.net/pub/a/today/2006/03/02/agile-legacy-data-import.html"&gt;java.net: Agile Legacies: Using Iterative Methods to Import Legacy Data&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I agree wholeheartedly in this article, the impacts of not doing iterative legacy data import are as follows:&lt;br /&gt;- some fields were missed/not mapped in the development&lt;br /&gt;- missing features are detected very late&lt;br /&gt;- fields are not one to one translation to the new domain, thus domain needs to be changed&lt;br /&gt;&lt;br /&gt;Benefits of doing iterative data migration:&lt;br /&gt;- migrating data at the same time as development can improve the system by uncovering things that don't work well in the old system&lt;br /&gt;- developer works with more realistic data&lt;br /&gt;&lt;br /&gt;Challenges of doing iterative data migration:&lt;br /&gt;- DBA needs to buy into the process&lt;br /&gt;- Data needs to be scriptable so that unit testing can be accomodated&lt;br /&gt;- Analysis work needs to be done early for data migration&lt;br /&gt;- Domain model needs to be work on together with Data analysts and DBAs&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114183939780913726?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114183939780913726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114183939780913726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114183939780913726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114183939780913726'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/03/agile-legacies-using-iterative-methods.html' title='Agile Legacies: Using Iterative Methods to Import Legacy Data'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114139921300888629</id><published>2006-03-03T07:20:00.000-08:00</published><updated>2006-03-03T07:20:13.010-08:00</updated><title type='text'>The importance of SLA</title><content type='html'>Service Level agreement set the standards/requirements of the system in a concrete manner. Thus there won't be any&lt;br /&gt;ambiguous requirement down the line pertaining the system under development. What SLA should cover are as follows:&lt;br /&gt;- availability concerns&lt;br /&gt; - uptime (system needs to be available this % of time) /downtime (for maintenance)&lt;br /&gt;- scalability concerns&lt;br /&gt; - how many concurrent users can it handle, CPU, Memory&lt;br /&gt;- performance concerns&lt;br /&gt; - response times&lt;br /&gt;&lt;br /&gt;SLA written needs to be reasonable instead of some wishful thinking, since it could affect budget cost/time for&lt;br /&gt;something that users rarely need. It is sometimes useful to use stress test even in early release cycle&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114139921300888629?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114139921300888629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114139921300888629' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114139921300888629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114139921300888629'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/03/importance-of-sla.html' title='The importance of SLA'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-114139914861363286</id><published>2006-03-03T07:19:00.000-08:00</published><updated>2006-03-03T07:19:08.650-08:00</updated><title type='text'>To Distribute or Not to distribute</title><content type='html'>There are different methods of achieving distribute communication:&lt;br /&gt;- web service&lt;br /&gt;- rpc&lt;br /&gt;- http&lt;br /&gt;&lt;br /&gt;Reason to have distributed system:&lt;br /&gt;- the need to create separate system (sold separately)&lt;br /&gt;- smart client with centralized application server model&lt;br /&gt;- integration with another organization&lt;br /&gt;- integration with COTS products&lt;br /&gt;- integration with legacy application that has legacy technology/architecture&lt;br /&gt;- different systems have different availability/up time requirement&lt;br /&gt;&lt;br /&gt;Not a reason to distribute&lt;br /&gt;&lt;br /&gt;- api is getting complex, to achieve coarse grained access&lt;br /&gt;- different release cycle&lt;br /&gt;- clustering&lt;br /&gt;- organization breakdown&lt;br /&gt;&lt;br /&gt;Cost of distribute environment&lt;br /&gt;- increase in complexities for transaction management, security, error handling&lt;br /&gt;- need business process management to manage process flow amongst participant system&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-114139914861363286?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/114139914861363286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=114139914861363286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114139914861363286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/114139914861363286'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/03/to-distribute-or-not-to-distribute.html' title='To Distribute or Not to distribute'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-113764682153186458</id><published>2006-01-18T21:00:00.000-08:00</published><updated>2006-03-03T07:21:47.500-08:00</updated><title type='text'>SOA vs. Point to Point Integration Arch.</title><content type='html'>SOA approach&lt;br /&gt;&lt;br /&gt;- different application communicate through the canonical model&lt;br /&gt;- benefit of such approach are:&lt;br /&gt;    * different systems can use the same service&lt;br /&gt;    * less work need to be done in the adapter layer&lt;br /&gt;    * more reusable services&lt;br /&gt;&lt;br /&gt;Point to Point approach&lt;br /&gt;&lt;br /&gt;- different applications will need different service call to the integration layer&lt;br /&gt;- benefit of such approach are:&lt;br /&gt;    * application and integration are decoupled from changes in the domain&lt;br /&gt;    * application and integration team can work independently&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-113764682153186458?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/113764682153186458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=113764682153186458' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/113764682153186458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/113764682153186458'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2006/01/soa-vs-point-to-point-integration-arch.html' title='SOA vs. Point to Point Integration Arch.'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-113399019627980718</id><published>2005-12-07T13:16:00.000-08:00</published><updated>2005-12-07T13:18:43.783-08:00</updated><title type='text'>Thoughts on Software &amp; Integration Architecture from the Trenches: Agile Development and Architecture - Yeah Right!</title><content type='html'>http://blogs.ittoolbox.com/eai/trenches/archives/006787.asp&lt;br /&gt;&lt;br /&gt;I'm somewhat agree with the author as far as what are bad things that could happen when Agile practices are not done correctly. Like any other practices, RUP, XP, RAD, things could go wrong regardless of how well/matured the particular practice is.&lt;br /&gt;&lt;br /&gt;"Speed" is not the main goal of Agile development practice, it's one of the many side effects that come from it, like many other efficiently run practices (RUP or RAD).&lt;br /&gt;&lt;br /&gt;Agile practices support delivering what's most important to the users of the system/stakeholders(could be users, architects, project sponsor, etc.) &lt;br /&gt;&lt;br /&gt;Things that Agile practices have done that resulted in faster time delivery:&lt;br /&gt;&lt;br /&gt;1. Only implement what the requirement stated, with no added bell and whistles that deliver the least amount of value but it still take time to produce.&lt;br /&gt;&lt;br /&gt;This doesn't necessary mean Agile practioners abandon common senses/good practices, b/c by doing that it will also cause negative effects in the future and thus cause major rework which essentially will impede the "speed".  &lt;br /&gt;&lt;br /&gt;2. Agile practice encourage constant refactoring&lt;br /&gt;&lt;br /&gt;This doesn't mean that Agile practioners do things badly in the first place without thinking and fix it later, I hate to admit but bad people usually does this, but regardless of how good a practice is, bad people will always exists, we can't control that.&lt;br /&gt;&lt;br /&gt;Refactoring is done to improve the code, readability, make it easier to maintain in the future, because software are flexible, in my experience , you can't possibly write a piece of software and get it right at the first cut. (even Beethoven couldn't do it, unless you're Mozart) As things changes, and development team learn new thing/technology, its to developer good conscience to apply his newly found knowledge to the codebase rather than leaving it the way it is.&lt;br /&gt;&lt;br /&gt;3. Creating a good testable code with loosely coupled and high cohesion is also goals for every agile practioners&lt;br /&gt;&lt;br /&gt;the way to achieve this is you're applying Test Driven Development in your coding practice, you'll write your test to improve your design, afterall each component that you create will be use by some other component, and it only make sense that your test component be the first one that use your component, because you'd rather find out that your design make sense earlier rather than later on once things are harder to control/fix.&lt;br /&gt;&lt;br /&gt;this practice allows you to have faster feedback as far as how good your design really is, again "speed" is the result of other good practice not the ultimate goal of it.&lt;br /&gt;&lt;br /&gt;The author mentioned as an example things about enforcing database constraint, these are a common sense, and should be part of other non functional requirements of system under development. &lt;br /&gt;&lt;br /&gt;One should allocate/treat these non functional requirements the same way as the other business requirements, which I admit is a bit harder, since business stakeholders don't care (directly) about these non functional requirements, however, architects and other people in an organization are also stakeholders, and their needs should be fulfilled, and works should also be budgetted against that requirements.&lt;br /&gt;&lt;br /&gt;Like other software practices, sometimes development team will miss estimate on these non-functional requirements, which are a shame, and should be corrected and included as part of work and budget when building a system.&lt;br /&gt;&lt;br /&gt;But one thing for sure there should be tradeoff made on these non functional requirements also, the same as business requirements, because the last thing people want is to spend years on development handling these requirements trying to make the system perfect and missing the actual intention of creating the system in the first place.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-113399019627980718?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/113399019627980718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=113399019627980718' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/113399019627980718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/113399019627980718'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/12/thoughts-on-software-integration.html' title='Thoughts on Software &amp; Integration Architecture from the Trenches: Agile Development and Architecture - Yeah Right!'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-113214731039727935</id><published>2005-11-16T05:21:00.000-08:00</published><updated>2005-11-16T05:21:50.436-08:00</updated><title type='text'>Does client list matter?</title><content type='html'>We've seen over and over again, companies boasted their clientele list on their website (products or services companies). But the real story is, are those clients happy with their works?&lt;br /&gt;&lt;br /&gt;One of Agile's methodologies is to deliver highest values to the client. But that again is only half the story. Features might be delivered to what client's want, but there are a lot of other software qualities beside just features (features are not qualities by the way)&lt;br /&gt;&lt;br /&gt;And in order to satisfy the other qualities, we have to realize that as part of our deliverables or user stories (according to XP)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-113214731039727935?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/113214731039727935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=113214731039727935' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/113214731039727935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/113214731039727935'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/11/does-client-list-matter.html' title='Does client list matter?'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112744992415771960</id><published>2005-09-22T21:32:00.000-07:00</published><updated>2005-09-22T21:32:05.770-07:00</updated><title type='text'>Inflated requirements</title><content type='html'>The concept of small increments iterations in a project allows a project team build the system incrementally in small chunks. This in turn allows user to see the system and be able to react to it or give feedback much faster than traditional waterfall method. &lt;br /&gt;&lt;br /&gt;There's a "process smell" in iterative world today, where a requirement/user story starts out small but keep increasing in the number of success scenario thus affecting the original estimate of story. This sort of activities seems harmless at first, since they changed a little at a time, but could potentially grow infiinitely. &lt;br /&gt;&lt;br /&gt;And it left poor developers scrambling and changing their work b//c of this constant changes, thus leaving it up to the project manager or the technical lead on the team to voice the concerns and stop the activity to become the norm.&lt;br /&gt;&lt;br /&gt;There's nothing worse for developers morale than to see his/her story is never completed due to constant additional changes to their work. &lt;br /&gt;&lt;br /&gt;This activity also relates to piling on multiple defects into one defect filing which will have the same consequences for the development team&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112744992415771960?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112744992415771960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112744992415771960' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112744992415771960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112744992415771960'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/09/inflated-requirements.html' title='Inflated requirements'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112683869792839041</id><published>2005-09-15T19:44:00.000-07:00</published><updated>2005-09-15T19:44:57.943-07:00</updated><title type='text'>Hibernate Session is not the same as Unit Of Work</title><content type='html'>A Unit of work usually defined operation(s) that will be executed within a single transaction to preserve&lt;br /&gt;the ACID rule. Hibernate session however could be tie in with a request (ie. web request) since there's no&lt;br /&gt;guarantee to preserver a session to be executed within a single transaction.&lt;br /&gt;&lt;br /&gt;Martin Fowler's definition of UnitOfWork is exactly that&lt;br /&gt;http://www.martinfowler.com/eaaCatalog/unitOfWork.html&lt;br /&gt;&lt;br /&gt;"A Unit of Work keeps track of everything you do during a business transaction that can affect the database. "&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112683869792839041?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112683869792839041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112683869792839041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112683869792839041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112683869792839041'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/09/hibernate-session-is-not-same-as-unit.html' title='Hibernate Session is not the same as Unit Of Work'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112534834430245532</id><published>2005-08-29T13:45:00.000-07:00</published><updated>2005-08-29T13:45:47.136-07:00</updated><title type='text'>AOP vs. Observer Pattern</title><content type='html'>Aspect:&lt;br /&gt;&lt;br /&gt;PROS:&lt;br /&gt;- encapsulate changes in one place&lt;br /&gt;- faster development time&lt;br /&gt;- declarative programming&lt;br /&gt;- crosscutting problems are solved&lt;br /&gt;- compiler support&lt;br /&gt;- debugging can be done like normal code with proper IDE&lt;br /&gt;&lt;br /&gt;CONS:&lt;br /&gt;- easily abused&lt;br /&gt;- harder to follow&lt;br /&gt;- required learning curve&lt;br /&gt;- harder to maintain&lt;br /&gt;&lt;br /&gt;Observer Pattern&lt;br /&gt;&lt;br /&gt;PROS:&lt;br /&gt;- easy to debug&lt;br /&gt;- more obvious in domain where changes happen&lt;br /&gt;&lt;br /&gt;CONS:&lt;br /&gt;- creates more coupling to domains&lt;br /&gt;- easier to introduce defects, since changes are done in multiple places&lt;br /&gt;- needs to create framework&lt;br /&gt;- runtime debug&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112534834430245532?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112534834430245532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112534834430245532' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112534834430245532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112534834430245532'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/08/aop-vs-observer-pattern.html' title='AOP vs. Observer Pattern'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112499821790904213</id><published>2005-08-25T12:30:00.000-07:00</published><updated>2005-08-25T12:30:17.923-07:00</updated><title type='text'>Database Coupling == Root of all evil</title><content type='html'>The hardest coupling to deal with is database coupling for various reasons:&lt;br /&gt;&lt;br /&gt;- it spans more than one system, a lot of time including legacy applications&lt;br /&gt;- it spans more than one development group, creating organizational related issues&lt;br /&gt;- it deals with enterprise data, make it that much harder to change, as data is less flexible than code for example.&lt;br /&gt;&lt;br /&gt;as the result, people usually just accepted the fact of it and do nothing to ease the problem. notice i said ease, b/c&lt;br /&gt;database coupling like any other coupling can't be eliminated fully. Like its counterpart, the code, database coupling&lt;br /&gt;can be reduced by introducing encapsulation with another layer of indirection (the cure for most computer science problems)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112499821790904213?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112499821790904213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112499821790904213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112499821790904213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112499821790904213'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/08/database-coupling-root-of-all-evil.html' title='Database Coupling == Root of all evil'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112473023685815748</id><published>2005-08-22T10:03:00.000-07:00</published><updated>2005-08-22T10:03:56.873-07:00</updated><title type='text'>Why business fields shouldn't be used as primary keys?</title><content type='html'>When designing a database entity, it's preferable not to business related field to be the primary key of an entity. For example,&lt;br /&gt;if we have a Customer entity, we should consider not to have SocialSecurityNumber as the primary key, but to create a CustomerNumber&lt;br /&gt;as the primary key(surrogate key). This practice enables separation between business type field and database type field for a number&lt;br /&gt;of benefits:&lt;br /&gt;- hides database key from business users&lt;br /&gt;- guarantee uniqueness of an entity within the database system&lt;br /&gt;- promotes more flexibililty to the design ( ie. in the case of Customer, not everyone has SSN )&lt;br /&gt;- it's more natural and simple ( ie. Address with AddressId as its primary key, instead of address name, city, state, zipcode, etc. )&lt;br /&gt;- decouple business changes from db changes ( ie. changes related to business key, will force foreign key changes )&lt;br /&gt;&lt;br /&gt;However, application should still query the business entities by its business key, afterall business logic shouldn't aware of the&lt;br /&gt;existence of db key (thus decoupling the two)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112473023685815748?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112473023685815748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112473023685815748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112473023685815748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112473023685815748'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/08/why-business-fields-shouldnt-be-used.html' title='Why business fields shouldn&apos;t be used as primary keys?'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112430710599713787</id><published>2005-08-17T12:31:00.000-07:00</published><updated>2005-08-17T12:31:46.040-07:00</updated><title type='text'>What is Consulting?</title><content type='html'>&lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=122020"&gt;What is Consulting?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sometimes I disagree with Bruce in a few of his technical approach, but I agree wholeheartedly on his view.&lt;br /&gt;&lt;br /&gt;The most important points to be a succesful consultant are:&lt;br /&gt;&lt;br /&gt;- teach the client, and hopefully you are a good teacher and be able to leave the client at a specified finite time. (not infinite time)&lt;br /&gt;- communication is the most important part of consultancy&lt;br /&gt;- continuosly upgrading your skills so that you feel the pain first before your client feels it&lt;br /&gt;- have a good network -&gt; gives you future opportunity easier without having to hog down one client for extended period of time&lt;br /&gt;&lt;br /&gt;The different about body shop work and consultancy:&lt;br /&gt;- body shop usually doesn't have much says in technical decision being made by the clients&lt;br /&gt;- body shop is not obligated to teach the client&lt;br /&gt;- body shop should be cheaper&lt;br /&gt;- body shop work can be done offshored&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112430710599713787?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112430710599713787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112430710599713787' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112430710599713787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112430710599713787'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/08/what-is-consulting.html' title='What is Consulting?'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112316678998909253</id><published>2005-08-04T07:46:00.000-07:00</published><updated>2005-08-04T07:46:30.010-07:00</updated><title type='text'>How to implement P of EAA: Data Mapper in Hibernate?</title><content type='html'>&lt;a href="http://www.martinfowler.com/eaaCatalog/dataMapper.html"&gt;P of EAA: Data Mapper&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hibernate provides custom user type capability in UserType or CompositeUserType. Those classes provide&lt;br /&gt;capability to map user domain type to database type, including any conversion that needs to happen. Other techniques involve querying data from other external resources such as LDAP, etc. thus frees up domain responsibilites from other non domain related concerns.&lt;br /&gt;&lt;br /&gt;Also, in the spirit of Domain Driven Design, where domain sometimes relies on other external resources that will impact its properties, one can use this pattern during loading/saving of those properties cleanly&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112316678998909253?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112316678998909253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112316678998909253' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112316678998909253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112316678998909253'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/08/how-to-implement-p-of-eaa-data-mapper.html' title='How to implement P of EAA: Data Mapper in Hibernate?'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112240823959839642</id><published>2005-07-26T13:03:00.000-07:00</published><updated>2005-07-26T13:05:17.540-07:00</updated><title type='text'>Importance of messaging in distributed environment</title><content type='html'>&lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=120669"&gt;Messaging is the Right Way to Build a Distributed System&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I couldn't agree more with this article. Messaging should also be considered in applications where there are many subsystems in order to prevent "point to point communications hell". For example, in a CRM system where it contains HR, Accounting, Sales, etc. they should be communicated with each other using messaging, and service oriented approach.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112240823959839642?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112240823959839642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112240823959839642' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112240823959839642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112240823959839642'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/07/importance-of-messaging-in-distributed.html' title='Importance of messaging in distributed environment'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112239187510386443</id><published>2005-07-26T08:31:00.000-07:00</published><updated>2005-07-26T08:31:15.116-07:00</updated><title type='text'>Why do we need to keep actual?</title><content type='html'>in software engineering fields, estimates are usually done in the beginning of a project/release cycle. some estimates are good others are usually&lt;br /&gt;bad (see how to do good estimates?)&lt;br /&gt;based on those estimates, sometimes it takes more or less for development team to complete the tasks. the importants of keeping the adjusted/actual&lt;br /&gt;effort (in terms of hours preferably) to complete the tasks are as follows&lt;br /&gt;&lt;br /&gt;- it makes good resources for future development estimation ( near or distance future )&lt;br /&gt;- good for making cases for late project causes ( aggresive estimates number are most of the time the cause of late project )&lt;br /&gt;- track the real costs of the project ( although this number can sometimes derive from timekeeping, but a lot of times time keeping numbers are not&lt;br /&gt;well represented, ie. ppl don't usually separates their actual effort to this project with other daily activities)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112239187510386443?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112239187510386443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112239187510386443' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112239187510386443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112239187510386443'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/07/why-do-we-need-to-keep-actual.html' title='Why do we need to keep actual?'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112198778590727161</id><published>2005-07-21T16:16:00.000-07:00</published><updated>2005-07-21T16:16:25.920-07:00</updated><title type='text'>Code smells</title><content type='html'>Below is my code smells snippet of the day&lt;br /&gt;&lt;br /&gt;public class RequestCycle implements IRequestCycle {&lt;br /&gt;&lt;br /&gt;     public void renderPage(...) {&lt;br /&gt;             page.renderPage(..., this);&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     public void commitPageChanges() { ... }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Page {&lt;br /&gt;     public void renderPage(..., IRequestCycle) {&lt;br /&gt;           ....&lt;br /&gt;           this.commitPageChanges();     &lt;br /&gt;     }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;okay ... so we just b/c we introduce IRequestCycle doesn't mean that this code doesn't smell.&lt;br /&gt;&lt;br /&gt;why would a class call other class and have that other class callback to another method in the originating class, especially at the end of the called method.&lt;br /&gt;&lt;br /&gt;this is another sample of unnecessarily tight coupling introduce in a somewhat wellknown framework&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112198778590727161?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112198778590727161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112198778590727161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112198778590727161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112198778590727161'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/07/code-smells.html' title='Code smells'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112191972826599786</id><published>2005-07-20T21:22:00.000-07:00</published><updated>2005-07-23T07:51:31.530-07:00</updated><title type='text'>What makes a good framework</title><content type='html'>There are a few criteria to identify a world class framework&lt;br /&gt;&lt;br /&gt;1. don't expose the public interface unless you expect the user of the framework to overload it&lt;br /&gt;2. force everything that should be overloaded to be an abstract method&lt;br /&gt;3. Leverage template method pattern to support point #2&lt;br /&gt;4. make classes and methods final if you don't want developers to overload it&lt;br /&gt;5. document all of the extension points&lt;br /&gt;6. document the execution flow of the framework if exists&lt;br /&gt;&lt;br /&gt;any other thought?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112191972826599786?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112191972826599786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112191972826599786' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112191972826599786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112191972826599786'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/07/what-makes-good-framework.html' title='What makes a good framework'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112178773309105493</id><published>2005-07-19T08:42:00.000-07:00</published><updated>2005-07-21T18:23:51.180-07:00</updated><title type='text'>I hate super.xxxx()</title><content type='html'>i hate an overridable methods that force you to call its super method. OK beside the fact that inheritance is not encouragable, but to force the implementer of the subclass to know what's going on in the super class creates an even tighter coupling b/w subclass and its parent class&lt;br /&gt;&lt;br /&gt;this problem is even more magnified when you're dealing with frameworks. Allowing the user of a framework to override method and calling its super method is going to be more problematic, since the implementer of the method couldn't modify the method at will due to unexpected side effects.&lt;br /&gt;&lt;br /&gt;so what could good framework developers do .. see this &lt;br /&gt;&lt;a href="http://thefranciscanreport.blogspot.com/2005/07/what-makes-good-framework.html"&gt;What makes a good framework&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112178773309105493?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112178773309105493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112178773309105493' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112178773309105493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112178773309105493'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/07/i-hate-superxxxx.html' title='I hate super.xxxx()'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112145241920595041</id><published>2005-07-15T11:33:00.000-07:00</published><updated>2005-07-21T18:19:56.743-07:00</updated><title type='text'>Josh Bloch on Design</title><content type='html'>&lt;a href="http://www.artima.com/intv/bloch2.html"&gt;Josh Bloch on Design&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A few things that I agree from Josh Bloch comments&lt;br /&gt;&lt;br /&gt;- XP says "Do the simplest feature set that could possibly work, without overdesign, and extraneous bells and whistles" but do not "Do the quickest slop you can thrown down that could work possibly", which will suffer in the long run&lt;br /&gt;&lt;br /&gt;A few things that I disagree&lt;br /&gt;&lt;br /&gt;- API design is not the same as other non-API design, it requires much more effort and cost. Creating reusable components are much more expensive than especially if we're talking about community used API (ie. Java SDK, and so on) And to spend that much effort if we don't know for sure that the API's going to be use widely would be a waste. Afterall, components are not really reusable until it has been reuse multiple times. However, this doesn't mean that we would not have reusable objects within the System Under Development, constant refactoring by removing duplicates will promote it by itself, without the cost of trying to come up with a silver bullet API&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112145241920595041?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112145241920595041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112145241920595041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112145241920595041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112145241920595041'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/07/josh-bloch-on-design.html' title='Josh Bloch on Design'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112144617645266644</id><published>2005-07-15T09:49:00.000-07:00</published><updated>2005-07-15T09:49:36.456-07:00</updated><title type='text'>Grouping packages based on specific patterns</title><content type='html'>Should one want to name a package based on a specific pattern name? For example, is it a good idea to collect all of the factories classes into one package. On the surface it looks like it's ok to group them by pattern, but if one of the rule of putting things in one package is to achieve high cohesiveness between classes in a package and to reduce coupling between other packages, then this idea is definitely not very sound.&lt;br /&gt;&lt;br /&gt;Any other thought?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112144617645266644?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112144617645266644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112144617645266644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112144617645266644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112144617645266644'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/07/grouping-packages-based-on-specific.html' title='Grouping packages based on specific patterns'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-14503818.post-112139518557652922</id><published>2005-07-14T19:36:00.000-07:00</published><updated>2006-09-20T12:55:11.926-07:00</updated><title type='text'>Interface Segregation</title><content type='html'>Should interfaces be separated into separate package than their concrete implementation? &lt;br /&gt;&lt;br /&gt;I think a more important approach is the benefit of those separations. I believe that separating interface and its concrete implementation just by namespace/package but still deploying it into the same deployment package (jar or dll) then we lose a little bit of those benefits.&lt;br /&gt;&lt;br /&gt;I would lean toward separating interface and implementation to two separate deployment package. They could have the same package/namespace name which doesn't really affect the intention of separating it.&lt;br /&gt;&lt;br /&gt;For details on interface separation, please refer to "Interface Segregation Principle" pattern discussed in Robert Martin's book (Agile Software Development ...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/14503818-112139518557652922?l=thefranciscanreport.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thefranciscanreport.blogspot.com/feeds/112139518557652922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=14503818&amp;postID=112139518557652922' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112139518557652922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/14503818/posts/default/112139518557652922'/><link rel='alternate' type='text/html' href='http://thefranciscanreport.blogspot.com/2005/07/interface-segregation.html' title='Interface Segregation'/><author><name>The Fighting Illini</name><uri>http://www.blogger.com/profile/09811285483585293476</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
