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

<channel>
	<title>ORTHOcoders &#187; Development</title>
	<atom:link href="http://orthocoders.com/tag/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://orthocoders.com</link>
	<description>U can code it, we can help</description>
	<lastBuildDate>Fri, 13 Jan 2012 07:16:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>The Bowling Game Kata &#8211; First attempt</title>
		<link>http://orthocoders.com/2011/09/05/the-bowling-game-kata-first-attempt/</link>
		<comments>http://orthocoders.com/2011/09/05/the-bowling-game-kata-first-attempt/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 05:55:41 +0000</pubDate>
		<dc:creator>Amir Barylko</dc:creator>
				<category><![CDATA[BDD]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Kata]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Training]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://orthocoders.com/?p=400</guid>
		<description><![CDATA[Katas are practice exercises to keep your skills sharp. The Bowling Kata lets you model the game and the rules.]]></description>
			<content:encoded><![CDATA[<p>Last week I did a presentation about the <a title="Uncle Bob's Bowling Game Kata" href="http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata" target="_blank">Bowling Game kata</a> in C#.</p>
<p>I created a <a title="Bowling Game Src Code @ GitHub" href="https://github.com/amirci/bowling_game" target="_blank">repository</a> on GitHub with the code so I can share my first attempt.</p>
<p>You can follow the commit comments to get an idea of the train of thought.</p>
<p>Or if u prefer, just keep reading <img src='http://orthocoders.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>The Methodology</h2>
<p>I used TDD and somehow BDD all the way. Started with an acceptance test and jumped in and out from the unit tests until the feature passed.</p>
<p>Why is a good idea to start with an acceptance test?</p>
<p>When you know where you want to go, what you want to achieve, is easier to keep the focus.</p>
<p>Having a way of identifying if the current feature is finished is a lot of power in your hands, so do the minimum necessary to make it work and then &#8211; once the test is passing &#8211; do refactoring as you see fit.</p>
<p>In the solution you will find three projects:</p>
<ol>
<li>BowlingKata: Classes that implement the Kata</li>
<li>BowlingKata.Unit.Tests: Unit tests</li>
<li>BowlingKata.Acceptance.Test: Features that I&#8217;m looking for in a bowling game</li>
</ol>
<h2>Design Decisions (fast forward TDD)</h2>
<p>As soon as I started to write a unit test for the <em>BowlingGame</em> class I wonder how am I going to design the solution.</p>
<p>My first test was for the method <em>Roll(pins)</em>. And right there I had to assign responsibilities.</p>
<p>What should this method do? Do the &#8220;registration&#8221; only? Do the calculation as well? Is there any other class involved?</p>
<p>I decided on keep things simple and separate two clear responsibilities:</p>
<ol>
<li>Keeping the number of pins knocked down on each ball (or frames later)</li>
<li>Calculating the score based on the information on each frame</li>
</ol>
<div>So I created two interfaces with that purpose:</div>
<div>
<ul>
<li><em>IFrameKeeper</em>: In charge of registering the pins down in each frame</li>
<li><em>IScoreCalculator</em>: in charge of calculating the score over a sequence of frames (10 frames + 1 optional extra)</li>
</ul>
<div>You can follow all the tests to see how the interfaces grew in complexity to fullfil the intended responsibility.</div>
<div>
<h2>What&#8217;s next?</h2>
<p>After the first approach I thought that would be nice to refactor again and explore other solutions:</p>
<ul>
<li>Change the frame class <em>IBowlingFrame</em> to be able to calculate the score, maybe having regular frames, spare, and strike.</li>
<li>Find a way of registering the pins and also add some kind of bonus to avoid the iteration over the frames to get the score</li>
</ul>
<div>Which option did you implement? Please share!</div>
<div>Feedback is more than welcome.</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://orthocoders.com/2011/09/05/the-bowling-game-kata-first-attempt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using multiple sources for Nuget</title>
		<link>http://orthocoders.com/2011/04/09/using-multiple-sources-for-nuget/</link>
		<comments>http://orthocoders.com/2011/04/09/using-multiple-sources-for-nuget/#comments</comments>
		<pubDate>Sun, 10 Apr 2011 05:40:26 +0000</pubDate>
		<dc:creator>Amir Barylko</dc:creator>
				<category><![CDATA[Build Tools]]></category>
		<category><![CDATA[Rake]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Nuget]]></category>

		<guid isPermaLink="false">http://orthocoders.com/?p=367</guid>
		<description><![CDATA[Nuget is a great tool to facilitate installing dependencies from a server, facilitating finding dependencies and avoiding storing them in the repository.
However the command line tool does not support multiple sources, so after installing a local nuget server I realize that I need to modify my script further....]]></description>
			<content:encoded><![CDATA[<p><a title="Nuget for local teams" href="http://orthocoders.com/2011/03/26/nuget-for-local-teams/" target="_blank">Last post</a> I talked about installing a local Nuget server and the benefits. However the implementation wasn&#8217;t as simple and straightforward as I expected, here is the roadblocks I found and what I had to do to make it work.</p>
<p>First I installed a local server and then updated the projects to use some of the packages from the local server.</p>
<p>The references were updated. Solution builds fine.</p>
<p>So I decided to update the <em>rake </em>build script and add the  local source.  First roadblock ahead.</p>
<h3>More than one source</h3>
<p>Now, I run the <em>rake</em> script to get all the packages to make sure it works and I found that when installing the packages the source is not stored in the  <em>packages.config </em>file<em>.</em></p>
<p>What a disappointment&#8230; but don&#8217;t let this drag you down&#8230; there&#8217;s still hope!</p>
<p>First I checked on twitter and confirmed that in the current version the source is not part of the packages config and I started a <a title="Nuget Multiple Sources" href="http://nuget.codeplex.com/discussions/251351" target="_blank">discussion</a> on the codeplex nuget site to talk about it.</p>
<p>Now, I have to figure out how to identify the local packages&#8230;</p>
<h3>Using a config file for the local packages</h3>
<p>Because I can&#8217;t store the source of the packages in the packages.config file I decided to use another file, packages_local.config to store my local packages.</p>
<p>Then, I changed the rakefile task to do the following:</p>
<pre class="brush: ruby; title: ; notranslate">

FileList[&quot;**/packages_local.config&quot;].each do |file|
	cp file, &quot;packages.config&quot;
	sh &quot;nuget install packages.config /OutputDirectory Packages /source #{local_feed}&quot;
end
</pre>
<p>If you are wondering why I need to copy the local to &#8220;packages.config&#8221;, is because the command line only accepts &#8220;packages.config&#8221; as a configuration file. Yeah, I know&#8230;.</p>
<h3>Thank god for contributors!</h3>
<p>Luckily, when I was writing this post I received an updated from the nuget <a title="Nuget discussion - Avoid committing depenedencies" href="http://nuget.codeplex.com/discussions/249628">discussion</a> (look at the end) forum talking about using multiple sources.</p>
<p>In the update <a title="Dan Turner @ codeplex" href="http://www.codeplex.com/site/users/view/dant199" target="_blank">Dan Turner</a> mentioned a <a title="Fork that combines both features" href="http://nuget.codeplex.com/SourceControl/network/Forks/dant199/NuGetDanTurner" target="_blank">fork</a> he did of the command line project to add two things:</p>
<ul>
<li>Using multiple sources</li>
<li>Using repositories.config (file left inside packages folder) to load all the packages.config</li>
</ul>
<p>Awesome! So I cloned the fork, build the solution, grab the new <em>nuget.exe</em> and voila! It works!</p>
<p>Here is the final version of the rakefile:</p>
<pre class="brush: ruby; title: ; notranslate">
desc &quot;Setup dependencies for nuget packages&quot;
task :dep do
	remote_feed = &quot;https://go.microsoft.com/fwlink/?LinkID=206669&quot;
	local_feed = &quot;http://wpgbuild02:8090/dataservices/packages.svc&quot;
	FileList[&quot;**/packages.config&quot;].each do |file|
		sh %Q{nuget install #{file} /OutputDirectory Packages /Source &quot;#{remote_feed};#{local_feed}&quot;}
	end
end
</pre>
<p>I&#8217;m still using the <em>FileList</em> to get all the packages.config because the <em>Packages</em> folder is removed and not stored in the repository.</p>
<p>The drawback is that is not the official release, thus getting updates is going to be a problem. Hopefully they will merge them soon.</p>
<p>Hope it works for you, let me know if you have any questions.</p>
]]></content:encoded>
			<wfw:commentRss>http://orthocoders.com/2011/04/09/using-multiple-sources-for-nuget/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC CONF 2010</title>
		<link>http://orthocoders.com/2010/07/22/asp-net-mvc-conf-2010/</link>
		<comments>http://orthocoders.com/2010/07/22/asp-net-mvc-conf-2010/#comments</comments>
		<pubDate>Thu, 22 Jul 2010 20:14:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[BDD]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Presentations]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Training]]></category>

		<guid isPermaLink="false">http://orthocoders.com/?p=194</guid>
		<description><![CDATA[Just finished my presentation about BDD for the ASP.NET MVC virtual conference! It was fun to have a virtual audience. I uploaded the code and slides to the presentations page. Any feedback would be appreciated! Feel free to ask any questions. Enjoy!]]></description>
			<content:encoded><![CDATA[<p>Just finished my presentation about BDD for the ASP.NET MVC virtual conference!</p>
<p>It was fun to have a virtual audience.</p>
<p>I uploaded the code and slides to the <a title="Presentations page" href="wordpress/presentations">presentations</a> page.</p>
<p>Any feedback would be appreciated! Feel free to ask any questions.</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://orthocoders.com/2010/07/22/asp-net-mvc-conf-2010/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ruby On Rails Training</title>
		<link>http://orthocoders.com/2010/05/07/ruby-on-rails-training/</link>
		<comments>http://orthocoders.com/2010/05/07/ruby-on-rails-training/#comments</comments>
		<pubDate>Fri, 07 May 2010 18:35:29 +0000</pubDate>
		<dc:creator>Amir Barylko</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Training]]></category>
		<category><![CDATA[Presentations]]></category>
		<category><![CDATA[RubyOnRails]]></category>

		<guid isPermaLink="false">http://orthocoders.com/2010/05/07/ruby-on-rails-training/</guid>
		<description><![CDATA[I'm giving a Ruby On Rails course on June 14th - 18th at NewMediaManitoba]]></description>
			<content:encoded><![CDATA[<p>On June 14th to 18th I’ll be giving my first formal RoR training here in Winnipeg.</p>
<p>The course would take place at <a href="http://www.newmediamanitoba.com">New Media Manitoba</a> and if you’d like to attend here is the link to <a href="http://www.newmediamanitoba.com/component/option,com_dtregister/Itemid,46/">register.</a></p>
<h3>Why you should attend?</h3>
<p>RoR is a full MVC web development framework that would show you that developing web applications can be intuitive, professional, secure, easy and fun!</p>
<p>What is so great about Rails? Here are some reasons:</p>
<ul>
<li>It’s based on ruby, so you get all the power of a dynamic language.</li>
<li>Automatic dependencies and library management using Gems</li>
<li>Automatic relational mapping to databases</li>
<li>Behaviour Driven Development</li>
<li>Test Driven Development</li>
<li>Database versioning, migrations and seeding</li>
<li>Automatic REST implementation</li>
<li>Rake DSL</li>
<li>Support for multiple view engines (like haml)</li>
<li>Huge base of libraries (gems) and users around the world</li>
</ul>
<h3>Who should attend?</h3>
<p>Any developer with basic knowledge of a programming language can learn RoR.</p>
<h3>What do I get?</h3>
<p>In this course you will build the confidence and real hands on knowledge to start developing high quality RoR applications. You will learn:</p>
<ul>
<li>Ruby scripting</li>
<li>Rails MVC architecture.</li>
<li>Package management with Gems.</li>
<li>How to apply Behaviour Driven Development, and Test Driven Development.</li>
<li>Persistence mapping with ActiveRecord.</li>
<li>RESTful services.</li>
<li>Manage source versioning with Git.</li>
<li>Automated deployment with Capistrano.</li>
</ul>
<h3>Are you sure it’s a course for me?</h3>
<p>Of course, it does not matter if you are a .NET, Java or Eiffel developer, RoR would open your mind to new concepts, technologies and tools that would complement and improve your daily tasks.</p>
<p>Any more questions, please contact me at <a href="mailto:amir@barylko.com">amir@barylko.com</a>.</p>
<p>Hope to see you there!</p>
]]></content:encoded>
			<wfw:commentRss>http://orthocoders.com/2010/05/07/ruby-on-rails-training/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Prairie Development Conference</title>
		<link>http://orthocoders.com/2010/05/03/prairie-development-conference/</link>
		<comments>http://orthocoders.com/2010/05/03/prairie-development-conference/#comments</comments>
		<pubDate>Tue, 04 May 2010 03:14:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[BDD]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Patterns]]></category>
		<category><![CDATA[Presentations]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Unit Testing]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Mocking]]></category>
		<category><![CDATA[SOLID]]></category>

		<guid isPermaLink="false">http://orthocoders.com/2010/05/03/prairie-development-conference/</guid>
		<description><![CDATA[On Jun 2nd and 3rd I’ll be speaking at the PrairieDevCon 2010 in Regina!!! You can read about it at http://www.prairiedevcon.com/. It would be two complete days of sessions with four tracks and many cool speakers!!!! I will do two presentations: Real World Behaviour Driven Development Behaviour Driven Development drives you process towards keeping the [...]]]></description>
			<content:encoded><![CDATA[<p>On Jun 2nd and 3rd I’ll be speaking at the <strong>PrairieDevCon</strong> 2010 in Regina!!!</p>
<p><a href="http://orthocoders.com/wp-content/uploads/2010/05/Prairie_Dev_Con_Presenter.gif"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Prairie_Dev_Con_Presenter" src="http://orthocoders.com/wp-content/uploads/2010/05/Prairie_Dev_Con_Presenter_thumb.gif" border="0" alt="Prairie_Dev_Con_Presenter" width="225" height="123" /></a></p>
<p>You can read about it at <a href="http://www.prairiedevcon.com/">http://www.prairiedevcon.com/</a>. It would be two complete days of sessions with four tracks and many cool speakers!!!!</p>
<p>I will do two presentations:</p>
<p><strong> </strong></p>
<h5>Real World Behaviour Driven Development</h5>
<p>Behaviour Driven Development drives you process towards keeping the focus on the stakeholder’s goals while discovering new features to achieve those goals.<br />
But&#8230; what does it mean in a .NET project to use BDD? What do I have to change? What tools are available? Can I use it for project with actual deadlines? How the quality will be improved?<br />
We are going to see a real world example from start to finish using BDD and TDD while answering all those questions. After the session you will have the foundation to apply BDD with confidence on any .NET project.<br />
<strong>Track:</strong> Developer Foundation<br />
<strong>Style:</strong> Dojo (Bring your laptop and code with me!)</p>
<h5>Test Driven Development Patterns for .NET Developers</h5>
<p>Test Driven Development is a methodology that will help us to discover our model while improving the quality of our software.<br />
We are going to see different patterns to help us deal with day to day problems like constructor initialization, exception testing, combinatorial tests, database testing, and many others.<br />
<strong>Track:</strong> Developer Foundation<br />
<strong>Style:</strong> Lecture</p>
<p>Hope to see you there!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://orthocoders.com/2010/05/03/prairie-development-conference/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Snapping Strategy Part II</title>
		<link>http://orthocoders.com/2010/04/13/snapping-strategy-part-2/</link>
		<comments>http://orthocoders.com/2010/04/13/snapping-strategy-part-2/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 04:26:07 +0000</pubDate>
		<dc:creator>Amir Barylko</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[SOLID]]></category>

		<guid isPermaLink="false">http://orthocoders.com/?p=115</guid>
		<description><![CDATA[After my first post about implementing a snapping strategy, I got feedback, and a new implementation was suggested: Use Chain-of-Responsibility instead of Composite.]]></description>
			<content:encoded><![CDATA[<h3>New inspiration</h3>
<p>One of many great things about blogging is that you get feedback from other developers. My good friend Sebastian (@paraseba) suggested to use a <em>Chain-of-Responsibility</em> instead of a <em>Composite</em> to find the an active snapping strategy. If u have no idea what I&#8217;m talking about, please read the previous post about &#8220;<a href="http://orthocoders.com/2010/04/13/snapping-strategy/" target="_blank">Implementing a Snapping Strategy</a>&#8220;.</p>
<h3>CoR Pattern</h3>
<p>In the Design Patterns book, the authors describe the Chain of Responsibility pattern like this:</p>
<blockquote><p>Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.</p></blockquote>
<p>In our case this means that we should give the opportunity to each strategy to do the snapping and if no snapping is available should call the “chained” strategy to see if the point should be snapped.</p>
<p>The solution it&#8217;s working, good time to refactor (Red, Green, Refactor) to add more flexibility to our strategies.</p>
<p>Let’s explore what changes do we need to do in order to be able to chain the strategies.</p>
<h3>Chained Strategies</h3>
<p>I don’t think we should modify the interface, no one needs to know which pattern are we implemented, so I am going to create a new abstract class called <em>ChainedSnappingStrategy</em>.</p>
<p>This class will be the base implementation for all the other strategies with two responsibilities:</p>
<ul>
<li>Call the next strategy in the chain if no snapping was applied</li>
<li>If it’s the end of the chain, return the same point.</li>
</ul>
<p>Our hierarchy updated will look something like this:</p>
<p><a href="http://orthocoders.com/wp-content/uploads/2010/04/image4.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" src="http://orthocoders.com/wp-content/uploads/2010/04/image_thumb4.png" border="0" alt="image" width="580" height="306" /></a></p>
<p>I added a new abstract method called <em>SnapImpl</em> to implement in each concrete class the snapping (same as we have now).</p>
<p>The <em>Snap</em> method should call the implementation first and then check if the point was snapped or not, if not should go to the next strategy. Here is the code:</p>
<div id="codeSnippetWrapper">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum1" style="color: #606060">   1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">abstract</span> <span style="color: #0000ff">class</span> ChainedSnappingStrategy : ISnappingStrategy</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum2" style="color: #606060">   2:</span> {</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum3" style="color: #606060">   3:</span>     <span style="color: #0000ff">public</span> ISnappingStrategy Next { get; set; }</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum4" style="color: #606060">   4:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum5" style="color: #606060">   5:</span>     <span style="color: #0000ff">public</span> Point Snap(Point point, IDrawingContext context)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum6" style="color: #606060">   6:</span>     {</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum7" style="color: #606060">   7:</span>         var result = <span style="color: #0000ff">this</span>.SnapImpl(point, context);</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum8" style="color: #606060">   8:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum9" style="color: #606060">   9:</span>         <span style="color: #0000ff">if</span> (<span style="color: #0000ff">this</span>.Next != <span style="color: #0000ff">null</span> &amp;&amp; result == point)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum10" style="color: #606060">  10:</span>         {</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum11" style="color: #606060">  11:</span>             result = <span style="color: #0000ff">this</span>.Next.Snap(point, context);</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum12" style="color: #606060">  12:</span>         }</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum13" style="color: #606060">  13:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum14" style="color: #606060">  14:</span>         <span style="color: #0000ff">return</span> result;</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum15" style="color: #606060">  15:</span>     }</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum16" style="color: #606060">  16:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum17" style="color: #606060">  17:</span>     <span style="color: #0000ff">protected</span> <span style="color: #0000ff">abstract</span> Point SnapImpl(Point point, IDrawingContext context);</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum18" style="color: #606060">  18:</span> }</pre>
<p><!--CRLF--></div>
</div>
<p>And voila, our strategies are chained!</p>
]]></content:encoded>
			<wfw:commentRss>http://orthocoders.com/2010/04/13/snapping-strategy-part-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Snapping Strategy</title>
		<link>http://orthocoders.com/2010/04/13/snapping-strategy/</link>
		<comments>http://orthocoders.com/2010/04/13/snapping-strategy/#comments</comments>
		<pubDate>Tue, 13 Apr 2010 15:16:04 +0000</pubDate>
		<dc:creator>Amir Barylko</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Patterns]]></category>
		<category><![CDATA[SOLID]]></category>

		<guid isPermaLink="false">http://orthocoders.com/?p=92</guid>
		<description><![CDATA[Strategies are an excellent way of abstracting algorithms to achieve particular tasks. The snapping strategy helped me to apply different snapping to the DrawingTool in my application]]></description>
			<content:encoded><![CDATA[<h3>The application</h3>
<p>For the past eight months I’ve been working on a WPF  desktop application that has a tool to draw. Very similar to most drawing application, you select the Drawing tool in the ribbon/toolbox and then you are able to draw on the canvas until you close the shape or cancel the tool.</p>
<h3>The new requirement</h3>
<p>Now, we need to draw using snapping. Snapping means that when you are drawing close to a particular point (considering a distance) the mouse will move but the drawing line not, will stay snapped to the point.</p>
<p>In this case we need to consider three cases:</p>
<ol>
<li>Snapping on the X axis (horizontal axis)</li>
<li>Snapping on the Y axis (vertical axis)</li>
<li>Snapping when the line has an 90 degree angle with the previous line</li>
</ol>
<h3>The solution</h3>
<h4>Where should I add the snapping?</h4>
<p>So I started by writing a test  (Yes, full TDD) that checks when I’m close to the X axis (3 pixels or less) then the drawing tool should snap. My test failed gloriously and I was ready to start my implementation in order to make the test pass… now… the question is… who is responsible for snapping?</p>
<h4>The Drawing Tool</h4>
<p>Let’s review the drawing tool interaction to understand how it works using MVVM.</p>
<ul>
<li>The <em>Canvas </em>receives a mouse move event and passes that information to the <em>DrawingTool</em></li>
<li>The <em>DrawingTool</em> raises a <em>LineMoved</em> event</li>
<li>The view model receives the event and notifies the view</li>
<li>The view shows the line ending on the new point</li>
</ul>
<p>A sequence diagram should look something like this:</p>
<p><a href="http://orthocoders.com/wp-content/uploads/2010/04/image.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" src="http://orthocoders.com/wp-content/uploads/2010/04/image_thumb.png" border="0" alt="image" width="568" height="213" /></a></p>
<h4>Who is responsible for snapping?</h4>
<p>The <em>DrawingTool</em> does not know about snapping, but it should, because is raising the event… However considering the SRP (single responsibility principle) makes more sense to delegate this decision to another class, behold the <em>ISnappingStrategy</em>.</p>
<p>I decided to inject the strategy into the <em>DrawingTool</em> constructor (via IoC) and the <em>DrawingTool</em> will query the strategy for each point before raising the event, thus the event will contain the point decided by the strategy.</p>
<p>Let’s look at the new sequence diagram with the strategy added to the interaction:</p>
<h4>Why a strategy? Is that the GOF pattern?</h4>
<p>Indeed it is, why? Because I wanted to encapsulate the algorithm I’m going to use to snap, snapping to X axis has different rules than snapping to the previous line when having a 90 degree angle. Please refer to the GOF book “Design Patterns” or Google for more examples and diagrams.</p>
<h4>Snapping Strategy Hierarchy</h4>
<p>I have so far one interface <em>ISnappingStrategy</em> and three concrete strategies that implement the interface:</p>
<p><span style="font-size: 13.3333px;"> </span></p>
<ol><span style="font-size: 13.3333px;"><a href="http://orthocoders.com/wp-content/uploads/2010/04/image1.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" src="http://orthocoders.com/wp-content/uploads/2010/04/image_thumb1.png" border="0" alt="image" width="569" height="256" /></a></span></ol>
<p>Each strategy when called will return the snapped point or, if no snapping is required the same point.</p>
<p>So far, so good…. now I have implemented them, and each one passes the unit tests. However I don’t want to use just one of the them, I want to use all of them combined. I’d like to use first <em>SnapToX</em> and if does not snap, then <em>SnapToY, etc, etc</em>.</p>
<h4>Enters the Composite Strategy</h4>
<p>The Composite pattern is another GOF pattern and the goal is to treat a group of objects like they where a single instance. In this case, I want to use multiple snapping strategies like they were just one strategy.</p>
<p>Here is the idea, let’s create the Composite with a collection of strategies, and when called the Composite will iterate thru them until it finds a new snapping point or, if no snapping should happen, return the same point.</p>
<p>So, with the Composite, the new hierarchy looks like:</p>
<p><a href="http://orthocoders.com/wp-content/uploads/2010/04/image2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" src="http://orthocoders.com/wp-content/uploads/2010/04/image_thumb2.png" border="0" alt="image" width="755" height="202" /></a></p>
<p>And the code for the composite snapping would be:</p>
<div id="codeSnippetWrapper">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum1" style="color: #606060">   1:</span> <span style="color: #0000ff">public</span> Point Snap(Point point, IDrawingContext context)</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum2" style="color: #606060">   2:</span> {</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum3" style="color: #606060">   3:</span>     var found = <span style="color: #0000ff">this</span>._strategies.Find(s =&gt; s.Snap(point, context) != point);</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum4" style="color: #606060">   4:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum5" style="color: #606060">   5:</span>     <span style="color: #0000ff">return</span> found == <span style="color: #0000ff">null</span> ? point : found.Snap(point, context);</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum6" style="color: #606060">   6:</span> }</pre>
<p><!--CRLF--></div>
</div>
<h3>The cherry on top</h3>
<p>Now we need to configure all this, luckily we can use Binsor to configure our Windsor container and it will look something like this:</p>
<div id="codeSnippetWrapper">
<div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;">
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum1" style="color: #606060">   1:</span> component <span style="color: #006080">"SnapToX"</span>, ISnappingStrategy, VectorSnappingStrategy:</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum2" style="color: #606060">   2:</span>   x = 1</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum3" style="color: #606060">   3:</span>   y = 0</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum4" style="color: #606060">   4:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum5" style="color: #606060">   5:</span> component <span style="color: #006080">"SnapToY"</span>, ISnappingStrategy, VectorSnappingStrategy:</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum6" style="color: #606060">   6:</span>   x = 0</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum7" style="color: #606060">   7:</span>   y = 1</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum8" style="color: #606060">   8:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum9" style="color: #606060">   9:</span> component <span style="color: #006080">"SnapToPrevious"</span>, ISnappingStrategy, PreviousLineSnappingStrategy</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum10" style="color: #606060">  10:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum11" style="color: #606060">  11:</span> component <span style="color: #006080">"SnappingStrategy"</span>, ISnappingStrategy, CompositeSnappingStrategy:</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum12" style="color: #606060">  12:</span>   strategies = [@SnapToX, @SnapToY, @SnapToPrevious]</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum13" style="color: #606060">  13:</span></pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum14" style="color: #606060">  14:</span> component <span style="color: #006080">"DrawTool"</span>, IDrawTool, DrawTool:</pre>
<p><!--CRLF--></p>
<pre style="text-align: left; line-height: 12pt; background-color: white; margin: 0em; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow: visible; border-style: none; padding: 0px;"><span id="lnum15" style="color: #606060">  15:</span>   snapping = @SnappingStrategy</pre>
<p><!--CRLF--></div>
</div>
<p>Neat eh?</p>
]]></content:encoded>
			<wfw:commentRss>http://orthocoders.com/2010/04/13/snapping-strategy/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>The road to be an Architect</title>
		<link>http://orthocoders.com/2009/03/03/the-road-to-be-an-architect/</link>
		<comments>http://orthocoders.com/2009/03/03/the-road-to-be-an-architect/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 14:07:53 +0000</pubDate>
		<dc:creator>Amir Barylko</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://orthocoders.com/?p=21</guid>
		<description><![CDATA[After the TDD presentation someone asked me about what should he do in order to become a Software Architect. Here is what I think. First of all, I would say that you have to be sure that you would like to be an architect, and for that we have to agree on an architect definition. [...]]]></description>
			<content:encoded><![CDATA[<p>After the TDD presentation someone asked me about what should he do in order to become a Software Architect. Here is what I think.</p>
<p>First of all, I would say that you have to be sure that you would like to be an architect, and for that we have to agree on an architect definition.</p>
<p>An architecture in software development can be considered a collection of different components, each one with a particular role, and the interaction between them through interfaces.</p>
<p style="text-align: justify;">Therefore, an architect is responsible for defining the best architecture in order to solve the problem at hand. In order to do that the architect should have technical roots and technical acuity to grasp technical issues and collaborate with the team to solve them. The architect will have the global view of the system and would be responsible of identifying the major issues that have to be addressed to avoid failure.</p>
<p style="text-align: justify;">An architect has to be close the developers and able to answer questions and provide guidance to the rest of the team. He has to be fond of writing code and familiar with the technology the team is using. A good architect will be a combination of being a excellent technologist, strategist and politician.</p>
<p style="text-align: justify;">The difference between the team leader (or lead developer) and the architect is the scope and the responsibility. The architect has a broader scope that includes interaction between different components, security, response time, etc.</p>
<p style="text-align: justify;">Many times the architect role is considered a &#8220;promotion&#8221; or the next step in the hierarchy for a lead developer. But that may be a mistake because unfortunately not all the great developers or leads have the broad talents required to be an architect.</p>
<p>So, what should we do to achieve such a worthy goal?</p>
<p>Here is a (mixed) list of subjects to learn and practice (not exclusive, just a starting point):</p>
<ul>
<li>Different architectures: Which well known architectures are available?</li>
<li>Security: How to secure applications and systems, which options are available, benefits, etc.</li>
<li>Concurrency: How to run process in parallel? Implementation, Benefits, drawbacks&#8230;.</li>
<li>Communication and Services: Why be service oriented? What kind of services are available?</li>
<li>Testing: TDD, functional testing, how to write scripts to test web or desktop apps.</li>
<li>Storage: Which databases or alternative methods of storage are available?</li>
<li>Development methodologies: Which ones are available? Why should I use one instead of the other?</li>
<li>Agile planning and management: How does it work? What is the difference with classic management?</li>
<li>Source Control Management: SVN, CVS, GIT&#8230;</li>
<li>Continuous Integration: What? Why? When</li>
<li>Development platforms: Rails? J2EE? .NET? GWT?</li>
<li>Politics: How to be politically correct and identify managers and customer needs.</li>
<li>Communication: How to communicate with your team, managers and customers effectively.</li>
<li>Requirements: What should they look like? When is enough?</li>
</ul>
<p style="text-align: justify;">Sometimes, architects specialize in one technology or framework (i.e: Web Services Architect, .NET Architect, Testing Architect). I think is natural to have more experience in a particular technology than other but that doesn&#8217;t mean that you should ignore the rest. Not always the job you are working on will help you to develop or to grow towards being and architect. That, I&#8217;m afraid to say is up to each of us.</p>
<p style="text-align: justify;">As any software professional you have to research, read books, blogs and try to meet others with the same goals. Keep your information up to date, find tendencies, success stories, antipatterns (patterns to identify failure) and guidelines.</p>
<p>Here are some books I like (see the link for the full information) and think can be helpful:</p>
<ul>
<li> <a title="Patterns Enterprise Architecture" href="http://www.amazon.com/exec/obidos/ASIN/0321127420" target="_blank"><span id="btAsinTitle">Patterns of Enterprise Application Architecture</span></a></li>
<li><a title="Design Patterns" href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1236037168&amp;sr=1-1" target="_blank">Design Patterns</a></li>
<li><a title="Manage It!" href="http://www.amazon.com/Manage-Modern-Pragmatic-Project-Management/dp/0978739248/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1236037205&amp;sr=1-1" target="_blank">Manage It!</a></li>
<li><a title="Enterprise Integration Patterns" href="http://www.amazon.com/exec/obidos/ASIN/0321200683" target="_blank">Enterprise Integration Patterns</a></li>
<li><a title="Refactoring to patterns" href="http://www.amazon.com/exec/obidos/ASIN/0321213351" target="_blank">Refactoring to Patterns</a></li>
<li> <a title="Java concurrence in practice" href="http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/ref=sr_1_2?ie=UTF8&amp;s=books&amp;qid=1236037567&amp;sr=1-2" target="_blank"><span id="btAsinTitle">Java Concurrency in Practice</span></a></li>
<li> <a title="Enterprise Integration with Ruby and Rails" href="http://www.amazon.com/Enterprise-Recipes-Ruby-Rails-Schmidt/dp/1934356239/ref=sr_1_3?ie=UTF8&amp;s=books&amp;qid=1236037683&amp;sr=1-3" target="_blank"><span id="btAsinTitle">Enterprise Recipes with Ruby and Rails </span></a></li>
<li><a title="Software Architecture In Practice" href="http://www.amazon.com/Software-Architecture-Practice-Len-Bass/dp/0201199300" target="_blank">Software Architecture in Practice</a></li>
<li><a title="Documenting Software Architecture" href="http://www.amazon.com/Documenting-Software-Architectures-Beyond-Engineering/dp/0201703726/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1239671754&amp;sr=1-1" target="_blank">Documenting Software Architecture, Views and Beyond</a></li>
</ul>
<p>And here some blogs that I like:</p>
<ul>
<li><a title="ScottGu's Blog" href="http://weblogs.asp.net/Scottgu/" target="_blank">ScottGu&#8217;s </a></li>
<li><a title="Haacked" href="http://haacked.com/" target="_blank">Haacked</a></li>
<li><a title="James Gosling" href="http://blogs.sun.com/jag/" target="_blank">James Gosling: on the Java Road</a></li>
<li><a title="Oren Eini" href="http://ayende.com/" target="_blank">Ayende @ Rahien</a></li>
<li><a title="The Planetarium" href="http://blogs.sun.com/theplanetarium/" target="_blank">The Planetarium</a></li>
<li><a title="Stack Overflow" href="http://stackoverflow.com/" target="_blank">StackOverflow</a></li>
</ul>
<p style="text-align: justify;">There is no certified recipe, you will find all kind of architects with many strengths and weaknesses. As with any other role, try to find architects that inspire you, people that you respect that will help you to keep your spark alive. Follow them in their blogs, books and conferences. They would lead you to other great professionals for sure.</p>
<p style="text-align: justify;">Here are some of mine:</p>
<ul>
<li><a title="Martin Fowler" href="http://martinfowler.com/" target="_blank">Martin Fowler</a></li>
<li><a title="Bertrand Meyer" href="http://se.ethz.ch/~meyer/" target="_blank">Bertrand Meyer</a></li>
<li><a title="James Gosling" href="http://blogs.sun.com/jag/" target="_blank">James Gosling</a></li>
<li><a title="Scott Meyers" href="http://www.aristeia.com/" target="_self">Scott Meyers</a></li>
<li><a title="Kent Beck" href="http://www.threeriversinstitute.org/" target="_blank">Kent Beck</a></li>
<li><a title="Scott Gu's blog" href="http://weblogs.asp.net/scottgu/" target="_blank">Scott Guthrie</a></li>
</ul>
<p>As a closing remark, keep in mind that is very important to work supporting your team and whatever you do don&#8217;t become a &#8220;<a title="Seagull Architect" href="http://orthocoders.com/?p=14" target="_blank">Seagull architect</a>&#8220;.</p>
]]></content:encoded>
			<wfw:commentRss>http://orthocoders.com/2009/03/03/the-road-to-be-an-architect/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

