<?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>Luminis Software Development &#187; software</title>
	<atom:link href="http://lsd.luminis.eu/tag/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://lsd.luminis.eu</link>
	<description></description>
	<lastBuildDate>Wed, 28 Dec 2011 20:44:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>nl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Uncle Bob in da house: how to write clean code</title>
		<link>http://lsd.luminis.eu/uncle-bob-in-da-house-how-to-write-clean-code/</link>
		<comments>http://lsd.luminis.eu/uncle-bob-in-da-house-how-to-write-clean-code/#comments</comments>
		<pubDate>Fri, 17 Sep 2010 12:25:13 +0000</pubDate>
		<dc:creator>Richard de Zwart</dc:creator>
				<category><![CDATA[technical]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[News Item]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://lsd.luminis.nl/?p=1089</guid>
		<description><![CDATA[Robert C. Martin was een uur lang te gast op de HAN in Arnhem en hield een vlammend betoog over het schrijven van Clean Code.]]></description>
			<content:encoded><![CDATA[<p>Gisterenavond (16 september) was Arnhem in de gelukkige omstandigheid dat <a href="http://objectmentor.com/omTeam/martin_r.html">Robert C. Martin</a> de uitnodiging had aangenomen van de HAN om een verhaal te komen houden. Het onderwerp: <a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882">Clean Code</a>.</p>
<p>Robert Martin (die ook schrijft onder de naam <a href="http://butunclebob.com/ArticleS.UncleBob">Uncle Bob</a>) is een geweldige spreker en een wereldberoemd schrijver van publicaties over software craftmanship. Hij is dermate gepassioneerd over het op een hoger niveau brengen van ons vak, dat hij zelfs voor een groepje jonge engineers die de schoolbanken nog niet hebben verlaten een vlammend betoog komt houden.</p>
<p>Hij raasde in een uur tijd door zijn slides over Clean Code heen, lardeerde dat met leuke verhalen en analogieën en onderbouwde zijn betoog met praktijk voorbeelden. Hieronder een greep uit de tips die we kregen over het schrijven van functies.</p>
<h3>Leesbaarheid</h3>
<p>Eigenlijk gaan alle onderstaande tips over de leesbaarheid van de code. Iemand die jouw code ziet (en dat kun je ook goed zelf zijn) moet met lichte verveling van boven naar beneden door je code kunnen gaan, waarbij de code steeds gedetailleerder wordt.<br />
- &#8220;Ja&#8221;<br />
- &#8220;Mmmh, mmh&#8221;<br />
- &#8220;Duidelijk&#8221;<br />
- &#8220;Ja&#8221;<br />
- &#8220;Logisch&#8221;<br />
Totdat de code een nivo van detaillering bereikt dat je als lezer denkt &#8220;Ja, ja, nu begrijp ik het wel. Saai&#8221;. Dan heb je het goed gedaan. Saaie code, waar niemand lang bij hoeft stilt te staan (want daar heb je gewoon geen tijd voor). Niemand zit te wachten op briljante code, behalve jouw ego. Briljante code is de eerste code die ik vervang als ik onderhoud moet doen; vervang door saaie, begrijpelijke code.</p>
<h3>Descriptive names</h3>
<p>Gebruik een naam voor je functie die zegt wat de functie doet. Dus niet &#8220;Process()&#8221; maar &#8220;AddOrderLineToOrder()&#8221;.</p>
<h3>Do One Thing</h3>
<p>Een functie moet slechts 1 ding doen. Als een functie 2 dingen doet, moet je &#8216;m in 2 functies opdelen. De functie &#8220;AddOrderAndCalculateTotals()&#8221; wordt dan dus &#8220;AddOrder()&#8221; en &#8220;CalculateTotalsForOrder()&#8221;.</p>
<h3>Small functions</h3>
<p>Functies mogen niet meer dan 4 regels lang zijn (tussen de accolades). Het liefst 2 of 3, maar als het echt moet dan kan 4 ook. Een functie moet eigenlijk niet veel meer doen dan bijvoorbeeld een test uitvoeren in een if-statement en dan een andere functie aanroepen. En de test in de if is natuurlijk ook een functie.<br />
Hoe kom je aan kleine functies? Die kun je niet van scratch af aan maken. Je maakt eerst je bekende grote bak code van wel 20 of 30 regels, zodat je je test aan de praat kan krijgen (je weet wel <a href="http://en.wikipedia.org/wiki/Test-driven_development">&#8220;Red-Green-Refactor&#8221;</a>). Daarna ga je je grote functie opknippen met een van de standaard Refactor-tools die jouw IDE ondersteunt, meestal &#8220;ExtractMethod&#8221; geheten. En na elke ExtractMethod draai je je tests om te weten of je niets stuk gemaakt hebt.</p>
<h3>No error codes</h3>
<p>Functies moeten exceptions gebruiken en try/catch blocks. Binnen een try moet bij voorkeur 1 regel code staan: de aanroep van een functie.<br />
Return-codes zijn om iets nuttigs terug te geven aan de aanroepende code, bijvoorbeeld een Boolean als je functie &#8220;IsValidDate()&#8221; heet, maar niet om te laten weten dat er iets is mis gegaan. Error-codes leiden tot veel geneste if&#8217;s en tot out-parameters (zie verderop).</p>
<h3>No more than 3 parameters</h3>
<p>Een functie heeft bij voorkeur geen parameters, dat leest het makkelijkst, maar is niet zo realistisch. Als een functie meer data dan 3 parameters nodig heeft om zijn werk te kunnen doen, moet je gaan refactoren. Waarschijnlijk hoort al die data bij elkaar in één class.</p>
<h3>No out-parameters and no boolean-parameters</h3>
<p>Een functie heeft dingen aan de rechterkant (parameters) die erin gaan en een ding aan de linkerkant (return-value) die eruit komt. Als er dingen aan de rechterkant uitkomen verwar je de lezer enorm. Tijd voor een refactoring.<br />
Booleans lezen helemaal moeilijk en verraden dat je eigenlijk een functie hebt die 2 dingen doet, gestuurd door de vlag die je erin stop.<br />
Wat doet het onderstaande?</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">var html <span style="color: #008000;">=</span> GetHtmlForControl<span style="color: #000000;">&#40;</span>button, <span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span></pre></div></div>

<p>Zou het niet beter zijn om 2 functies te hebben die beter laten zien wat ze doen?</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">private</span> <span style="color: #FF0000;">string</span> GetUnformattedHtmlForControl<span style="color: #000000;">&#40;</span>button<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span> ... <span style="color: #000000;">&#125;</span>
<span style="color: #0600FF;">private</span> <span style="color: #FF0000;">string</span> GetFormattedHtmlForControl<span style="color: #000000;">&#40;</span>button<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span> ... <span style="color: #000000;">&#125;</span></pre></div></div>

<h3>Unit tests</h3>
<p>Als je geen unit-test hebt kun je nooit bewijzen (voor jezelf, je teamgenoten of je baas) dat de code die je gemaakt hebt echt werkt.<br />
Accountants controleren hun eigen werk door elke boeking 2 keer op te nemen: &eacute;&eacute;n keer aan de debet kant en &eacute;&eacute;n keer aan de credit kant. Onderaan moet dan nul staan. Je kunt nog steeds de pech hebben dat je twee fouten hebt gemaakt die elkaar precies opheffen, maar die kans is niet zo groot. In ieder geval heb je een Standard Practice toegepast.<br />
Dat kunnen wij software-engineers minstens even goed doen. Code schrijven en tests schrijven. </p>
<h3>Design Patterns</h3>
<p><a href="http://lsd.luminis.nl/wp-content/uploads/2010/09/DesignPatterns.jpg"><img src="http://lsd.luminis.nl/wp-content/uploads/2010/09/DesignPatterns-300x300.jpg" alt="DesignPatterns" title="DesignPatterns" width="300" height="300" class="alignright size-medium wp-image-1093" /></a>Ken je patterns. Het boek van de Gamma et al is volgens Robert Martin het belangrijkste boek dat de afgelopen 20 jaar is geschreven op het gebied van software design.</p>
<h3>Maar daar hebben we geen tijd voor!</h3>
<p>Je zult het zelf misschien onmiddellijke roepen als je bovenstaande hebt gelezen: &#8220;Allemaal leuk en aardig, en ja, ik wil goeie code schrijven, maar het moet af, ik heb hier echt geen tijd voor&#8221;.<br />
Fout. Als je het op bovenstaande manier doet, houd je tijd over. Om de simpele reden dat iedereen gedurende het project zijn bestaande code moet uitbreiden, aanpassen, verbeteren of overdragen. Als je clean-code schrijft dan kost dat wroeten in je eigen code je veel minder tijd dan wanneer je de gebruikelijke bak spaghetti heb geschreven. En omdat je unit-tests hebt,  weet je ook dat je aanpassing niets stuk gemaakt heeft.</p>
<p>Robert Martin haalde het voorbeeld aan van Hongaarse arts <a href="http://en.wikipedia.org/wiki/Ignaz_Semmelweis">Ignaz Semmelweis</a> die ontdekte dat het aantal vrouwen dat overleed in het kraambed van 8 op de 10 zakte naar 1 op de 100 als je eerst je handen waste nadat je een autopsie had gedaan. Hij begreep niet waarom, maar stelde onomstotelijk vast dat het werkte. Desalniettemin duurde het tot vele jaren na zijn dood voordat deze activiteit tot het standaard repertoire van de arts ging behoren.</p>
<p>Zou jij tegen je chirurg zeggen vlak voordat je de operatiekamer ingereden werd &#8220;Laat dat handen wassen maar achterwegen hoor, daar heb je helemaal geen tijd voor&#8221;? Vast niet. En omgekeerd? Als jouw patiënt dat zou zeggen, zou je dan naar hem luisteren?<br />
In jouw vak ben jij de chirurg en is je opdrachtgever degene die onder het mes gaat.</p>
<h3>Word een professional</h3>
<p>Wij zijn geen loonwerkers, ons werk is niet te vergelijken met het op elkaar stapelen van stenen. En onze verantwoordelijkheid gaat verder dan &#8220;maar hij heeft gezegd dat dat zo moest&#8221;. Als professional heb je de plicht om tegen je opdrachtgever/klant/baas &#8220;nee&#8221; te zeggen als hij/zij vraagt om iets slechts af te leveren.<br />
- &#8220;Kun je het niet zonder tests?&#8221;<br />
- &#8220;Nee&#8221;<br />
- &#8220;Maar daar hebben we geen tijd voor!&#8221;<br />
- &#8220;Dus er mogen bugs zitten in mijn werk?&#8221;<br />
- &#8220;Uh, nou ja, het hoeft niet perfect te zijn&#8221;<br />
- &#8220;Als er bugs in mogen zitten, dan ben ik klaar wanneer je wilt. Nu al, feitelijk&#8221;<br />
- &#8220;Kom op, je begrijpt best wat ik bedoel&#8221;<br />
- &#8220;Nee, wil je nou dat ik m&#8217;n handen was of niet?&#8221;<br />
- &#8230;..?</p>
]]></content:encoded>
			<wfw:commentRss>http://lsd.luminis.eu/uncle-bob-in-da-house-how-to-write-clean-code/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Software Architecture Workshop</title>
		<link>http://lsd.luminis.eu/software-architecture-workshop/</link>
		<comments>http://lsd.luminis.eu/software-architecture-workshop/#comments</comments>
		<pubDate>Wed, 20 May 2009 06:49:36 +0000</pubDate>
		<dc:creator>Dennis Geurts</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[dana bredemeyer]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[workshop]]></category>

		<guid isPermaLink="false">http://lsd.luminis.net/?p=196</guid>
		<description><![CDATA[<img class="thumbnail" src="http://blog.luminis.nl/roller/luminis/resource/dennisg/danab02.jpg"/>

In may 2009 luminis invited Dana Bredemeyer again to give his inspiring workshop on software architecture. During this workshop the attendees were shown that being a good software architect is more than being able draw some UML graphs... 

Interested ? Read the full article and make us invite him over to the Netherlands once more!

]]></description>
			<content:encoded><![CDATA[<p>
Earlier this month we (luminis) once again invited Dana Bredemeyer to give a workshop on software architecture. This time I was one of the happy few that were able to attend this workshop. Much to my surprise the workshop already started the weekend before when I received a personal e-mail from Dana with some simple questions pertaining my view on software architecture:
</p>
<ul>
<li>What is your definition of software architecture?</li>
<li>How is software architecture positioned in your organization (value and benefits)?</li>
<li>&#8230;</li>
</ul>
<p><i>(There were more questions; ask us to <a href="http://www.luminis.nl/nl/detail-29.html">invite</a> Dana again if you want to know them all <img src='http://lsd.luminis.eu/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</i></p>
<p>Usually, to such a list of questions you really find some (sometimes shallow) answers to work with but the ones Dana posed really got me started on the role of software architecture in general. What indeed is a good definition of software architecture ? Is the value of (good) software architecture a measurable entity ? I think not. Many times during the course of the workshop I pondered about quality and got thrown back to college time when I read &#8220;Zen and the art of motorcycle management&#8221;, that also addresses the notion of quality: <i>That what you just like</i>. Is that enough ? Certainly not ! With respect to software architecture it also counts if the product (or products) that is (are) based on the architecture even get to production state and actually start adding value for your company. If they do not, then it has all been in vain&#8230;
</p>
<p>
Many issues like these got addressed during the workshop. Also the political forces that influence technical decisions where explained with such clarity that my understanding of what it takes to be a good software architect (and what personal skills I lack !) has grown enormously.
</p>
<p>In short, a must-attend workshop for all stakeholders to the process of employing software to extend business for a company: manager, CEO, CFO, engineer and last but certainly not least the architects.</p>
<p><img width="480px" src="http://blog.luminis.nl/roller/luminis/resource/dennisg/danab01.jpg"/></p>
]]></content:encoded>
			<wfw:commentRss>http://lsd.luminis.eu/software-architecture-workshop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

