<?xml version="1.0" encoding="UTF-8" ?>

<rss version="2.0"
  xmlns:ent="http://www.purl.org/NET/ENT/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
  <title>Reflections on software development . . .</title>
  <link>http://swcses.eponym.com/blog</link>
  <description>Collection of thoughts regarding software development and design best practices targeted at the object-oriented business application developer</description>
  <language>en-us</language>
  <lastBuildDate>Fri, 19 Mar 2010 03:02:36 -0500</lastBuildDate>
  <category domain="http://swcses.eponym.com/blog">Main Page</category>
  <generator>Blogware</generator>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>First Steps to Quality Code</title>
    <link>http://swcses.eponym.com/blog/_archives/2009/8/24/4298670.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2009/8/24/4298670.html</guid>
    <pubDate>Mon, 24 Aug 2009 09:13:35 -0500</pubDate>
    <description>&lt;P&gt;&lt;EM&gt;This is a reply to a comment on a previous page that for technical reasons got posted as a new entry as opposed to a comment reply.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Comment:&lt;/STRONG&gt;&amp;nbsp; &lt;BR&gt;Your articles are of great inspiration, Thanks Reddy. &lt;BR&gt;Am a 2.5 yrs old Software Engineer and worked on Maintenance Projects. &lt;BR&gt;Could you please suggest me a route towards Quality Software Engineering and better growth pattern?&lt;/P&gt;&lt;STRONG&gt;Reply: &lt;/STRONG&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;Being that this is an article dedicated to reading books, I might suggest the apparent…read. And I don’t mean read books on new languages or technologies like Share Point or the newest version of the Apache server. Though these technical books have their place, they do little to advance your comfort level with building quality applications. &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;It all starts with the code you type. If an application has a poor design or weak architecture it can still have high-quality code. If you are not sure the design you have chosen is the best, the design can be more easily understood and changed as necessary if its code base is solid. To that end I highly recommend that both &lt;A href=&quot;http://www.amazon.com/Complete-Microsoft-Programming-Steve-McConnell/dp/1556154844&quot;&gt;Code Complete&lt;/A&gt; and &lt;A href=&quot;http://www.amazon.com/Writing-Solid-Code-Microsofts-Programming/dp/1556155514&quot;&gt;Writing Solid Code&lt;/A&gt; are read and discussed. (Note that Writing Solid Code refers to the C language, but it requires no knowledge of C to understand what the book is teaching.)&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;Beyond this I think it is imperative that you continue reading about the way other developers write software, finding a style and method of your own that blends the best of what you find. Books like &lt;A href=&quot;http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X&quot;&gt;The Pragmatic Programmer&lt;/A&gt;, &lt;A href=&quot;http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215&quot;&gt;Domain Driven Design&lt;/A&gt;, &lt;A href=&quot;http://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Technology/dp/0201485672&quot;&gt;Refactoring&lt;/A&gt;, &lt;A href=&quot;http://www.amazon.com/Object-Oriented-Analysis-Applications-Addison-Wesley-Technology/dp/020189551X&quot;&gt;Object-Oriented Analysis and Design with Applications&lt;/A&gt;, and any of the &lt;A href=&quot;http://www.amazon.com/s/ref=nb_ss_0_5?url=search-alias%3Dstripbooks&amp;amp;field-keywords=agile+software+development&amp;amp;x=0&amp;amp;y=0&amp;amp;sprefix=Agile&quot;&gt;Agile&lt;/A&gt; programming books give you insight into how applications are approached by other developers. I would hope any developer reading these books would find good ideas that fit with what they do and how they think. I would also hope there is plenty to disagree with in these books, as no one size fits all.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;I often argue that no aspect of software development is more important than communication. Whether it is how the code communicates to &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2009/4/8/4147609.html&quot;&gt;&lt;FONT color=#800080&gt;the next guy&lt;/FONT&gt;&lt;/A&gt; who has to understand and update the code, or how a &lt;A href=&quot;http://www.amazon.com/About-Face-Essentials-Interaction-Design/dp/0470084111&quot;&gt;user interface&lt;/A&gt; communicates &lt;A href=&quot;http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0465067107&quot;&gt;its purpose&lt;/A&gt; to a user, or how a developer &lt;A href=&quot;http://www.amazon.com/s/ref=nb_ss?url=search-alias%3Dstripbooks&amp;amp;field-keywords=interpersonal+communication&quot;&gt;communicates&lt;/A&gt; with the business analysts, without solid communication, I might go so far as to say nothing else matters. What good is a great book if no one reads it? Or more to the point, what good is an awesome design if no one can understand it? What good is a great software business idea if no one can translate the business processes to an application? What good is a great developer who cannot communicate clearly with other developers, users and business analysts? &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;Finally, the very best thing you can do, of course, is to click on this &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/3/10/1814430.html&quot;&gt;&lt;FONT color=#800080&gt;link&lt;/FONT&gt;&lt;/A&gt; and then read the next 120 blog entries. Ha, ha, ho, he, oh man, I crack myself up. &lt;SPAN style=&quot;FONT-FAMILY: Wingdings; mso-ascii-font-family: &#39;Times New Roman&#39;; mso-hansi-font-family: &#39;Times New Roman&#39;; mso-char-type: symbol; mso-symbol-font-family: Wingdings&quot;&gt;&lt;SPAN style=&quot;mso-char-type: symbol; mso-symbol-font-family: Wingdings&quot;&gt;J&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;Good luck!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>2009: The year in books (1st half) </title>
    <link>http://swcses.eponym.com/blog/_archives/2009/7/1/4240744.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2009/7/1/4240744.html</guid>
    <pubDate>Wed, 01 Jul 2009 08:26:48 -0500</pubDate>
    <description>&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;For what its worth, here are the books I have read the first half of&amp;nbsp;2009 and my humble opinions on their content:&lt;/P&gt;
&lt;UL style=&quot;MARGIN-TOP: 0in&quot; type=disc&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;SQL Server 2005: Unleashed&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;Overcoming the Five Dysfunctions of a Team&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;Elements of Friendly Software Design&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;Getting Things Done&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;Data Modeling Made Simple&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;SQL Server 2005: Unleashed&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;EM&gt;Ray Rankins, Paul Bertucci, Chris Gallelli, Alext T. Silverstein&lt;/EM&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;I have found that technical books are hard to review for me. If I am not already knowledgeable on the subject then I don’t often know how thorough they are. They also tend to be somewhat &lt;EM&gt;dry&lt;/EM&gt;, not too easy to read for long periods of time. However, they must contain explanations as to&amp;nbsp;why things exist and why features are useful, and why things are arranged the way they are, etc. I also prefer a little opinion with my facts. This book does a good job at this for the most part. Since there are 4 authors it makes sense that some sections did a better job than others in providing real life examples and real-life issues to think about.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Technically I am not done reading the book since as of this review I am on page 1116 of 1659. However, I have read enough to know I am generally happy with it and expect to finish it. &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;It might also seem strange that I am reading a technical book that is 4 years old. However, it had been quite awhile since I have read a pure technical book (as opposed to theory) on databases and at my office we are still on SQL server 2005, furthermore a coworker already owned the book. I’m cheap. For a solid intro to what’s going on in and behind the scenes of SQL Server I think it does a fine job.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;Overcoming the Five Dysfunctions of a Team&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;EM&gt;Patrick Lencioni&lt;/EM&gt; &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;Most software developers I know of are part of a team, even if it is a new team every year. I am aware that the team I am on does an adequate job but does&amp;nbsp;not operate as well as I am sure it could.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;We are definitely not efficient and probably lack definition of common goals among other things.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;I read this book in an effort to get a better grasp of what those &lt;EM&gt;other things&lt;/EM&gt; might be, and what we as a team could do about it. I did not necessarily find anything revolutionary for me in the book, but I enjoyed reading it and found myself continually nodding in agreement. I am pretty sure there was nothing in the book I disagreed with, but I am clearly more pessimistic than the author about getting teams to work as smooth as he describes in the corporate environment. Right off the bat the author suggests that the team needs to put personal egos and agendas aside and trust our peers enough to be vulnerable and admit our mistakes, etc, etc. Many coworkers I have known cannot even do this with their spouses for Pete’s sake. For my own part, the book is a good reminder of what it means to have a good team and how to be a good team member. I think I’m better for reading the book.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;The Elements of Friendly Software Design&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;EM&gt;Paul Heckel&lt;/EM&gt; &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;This book&amp;nbsp;reads like a precursor to About Face. The book has a lot of the same ideas like knowing the user, metaphors, and mental models. It was an easy read, including the author’s thinly-related essay on getting his patents recognized by large corporations that were infringing.&amp;nbsp;The author’s main focus in regards to design was all about communication. I agree 100%. In my own studies and writings I have come to the same conclusion and the book just felt like more validation. Effective communication is what makes things work. Whether it is advertising, movies, books, user interfaces, written code, or team dynamics, communicating clearly allows everything else to happen naturally and with less friction. The book does not offer direct examples of how to use radio buttons or when to use a drop down list versus a list box, etc. That’s not the point. Rather the book really is just essay after essay covering 25+ elements of design. Regardless of whether you are developing a user interface, coding a method, or designing the handle of a car door, the elements should be understood.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;Getting Things Done&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;EM&gt;David Allen&lt;/EM&gt; &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;I really liked this book and the nuances the author points out about how we deal with all the tasks on our plate. For example he suggests we need to be able to use our mind to think &lt;STRONG&gt;about&lt;/STRONG&gt; things rather than think &lt;STRONG&gt;of&lt;/STRONG&gt; them. We need a formal list&amp;nbsp;that holds all the things going on in our lives that tend to clutter our mind and distract us when we are trying to think. Having this list that is always accessible to us allows us to&amp;nbsp;make the transition to thinking &lt;EM&gt;about&lt;/EM&gt; things.&amp;nbsp;&amp;nbsp;Once we have clarified our commitment to each and every task we then need to define doable tasks for each item. In other words we have to define the next step for each item instead of just listing the item somewhere. Our Blackberry calendar should not say Babysitter for Tuesday Night, it should say Call Maureen about babysitting, or clarify with wife about exact time. In other words, it needs to document the next actionable item.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Knowing that these things have been thought of frees our mind to focus on whichever tasks we are currently working on. This list also lets us know what tasks could be accomplished when…like waiting for the dentist or with 2 hours of unexpected time at home alone, etc. I liked his ideas so much I decided to implement his basic methods. Although I have not followed his system religiously, what I have changed about my organization of things is working pretty well. I recommend this book to someone who feels like they have too many plates spinning in the air and a few more that they wish were spinning. &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;Data Modeling Made Simple&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;EM&gt;Steve Hoberman&lt;/EM&gt; &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;Data Modeling Made Simple comes in at a lean 132 pages that effectively provides clear understanding of high-level concepts involved in data modeling while holding off on the low-level details to be covered by other books. &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;As a developer who approaches a database as just a backend to my business application, I gained further respect for data modeling, even as a parallel process to object modeling. Most of the author&#39;s statements of purpose and benefits of the data model match the purpose and benefits of an object model. I believe that doing both only gains me more insight into the business which is of course invaluable.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;On more than one occasion after the author suggested something, I found myself thinking, &quot;I hope he explains other situations where you would not want to do that!&quot; And almost without fail two sentences or a paragraph later he explained the alternatives or downsides to the suggestion. To me this is a hallmark of any good book on technology and methods. In fact, just to be picky, I only recall one time he did not do this. &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;The book is definitely an introduction book and never claims to be more than that. The title even states it is just a &lt;EM&gt;simple&lt;/EM&gt;, practical guide. The chapters are laid out as common questions someone might have about data modeling which makes it an easy read and an easy reference. I will recommend this book to new developers as a quick intro to data modeling and to help arm them with good definitions of terms and high-level explanations of common concepts that they need to understand. I will also recommend this to mid-level and senior developers who still seem to have no basic grasp of data modeling concerns and methods. And lastly I will recommend it to those who seem to think there is a huge gap between object modeling and data modeling in the common business application.&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    <category domain="http://swcses.eponym.com/blog/Books">Books</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Developer Interview</title>
    <link>http://swcses.eponym.com/blog/_archives/2009/5/21/4191734.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2009/5/21/4191734.html</guid>
    <pubDate>Thu, 21 May 2009 22:14:13 -0500</pubDate>
    <description>&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;I was asked to interview a candidate for a job here at my office. In preparation, I searched the web for good technical questions to update my standard interview sheet which I had not used in years. I found a few web sites that listed questions “every senior developer using .Net should know”. I have been programming for over 20 years and have been using .Net since its inception, so I guess some bureaucrat would label me a senior .Net developer. &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;I didn’t know more than half the right answers. I must suck.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;But I’m here to tell you I don’t suck. In fact, I think I am a definite asset to any development team building mission critical business applications.&amp;nbsp; But I cannot tell you the largest value an int can hold, the maximum amount of memory any single process on Windows can address, or even how to write a for loop in C#.&amp;nbsp; I have mentioned &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/3/31/3599390.html&quot;&gt;&lt;FONT color=#800080&gt;more&lt;/FONT&gt;&lt;/A&gt; than &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2009/3/5/4103376.html&quot;&gt;&lt;FONT color=#800080&gt;once&lt;/FONT&gt;&lt;/A&gt; on this site how the hardest thing about development is people, not technology. However, here I was looking for technology questions like these to ask an interviewee.&amp;nbsp; Feels hypocritical.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;So I am abandoning the technical questions. Not completely, but if I know the technology they listed on their resume then I can ask one or two questions to get an idea if they are lying on their resume. Here at my office we will ask developers to sit down at a computer and do something rather trivial to show us they were not lying. So assuming they have the experience they claim, what is truly most important is how well I and the other team members will get along with, relate to, and communicate with this developer. &lt;STRONG&gt;It is seriously essential that they share the same point of views in their approach to software development&lt;/STRONG&gt;, or at least as many critical aspects as possible. The more years they have under their belt, thus the more biases they have with methods and viewpoints, then the more important this part of the interview becomes. For a new developer out of school who has not been tarnished too much we just have to judge competence.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;To that end I am starting to compile questions and statements that can be put forth to a candidate to spur conversation that hopefully gives me better insight into the kind of developing partner they would be. Technically, there are no right answers to these questions; however I do need the answers to be in line with my team’s way of thinking.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;Possibilities:&lt;/P&gt;
