<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>carriagereturn.org</title><link>http://www.carriagereturn.org</link><description>carriagereturn.org - Horizontal Refresh</description><language>en</language><lastBuildDate>Mon, 20 Jul 2009 04:10:06 -0000</lastBuildDate><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/carriagereturn" type="application/rss+xml" /><feedburner:emailServiceId>carriagereturn</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>architecture</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/tqGgMNCrndM/</link><description>*Layers*
&lt;br/&gt;
&lt;br/&gt;Well-architected systems tend to be organized in multiple layers depending only on 'lower' layers. The lower layers contain generic functions that are used by the more specific functions in the upper layers. Forcing one-way dependencies between upper and lower layers avoids circular dependencies between components. It also clarifies the process of unit and integration testing: Test the lower levels first and build up. The higher levels can be tested with mocks / stubs replacing the lower layers.
&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/tqGgMNCrndM" height="1" width="1"/&gt;</description><pubDate>Mon, 20 Jul 2009 04:10:06 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/49/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/49/</feedburner:origLink></item><item><title>design</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/P9s-XGu99Rg/</link><description>Think like the user:
&lt;br/&gt;
&lt;br/&gt;It takes a lot more work to understand the other person than it takes to understand you. 
&lt;br/&gt;
&lt;br/&gt;You might say, "I have these two things together so I will let the user (the person using the API) manipulate them." But that user didn't say, "Hey, I want to manipulate these two data structures!" Often the user is saying, "I want to get this result." If users could get a result without manipulating the data structures, they'd be happy as clams. 
&lt;br/&gt;If you can make it more natural for them to get that result, the fact that you have to go through 10 times as much work to access those data structures is good; it means you are providing value. Many people are much more likely to think about what they have in hand and what they can do. They think from the implementation out, instead of thinking from the user in.
&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/P9s-XGu99Rg" height="1" width="1"/&gt;</description><pubDate>Fri, 17 Jul 2009 04:10:06 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/48/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/48/</feedburner:origLink></item><item><title>unit testing</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/wAiTD-X8g2I/</link><description>Unit Testing:
&lt;br/&gt;
&lt;br/&gt;We want to eliminate outside dependencies as much as possible when testing a single component in isolation.
&lt;br/&gt;
&lt;br/&gt;Use Stubs and Mock objects to build a harness around the component. Working test first, and designing our components to be testable in isolation significantly reduces their coupling with each other. Tests are first class clients of the code, so the code often changes in response to the requirements of the tests. The tests are the first client of the code, the second is usually the application, and if re-used there can be many other clients.
&lt;br/&gt;
&lt;br/&gt;See DependencyInversionPrinciple
&lt;br/&gt;
&lt;br/&gt;Testing at the unit level ensures that when integration begins we can have confidence in the functinality of each component being integrated.
&lt;br/&gt;
&lt;br/&gt;Always test each application with xUnit (http://www.junit.org), whether it is part of a bigger system, or standalone.
&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/wAiTD-X8g2I" height="1" width="1"/&gt;</description><pubDate>Thu, 16 Jul 2009 04:10:01 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/47/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/47/</feedburner:origLink></item><item><title>design smell</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/5r2NRNt7gWw/</link><description>Symptoms of a bad architecture / rotting design:
&lt;br/&gt;
&lt;br/&gt; *Rigidity*
&lt;br/&gt;
&lt;br/&gt; Rigidity is the tendency for software to be difficult to change even in simple ways. Every change causes a cascade of subsequent changes in dependent modules. What begins as a simple two day change to one module grows into a multi-week marathon of change in module after module as engineers chase the thread of the change through the application.
&lt;br/&gt;
&lt;br/&gt; *Fragility*
&lt;br/&gt;
&lt;br/&gt; Fragility if the tendency of software to break in many places every time it is changed. Often the breakage occurs in areas that have no conceptual relationship with the area that was changed.
&lt;br/&gt;
&lt;br/&gt; *Immobility*
&lt;br/&gt;
&lt;br/&gt; Immobility is the inability to reuse software from other projects or from parts of the same project. It often happens that one engineer will discover that he needs a module that is similar to one that another engineer wrote. However it also often happens that the module in question has too much baggage that it depends on.
&lt;br/&gt;
&lt;br/&gt; *Viscosity*
&lt;br/&gt;
&lt;br/&gt; When faced with a change, engineers usually find more than one way to make the change. Some of the ways preserve the design, others do not (i.e. they are hacks). When the design preserving methods are harder to emply than the hacks, then the viscosity of the design is high. It is easy to do the wrong thing but hard to do the right thing.
&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/5r2NRNt7gWw" height="1" width="1"/&gt;</description><pubDate>Wed, 15 Jul 2009 04:10:05 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/46/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/46/</feedburner:origLink></item><item><title>general principles</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/Bszt1KwD9y0/</link><description>Programming is about communication between humans with a computer eavsdropping. There is a tension between communicating to the machine and to other programmers with the same source text.
&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/Bszt1KwD9y0" height="1" width="1"/&gt;</description><pubDate>Tue, 14 Jul 2009 04:10:05 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/78/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/78/</feedburner:origLink></item><item><title>general principles</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/9gdcIXWW_GE/</link><description>From Dave Hoover, a quote from C.S. Lewis:
&lt;br/&gt;
&lt;br/&gt;If we let ourselves, we shall always be waiting for some distraction or other to end before we can really get down to our work. The only people who achieve much are those who want knowledge so badly that they seek it while the conditions are still unfavourable. Favourable conditions never come.
&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/9gdcIXWW_GE" height="1" width="1"/&gt;</description><pubDate>Mon, 13 Jul 2009 04:10:05 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/45/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/45/</feedburner:origLink></item><item><title>general principles</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/dpbXGWU2sBs/</link><description>Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius, and a lot of courage, to move in the opposite direction.
&lt;br/&gt;    ---Albert Einstein
&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/dpbXGWU2sBs" height="1" width="1"/&gt;</description><pubDate>Fri, 10 Jul 2009 04:10:05 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/44/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/44/</feedburner:origLink></item><item><title>team</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/sHoCA-Uokss/</link><description>"If you want to build a ship, don't drum up the men to gather wood, divide the work and give orders. Instead, teach them to yearn for the vast and endless sea."
&lt;br/&gt;
&lt;br/&gt; - Antoine de Saint-Exupéry (attributed)
&lt;br/&gt;
&lt;br/&gt;There are a lot of ways to build bad engineering teams, and very few ways to build great ones. I've come to believe that the attributed quote above spells out pretty much the only way I know how to build a great development group.
&lt;br/&gt;
&lt;br/&gt;The best way to get developers to build something great is to make them believe your goal is worthwhile. If you do, control from the top will not only be unnecessary; it will be impossible. That's the best situation you can hope to create, and frankly I love that so many people don't believe that, since it makes things so much easier for those of us who do.
&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/sHoCA-Uokss" height="1" width="1"/&gt;</description><pubDate>Thu, 09 Jul 2009 04:10:05 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/133/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/133/</feedburner:origLink></item><item><title>general principles</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/5YxVgS0lBVs/</link><description>Less is more.
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/5YxVgS0lBVs" height="1" width="1"/&gt;</description><pubDate>Wed, 08 Jul 2009 04:10:05 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/43/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/43/</feedburner:origLink></item><item><title>exception handling</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/23iPAc8JwZ4/</link><description>*Do Or Die*
&lt;br/&gt;
&lt;br/&gt;Do-or-die is simple: either an operation succeeds or it raises an exception. When you call a do-or-die method, any normal code path relying on the results of that method have a guarantee for sanity - there are no problems to check for or deal with in the normal code path. The abnormal code path coping with the raised exception handles all problems. (Contrast this with languages lacking exceptions.) This means:
&lt;br/&gt;
&lt;br/&gt;   1. Any procedure always returns void; no boolean returns that require checking for success or failure. Just call the procedure and be done with it.
&lt;br/&gt;   2. Any function always returns a valid object; no null returns that require nullity checks. Just capture the return and use it as expected.
&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/23iPAc8JwZ4" height="1" width="1"/&gt;</description><pubDate>Tue, 07 Jul 2009 04:10:03 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/76/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/76/</feedburner:origLink></item><item><title>exception design</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/L58JCupWilg/</link><description>*Designing with exceptions*
&lt;br/&gt;
&lt;br/&gt;Think what the throws clause should contain at the abstract contract level.
&lt;br/&gt;
&lt;br/&gt;Exception translation can be helpfull, for example if in something that reads a database deep inside it could cause a MalformedURLException - the interface should not have to deal with that, hence exceptions can be wrapped in more meaningfull ones.
&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/L58JCupWilg" height="1" width="1"/&gt;</description><pubDate>Mon, 06 Jul 2009 04:10:05 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/77/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/77/</feedburner:origLink></item><item><title>exception handling</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/W6qfKpsFDvk/</link><description>*James Gosling on localised exception handling* (paraphrased occasionaly):
&lt;br/&gt;
&lt;br/&gt;When you try to open a file and it's not there, your coping strategy is really determined by what you were going for. Some guy (i.e. piece of code) miles away isn't going to know what to do. The code that tried to open the file knows what to do, whether it be trying a backup file, looking in a different directory, or asking the user for another filename.
&lt;br/&gt;
&lt;br/&gt;Having one big catch clause on the outside really only works if your exception handling philosophy is simply to die. If you have an event loop, you can maybe cause that one event to just be tossed. If you have a plugin architecture, the enclosing environment could respond to a failure in the plugin by disabling it. But if you're not doing an event driven program or plugins, there isn't an outside place where you can take big hunks of functionality and saw them off.
&lt;br/&gt;
&lt;br/&gt;It's good to have a last ditch catch clause though, specifially for a server, so that we can fail the offending request only.
&lt;br/&gt;
&lt;br/&gt;In general, when you are writing a declaration in a throws clause, it is good to try to be as specific as possible because it gives more information to the context about exactly what went wrong.
&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/W6qfKpsFDvk" height="1" width="1"/&gt;</description><pubDate>Fri, 03 Jul 2009 04:10:05 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/42/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/42/</feedburner:origLink></item><item><title>testing tdd</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/nlPenOl7VWs/</link><description>*Test Driven Development*
&lt;br/&gt;
&lt;br/&gt;Test First Development (or Test Driven Development) implies that rather than deferring testing until the end of the project we move it to the beginning of the lifecycle. Before devlelopers code a new piece of functionality they define and develop the test cases describing the required functionality. Then, they develop code modules until all test cases succeed. Development occurs in rapid iteration cycles between developing, verifying and correcting code.
&lt;br/&gt;
&lt;br/&gt;Automated testing, particularly as part of TDD, has the ability to change the dynamics of the development team in a way that testing is no longer seen as a burden but becomes a natural part of the development process. This change in developer mindset is key to test-driven development.
&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/nlPenOl7VWs" height="1" width="1"/&gt;</description><pubDate>Thu, 02 Jul 2009 04:10:11 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/74/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/74/</feedburner:origLink></item><item><title>testing</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/It_27BzAgAk/</link><description>How to investigate intermittent problems: http://blackbox.cs.fit.edu/blog/james/archives/000197.html&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/It_27BzAgAk" height="1" width="1"/&gt;</description><pubDate>Wed, 01 Jul 2009 04:10:03 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/75/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/75/</feedburner:origLink></item><item><title>testing</title><link>http://feedproxy.google.com/~r/carriagereturn/~3/xyZhsIj3nsM/</link><description>To test you need to be able to:
&lt;br/&gt;
&lt;br/&gt; - Control the system under test: Ideally via an API that allows control of the system (a test interface), or via a gui testing tool. API is much better.
&lt;br/&gt; - Inspect the results: Again an API is most helpfull but also good logs and consistent error reporting help.
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;&lt;img src="http://feeds.feedburner.com/~r/carriagereturn/~4/xyZhsIj3nsM" height="1" width="1"/&gt;</description><pubDate>Tue, 30 Jun 2009 04:10:03 -0000</pubDate><guid isPermaLink="false">http://www.carriagereturn.org/entry/41/</guid><feedburner:origLink>http://www.carriagereturn.org/entry/41/</feedburner:origLink></item></channel></rss>