&lt;UL style=&quot;MARGIN-TOP: 0in&quot; type=disc&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Comments – good, bad - If bad…why? If good…why?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;What’s the hardest thing about software development?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;What’s the role of a database in the common business application?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Looking at a single method and noting that it can be long, short, efficient, etc. What would you consider its most important aspects?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Do you play a musical instrument, or make movies, or paint, etc?&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;What’s the role of the GUI?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;What are the main benefits to an object-oriented design?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Naming conventions – good, bad, why?, examples…&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Exception handling – what’s the point, where, good examples, bad examples&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Testing…&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;What was the point of No Country for Old Men?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;What are some of the pitfalls to an OO approach?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Software development life cycle – how does that go?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Dealing with changes in requirements…&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Documentation…what’s necessary?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Did you belong to a fraternity/sorority in college?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Do you have a technical certification? If so, what was the motivation to get one?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Name two of your own personal best practices&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Name something that seems lots of developers or development teams do that you think is just flat wrong.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;If the candidate will help in database design&lt;/SPAN&gt;&lt;/LI&gt;
&lt;UL style=&quot;MARGIN-TOP: 0in&quot; type=circle&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Nullable columns - bad, good, circumstantial?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;How do you feel about stored procedures - benefits, drawbacks, misuse?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Feelings on auto numbers / surrogate keys / virtual keys /natural keys. Benefits and drawbacks&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;What’s your favorite kind of work related to a software developer’s job?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;What makes a developer a good developer?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Based on something on their resume that is highly-technical that you believe needs a very good reason to be used, ask them about situations that required the use of the technology.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;What are the last two books you read related to your job as a developer?
&lt;UL style=&quot;MARGIN-TOP: 0in&quot; type=circle&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Did you agree with the author&#39;s ideologies?&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;What traits do you have that might constitute a weakness in regards to you as a programmer?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;A question to see how they would react to an impossible situation. Like a stakeholder asking for a ridiculous time schedule or a boss that says something has to be correct and done by morning and upon finding problems with a critical detail you cannot reach boss on phone, etc.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Do you participate in any open source projects?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;What’s the purpose of a business object?&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-fareast-font-family: &#39;Times New Roman&#39;&quot;&gt;Talk a bit about the involvement on a development team of the users and business analysts.&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;I think it’s important that we don’t say too much, or lead the interviewee too much and by no means should we argue with them. We just want to get them talking and maybe take notes on some of the ideas they profess. Got any more ideas?&lt;/P&gt;&lt;/SPAN&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Where Does Business Logic Go?</title>
    <link>http://swcses.eponym.com/blog/_archives/2009/4/23/4148512.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2009/4/23/4148512.html</guid>
    <pubDate>Thu, 23 Apr 2009 21:39:33 -0500</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Encapsulating Business Logic&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Recently I was asked for my 2 cents in regards to how I might encapsulate some business logic (business logic defined &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2009/4/16/4153086.html&quot;&gt;here&lt;/A&gt;). Over the course of the discussion, I realized that I tend to follow a mental checklist of sorts&amp;nbsp;in order to make sure I am implementing encapsulation correctly. Paraphrasing Einstein: if I understand something well enough then I should be able to explain it simply. So what follows below is my attempt to explain encapsulating business logic simply in order to see if I understand it well enough. Following the &lt;SPAN style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: &#39;Times New Roman&#39;; mso-fareast-font-family: &#39;Times New Roman&#39;; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA&quot;&gt;explanation &lt;/SPAN&gt;is a quick example.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Encapsulating Business Logic Checklist&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL style=&quot;MARGIN-TOP: 0in&quot; type=1&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo2; tab-stops: list .5in&quot;&gt;Clarify the logic&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo2; tab-stops: list .5in&quot;&gt;Capture the logic&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo2; tab-stops: list .5in&quot;&gt;Make the logic easily found&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo2; tab-stops: list .5in&quot;&gt;Make the logic easily testable&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo2; tab-stops: list .5in&quot;&gt;Make the logic hard to mess up&lt;/LI&gt;&lt;/OL&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Clarify the Logic&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/5/3961207.html&quot;&gt;&lt;FONT color=#800080&gt;Write something down&lt;/FONT&gt;&lt;/A&gt;. Even in an ideal word where all requirements and business rules are written down in formal documents, we often need to restate words in the context of the system to make sure we are on the same page as the business analyst. I have done everything from typing up an official document to just having the business expert look over my shoulder at the comments of a routine. Whatever fits you and your context is great, just do it.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Capture the Logic&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Regardless of where I put the logic at the end of the day, first I just want to start capturing it in code, thinking about it from a code point of view.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;This is the first stab at design separated from all other concerns as I start writing code to implement the logic. The classes involved are determined as I go through typical &lt;A href=&quot;http://en.wikipedia.org/wiki/Black_box&quot;&gt;&lt;FONT color=#800080&gt;black-box&lt;/FONT&gt;&lt;/A&gt; thinking: Given A, B, and C how do I determine D?&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;This naturally leads to the next step of making this logic easily found.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Make the Logic Easily Found&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I need to make this logic easily found for the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2009/4/8/4147609.html&quot;&gt;&lt;FONT color=#800080&gt;next guy&lt;/FONT&gt;&lt;/A&gt; who is going to update this logic or gasp, fix my bugs. As an object-oriented developer, I know the business logic belongs in an object, but which one? The short answer is…the obvious one. Often a particular object seems to be the most natural choice and we don’t give it much thought. However, when multiple objects are involved the general rule is to pick the object that has the most data involved. If multiple objects appear equally involved THEN JUST PICK ONE, you’re thinking about it too much now. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Make the Logic Easily Testable&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Business logic is arguably the most important code you will write. It determines how much should be paid or charged,&amp;nbsp;calculates values, determines answers, figures whether a missile should zig or zag, etc, etc, etc. If you are going to bother writing any tests, test your business logic. Furthermore, make the tests so fast and easy to run that no one has a problem with running the tests all the time. If you find you can’t easily and repeatedly test your business logic because it requires database connectivity, complex object creation, or whatever, then think about changing the design.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;It’s also true that making your logic easily testable&amp;nbsp;with solid&amp;nbsp;tests can go a long way towards clarifying the logic and design. This is one of the touted benefits of &lt;A href=&quot;http://en.wikipedia.org/wiki/Test-driven_development&quot;&gt;test-driven development&lt;/A&gt;. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Make the Logic Hard to Mess Up&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Those who make the leap to &lt;EM&gt;programming objects&lt;/EM&gt; as opposed to just &lt;EM&gt;programming &lt;STRONG&gt;with&lt;/STRONG&gt; objects&lt;/EM&gt; will see a huge improvement in quality simply because things become harder to mess up. There are many things we can do, but two common approaches include making&amp;nbsp;objects for any business concept and making objects immutable. For example, if a password has to be more than 3 characters but less than 10 and include letters and numbers then create a Password object that encapsulates these business rules and has methods for accessing them. It should be impossible for invalid passwords to be bouncing around the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/10/12/3287884.html&quot;&gt;&lt;FONT color=#800080&gt;business layer&lt;/FONT&gt;&lt;/A&gt; of an application. If an Email requires an IP address of an SMTP server&amp;nbsp;to send itself, then do not make a property called IP address that may or may not be set at the whim of the caller, or get changed somehow during a process. Make the IP address required upon construction and unchangeable. The users of that Email object are much less likely to mess things up.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Simple Example&lt;/STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;For the sake of discussion, another developer sent me a simple case. I like simple cases because then we can focus more on the process and less on the complexities of the example. However, I’m sure if you use your imagination you could apply the checklist to more complex scenarios.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I have a class I’m creating called Message Header, and I need to increment a value (Message Number) each time I create an instance of the class based on a previous message number. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Clarify the logic&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;After a few emails we established the following details about the business logic&lt;/P&gt;
&lt;UL style=&quot;MARGIN-TOP: 0in&quot; type=disc&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;At this point we don’t know where the last message number comes from&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;Message Number is an attribute of Message Header&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;The new number should always be the next even number (2 more than the previous)&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;The new number should always be between 2 and 9998 (inclusive)&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;After 9998 the message number should reset to 2&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Capture the logic&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I create a function called DetermineNextMessageNumber that takes in the previous message number. Code is written to encapsulate the logic above. Defensive code is added to throw an exception &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/5/28/3717181.html&quot;&gt;&lt;FONT color=#800080&gt;with the kitchen sink&lt;/FONT&gt;&lt;/A&gt; if expected assumptions are not met – like assuming the previous message number is always&amp;nbsp;even.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Make the logic easily found&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The obvious choice according to the developer was the MessageHeader class, so I add the method as an internal/friend static/shared method to the MessageHeader class.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Make the logic easily testable&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I create 5 quick tests to test the logic: a normal case - passing in the number 6, two edge cases – passing in zero and 9998,&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;and two possible extremes – passing in -50 and 55223. This prompts me to ask the business analyst what to do in these extreme cases. He claims both are&amp;nbsp; exceedingly unlikely. So I figure my defensive coding with the kitchen sink will be perfect for when the cases do happen. My tests require no database access and no complicated object building. No changes seem to be needed, the method is easily testable.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Make the logic hard to mess up&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I don’t create objects with settable attributes by default&amp;nbsp;so I know the user could not easily forget to set the Message Number. However, I realize that someone could create a Message Header and not realize there is business logic that determines the correct &lt;EM&gt;next number&lt;/EM&gt;. To fix this I change the constructor on the Message Header class to take in the PreviousMessageNumber. The constructor will then call the DetermineNextMessageNumber making sure that a coder cannot generate a Message Header without applying the appropriate&amp;nbsp;logic. Since the constructor handles the logic I realize I can reduce &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/4/24/2902824.html&quot;&gt;scope issues&lt;/A&gt; by making my DetermineNextMessageNumber routine private. Suuuhhhweeeet. For half a second I think that maybe I should make a MessageNumber object that will guarantee a valid integer between 2 and 9998 and thus separate concerns more, etc. However, the expert said it is rare, and I &lt;STRONG&gt;am&lt;/STRONG&gt; throwing in the kitchen sink in case it does happen….hmmmm, I think the design is good enough for now.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&lt;STRONG&gt;Summary&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Get your logic right, get it in code in the correct place with good tests, and design so that the next guy will have a hard time messing it up. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;When I see the code of developers trying to do more than just object-based code&amp;nbsp;the most common blunder seems to be leaving business logic all over the place. The most common misplacement seems to be in user interfaces, however, well-meaning developers often move the logic out of user interfaces but then misplace the logic in&amp;nbsp;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798981.html&quot;&gt;factory code&lt;/A&gt;,&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798993.html&quot;&gt; service classes&lt;/A&gt;, stored procedures, etc.&amp;nbsp; When object-thinking is applied I think logic starts to naturally fall into place without much thinking or time-consuming analysis.&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    <category domain="http://swcses.eponym.com/blog/GeneralProgrammingDesignBestPractices">General Programming &amp; Design Best Practices</category>
    
    <category domain="http://swcses.eponym.com/blog/OOStuff">OO Stuff</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>What is Business Logic?</title>
    <link>http://swcses.eponym.com/blog/_archives/2009/4/16/4153086.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2009/4/16/4153086.html</guid>
    <pubDate>Thu, 16 Apr 2009 08:54:15 -0500</pubDate>
    <description>&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Calibri&#39;,&#39;sans-serif&#39;; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: &#39;Times New Roman&#39;; mso-bidi-theme-font: minor-bidi&quot;&gt;What is Business Logic?&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Calibri&#39;,&#39;sans-serif&#39;; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: &#39;Times New Roman&#39;; mso-bidi-theme-font: minor-bidi&quot;&gt;Business&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;FONT face=Calibri&gt;: Commercial enterprise: the activity of providing goods and or services involving financial, commercial and or industrial aspects&lt;/FONT&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Calibri&#39;,&#39;sans-serif&#39;; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: &#39;Times New Roman&#39;; mso-bidi-theme-font: minor-bidi&quot;&gt;Logic&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;FONT face=Calibri&gt;: The principles that guide reasoning within a given field or situation&lt;/FONT&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;FONT face=Calibri&gt;Business logic code is the code that applies the principles that guide reasoning within the business. Sounds fancy, but in fact it is just the code that makes decisions, answers questions, and applies rules. One might argue that in the &lt;/FONT&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;&lt;FONT color=#800080 face=Calibri&gt;common business application&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Calibri&gt; the business logic code is the most important code. The code you cannot write unless you understand the business and as such is often defined by experts in the field. &lt;/FONT&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Calibri&#39;,&#39;sans-serif&#39;; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: &#39;Times New Roman&#39;; mso-bidi-theme-font: minor-bidi&quot;&gt;What is not business logic code?&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;FONT face=Calibri&gt;In short: all the other code.&amp;nbsp; Often the common business application also requires code to handle user interaction via&amp;nbsp;graphical user interface components.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;There is often code for database access, code for capturing process algorithms, code for handling security, code for logging interaction or auditing events, code for managing errors, code for wrapping external services or components, etc.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;These &lt;EM&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Calibri&#39;,&#39;sans-serif&#39;; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: &#39;Times New Roman&#39;; mso-bidi-theme-font: minor-bidi&quot;&gt;subsystems&lt;/SPAN&gt;&lt;/EM&gt; are all required to complete the application, but are often not directly tied to the business itself.&amp;nbsp; As mentioned above, business logic is defined by a subject matter expert from the business the application is being built for, however the developer or other related technical &lt;SPAN style=&quot;FONT-FAMILY: Calibri; FONT-SIZE: 12pt; mso-bidi-font-family: &#39;Times New Roman&#39;; mso-fareast-font-family: &#39;Times New Roman&#39;; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA&quot;&gt;authority &lt;/SPAN&gt;is often the subject matter expert for this &lt;EM&gt;other&lt;/EM&gt; code. &lt;/FONT&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&lt;FONT face=Calibri&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Calibri&#39;,&#39;sans-serif&#39;; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: &#39;Times New Roman&#39;; mso-bidi-theme-font: minor-bidi&quot;&gt;This is so clear, could you please add some confusion?&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;FONT face=Calibri&gt;Yes, yes I can.&amp;nbsp;The subsystems noted above (data access, user interface code, etc) also have principles that guide the reasoning related to them. So although these subsystems are not tied directly to the business at hand, they do have their own business to attend to and so the logic involved is also &lt;EM&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Calibri&#39;,&#39;sans-serif&#39;; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: &#39;Times New Roman&#39;; mso-bidi-theme-font: minor-bidi&quot;&gt;technically&lt;/SPAN&gt;&lt;/EM&gt; business logic. This is important for the object-oriented developer since the objects created to handle these subsystems should also be responsible for their own related business which of course is not the business of the application...clearly.&amp;nbsp;This is worth noting&amp;nbsp;because often object-oriented developers drop their respected OO principles when working in these other subsystems outside of what they would consider business logic. I did just that until it dawned on me that I was missing all the benefits of an OO design outside of business code.&lt;/FONT&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-FAMILY: &#39;Calibri&#39;,&#39;sans-serif&#39;; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: &#39;Times New Roman&#39;; mso-bidi-theme-font: minor-bidi&quot;&gt;Why is it important to identify business logic?&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL style=&quot;MARGIN-TOP: 0in&quot; type=disc&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;FONT face=Calibri&gt;Business changes frequently and we have to know where to look, what to change, and how to easily test our changes&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;FONT face=Calibri&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;FONT-FAMILY: Calibri&quot;&gt;When discussing the logic with subject matter experts after it has been implemented, we need that logic isolated and at the right level of abstraction without peripheral distractions to minimize logic-to-code translation&lt;/SPAN&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;FONT face=Calibri&gt;So the business logic code can be kept separate from other code to make sure changing either has little to no affect on the other. Rude developers have a habit of spreading business logic all over an application from the user interface through stored procedures&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;FONT face=Calibri&gt;We have to be sure not to duplicate business logic so when it needs to change (as it is highly prone to do)&amp;nbsp;we make sure the logic is changed and fixed for all code dependent on that logic&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;FONT face=Calibri&gt;Business logic is often tied back to requirements to make sure features are implemented correctly&lt;/FONT&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;STRONG&gt;See also:&lt;/STRONG&gt; &lt;/FONT&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;FONT face=Calibri&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798962.html&quot;&gt;Business Object&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/5/1/3659890.html&quot;&gt;Your object-oriented program is not object-oriented&lt;/A&gt; &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/8/15/3161078.html&quot;&gt;What&#39;s the diff?&lt;/A&gt; &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>The Next Guy</title>
    <link>http://swcses.eponym.com/blog/_archives/2009/4/8/4147609.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2009/4/8/4147609.html</guid>
    <pubDate>Wed, 08 Apr 2009 21:40:23 -0500</pubDate>
    <description>&lt;STRONG&gt;Who is this &lt;EM&gt;next guy&lt;/EM&gt; and why do I care about him or her?&lt;/STRONG&gt;&lt;BR&gt;One of my favorite quotes is attributed to Martin Golding, &quot;Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.&quot; The psychopath is &lt;EM&gt;The Next Guy&lt;/EM&gt;. 
&lt;P&gt;Often senior developers write new applications, write the hardest parts of an application, or&amp;nbsp; at least set the standards to be used in writing an application. However it is usually junior and newbie developers who actually spend the most time in the code in what is the longest phase of any application: maintenance. So junior and newbie developers are &lt;EM&gt;The Next Guy&lt;/EM&gt;.&lt;/P&gt;
&lt;P&gt;Often we write code when our heads are totally wrapped around the subject matter and the technologies involved. However in two months or even less, when we go back to work with the code it might as well have been written by someone else. We are &lt;EM&gt;The Next Guy&lt;/EM&gt; in this case who cannot recall what the heck is going on.&lt;/P&gt;
&lt;P&gt;In the if-you-have-not-read-it-yet-stop-writing-code-and-read-it-first-then-get-back-to-work book Code Complete, the author reiterates a long established truth about programming: Write code for people first, computers second because computers can read ugly code but they don&#39;t have to debug and enhance it.&amp;nbsp; In other words, you must keep &lt;EM&gt;The Next Guy&lt;/EM&gt; in mind when writing code, it is imperative. &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;How do you keep the next guy in mind?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;This can be done in many ways, too numerous to record here but I’ll list a few of my favorites or greatest related pet peeves when &lt;STRONG&gt;I&lt;/STRONG&gt; am the next guy.&lt;/P&gt;
&lt;UL style=&quot;MARGIN-TOP: 0in&quot; type=disc&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;If I am the next guy, do not make me think about, work with, or understand anything more than I absolutely have to in order to get my job done.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Try to apply some level of a separation of concerns for my sake. The notion is simple really. It is easier to think about things, work with things, understand things and communicate things when we only think, work, understand, and communicate with the least amount of concerns as possible. &lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;Follow some coding standards so I don’t have to constantly figure out what some new convention is supposed to mean as it changes from module to module. &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/5/3964294.html&quot;&gt;&lt;FONT color=#800080&gt;Any standards please&lt;/FONT&gt;&lt;/A&gt;! If someone else already started the coding on a project using a particular convention then use theirs, I don’t care what &lt;STRONG&gt;your&lt;/STRONG&gt; &lt;STRONG&gt;preference&lt;/STRONG&gt;&lt;/STRONG&gt;&lt;/STRONG&gt; is.&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;Magic data values make me mad, like violent psychopath mad.&lt;/LI&gt;
&lt;UL style=&quot;MARGIN-TOP: 0in&quot; type=circle&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in&quot; class=MsoNormal&gt;Widget.DetermineThis(5, “Begin”, false) – Huh?&lt;/LI&gt;&lt;/UL&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;Write code using the core framework and basic functionality of your language. Stick to what you would expect a new developer in the chosen language and framework to understand. Anything else should be strongly contested and verified as necessary. &lt;/LI&gt;
&lt;UL style=&quot;MARGIN-TOP: 0in&quot; type=circle&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in&quot; class=MsoNormal&gt;We all know (or have been) the developer who reads a chapter on threading and now all the sudden everything is a needle and requires some good threading. Oooh, Microsoft LINQ I’m doing that! Generics, cool it’s not just for collections anymore. Oh yeah, I’m stick’n &lt;?xml:namespace prefix = st1 ns = &quot;urn:schemas-microsoft-com:office:smarttags&quot; /&gt;&lt;st1:City w:st=&quot;on&quot;&gt;&lt;st1:place w:st=&quot;on&quot;&gt;AJAX&lt;/st1:place&gt;&lt;/st1:City&gt; on our website. Desktop apps are so 90s! XML kicks up the cool factor! Real objects don’t expose any data! &lt;STRONG&gt;Just stop!&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in&quot; class=MsoNormal&gt;The best business application developers are not more productive because they know all the intricacies of a language. Language-certified developers scare the hell out of me. Don’t make things more complex than they absolutely have to be because I want to get in, get out, and get testing.&lt;/LI&gt;
&lt;UL style=&quot;MARGIN-TOP: 0in&quot; type=square&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level3 lfo1; tab-stops: list 1.5in&quot; class=MsoNormal&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/12/3961431.html&quot;&gt;&lt;FONT color=#800080&gt;Programming a computer is easy.&lt;/FONT&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level3 lfo1; tab-stops: list 1.5in&quot; class=MsoNormal&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/6/2/3725168.html&quot;&gt;&lt;FONT color=#800080&gt;Clarity should trump elegance and often even efficiency&lt;/FONT&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level3 lfo1; tab-stops: list 1.5in&quot; class=MsoNormal&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/4/8/1871407.html&quot;&gt;&lt;FONT color=#800080&gt;Hi, I’m Gary, I’m a Java Programmer&lt;/FONT&gt;&lt;/A&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;In an ideal world, well-written code does not require comments.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;In the real world, even well-written code could use some comments of intent.&amp;nbsp;Well-written comments are&amp;nbsp;the &lt;A href=&quot;http://www.excedrin.com/&quot;&gt;Excedrin&lt;/A&gt; to the migraine pain of bad code.&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;Use objects. At least object-based, but consider object-oriented. And no, I do not consider rudimentary knowledge of objects and object-oriented thinking to be above the newbie developer. I started teaching my daughter programming&amp;nbsp;when she was&amp;nbsp;nine and the first thing I taught her was what an object is. I explained it is the building block of everything and all the &quot;smart&quot; code you&#39;ll write is inside them.&amp;nbsp; Some 10-year development veterans using an OO language like VB.Net still don’t get that.&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;Apply a little defensive coding to help the next guy figure out what went wrong after they have broken the code. For example, any time you have a case statement always have an &lt;EM&gt;else block&lt;/EM&gt;&amp;nbsp;to check for the unexpected. Adding a new enumeration should make the code bomb if somewhere in the bowels of the code that enumeration was not expected.&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;I have to stop. I could go on all night with this. However since these were the first&amp;nbsp;7 things to pop in my head I am going with them.&lt;/LI&gt;&lt;/UL&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    <category domain="http://swcses.eponym.com/blog/GeneralProgrammingDesignBestPractices">General Programming &amp; Design Best Practices</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>The Pit Stop</title>
    <link>http://swcses.eponym.com/blog/_archives/2009/3/27/4134383.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2009/3/27/4134383.html</guid>
    <pubDate>Fri, 27 Mar 2009 08:06:30 -0500</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;One upon a time there were 3 little race car drivers&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;There are 3 drivers in a 50-lap race driving their cars as fast and as hard as can be expected in a race to the finish. After 25 laps their tires start to thin out, gasoline gets low, even paint starts to chip off the hood of their cars. Driver 1 and 2 are driving steady and fast but trail driver 3 by about 5 car-lengths as driver 3 drives at unsafe speeds. Driver 1 pulls over for a pit stop and gets 4 new tires and a full tank of gas. Driver 2 does the same but also touches up the chipped paint. Driver 3 decides he has no time for stopping and skips the pit stop resulting in an impressive 2-lap lead on the other cars.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Driver 3 blows out one of his thinned-out tires at lap 85, but is able to hobble forward with 3 tires and a rim. By lap 90 the other drivers with good tires are nearly caught up. At lap 95 driver 3 blows another tire and realizes he in running on fumes. Driver 3 knows he needs one last heroic effort to beat the&amp;nbsp;two cars that are now right on his tail.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;He switches to a higher gear and guns the engine coming out of a turn. His bare tires can’t take the explosive speed and he careens across the track and into the wall destroying the car and nearly killing him. Driver 1 wins the race with driver 2 about 20 car-lengths behind.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;If you have made mistakes, even serious ones, there is always another chance for you. What we call failure is not the falling down but the staying down.&lt;/STRONG&gt; - Mary Pickford &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Driver 3’s mistakes seem obvious even to someone like me who knows little of car racing. Everyone knows he has to go fast to win a race, but not to the point of being reckless. Everyone knows he will have to take a pit stop, obviously stopping his forward progress, but it is time well-invested to ensure he can finish the race. Everyone knows the more reckless he drives, and the worse shape his car is in will have a cumulative affect making him drive more reckless and deteriorate his car even further to the point where he cannot race anymore.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Driver 2’s mistake is a little less obvious but he did lose the race for a reason. He was smart to take a pit stop, however he was not smart about what he chose to do with his time there. Driver 1 made the smart decision to leave the chipped paint for another time and only change what was required to make sure the race could be won. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Those who make the worst use of their time are the first to complain of its shortness.&lt;/STRONG&gt; – Jean de La Bruysre&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;At this very moment development teams around the world are building applications without pit stops. There’s a good chance you know of one, are a part of one now, were in the past, or will be in the future because it is an epidemic that is more prevalent than it ought to be.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The way I see it there are two kinds of pit stops and more than one way to handle them. There is the concept of mini-pit stops in software development called refactoring which has become so mainstream that refactoring options are now &lt;A href=&quot;http://msdn.microsoft.com/en-us/library/ms379618(VS.80).aspx&quot;&gt;built into Visual Studio&lt;/A&gt;. Refactoring is the concept of taking time to improve existing code without changing functionality. The value is often unperceivable by the naïve developer and of course management. In general, right after code is written, when a new feature is added or a bug is fixed, we must always give some thought to changing the design so the new feature would be easier to add, the feature would be easier to update, or the bug could never happen again.&amp;nbsp;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;There is also the concept of a large pit stop that is obviously more time consuming and painful. The large pit stop is often&amp;nbsp;attributed to not taking enough previous smaller pit stops.&amp;nbsp;&amp;nbsp;The bigger the pit stop is the more likely it will be put off. The more it is put off the bigger the need becomes until the race car (application) is so beat up, so distorted and uncontrollable, that it falls apart and &lt;SPAN style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: &#39;Times New Roman&#39;; mso-fareast-font-family: &#39;Times New Roman&#39;; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA&quot;&gt;management &lt;/SPAN&gt;decides we have to buy a new car (rewrite).&amp;nbsp;&amp;nbsp;Not stopping for the smaller pit stops ends up costing the business much more money in the end.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;There is still much to debate about when it comes to pit stops along the lines of when to take them and what to do while we are stopped. Driver 2 made the mistake in his pit stop to touch up his paint which was cosmetic and had no affect on the future of the race, and in fact cost him the race. Likewise, developers need to be judicious about what gets changed when they invest time to do so. We have a tendency to want to make things look familiar to us, do them &lt;EM&gt;our&lt;/EM&gt; way. In affect we are just &lt;A href=&quot;http://en.wiktionary.org/wiki/there&#39;s_more_than_one_way_to_skin_a_cat&quot;&gt;&lt;FONT color=#800080&gt;skinning the cat&lt;/FONT&gt;&lt;/A&gt; a different way and there is no improvement, or the improvement is marginal at best. The best pit stoppers &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2009/2/13/4088140.html&quot;&gt;&lt;FONT color=#800080&gt;know why&lt;/FONT&gt;&lt;/A&gt; they would make any change before making it so they can better foresee the impact.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Another possible pitfall of the pit stop is what author &lt;A href=&quot;http://en.wikipedia.org/wiki/The_Mythical_Man-Month#The_Mythical_Man-Month&quot;&gt;Fred Brooks&lt;/A&gt; calls the Second System Effect where developers tend to over-engineer a solution now that they have time to address everything they couldn’t the first time around. Like skinning the cat and making cosmetic changes, over-engineering has to be held in check. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Quality is not an act, it is a habit.&lt;/STRONG&gt; - Aristotle&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The need for time-consuming pit stops can be alleviated by any kind of quality control a development team can muster. This might be achieved by code reviews, pair programming, an easy testing framework, or simply best practices and standards agreed upon by the developers. I state they can be &lt;EM&gt;alleviated&lt;/EM&gt; in order to clarify that they cannot be removed entirely. No professional application worth its bytes can survive and have a decent return on investment without refactoring. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;Duct tape, spit and glue can only hold things together for so long, eventually broken applications completely fall apart. It is always then we realize that a little preventative maintenance could have helped. An ounce of prevention is worth a pound of cure as Ben Franklin would say.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The inexperienced view is that the methods used to get an application up and running or to figure out how to do something can be the same methods used to maintain, update and fix an application.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Often in an effort to get an application to market, electrify a client, impress a boss, just figure something out, or get some dollars rolling in we do what ever is necessary to get something working. However, it is patently absurd to keep banging away on an application with a hammer when the application and its context have evolved&amp;nbsp;in to what&amp;nbsp;is no longer a nail. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;In this blog I tend only to deal with software concepts that affect the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;. The business application has to be one that is intended to last as long as the business and make it more profitable. However a lack of quality control, in this case the failure to recognize the necessity of pit stops, seems to be a major killer of applications, developer’s jobs, and ultimately businesses. &lt;EM&gt;Though one could argue that this problem often creates more jobs as managers try adding more developers to fix their problems as opposed to ever addressing the fundamental issue. Right now there are too many businesses losing profit by paying too many developers to maintain applications that should require less to do so.&lt;/EM&gt;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    <category domain="http://swcses.eponym.com/blog/CodeProject">CodeProject</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>3 years later...</title>
    <link>http://swcses.eponym.com/blog/_archives/2009/3/10/4117124.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2009/3/10/4117124.html</guid>
    <pubDate>Tue, 10 Mar 2009 08:01:35 -0500</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;If you can’t explain it simply, you don’t understand it well enough&lt;/EM&gt;. - Albert Einstein. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I think it is safe to say that Albert enjoyed thinking things through until he understood them well enough to explain them simply. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;3 years ago to the day I started a blog to challenge myself to see if I understood software development practices well enough to explain them simply. Often I fail with verbose explanations of concepts, which according to Einstein means I must not have a complete grasp of them yet. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;But overall, I consider the blog a success. Granted with the insignificant number of subscribers and only a couple hundred page views a month, I don’t think I’ll be quitting my day job. However, that was never the point. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;By thinking things through, verbalizing them, and discussing them outside of myself, I have gotten a clearer understanding of the whats and the whys of development. I’ll go so far as to say that over the past 3 years the blog, the 65 pages of notes yet to be clarified and simplified, and the ensuing conversations have been the main catalyst for my improvement and overall development as a software developer. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;For what it’s worth, I recommend the same for any developer. Try writing down what you think is most important about development, or what &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/3/10/1814430.html&quot;&gt;&lt;FONT color=#800080&gt;drives you crazy&lt;/FONT&gt;&lt;/A&gt; etc. You may find that you can’t, because you can’t verbalize what are just abstract judgments. You may also learn some things are not as important as you thought. Best of luck.&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Scratched Windows</title>
    <link>http://swcses.eponym.com/blog/_archives/2009/3/5/4103376.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2009/3/5/4103376.html</guid>
    <pubDate>Thu, 05 Mar 2009 11:15:05 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;One of my favorite metaphors in regards to software development is that of Broken Windows. I first read about the theory of Broken Windows three years ago in the book the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/12/5/2551050.html&quot;&gt;&lt;FONT color=#800080&gt;Pragmatic Programmer&lt;/FONT&gt;&lt;/A&gt;. The theory comes from research done in inner-city neighborhoods where a psychologist noted that when broken windows were not quickly fixed in buildings a sense of abandonment and general culture of disregard for the building took hold. Soon graffiti, trash, and more vandalism became common place. The solution: don’t allow broken windows in the first place, but more importantly, fix them immediately. When the windows were fixed quickly the exact opposite culture set in. A culture of respect and perceived quality soon meant that&amp;nbsp;fewer windows, if any at all, would be broken in the future.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;This parallels software development if you consider things like quick hacks, poor error handling, missing abstractions, lack of standards, etc as broken windows.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;When they are tolerated the same theory suggests that the culture we are instilling only perpetuates more trash and development-vandalism in our project. This is one truism about development that I believe very strongly. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;If only software development broken windows were so obvious, so definite. Recently I mentioned to another developer that a metaphorical window was broken, he suggested it was merely scratched. Later I proved that a missing abstraction broken window led to breaking a standard we had all agreed to and I was concerned about what else these broken windows would lead to. The other developer claimed I was essentially using a slippery slope argument to claim one thing will lead to another. But that’s just it, that’s the point of the broken windows theory. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;He also suggested that he could track the windows and step in before it got too out of hand. I’m not so sure you can easily change the development culture surrounding an application after so long. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;In a &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2009/2/23/4102164.html&quot;&gt;&lt;FONT color=#800080&gt;previous blog entry&lt;/FONT&gt;&lt;/A&gt; I mentioned the benefits of trying to give more than you take in terms of design choices when working with another developer. I believe in the above examples the developer who was allowing the broken windows was doing so in an effort to &lt;EM&gt;give&lt;/EM&gt; wherever he could, an admirable thing to do. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;To keep the metaphor going, one might argue that he had to give up a few broken windows so he could gain a few steel doors. Is there risk that the broken windows will lead to more problems?&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Yes, I think it was even proven. However, as I have often stated before, it is also nearly definite that the hardest thing about software development is “other people”.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Sometimes a few broken windows are required to maintain goodwill and a productive development culture among those people. &lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    <category domain="http://swcses.eponym.com/blog/CodeProject">CodeProject</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>A Sixth U of Design Debates</title>
    <link>http://swcses.eponym.com/blog/_archives/2009/2/24/4102182.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2009/2/24/4102182.html</guid>
    <pubDate>Tue, 24 Feb 2009 08:28:11 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;About a year and a half ago I had written a blog entry called the &lt;EM&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/9/7/3215577.html&quot;&gt;3 U&#39;s of Deisgn Debates&lt;/A&gt;&lt;/EM&gt;. The entry is about things I need to keep in mind whenever debating design,&amp;nbsp;best practices, or truly anything at all. Months later I added a 4th concept, and then a 5th, and now today I have a 6th. So along with Unclear Requirements, Undefined Scope, Underlying Fundamental Opinion, Unrecognized Context, and Uneven Give and Take, I propose No &lt;STRONG&gt;U&lt;/STRONG&gt;ltimate Decision.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;No Ultimate Decision&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;During a debate everyone wants to get heard and everyone’s egos really want their own ideas to be chosen in group consensus. We are careful to protect core beliefs that we hold dear (even if we are not sure &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2009/2/13/4088140.html&quot;&gt;&lt;FONT color=#800080&gt;why&lt;/FONT&gt;&lt;/A&gt; we hold them so dear), we might make snap judgments and be uncharacteristically inflexible in regard to them. It’s our nature; we are in the heat of battle and this is our only chance to get to the right answer, to the correct &lt;EM&gt;ultimate decision&lt;/EM&gt; on the matter. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The first mistake in a discussion that is warmly if not hotly contested is to even try to make a final or ultimate decision right then and there. A better option is to make sure notes are taken and positions summarized and made clear. Secondly, everyone involved should be left alone to absorb what has been said.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;A conscientious developer will often back off snap judgments they made and possibly rethink their position while the words of other debaters bounce around their heads. They will also remember the things they did not think of in the meeting, like possibly the other 5 U’s of design debates. So in a nutshell, hold off making a final decision after a single design debate.&amp;nbsp; &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The second mistake related to an ultimate decision is a little more touchy-feely. We seem to sometimes equate &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2009/2/23/4102164.html&quot;&gt;giving in&lt;/A&gt; with completely disregarding our beliefs.&amp;nbsp; We seem to feel that going with a different option somehow negates all we have learned, or means every time we did it differently we were doing it wrong.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;We make the mistake of feeling that somehow this one case becomes the ultimate decision&lt;/EM&gt;, the ultimate word on the matter.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;I noticed this a lot recently when talking about surrogate keys, multi-part keys, and natural keys with a bunch of different developers. I had many good conversations, but I also had useless ones where a staunch defender of a method seemed afraid that if they gave in or admitted benefits to the other options, that they somehow negated all the great work they have done in the past. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;We have to keep in mind that no decision we make about development is the final word on the matter. I have been writing software for over 20 years and no two applications have ever been written the exact same way. The “best” way to do darn near anything changes with my experiences along with the influences of those around me (as it should be). &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;I have to remember not to rush to a perceived ultimate decision, and in the end remember that there really is no such thing anyway.&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>A Fifth U of Design Debates</title>
    <link>http://swcses.eponym.com/blog/_archives/2009/2/23/4102164.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2009/2/23/4102164.html</guid>
    <pubDate>Mon, 23 Feb 2009 12:07:26 -0600</pubDate>
    <description>&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;About a year and a half ago I had written a blog entry called the &lt;EM&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/9/7/3215577.html&quot;&gt;3 U&#39;s of Deisgn Debates&lt;/A&gt;&lt;/EM&gt;. The entry is about things I need to keep in mind whenever debating design,&amp;nbsp;best practices, or truly anything at all. Months later I added a 4th concept, and now today I have a 5th. So along with Unclear Requirements, Undefined Scope, Underlying Fundamental Opinion, and Unrecognized Context, I now offer Uneven Give and Take.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;Uneven Give and Take&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;8 years ago at the start of a project with another developer, I adopted that developer’s variable naming convention. We had agreed that the scope of a variable should be denoted in the name, but that was the extent of our agreement.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Unlike me, he liked to note the data type, liked to always use a 3 letter identifier, and to move the abbreviation to the end of the name. In my life I have never seen another example of any code any where that looks similar to this convention. I physically shivered the first time I typed LastName_mStr instead of _LastName. Now, ask me 8 years and 10,000+ lines of code later if it bothers me at all to type LastName_mStr. Of course it doesn’t. I am used to it. The verbose extensions flitter off my fingertips without any thought.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;Being aware of an Uneven Give and Take refers at once to compromise, but also to choosing our battles wisely. With any good development team, there should be healthy discussion about best practices for the context of the application, and many small and large design decisions. If the team really has their act together this would also include some pair programming and or peer code reviews. The conscientious developer (debater) should know &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2009/2/13/4088140.html&quot;&gt;why they do what they do&lt;/A&gt;, and try to stay keenly aware of what is important and what might just be noise. When in these discussions it benefits us to try to &lt;EM&gt;give&lt;/EM&gt; more often than we &lt;EM&gt;take&lt;/EM&gt; in order to help foster a sense of compromise and to save up &quot;debate goodwill&quot; for when we find a topic we really should hold our ground on.&amp;nbsp;If you try to do this, chances are you will give in just enough. &amp;nbsp;&lt;/o:p&gt;As a developer in my office routinely says, sometimes you just need to smile, nod, and say OK. What is understood is that you are biting your tongue, saving both your breath and &lt;EM&gt;debate-points&lt;/EM&gt;&lt;/EM&gt; for another debate that matters more.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;Are there any benefits to adding data types to variables or moving the scope identifier to the end of the variable instead of the beginning? Sure there are! But they feel negligible to me and&amp;nbsp;the convention of course has its own drawbacks. However, on a more human level, there are many benefits to smiling, nodding and saying OK. This is by no means meant to be patronizing or condescending. You are deciding that what ever your beef is with the idea, it is not dangerous or problematic enough to bother fighting over. Ask yourself these questions: &quot;Can I live with that?&quot; &quot;Is that really problematic, or just ugly, or different from what I am used to?&quot; &quot;Is this a good time to &lt;EM&gt;give&lt;/EM&gt;, let them have&amp;nbsp;their way?&quot; &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;I would even argue that based on my experience,&amp;nbsp;uneven giving and taking leads to a lack of standards, people avoiding debates, hiding their methods from each other, voting against code reviews, and just generally not getting along on a development team.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;This can be a major contributor to team deterioration leading to a &lt;A href=&quot;http://codesnipers.com/?q=node/43&quot;&gt;&lt;FONT color=#800080&gt;guy in a room&lt;/FONT&gt;&lt;/A&gt;&lt;/EM&gt; and or &lt;A href=&quot;http://www.estek.net/estek/estBlank.cfm?pageName=shipGreatSoftware&quot;&gt;&lt;FONT color=#800080&gt;going dark&lt;/FONT&gt;&lt;/A&gt;&lt;/EM&gt;.&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Why oh why</title>
    <link>http://swcses.eponym.com/blog/_archives/2009/2/13/4088140.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2009/2/13/4088140.html</guid>
    <pubDate>Fri, 13 Feb 2009 10:14:50 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;For me, in software development, it is all about &lt;EM&gt;why&lt;/EM&gt;.&amp;nbsp; I feel a very strong need to understand &lt;EM&gt;why&lt;/EM&gt; I am doing everything and anything I do. Furthermore, I am upset with myself when I cannot clearly state &lt;EM&gt;why&lt;/EM&gt;, and on the flip side take pride in knowing &lt;EM&gt;why&lt;/EM&gt;: why I choose a minimum of three layers in darn near any application, why I rarely if ever read books on a language, why I don’t blindly choose auto numbers for primary keys in databases, why I prefer business-object-oriented development, why I don’t bother arguing with people about how they want to define scope on their variables, etc, etc, etc, etc, etc, etc.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The author of one of the books I am currently reading&amp;nbsp;(&lt;A href=&quot;http://my.eponym.com/am%20upset%20with%20myself%20when%20I%20cannot%20clearly%20state%20why&quot;&gt;Getting Things Done&lt;/A&gt;) stresses that getting anything done&amp;nbsp;starts from understanding &lt;EM&gt;why&lt;/EM&gt; we are trying to get anything done in the first place. There is a real problem if we cannot explain &lt;EM&gt;why&lt;/EM&gt; we take any action, and if we cannot agree on why we are taking action.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I feel validated today. I guarantee you there is more than one developer in your midst right now who cannot tell you why he or she does things the way they do. “That’s how everyone does it,” or “It’s better,” or “It’s easier”,&amp;nbsp;or &quot;It&#39;s simpler&quot;&amp;nbsp;do not count. I’m looking for a deeper understanding of purpose. **&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Want a telling interview with a perspective hire?&amp;nbsp; Ask them why they do the things they say they do. Do they put little prefixes on variables to denote data type? Ask them why. Do they employ object-oriented development techniques? Ask them why.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Want to be a better developer? Work to understand why you do the things you do and to understand why you don&#39;t do some other things. Sounds like common sense, but appears not to be commonly practiced.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;**Side Note: One short answer that I have becoming increasingly alright&amp;nbsp;with is &quot;I am comfortable with this.&quot; If you understand both sides of a debate, and everything seems relatively even, being comfortable with a decision can easily tip the scales as the comfort level may make you more efficient and even happier.&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    <category domain="http://swcses.eponym.com/blog/CodeProject">CodeProject</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>2008: The year in books (2nd half)</title>
    <link>http://swcses.eponym.com/blog/_archives/2009/1/8/4046693.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2009/1/8/4046693.html</guid>
    <pubDate>Thu, 08 Jan 2009 09:16:29 -0600</pubDate>
    <description>&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/6/4/3728872.html&quot;&gt;&lt;FONT color=#800080&gt;First half of the year books (blog entry from June):&lt;/FONT&gt;&lt;/A&gt;&lt;BR&gt;- Manage It! By Johanna Rothman&lt;BR&gt;- Object Models: Strategies, Patterns, and Applications by Peter Coad&lt;BR&gt;- Prefactoring: Extreme Abstraction, Extreme Separation, and Extreme Readability by Ken Pugh&lt;BR&gt;- Object-Oriented Program Design: With Examples in C++ by Mark Mullin&lt;BR&gt;- Building Object Applications that Work by Scott Ambler &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;Second half of the year in books and my humble opinions on their content:&lt;/STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-list: Ignore&quot;&gt;-&lt;SPAN style=&quot;FONT: 7pt &#39;Times New Roman&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;About Face 2.0&lt;/P&gt;
&lt;P style=&quot;TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-list: Ignore&quot;&gt;-&lt;SPAN style=&quot;FONT: 7pt &#39;Times New Roman&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;Object Thinking&lt;/P&gt;
&lt;P style=&quot;TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-list: Ignore&quot;&gt;-&lt;SPAN style=&quot;FONT: 7pt &#39;Times New Roman&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;Systemantics: How Systems Work and Especially How They Fail&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;The list is shorter than usual thanks to two technical books I&amp;nbsp;read, ahem, skimmed for information, but had no real intention of reading cover-to-cover: &lt;/P&gt;
&lt;P style=&quot;TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-list: Ignore&quot;&gt;-&lt;SPAN style=&quot;FONT: 7pt &#39;Times New Roman&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;IIS7 Implementation and Administration&lt;/P&gt;
&lt;P style=&quot;TEXT-INDENT: -0.25in; MARGIN: 0in 0in 0pt 0.5in; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot; class=MsoNormal&gt;&lt;SPAN style=&quot;mso-list: Ignore&quot;&gt;-&lt;SPAN style=&quot;FONT: 7pt &#39;Times New Roman&#39;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;SharePoint 2007 Unleashed.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;STRONG&gt;About Face 2.0&lt;/STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;EM&gt;Alan Cooper and Robert Reiman&lt;/EM&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;About Face is a book I have contemplated reading for over 10 years but shied away because I am not a big fan of user interface work. About Face 2.0 is the second release of that book. (There is in fact a 3.0 version of this book put out in 2007.) I’m glad I finally got around to it. Like the book, I can put off UI development, but eventually I have to face reality and get it done, and get it done right. &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;The About Face author builds heavily on the most memorable aspect of another book I recommend called &lt;A href=&quot;http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0465067107&quot;&gt;&lt;SPAN style=&quot;COLOR: purple&quot;&gt;The Design of Every Day Things&lt;/SPAN&gt;&lt;/A&gt;. This central theme is that we build the user interface to reflect the user’s model of the system, not our model and definitely not the implementation model. (I have a few notes &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/9/24/3896187.html&quot;&gt;&lt;SPAN style=&quot;COLOR: purple&quot;&gt;here&lt;/SPAN&gt;&lt;/A&gt; on this.) The book stresses making the user happy which requires us understanding their model along with their wants, needs, context, and motivation.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;The writers are fanatics as you would imagine they would be to take the time to write a book on a subject obviously near and dear to their hearts. Some of their advice may seem a little impractical for the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;&lt;SPAN style=&quot;COLOR: purple&quot;&gt;common business application&lt;/SPAN&gt;&lt;/A&gt; developer, for example, cutting out people from magazines to help put faces on users. That said, this is not exactly bad advice, and very similar to the efforts Microsoft put into creating the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/1/5/2622285.html#820548&quot;&gt;&lt;SPAN style=&quot;COLOR: purple&quot;&gt;personas&lt;/SPAN&gt;&lt;/A&gt; of Mort, Elvis and Einstein. There is plenty of practical advice beyond the equivocal “user model” like trying to provide modeless feedback, not popping up windows for everything, designing for the probable case and providing for the possible, anticipating needs,&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;avoiding clutter and too much on a single window, etc, etc. Great stuff for new developers and fantastic reminders for the experienced ones. I should skim my notes from this book every time I am about to embark on some UI development. &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;BR&gt;&lt;STRONG&gt;Object Thinking&lt;/STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;EM&gt;David West&lt;/EM&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;I can’t say I would recommend this book, but I did enjoy it. I like reading about people’s opinions and experiences applying object-oriented methodologies to applications, regardless if I agree or can even relate. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;The author attempts to explain how object-oriented developers have to change their point of view when designing software to a near radical extent. I agree there has to be a point-of-view shift, but the shift he asks developers to make outside of the context of a common business application seemed too, well, too out of context. Like many OO books it suffers from OO examples that are not from the common business application, but from a real-time application like a game, or user-interface-based app like a word processor, etc. &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;I have made it clear through out my blog that I am a huge proponent of object-oriented methodologies, but &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/5/1/3659890.html&quot;&gt;&lt;SPAN style=&quot;COLOR: purple&quot;&gt;argue&lt;/SPAN&gt;&lt;/A&gt; that the standard heuristics have to be adjusted to sit well with the common business application. This author is not in the same boat as me and often refers to objects displaying themselves on user interfaces, and relying on events to link up functionality, etc. &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;The author also divides up developers into two groups: those that are agile and those that prefer big upfront engineering methods. He completely ignores the hordes of no-separation-of-concerns-hacking crowd which makes up the majority of new and junior developers. This bothered me, but he may do this on purpose as he might be assuming they would never read his book in the first place. &lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;I’m not sure who I would recommend this book to. I think the newer developer would be confused and the practical OO developer would be bemused. I assume it might be good for the strict engineering type OO developer he refers to. The book then reads like a case for agile development for that reader.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;BR&gt;&lt;STRONG&gt;Systemantics: How Systems Work and Especially How They Fail&lt;/STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;EM&gt;John Gall&lt;/EM&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;Systemantics was probably my favorite read of the year.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Like &lt;A href=&quot;http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0465067107&quot;&gt;&lt;FONT color=#800080&gt;The Design of Everyday Things&lt;/FONT&gt;&lt;/A&gt;, this book is not about software development, at least not directly. This book addresses all the things that are arguably true about &lt;EM&gt;systems&lt;/EM&gt;&lt;/EM&gt;. The book refers to large systems like government and public school systems, and medium systems like city garbage collection, and even smaller systems like families, or a system for managing a small group of employees. These systems are all set up to solve or at least manage a problem the same way we develop software systems to do the same.&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;The author refers back and forth to these common systems as he explains over 20 truisms of systems, especially large ones. Some of my favorites include:&lt;/P&gt;
&lt;UL style=&quot;MARGIN-TOP: 0in&quot; type=disc&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo2; tab-stops: list .5in&quot; class=MsoNormal&gt;First rule of systems design: do without out one if possible&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo2; tab-stops: list .5in&quot; class=MsoNormal&gt;New systems mean new problems&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo2; tab-stops: list .5in&quot; class=MsoNormal&gt;A large system produced by expanding a smaller system will not behave like the smaller system&lt;/LI&gt;
&lt;LI style=&quot;MARGIN: 0in 0in 0pt; mso-list: l1 level1 lfo2; tab-stops: list .5in&quot; class=MsoNormal&gt;Things are as they appear to be, not what they are&lt;/LI&gt;&lt;/UL&gt;
&lt;P style=&quot;MARGIN: 0in 0in 0pt&quot; class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;The book is written in a very lighthearted yet serious way which makes it easy to read, even funny. Everywhere, things are not working well and those outside of the systems that are failing are sure they could fix them if only their ideas were universally adopted. However, this book admittedly offers no solution. There is no single method to follow and all axioms are too fundamental for direct application. Rather the axioms provide clues and guidance to awareness of what makes a particular system faulty.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;The Systemantics student, understanding the risk of failure, even catastrophic failure, knows that the undertaking should only be begun where the present evil is very clear and the consequences of utter failure are no more unbearable than the original unsatisfactory situation.&amp;nbsp;&lt;o:p&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/o:p&gt;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    <category domain="http://swcses.eponym.com/blog/Books">Books</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Simple Object Pattern: Type Object</title>
    <link>http://swcses.eponym.com/blog/_archives/2009/1/5/4043573.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2009/1/5/4043573.html</guid>
    <pubDate>Mon, 05 Jan 2009 08:11:35 -0600</pubDate>
    <description>&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: Arial&quot;&gt;Intent&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Create an object that defines the kind of possibilities available for a parent object and encapsulates the attributes and methods of that type.&lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: Arial&quot;&gt;Why&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Clarity. A designer may misname an object when not realizing the concept is a type of something, the definition of something and not the actual thing. This almost always leads to the the actual thing being misnamed. &lt;/P&gt;
&lt;H3 style=&quot;MARGIN: 12pt 0in 3pt&quot;&gt;&lt;SPAN style=&quot;FONT-FAMILY: Arial&quot;&gt;Implementation Notes&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;When we realize the concept we are modeling is a type of something, we create a class called &lt;EM&gt;Something&lt;/EM&gt;&lt;/EM&gt;Type (or SomethingDef(inition)).&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Just identifying that there is such a thing as a stereotype/pattern called Type&lt;/EM&gt; helps in model design and understanding. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;Better names for classes are created and often odd inheritance relatioships&amp;nbsp;are avoided.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;A Type Object might be modeled as a &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3799003.html&quot;&gt;Value&lt;/A&gt; object or &lt;A href=&quot;http://my.eponym.com/admin/index.cgi/cmd=edit_article/id=4043573&quot;&gt;Entity&lt;/A&gt; object depending on the model.&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Example:&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;We have different kinds of vehicles: cars, trucks, vans and SUVs. Without thinking about the concept of Type objects a modeler may create a class called Vehicle that can be a Car, Truck, Van, or SUV.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Eventually they run into trouble when they want to add an attribute to a Truck that does not quite belong. They create a new class with a poor name like ActualVehicle, UsedVehicle, etc.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;The modeler may never realize that their first object is a &lt;STRONG&gt;type&lt;/STRONG&gt;&lt;/STRONG&gt; of Vehicle and should encapsulate everything related to the type, not an actual Vehicle. Their second object is the &lt;EM&gt;true&lt;/EM&gt;&lt;/EM&gt; Vehicle.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Sounds obvious but I have stumbled across designs that have done this with User objects, Event objects, and more. In the User case it resulted in an object called ClientUser which was of course not part of the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/9/24/3896187.html&quot;&gt;&lt;FONT color=#800080&gt;Universal Model&lt;/FONT&gt;&lt;/A&gt;. The Event case resulted in a second object called a Scheduled Event which one would assume was a special kind of Event until you looked under the hood and saw that the Event class was really just a &lt;EM&gt;type&lt;/EM&gt; of an Event.&amp;nbsp; Both examples created misleading models and some other poor design off-shoots simply because the concept of the Type stereotype was not implemented. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/20/3799016.html&quot;&gt;&lt;FONT color=#800080&gt;Click here to view list of all&amp;nbsp;Simple Object Patterns&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    <category domain="http://swcses.eponym.com/blog/GeneralProgrammingDesignBestPractices">General Programming &amp; Design Best Practices</category>
    
    <category domain="http://swcses.eponym.com/blog/OOStuff">OO Stuff</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Focus</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/12/4/4007053.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/12/4/4007053.html</guid>
    <pubDate>Thu, 04 Dec 2008 11:14:13 -0600</pubDate>
    <description>&lt;P&gt;&quot;Our thoughts create our reality -- where we put our focus is the direction we tend to go.” &lt;BR&gt;&amp;nbsp;Peter McWilliams &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I have often stated that &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/2/26/2766594.html&quot;&gt;&lt;FONT color=#800080&gt;a tell-tale sign&lt;/FONT&gt;&lt;/A&gt; of a data-centric application design is designing the data storage first. Obviously database tables are not part of the problem domain, they are implementation details. Designing tables first means I am concerning myself with how I am going to implement something. I am no closer to action, action that solves a problem or even better, gets me closer to understanding the problem and its obstacles better.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;What I should be doing is learning what is involved in the problem and what is responsible for doing what, responsible for figuring out what.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;So we shun the table design and focus on business objects because they are the &lt;EM&gt;whats&lt;/EM&gt;, not the &lt;EM&gt;hows&lt;/EM&gt;!&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;However, here is where I often still make a mistake. I end up focusing on what the code will look like, the structure of it all, the objects I am &lt;EM&gt;sure&lt;/EM&gt; are involved, the objects that will contain this and the objects that will contain that. In the end, this approach is not much better than the data-table-design-first approach as the focus is still on &lt;EM&gt;how&lt;/EM&gt; things will be organized and implemented without any real concern with&amp;nbsp;solving the problem. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Those in the test driven design/development (TDD) club (which I am not exactly a full blown member) realize this and propose a solution that requires we write tests first. This forces us to focus in on responsibility and let the need for certain things to get calculated and determined drive what objects will exist. &lt;STRONG&gt;After&lt;/STRONG&gt; that happens we can then figure out &lt;EM&gt;how&lt;/EM&gt; those objects will do their calculations and determinations, and we will figure out &lt;EM&gt;how&lt;/EM&gt; those objects will be persisted.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The truth is that the first step is to understand the domain, or in the case of a new feature we need to understand a subset of the domain.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Often experienced developers can envision what objects will be required to support something after they get a good understanding of it. In the common business application there is often a correlation between an object and a table so one can argue we “know” what tables will be needed. Often we are right, or it at least it feels like we have guessed right because we make it work with what we have already created anyway. We build ourselves an object model or data schema box without realizing it is keeping us from thinking &lt;EM&gt;outside the box.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: &#39;Times New Roman&#39;; mso-fareast-font-family: &#39;Times New Roman&#39;; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA&quot;&gt;So when we &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/5/3961207.html&quot;&gt;&lt;FONT color=#800080&gt;think it through and write something down&lt;/FONT&gt;&lt;/A&gt; before getting started, make sure you think through the responsibilities required of objects and choose objects from possible candidates in the domain. Figuring out what exactly is going to happen (not how) and who should do it (what object) is your priority, your focus.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;When every responsibility is accounted for, then you have something that solves a problem. A data table or an object with data does not handle a responsibility, they do not solve problems, they only support the effort. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    <category domain="http://swcses.eponym.com/blog/CodeProject">CodeProject</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally Speaking...</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/18/3983539.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/18/3983539.html</guid>
    <pubDate>Tue, 18 Nov 2008 08:24:12 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is an index of &quot;Generally Speaking...&quot; entries that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal dir=ltr style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/4/3961276.html&quot;&gt;The best software is never written&amp;nbsp;&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal dir=ltr style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/5/3961207.html&quot;&gt;Write something down&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/5/3964294.html&quot;&gt;Practice, practice, practice&amp;nbsp;&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal dir=ltr style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/6/3961421.html&quot;&gt;It is not about how fast you can get something done&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/6/3961457.html&quot;&gt;No spaghetti or balls of mud&amp;nbsp;&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal dir=ltr style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/10/3961239.html&quot;&gt;There are at least 3 layers to every application&amp;nbsp;&lt;/A&gt;&lt;/P&gt;
&lt;P class=MsoNormal dir=ltr style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/11/3961417.html&quot;&gt;Favor theory over rules&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/12/3961431.html&quot;&gt;Programming a computer is easy&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/13/3961398.html&quot;&gt;Everyone writes hacks&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/13/3961261.html&quot;&gt;Business-Object-Oriented should be standard operating procedure&lt;/A&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;- &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/14/3961284.html&quot;&gt;Make the user more effective&lt;/A&gt; &lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...Make the user more effective</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/14/3961284.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/14/3961284.html</guid>
    <pubDate>Fri, 14 Nov 2008 16:37:28 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/18/3983539.html&quot;&gt;&quot;Generally Speaking...&quot; entries&lt;/A&gt; that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;Applications (especially the user interface portion) should serve the user by making the user more effective, not more flexible. We have the tendency to try to create user interfaces that allow a user to do everything, have full control. At worst developers&amp;nbsp;build an application as just a front end to a database essentially giving the user a &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/5/3/1931065.html&quot;&gt;database table editor&lt;/A&gt;.&amp;nbsp;If that&#39;s all we were meant to do we would all be&amp;nbsp;using Microsoft Access to create database front-ends. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;Software&amp;nbsp;should be a tool to help users do their job better. This requires that we work hard to understand their job. We need to gain understanding beyond the tasks they must complete and instead strive to&amp;nbsp;understand their goals. This may sound a little touchy-feely but in the end it is really about learning the user&#39;s business and creating an application that makes the user more effective at their job.&amp;nbsp; Replacing a file cabinet with a computerized file cabinet is not application development, it&#39;s called shifting the burden. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...Business-Object-Oriented should be standard operating procedure</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/13/3961261.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/13/3961261.html</guid>
    <pubDate>Thu, 13 Nov 2008 17:41:33 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/18/3983539.html&quot;&gt;&quot;Generally Speaking...&quot; entries&lt;/A&gt; that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;Create an &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/9/24/3897411.html&quot;&gt;object model that models the business&lt;/A&gt;. Put business logic inside the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/7/18/3798962.html&quot;&gt;objects&lt;/A&gt;, put process logic inside the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/3/21/3594107.html&quot;&gt;services&lt;/A&gt;, and put implementation code in utility classes.&amp;nbsp;Life as a business application developer gets immeasurably easier when you follow these simple, flexible, and technology-independent&amp;nbsp;patterns.&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...Everyone writes hacks</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/13/3961398.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/13/3961398.html</guid>
    <pubDate>Thu, 13 Nov 2008 08:19:03 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/18/3983539.html&quot;&gt;&quot;Generally Speaking...&quot; entries&lt;/A&gt;&amp;nbsp;that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;Everyone has to write a hack from time to time thanks to time constraints and other imposing factors.&amp;nbsp;And by hack I mean code that we know is way less than perfect, &lt;A href=&quot;http://en.wikipedia.org/wiki/Code_smell&quot;&gt;smells bad&lt;/A&gt; but left alone, or a change&amp;nbsp;in a model that is much different than maybe the database that supports the application.&amp;nbsp;I often hack together methods on an object with full knowledge that my tests will bring out its dark side and help me refactor it later. What separates the masters from the merely competent is how hacks are written and what &lt;SPAN style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: &#39;Times New Roman&#39;; mso-fareast-font-family: &#39;Times New Roman&#39;; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA&quot;&gt;happens afterwards&lt;/SPAN&gt;.&amp;nbsp; &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;When I stumble over my own hacks from a year ago I am reminded why I am not yet the master I wish to be.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;Writing hacks should take place as deep as possible in the application. When we do write a hack we need to put the hack as deep in the code as possible so no code above it ever has to worry about the same issue again. Unfortunately some of the most hacked up&amp;nbsp;applications have no choice but to implement hacks right in the user interface, the absolute last place where you want to do it.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;It is too easy to just throw up our hands and decide we&#39;ll just have to hack something together so it works.&amp;nbsp; When a hack is written it should be &lt;SPAN style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: &#39;Times New Roman&#39;; mso-fareast-font-family: &#39;Times New Roman&#39;; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA&quot;&gt;officially &lt;/SPAN&gt;documented and&amp;nbsp;the fix should be added to the top of the to-do list for the next release.&amp;nbsp;&amp;nbsp;Any and all implications to the model must be understood by all stakeholders.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;No&lt;/SPAN&gt;&amp;nbsp;&lt;A href=&quot;http://www.sjvgreens.org/broken.shtml&quot;&gt;&lt;FONT color=#800080&gt;Broken Window Syndrome&lt;/FONT&gt;&lt;/A&gt;!&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...Programming a computer is easy</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/12/3961431.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/12/3961431.html</guid>
    <pubDate>Wed, 12 Nov 2008 08:06:44 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/18/3983539.html&quot;&gt;&quot;Generally Speaking...&quot; entries&lt;/A&gt;&amp;nbsp;that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in&quot;&gt;Programming a computer is easy, productive and clear communication is very hard. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in&quot;&gt;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/9/24/3896187.html&quot;&gt;Work on the latter&lt;/A&gt;. &amp;lt;-- Universal Model&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in&quot;&gt;&lt;A href=&quot;http://www.amazon.com/Object-Oriented-Analysis-Applications-Addison-Wesley-Technology/dp/020189551X&quot;&gt;Work on the latter.&lt;/A&gt;&amp;nbsp;&amp;lt;-- &lt;SPAN id=btAsinTitle&gt;Object-Oriented Analysis and Design with Applications [Booch]&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in&quot;&gt;&lt;A href=&quot;http://www.mindtools.com/CommSkll/CommunicationIntro.htm&quot;&gt;Work on the latter.&lt;/A&gt;&amp;nbsp;&amp;lt;-- Communication Skills 101&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in&quot;&gt;&lt;A href=&quot;http://www.khake.com/page66.html&quot;&gt;Work on the latter.&lt;/A&gt;&amp;nbsp;&amp;lt;-- Communication Skills 102 . . .&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in&quot;&gt;&lt;A href=&quot;https://www.google.com/accounts/NewAccount?service=blogger&amp;amp;continue=https%3A%2F%2Fwww.blogger.com%2Floginz%3Fd%3D%252Fcreate-blog.g%26a%3DADD_SERVICE_FLAG&amp;amp;hl=en&amp;amp;sendvemail=true&amp;amp;followup=https%3A%2F%2Fwww.blogger.com%2Floginz%3Fd%3D%252Fhome%26a%3DSERVICE_ONLY&amp;amp;naui=8&quot;&gt;Work on the latter.&lt;/A&gt;&amp;nbsp;&amp;lt;-- Start thinking out loud about what you think you know&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level2 lfo1; tab-stops: list 1.0in&quot;&gt;&lt;A href=&quot;http://www.amazon.com/Difficult-Conversations-Discuss-what-Matters/dp/014028852X&quot;&gt;Work on the latter.&lt;/A&gt;&amp;nbsp;&amp;lt;-- Difficult Conversations: How to Discuss what Matters Most [Stone]&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...Favor theory over rules</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/11/3961417.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/11/3961417.html</guid>
    <pubDate>Tue, 11 Nov 2008 08:10:35 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &quot;Generally Speaking...&quot; entries that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;Favor theory, general methods, and the &lt;EM&gt;reasons why&lt;/EM&gt; over rules, frameworks, and &lt;EM&gt;how things are done.&lt;/EM&gt;&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;It is &lt;STRONG&gt;not&lt;/STRONG&gt; about how test-driven, or agile, or extreme, or object-oriented, or domain-driven, or feature-driven, or procedural, or [fill in the blank] design and development is done, it is &lt;EM&gt;why&lt;/EM&gt;. Understand &lt;EM&gt;why&lt;/EM&gt; and you can successfully apply the best practices in your own context.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in; mso-list: l0 level1 lfo1&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;For the life of me I cannot find the source of this. However, years ago a book was written by some CEO who turned a failing corporation around to make it very successful.&amp;nbsp; Years after that the author discovered criticism for his book as the methods he described in his book were not proving successful for other CEOs. In speaking engagements the author would later address the naiveté of people who thought the same things would work for them. Readers failed to understand the &lt;EM&gt;why&lt;/EM&gt; of what the CEO did. The bungling CEOs needed to comprehend the why and then come up with solutions for their own environment, their own context. &lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...There are at least 3 layers to every application</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/10/3961239.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/10/3961239.html</guid>
    <pubDate>Mon, 10 Nov 2008 08:10:09 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &quot;Generally Speaking...&quot; entries that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;At a minimum, implement the most basic 3 layers of code (Presentation, Application, Data Access), even if they are not necessarily &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/10/12/3287884.html&quot;&gt;&lt;FONT color=#800080&gt;tiered&lt;/FONT&gt;&lt;/A&gt;. Anything else is &lt;A href=&quot;http://en.wikipedia.org/wiki/Big_ball_of_mud&quot;&gt;muddy&lt;/A&gt; and has no place in professional development of the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;Separation of concerns is &lt;STRONG&gt;the most basic&lt;/STRONG&gt; axiom of good development. Simple organization like this is the least you can do to help create maintainable code. &lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...No spaghetti or balls of mud</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/6/3961457.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/6/3961457.html</guid>
    <pubDate>Thu, 06 Nov 2008 16:12:17 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/18/3983539.html&quot;&gt;&quot;Generally Speaking...&quot; entries&lt;/A&gt; that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;No spaghetti, no balls of mud, no permanent hacking&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Signs your application might be a plate of spaghetti, ball of mud, or permanent hack…&lt;/P&gt;
&lt;UL style=&quot;MARGIN-TOP: 0in&quot; type=disc&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;When you are faced with fixing a subsystem, object, function, or small chunk of code you often feel it would be easier to rewrite it.&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;When a business rule changes you are not sure where all you have to make the change. This can be a simple as “Let’s make sure all people’s names are displayed like this…” or as serious as “Let’s change all calculations done with dollar amounts to round like this…”&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;The objects from your “business” layer don’t have any &quot;business&quot; methods&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;Code routines have little separation of concerns and tend to be large&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;You routinely have objects with more than 10 properties&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;You have code that exists a year after you said it was just a temporary fix&lt;/LI&gt;
&lt;LI class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;You have no layers in your code, no discernable architecture.&lt;/LI&gt;&lt;/UL&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...It is not about how fast you can get something done</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/6/3961421.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/6/3961421.html</guid>
    <pubDate>Thu, 06 Nov 2008 08:26:38 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/18/3983539.html&quot;&gt;&quot;Generally Speaking...&quot; entries&lt;/A&gt; that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;It is&amp;nbsp;not about the speed to completion, it&amp;nbsp;&lt;STRONG&gt;&lt;EM&gt;is&lt;/EM&gt;&lt;/STRONG&gt; all about understanding and maintaining code which affects the overall speed of the application’s lifecycle. We deliver quickly by delivering little bits at a time with each little bit being well-built, well-tested, and easily changeable. Those bits being objects that like Legos can be used to build and change many different things in our application domain with great ease.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in&quot;&gt;You should be able to check your code in at the end of the day without compilation problems. If you cannot then you are probably not delivering little bits of well-built, well-tested, and easily changeable code.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;Know that your application will spend most of its life in maintenance and extension. The first build is only the beginning. Knowing this, build small with quality at every step. The first step to quality is a &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/10/12/3287884.html&quot;&gt;&lt;FONT color=#800080&gt;separation&lt;/FONT&gt;&lt;/A&gt; of &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2007/10/10/3273095.html&quot;&gt;&lt;FONT color=#800080&gt;concerns&lt;/FONT&gt;&lt;/A&gt;.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in&quot;&gt;Do not engage in premature optimization &lt;STRONG&gt;or&lt;/STRONG&gt; generalization.&amp;nbsp; Worry about speed when it’s actually a problem. Make your code more flexible and generic when that flexibility is required. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in&quot;&gt;Applications should evolve not spontaneously arrive. The metaphor of building an application being like engineering serves us well to a point. However, I cannot go to the mall where an escalator is installed and widen it by two inches to allow wheelchair access, but a change to the width attribute of an object can be done, tested, and released in an hour. In other words, the &lt;A href=&quot;http://en.wikipedia.org/wiki/Big_Design_Up_Front&quot;&gt;big design up front&lt;/A&gt; required for engineering physical things does not apply to the engineering of software.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list 1.0in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Write as much test code as you can that does not require human interaction. This allows you to change and extend things fast and with confidence.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...Practice, practice, practice</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/5/3964294.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/5/3964294.html</guid>
    <pubDate>Wed, 05 Nov 2008 16:27:08 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/18/3983539.html&quot;&gt;&quot;Generally Speaking...&quot; entries&lt;/A&gt;&amp;nbsp;that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The only thing worse than bad development practices, is no development practices. Developers can debate best practices ad infinitum, ad nauseam. However, even disagreement does not excuse having no practices at all. Although painful, it is worth seeing what a development team can agree on and sticking to as many best practices as possible. Doing this makes working on each others’ code much easier, let alone just understanding it. Furthermore best practices can help new developers avoid mistakes if they follow practices set up by the senior developers. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;To avoid pointless disagreement, I have found it works best for a development team to figure out the least common denominator so to speak. The developers need to whittle down the debate to the point of intent and then ignore personal preference. For example, two development teams here quibbled over whether or not variable scope identification should be a prefix or a suffix on a variable. However, that debate was&amp;nbsp;mostly a personal preference debate. What was most important is that both teams recognized the usefulness and elegance of scope identification and did &lt;STRONG&gt;something&lt;/STRONG&gt;. They agreed they would not mix and match, but no one would declare a company-wide edict. Everyone is happy.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;It is also worth staying mindful of what is personal preference and what truly has benefits and drawbacks.&amp;nbsp;&amp;nbsp;&amp;nbsp;When you encounter something that makes your stomach churn but only because of personal preference, you can hold off speaking up and save your debate-points for something that really matters. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...Write something down</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/5/3961207.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/5/3961207.html</guid>
    <pubDate>Wed, 05 Nov 2008 08:03:39 -0600</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I often find myself in conversations with developers on &lt;A href=&quot;http://www.experts-exchange.com/&quot;&gt;Experts Exchange&lt;/A&gt;, blogs or forums saying, “Generally speaking…blah, blah, blah.”&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Where &lt;EM&gt;blah, blah, blah&lt;/EM&gt; is replaced by general rules of thumb in regards to development.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;This is one entry in a simple line of &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/11/18/3983539.html&quot;&gt;&quot;Generally Speaking...&quot; entries&lt;/A&gt;&amp;nbsp;that will provide an easy link for me to point to and of course supplement my poor memory.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;EM&gt;As always this is in regards to the &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/9/19/2341371.html#CommonBizAppDef&quot;&gt;common business application&lt;/A&gt;.&lt;/EM&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt 0.25in&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking...&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;Regardless of how simple the new implementation or change you are about to make is…write something down.&amp;nbsp;At my office, a particular developer is fond of saying, “&lt;EM&gt;Someone&lt;/EM&gt; needs to think it through and write it down.” I couldn’t agree more.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; mso-list: l0 level1 lfo1; tab-stops: list .5in&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; tab-stops: list .5in&quot;&gt;On the smallest level you comment and pseudo code your way through the solution before writing code. Taken a step further you can &lt;SPAN style=&quot;FONT-SIZE: 12pt; FONT-FAMILY: &#39;Times New Roman&#39;; mso-fareast-font-family: &#39;Times New Roman&#39;; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA&quot;&gt;scratch &lt;/SPAN&gt;notes on the back of a&amp;nbsp;napkin or&amp;nbsp;have whiteboard discussions with other developers. But rarely is there a change so insignificant that you don’t at least write down in plain English what you think you are about to do.&amp;nbsp; If you cannot say it in plain English, you cannot code it.&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Generally speaking...The best software is never written</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/11/4/3961276.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/11/4/3961276.html</guid>
    <pubDate>Tue, 04 Nov 2008 12:27:11 -0600</pubDate>
    <description>The best code (easiest to maintain and has the least amount of bugs) is the code you never write. So you only build the simplest thing that provides value, careful never to add bells and whistles to an unstable code base. </description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>An encapsulation misunderstanding</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/10/21/3940876.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/10/21/3940876.html</guid>
    <pubDate>Tue, 21 Oct 2008 13:36:16 -0500</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;In a discussion outside of this blog a developer suggested to me that encapsulation was kind of pointless in light of today’s more practiced methodologies. He said that we hide data behind a class so that if the data changed it would not affect anyone using the class. However, because he works on an agile development team with an iterative development cycle that lives and breathes changes, encapsulation was of little concern to him. His application is self-contained at his company so he is aware of all the client code. A simple change to a class’ interface and the compiler will point out all the places affected. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I explained that I too am in an environment where I have control over all clients of the object model so the affects of a simple data change can be easily handled. The encapsulation misunderstanding here is that exposing data is &lt;STRONG&gt;not&lt;/STRONG&gt; the problem, or at least not the direct problem. &lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;EM&gt;Writing logic against exposed data&lt;/EM&gt; is what leads to duplicated logic, difficult and incomplete tests, and a fragile design. I have mentioned &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/5/1/3659890.html#WhatDoIDo&quot;&gt;previously in this blog&lt;/A&gt; that at the end of the day my business objects do expose their data, more than would be ideal for sure. The solutions required to prevent exposure are often just not that practical. What is of the utmost importance is that the correct reasons are understood for not abusing the exposed data so any abuse is less likely to happen. The less this is understood and enforced, the more dangerous exposing object data is.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;If you are on a team of OO developers very keen to this understanding and code reviews or other practices are in place, then you could expose all your objects’ data without much fear of fragility. On the other hand, if you are surrounded by developers of varying OO-awareness then more ought to be done to hide object data so logic is not accidentally misplaced.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    <category domain="http://swcses.eponym.com/blog/OOStuff">OO Stuff</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Is the Business Object Dead?</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/10/17/3933540.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/10/17/3933540.html</guid>
    <pubDate>Fri, 17 Oct 2008 08:14:31 -0500</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;By my estimations (and minor research), most common business applications being written today are in Java, VB.Net and C#.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;The languages are similar in many respects, not the least of which is that they are all object-oriented languages. I am aware that many if not &lt;EM&gt;most&lt;/EM&gt; business applications written in these languages ignore 40+ years of object theory and proven layered architecture benefits on their way to a lovely &lt;A href=&quot;http://en.wikipedia.org/wiki/Big_ball_of_mud&quot;&gt;&lt;FONT color=#800080&gt;big ball of mud&lt;/FONT&gt;&lt;/A&gt;. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;However, there are &lt;A href=&quot;http://www.objectmentor.com/&quot;&gt;legions &lt;/A&gt;of developers who &lt;EM&gt;do&lt;/EM&gt; try to tap into the benefits of using an object-oriented design and a layered architecture to produce robust applications that are easy to build, understand, change, and maintain. When they do so they will make a decision as to whether an object representing a business concept will have methods for maintenance-related code or whether it will have methods that handle business logic. Rarely do objects have both as the two needs often lend themselves to different designs. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;In the past year or so I have come to the surprising realization that most developers seem to make the methods of their objects maintenance related. The objects tend to be mutable bags of data that act only as a conduit to database tables for moving data in and out, business seems like an afterthought.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Frameworks like nHibernate and CSLA promote this kind of design in much the way &lt;A href=&quot;http://msdn.microsoft.com/en-us/library/system.windows.forms.datagrid(VS.71).aspx&quot;&gt;Microsoft&lt;/A&gt; does which is ironic since users of nHibernate and other O/R mapping tools tend to be &lt;A href=&quot;http://weblogs.asp.net/rosherove/archive/2007/06/04/alt-net-alternative-tools-and-approaches-to-mainstream-net.aspx&quot;&gt;&lt;FONT color=#800080&gt;anti-Microsoft developers&lt;/FONT&gt;&lt;/A&gt;. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Gone or least fading is the idea of objects that represent business entities actually having only methods that relate to the business of the object, in other words, they are true &lt;EM&gt;business objects&lt;/EM&gt;.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;However, I’m not sure how an object-oriented developer whose emphasis is modeling a business in code rationalizes any other kind of design. &lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    <category domain="http://swcses.eponym.com/blog/GeneralProgrammingDesignBestPractices">General Programming &amp; Design Best Practices</category>
    
    <category domain="http://swcses.eponym.com/blog/OOStuff">OO Stuff</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
  <item>
    <dc:creator>Joseph Reddy</dc:creator>
    <title>Obstacles to The Universal Model</title>
    <link>http://swcses.eponym.com/blog/_archives/2008/9/24/3896187.html</link>
    <guid>http://swcses.eponym.com/blog/_archives/2008/9/24/3896187.html</guid>
    <pubDate>Wed, 24 Sep 2008 19:06:01 -0500</pubDate>
    <description>&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The classic design book from 1988 by Donald Norman, &lt;A href=&quot;http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0465067107&quot;&gt;The Design of Everyday Things&lt;/A&gt;, is not about designing software, but rather designing any thing that must be used by a person. The author makes the point that a good design is easier to use, easier to learn, and simply better when the thing’s design reflects the user’s view of how the thing works, or in other words: the user’s model.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;The basic idea is that for any given thing there is the user’s conceptual model and the implementation model. The implementation model is exactly how a thing works or in other words, how it is implemented.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Poor design either directly reflects implementation which is often no concern of the user, or the design reflects some model which is not the implementation or user’s model.&amp;nbsp;A door that needs to be pushed designed with a bar that suggests you should pull it is an example that doesn&#39;t match either model.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;?xml:namespace prefix = o ns = &quot;urn:schemas-microsoft-com:office:office&quot; /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Since software is just another designed thing, the 1995 book &lt;A href=&quot;http://www.amazon.com/About-Face-Essentials-Interaction-Design/dp/B001C323BI&quot;&gt;About Face&lt;/A&gt; was written specifically to address this issue in regards to building applications. Like the authors of many object-oriented books, these authors extol the virtues of building applications that reflect the users’ real-life view of the things involved. Doing this along with reflecting a singular language to describe the real-life views is what Domain-driven design methodologies and the book &lt;A href=&quot;http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215&quot;&gt;Domain-Driven Design&lt;/A&gt; refer to as creating a ubiquitous language.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;When it comes to the common business application I firmly believe that an object-oriented solution based on one model that the stakeholders and developers agree on is the best way to build easily-understood and easily-maintained business applications. I like to refer to that common model as the Universal Model.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;The universal model is not the user’s model exactly or the implementation model, but rather a model that gestates over time based on the cooperation of stakeholders and developers. The success of that model depends on the cooperation and open-mindedness of both the developers and the stakeholders. Though I have found plenty of literature on how &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/9/24/3897411.html&quot;&gt;&lt;FONT color=#800080&gt;wonderful&lt;/FONT&gt;&lt;/A&gt; a combo of OO development, &lt;A href=&quot;http://en.wikipedia.org/wiki/Model_Driven_Engineering&quot;&gt;model-driven design&lt;/A&gt;, and a universal model is, there is little about just how hard it can be to come up with that model. Here are some of my notes on the obstacles to achieving a good Universal Model:&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Obstacle 1:&amp;nbsp; Geeks &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Obstacle 2:&amp;nbsp; Players don’t want to play&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Obstacle 3:&amp;nbsp; Compromise&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Obstacle 4:&amp;nbsp; Abstract Art&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Obstacle 5:&amp;nbsp; Experts and Contextual Understanding&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Obstacle 1: Geeks&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Generally speaking, software developers are geeks who tend to see the world in 0s and 1s. By nature they tend to be interested in how things work and how to make things work. To them the implementation details are the real sexy details of an application (which might explain why many geeks do not care much for user interface development).&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Putting a universal model on top of their elegant implementation model can feel unnatural and even painful for a geek.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;The worst is an egotistical stubborn geek who believes that users just need to understand what is really going on because the universal model is the implementation model. The geek sees the implementation model as the only real model because it is true, clean, precise, logical, not-gray, 0s and 1, etc, etc,.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Geeks have to be made aware and then continually reminded who they are writing software for and who decides the success and relevance of their product.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Geeks must understand that communication will play a huge part in the success of their development effort and we cannot be hindered by using two different dialects to describe the same system. Geeks can have trouble sticking to the universal model, even when they agree to the concept. Implementation details bleed into discussions, user interfaces, and other public access points &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/9/24/3896187.html#paps&quot;&gt;&lt;FONT color=#800080&gt;[1]&lt;/FONT&gt;&lt;/A&gt; to the model. We have to all be vigilant to catch each other “leaking implementation.&quot;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Obstacle 2:&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Players don’t want to play&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The software application is the universal model.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;The universal model is produced by both the stakeholders and the developers.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Ergo the developers and stakeholders design the software application.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Ideally both parties will agree to this concept and work hard to achieve the universal model. However, often both geeks and stakeholders won’t play along.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Stakeholders start tuning out non-playing geeks when they talk of arrays, tables, data source grids, and referential integrity.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;And then there are stakeholders who are used to the old way of developing software that entails writing up what you want and then getting an application 6 months or more&amp;nbsp;later.&amp;nbsp; Regardless of the poor software they have gotten in the past, these stakeholders are not interested in being active participants in the design of better software.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;As with so many software development gotchas, an ounce of prevention is worth a pound of cure.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;From the beginning stakeholders have to be sold on the idea that they are designing the software by crafting the universal model. When they use terms that are not in the model, the developers should not assume anything and make the stakeholder clarify right there on the spot.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;Even when the stakeholders don’t play a long, it benefits us to try to figure out their conceptual model so when they speak in business-lingo we have less translation to do. When geeks won’t play along it behooves the team to move them deeper into the code and out of the public access points &lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2008/9/24/3896187.html#paps&quot;&gt;&lt;FONT color=#800080&gt;[1]&lt;/FONT&gt;&lt;/A&gt;. This allows them to work blissfully away on implementation code. When a geek that is not playing along speaks up in a meeting it might be worth restating what was said in terms of the universal model to make sure everyone is clear. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Obstacle 3: Compromise&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Once upon a time I considered the user model the model that I had to match my design against. I would chastise myself and other developers who tried to introduce new terms into the universal model that did not seem to exist before. For example, when designing a system that managed when documents can be viewed I balked at a new concept called Viewability Specification. I argued that no one says that now or has before, and a user does not need to know about those kind of details. However, the concept did exist before; it had just never been labeled. Having a universal model requires that we label things and agree on how we will refer to these things. On the flip side, I had also been too strict&amp;nbsp;about letting stakeholders use words that did not fit the reality of the design.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;For example, in a system that processes mass amounts of email, the users referred to the people who were sent emails as&amp;nbsp;recipients. However, the geek in me pointed out that because of delivery problems not every person is truly a recipient of an email. So we used the term Addressee instead. Stupid. No one used that word, everyone continued to call them recipients, and the universal model was rendered pointless.&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;This compromise also means that stakeholders will have to understand some basic object modeling concepts. In a nutshell they need to understand that every thing in the system ties to an object and an object can figure things out based on what it knows. Some objects&#39; state is stored so it can be used again&amp;nbsp;even after a computer is turned off and back on. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;We have to compromise on the model. There are times when developers will have to accept user-speak when it is more abstract than we would like, and users will have to refer to concepts with new terms not used before. Stakeholders and geeks alike can be anxious about the idea of stakeholders speaking in terms of objects, but the concept is so very simple and non technical.&amp;nbsp; The truth is that this can only go so far. Stakeholders might be interested in some of the more gory design details but&amp;nbsp; they will never want (or&amp;nbsp;should have)&amp;nbsp;to grasp the concepts of interfaces, classes, inheritance, or any other gobbledygook. So try as we might, 0% translation between real life and the model is not possible. Do your best, compromise where needed.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;STRONG&gt;Obstacle 4: Abstract Art&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Common disagreements in OO design often are in regard to levels of abstraction. What feels perfect for one developer is too abstract or&amp;nbsp;too in depth for another. The universal model sits somewhere among the many&amp;nbsp;levels of abstraction. The discussions about what is part of the universal model and what is deeper implementation is fraught with debatable material. Trying to discern whether a nuance needs to matter to a user can be tough. Most nuances are small, so on an individual basis they are easy to let slip into the model, however they do&amp;nbsp;&lt;A href=&quot;http://swcses.eponym.com/blog/_archives/2006/7/21/2147956.html&quot;&gt;add up over time&lt;/A&gt; and can make the model too complex. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;We have to ask ourselves what matters to the public consumer and producers of a concept in our model. Anything that does not matter does not need to be part of the universal model. For example, in the document system mentioned earlier we implemented 2 kinds of documents for various technical reasons. However, when consumed the user does not care what kind of document it is only that it contains information. When produced the administrative user could make changes that technically change it from being one kind of a document to the other, however, the kind did not matter to the user. To them it was just a Document with slightly different attributes.&lt;SPAN style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/SPAN&gt;So the universal model only contained the Document even though the implementation behind the scenes had two specialized document objects. This problem can also be solved by putting extra notes in the model for anything that is debated. In the document example there was only a Document in the &quot;index&quot; of the universal model. However, in the fine print there were extra notes added for anyone who cared that explained the 2 specialized docs. &lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&lt;STRONG&gt;Obstacle 5: Experts and Contextual Understanding&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/P&gt;&lt;o:p&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;Business experts and developers deep into a model often can give one word 50 different meanings. When their heads are so cleanly wrapped around the problem domain they can get to the point where they don&#39;t care what you call the Widget, they know what you mean based on the slightest context. However, there will be those involved in the project, maybe new to the project or a maintenance developer later, that will be confused by the willy nilly use of terms. We have to fight that &quot;don&#39;t care&quot; attitude. During design we don&#39;t have to dwell too much on it or get hung up on it, but a clean, clear, concise model needs to be&amp;nbsp;a conscious effort of the development team.&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&amp;nbsp;&lt;/P&gt;&lt;/o:p&gt;
&lt;DIV class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt; TEXT-ALIGN: center&quot; align=center&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-WEIGHT: normal&quot;&gt;
&lt;HR align=center width=&quot;100%&quot; SIZE=2&gt;
&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/DIV&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;COLOR: black&quot;&gt;[1] Public Access Points of an Application&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;I use this term to refer to the user interfaces and all public objects and public interfaces of the system. This high-level code benefits from being the most abstract and an exact match of the universal model.&lt;/P&gt;

&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;!-- article --&gt;&lt;!--
&lt;div class=&quot;articlePrintLink&quot;&gt;&lt;a href=&quot;xx&quot;&gt;&lt;img src=&quot;/_images/print.gif&quot; border=&quot;0&quot; width=&quot;20&quot; height=&quot;20&quot; alt=&quot;Print this article&quot;&gt;&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;xx&quot;&gt;Print Article&lt;/a&gt;&lt;/div&gt;
--&gt;&lt;/P&gt;</description>
    
    <category domain="http://swcses.eponym.com/blog">Main Page</category>
    
    
    <ent:cloud ent:href="">
    
    <ent:topic ent:id="OO" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=OO">OO</ent:topic>
    
    <ent:topic ent:id="design" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=design">design</ent:topic>
    
    <ent:topic ent:id="analysis" ent:href="http://swcses.eponym.com/blog/cmd=search_keyword/k=analysis">analysis</ent:topic>
    
    </ent:cloud>
    
    
    
  </item>
  
</channel>
</rss>
