<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Software-Sanierung</title>
	<atom:link href="http://softwaresanierung.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://softwaresanierung.wordpress.com</link>
	<description>alles zum Thema bestehende Software</description>
	<lastBuildDate>Wed, 28 Dec 2011 11:15:59 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='softwaresanierung.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/fc0aa9126080d33990553e79f9dbd3c6?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Software-Sanierung</title>
		<link>http://softwaresanierung.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://softwaresanierung.wordpress.com/osd.xml" title="Software-Sanierung" />
	<atom:link rel='hub' href='http://softwaresanierung.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Objekte auf der Anklagebank</title>
		<link>http://softwaresanierung.wordpress.com/2011/12/28/objekte-auf-der-anklagebank/</link>
		<comments>http://softwaresanierung.wordpress.com/2011/12/28/objekte-auf-der-anklagebank/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 11:15:55 +0000</pubDate>
		<dc:creator>sebastiankuebeck</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[objektorientiert]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[smalltalk]]></category>
		<category><![CDATA[softwarearchitektur]]></category>
		<category><![CDATA[softwareentwicklung]]></category>

		<guid isPermaLink="false">http://softwaresanierung.wordpress.com/?p=1141</guid>
		<description><![CDATA[Michael Feathers, Brian Foote, Richard P. Gabriel, Joshua Kerievsky, Eliot Miranda und Dave Ungar machen Objekten in dieser Präsentation den Prozess. Auf der Anklagebank sitzen einen Wasserball (Symbol für Smalltalk), ein Plüschpinguin (das Maskottchen von Linux), ein Becher Java-Kaffee und ein UML-Objekt. Das Publikum agiert als die Geschworenen. Das ganze ist mäßig unterhaltsam. Was vielleicht [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=1141&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Michael Feathers, Brian Foote, Richard P. Gabriel, Joshua Kerievsky, Eliot Miranda und Dave Ungar machen Objekten <a href="www.infoq.com/presentations/Panel-Objects-On-Trial">in dieser Präsentation</a> den Prozess. Auf der Anklagebank sitzen einen Wasserball (Symbol für Smalltalk), ein Plüschpinguin (das Maskottchen von Linux), ein Becher Java-Kaffee und ein UML-Objekt. Das Publikum agiert als die Geschworenen.</p>
<p>Das ganze ist mäßig unterhaltsam. Was vielleicht nicht so klar herauskommt ist, dass es bis heute keinen wirklichen Konsens darüber gibt, was <em>objektorientiert</em> eigentlich bedeutet. Weiters ist das dominierende Paradigma eine Art komponentenbasierte, prozedurale Programmierung in der Objekte im Wesentlichen mit Datensätzen gleichgesetzt werden. So gesehen wäre es fair, wenn man Objekten erst einmal eine Chance gäbe, bevor man sie verurteilt&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/softwaresanierung.wordpress.com/1141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/softwaresanierung.wordpress.com/1141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/softwaresanierung.wordpress.com/1141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/softwaresanierung.wordpress.com/1141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/softwaresanierung.wordpress.com/1141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/softwaresanierung.wordpress.com/1141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/softwaresanierung.wordpress.com/1141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/softwaresanierung.wordpress.com/1141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/softwaresanierung.wordpress.com/1141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/softwaresanierung.wordpress.com/1141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/softwaresanierung.wordpress.com/1141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/softwaresanierung.wordpress.com/1141/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/softwaresanierung.wordpress.com/1141/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/softwaresanierung.wordpress.com/1141/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=1141&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://softwaresanierung.wordpress.com/2011/12/28/objekte-auf-der-anklagebank/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/76e16e21551c9dd5e0e56fdba4bad357?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sebastiankuebeck</media:title>
		</media:content>
	</item>
		<item>
		<title>Der zentrale Fehler in der agilen Softwareentwicklung</title>
		<link>http://softwaresanierung.wordpress.com/2011/12/18/der-zentrale-fehler-in-der-agilen-softwareentwicklung/</link>
		<comments>http://softwaresanierung.wordpress.com/2011/12/18/der-zentrale-fehler-in-der-agilen-softwareentwicklung/#comments</comments>
		<pubDate>Sun, 18 Dec 2011 18:22:01 +0000</pubDate>
		<dc:creator>sebastiankuebeck</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[agile softwareentwicklung]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[softwarearchitektur]]></category>
		<category><![CDATA[softwareentwicklung]]></category>
		<category><![CDATA[xp]]></category>

		<guid isPermaLink="false">http://softwaresanierung.wordpress.com/?p=1133</guid>
		<description><![CDATA[In seiner Präsentation anlässlich der norwegischen Entwicklerkonferenz NDC2011 kritisiert Michael Feathers unter anderem, dass oft User Story auf User Story definiert und umgesetzt wird, ohne das alle Beteiligten wissen, welche Auswirkungen das auf die Softwarearchitektur hat. Anders ausgedrückt: Softwareentwicklung kann nicht hinter einer Schnittstelle aus User Storys versteckt werden. Nur wenn Softwareentwickler und Fachabteilungen eng [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=1133&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In seiner Präsentation anlässlich der norwegischen Entwicklerkonferenz NDC2011 kritisiert Michael Feathers unter anderem, dass oft User Story auf User Story definiert und umgesetzt wird, ohne das alle Beteiligten wissen, welche Auswirkungen das auf die Softwarearchitektur hat. Anders ausgedrückt:</p>
<blockquote><p>Softwareentwicklung kann nicht hinter einer Schnittstelle aus User Storys versteckt werden.</p></blockquote>
<p>Nur wenn Softwareentwickler und Fachabteilungen eng zusammenarbeiten, so Feathers, erhält man im Endeffekt brauchbare Software.</p>
	      <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="437" height="288" id="viddler_437"><param name="movie" value="http://www.viddler.com/player/16bd3597/"/><param name="allowScriptAccess" value="always"/><param name="allowNetworking" value="all"/><param name="wmode" value=""/><param name="allowFullScreen"value="true"/><param name="flashVars" value="f=1&autoplay=f&disablebranding=f&liverailTags="/><embed src="http://www.viddler.com/player/16bd3597/" width="437" height="288" type="application/x-shockwave-flash" wmode="" allowScriptAccess="always" allowFullScreen="true" allowNetworking="all" name="viddler_437" flashVars="f=1&autoplay=f&disablebranding=f&liverailTags="></embed></object>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/softwaresanierung.wordpress.com/1133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/softwaresanierung.wordpress.com/1133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/softwaresanierung.wordpress.com/1133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/softwaresanierung.wordpress.com/1133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/softwaresanierung.wordpress.com/1133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/softwaresanierung.wordpress.com/1133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/softwaresanierung.wordpress.com/1133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/softwaresanierung.wordpress.com/1133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/softwaresanierung.wordpress.com/1133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/softwaresanierung.wordpress.com/1133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/softwaresanierung.wordpress.com/1133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/softwaresanierung.wordpress.com/1133/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/softwaresanierung.wordpress.com/1133/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/softwaresanierung.wordpress.com/1133/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=1133&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://softwaresanierung.wordpress.com/2011/12/18/der-zentrale-fehler-in-der-agilen-softwareentwicklung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/76e16e21551c9dd5e0e56fdba4bad357?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sebastiankuebeck</media:title>
		</media:content>
	</item>
		<item>
		<title>Eine kurze Geschichte der iterativen Softwareentwicklung</title>
		<link>http://softwaresanierung.wordpress.com/2011/11/26/eine-kurze-geschichte-der-iterativen-softwareenwticklung/</link>
		<comments>http://softwaresanierung.wordpress.com/2011/11/26/eine-kurze-geschichte-der-iterativen-softwareenwticklung/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 11:38:27 +0000</pubDate>
		<dc:creator>sebastiankuebeck</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[agile softwareentwicklung]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[softwareentwicklung]]></category>
		<category><![CDATA[tdd]]></category>

		<guid isPermaLink="false">http://softwaresanierung.wordpress.com/?p=1122</guid>
		<description><![CDATA[Viele Leute glauben bis heute, dass die iterative Softwareentwicklung eine Modeerscheinung der letzten 15 oder so Jahre wäre. Tatsächlich verhält es sich genau umgekehrt: Wahrscheinlich setzte bereits der Computerpionier John von Neumann auf die inkrementelle Softwareentwicklung. Mehr dazu im Artikel Some History about Iterative Development auf meinem englischsprachigen Blog&#8230;<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=1122&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Viele Leute glauben bis heute, dass die iterative Softwareentwicklung eine Modeerscheinung der letzten 15 oder so Jahre wäre. Tatsächlich verhält es sich genau umgekehrt: Wahrscheinlich setzte bereits der Computerpionier <a href="http://de.wikipedia.org/wiki/John_von_Neumann">John von Neumann</a> auf die inkrementelle Softwareentwicklung.</p>
<p>
Mehr dazu im Artikel <a href="http://www.jroller.com/sebastianKuebeck/entry/some_history_about_iterative_development">Some History about Iterative Development </a>auf meinem englischsprachigen Blog&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/softwaresanierung.wordpress.com/1122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/softwaresanierung.wordpress.com/1122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/softwaresanierung.wordpress.com/1122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/softwaresanierung.wordpress.com/1122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/softwaresanierung.wordpress.com/1122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/softwaresanierung.wordpress.com/1122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/softwaresanierung.wordpress.com/1122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/softwaresanierung.wordpress.com/1122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/softwaresanierung.wordpress.com/1122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/softwaresanierung.wordpress.com/1122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/softwaresanierung.wordpress.com/1122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/softwaresanierung.wordpress.com/1122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/softwaresanierung.wordpress.com/1122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/softwaresanierung.wordpress.com/1122/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=1122&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://softwaresanierung.wordpress.com/2011/11/26/eine-kurze-geschichte-der-iterativen-softwareenwticklung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/76e16e21551c9dd5e0e56fdba4bad357?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sebastiankuebeck</media:title>
		</media:content>
	</item>
		<item>
		<title>Die Suche des Ingenieurs nach der universellen Methode</title>
		<link>http://softwaresanierung.wordpress.com/2011/10/18/die-suche-des-ingenieurs-nach-der-universellen-methode/</link>
		<comments>http://softwaresanierung.wordpress.com/2011/10/18/die-suche-des-ingenieurs-nach-der-universellen-methode/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 10:59:44 +0000</pubDate>
		<dc:creator>sebastiankuebeck</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://softwaresanierung.wordpress.com/?p=1112</guid>
		<description><![CDATA[William Vaughn Koen, emeritierter Professor der University of Texas und Autor des Buches Discussion of the Method: Conducting the Engineer&#8217;s Approach to Problem Solving über die Art und Weise, wie Ingenieure Probleme lösen. Faszinierende Einsichten über die Natur des Ingenieurwesens und den Umstanden, dass auch in scheinbar exakten Wissenschaften wie der Mathematik Faustformeln (Heuristiken), und [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=1112&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>William Vaughn Koen, emeritierter Professor der University of Texas und Autor des Buches <a>Discussion of the Method: Conducting the Engineer&#8217;s Approach to Problem Solving</a> über die Art und Weise, wie Ingenieure Probleme lösen.</p>
<p><a href="http://www.me.utexas.edu/~koen/etc-lecture/"><img class="alignnone size-full wp-image-1113" title="UniversalMethodBillyVKoen" src="http://softwaresanierung.files.wordpress.com/2011/10/universalmethodbillyvkoen.jpg?w=450&#038;h=191" alt="" width="450" height="191" /></a></p>
<p>Faszinierende Einsichten über die Natur des Ingenieurwesens und den Umstanden, dass auch in scheinbar exakten Wissenschaften wie der Mathematik Faustformeln (Heuristiken), und nicht glasklare Logik die Entscheidungen der Forscher bestimmen.</p>
<p>Der Vortrag hat nur einen kleinen Schönheitsfehler: Die Aussage &#8222;Alles ist eine Heuristik!&#8220;. Man sollte sich von der Eloquenz und Reputation des Vortragenden hier nicht blenden lassen, denn offensichtlicherweise ist ein Tisch ein Tisch, ein Sessel ein Sessel und eine Heuristik eine Heuristik. Diese triviale Einsicht bin ich persönlich nicht bereit aufzugeben! Prof. Koen hätte hier auf Boëthius hören sollen: <em>Wenn du geschwiegen hättest, wärest du Philosoph geblieben</em>.</p>
<p>Ansonsten ist der Vortrag äußerst unterhaltsam und lehrreich und alle beschriebenen Erkenntnisse gelten natürlich auch uneingeschränkt für Softwareentwickler.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/softwaresanierung.wordpress.com/1112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/softwaresanierung.wordpress.com/1112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/softwaresanierung.wordpress.com/1112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/softwaresanierung.wordpress.com/1112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/softwaresanierung.wordpress.com/1112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/softwaresanierung.wordpress.com/1112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/softwaresanierung.wordpress.com/1112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/softwaresanierung.wordpress.com/1112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/softwaresanierung.wordpress.com/1112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/softwaresanierung.wordpress.com/1112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/softwaresanierung.wordpress.com/1112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/softwaresanierung.wordpress.com/1112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/softwaresanierung.wordpress.com/1112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/softwaresanierung.wordpress.com/1112/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=1112&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://softwaresanierung.wordpress.com/2011/10/18/die-suche-des-ingenieurs-nach-der-universellen-methode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/76e16e21551c9dd5e0e56fdba4bad357?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sebastiankuebeck</media:title>
		</media:content>

		<media:content url="http://softwaresanierung.files.wordpress.com/2011/10/universalmethodbillyvkoen.jpg" medium="image">
			<media:title type="html">UniversalMethodBillyVKoen</media:title>
		</media:content>
	</item>
		<item>
		<title>Code für andere Leute schreiben, Teil 8</title>
		<link>http://softwaresanierung.wordpress.com/2011/09/28/code-fur-andere-leute-schreiben-teil-8/</link>
		<comments>http://softwaresanierung.wordpress.com/2011/09/28/code-fur-andere-leute-schreiben-teil-8/#comments</comments>
		<pubDate>Wed, 28 Sep 2011 06:36:26 +0000</pubDate>
		<dc:creator>sebastiankuebeck</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[agile softwareentwicklung]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[software-sanierung]]></category>
		<category><![CDATA[softwarearchitektur]]></category>
		<category><![CDATA[softwareentwicklung]]></category>

		<guid isPermaLink="false">http://softwaresanierung.wordpress.com/?p=1061</guid>
		<description><![CDATA[Der vorhergehende Teil dieser Artikelserie war der Identifikation von Analogiemustern im Quellcode gewidmet. In diesem letzten Teil wird die für Thomas Mullen fundamentale Regel des Softwareentwurfs beschrieben und Schlussfolgerungen aus all dem gezogen. Die fundamentale Regel des Softwareentwurfs … more what you’d call ‘guidelines’ than actual rules Capt. Barbossa in &#8222;Pirates of the Caribbean: The [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=1061&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Der <a href="http://softwaresanierung.wordpress.com/2011/09/27/code-fur-andere-leute-schreiben-teil-7/">vorhergehende Teil</a> dieser Artikelserie war der Identifikation von Analogiemustern im Quellcode gewidmet. In diesem letzten Teil wird die für Thomas Mullen fundamentale Regel des Softwareentwurfs beschrieben und Schlussfolgerungen aus all dem gezogen.</p>
<h2>Die fundamentale Regel des Softwareentwurfs</h2>
<blockquote><p>… more what you’d call ‘guidelines’ than actual rules</p></blockquote>
<p>Capt. Barbossa in &#8222;Pirates of the Caribbean: The Curse of<br />
the Black Pearl&#8220; (dt.: &#8222;Der Fluch der Karibik&#8220;).</p>
<h3>Die &#8222;4 minus Analogien&#8220; -Regel</h3>
<p>Wie wir im <a href="http://softwaresanierung.wordpress.com/2011/09/23/code-fur-andere-leute-schreiben-teil-6/">6. Teil</a> gesehen haben sind Analogien die Bausteine der Wahrnehmung. Identifizieren der Analogien eines Problems ist der erste Schritt zur Lösung. Code-Strukturen zu identifiziren, die Analogien repräsentieren, sind Teil der Kenntnisse eines erfahrenen Programmierers. Unser Gehirn hat sich dahingehend entwickelt, Netzwerke für das Langzeitgedächtnis aufzubauen (siehe <a href="http://softwaresanierung.wordpress.com/2011/09/19/code-fur-andere-leute-schreiben-teil-3/">Teil 3</a>). Netzwerke, die für das effiziente Auffinden von Informationen und das minimieren des Aufwandes für das Umlernen optimiert sind. Die Konsequenz dieser Entwicklung ist, dass wir lediglich vier Code-Elemente oder weniger zu einem gegebenen Zeitpunkt verarbeiten können. Die einzige Ausnahme ist die Anzahl von Varianten einer Analogie.</p>
<p>Wir können eine Einkaufsliste unabhängig von ihrer Länge verstehen, da wir wissen, dass wir alle Elemente der Liste gleich behandeln können (z.B. finden und einkaufen). Wir werden also instinktiv alle Varianten als ein Element in einer Analogie gruppieren. Damit ergibt sich die fundamentale Regel des Softwareentwurfs als:</p>
<blockquote><p>Software sollte in Chunks aus maximal vier Elementen Gruppiert sein, wobei eine beliebige Anzahl von Varianten von Analogien erlaubt sind.</p></blockquote>
<p>Da wir die Definition der Psychologen für Chunking verwenden (siehe <a href="http://softwaresanierung.wordpress.com/2011/09/18/code-fur-andere-leute-schreiben-teil-2/">Teil 2</a>), ist die Forderung nach geringer Kopplung und hoher Kohäsion (gemäß dem <a href="http://www.objectmentor.com/resources/articles/srp.pdf">Einzelzuständigkeitsprinzip</a>) automatisch erfüllt. Das bedeutet natürlich nicht, dass beispielsweise eine Klasse nur vier Methoden haben darf. Es ist auch erlaubt, Methoden in Chunks von vier Methoden oder weniger zusammenzufassen, dabei ist wieder eine beliebige Anzahl von Varianten von Analogien erlaubt.</p>
<p>Software zu Chunks zusammenzufassen ist eine durchaus offensichtliche Form der Strukturierung von Code und wird daher in zahlreichen Quellen beschrieben. Ein Erklärungsmodell, das erlaubte Ausnahmen beschreibt hingegen nicht. Das klassische Beispiel ist das eines einzelnen, einfachen Verhaltens basierend auf unterschiedlichen Datentypen, das aber keine eigene Klasse benötigt. In diesem Fall ist eine einfache Switch-Anweisung besser geeignet.</p>
<pre style="font-size:120%;">switch (operand) {
        case MULTIPLY:
            return first * second;
        case DIVIDE:
            return first / second;
        case ADD :
            return first + second;
        case SUBTRACT :
            return first - second;
    }</pre>
<p style="font-size:80%;">Diese Switch-Anweisung braucht auch dann nicht in eine eigene Klasse ausgelagert zu werden, wenn sie mehr als vier Case-Anweisungen enthält. Schließlich sind alle Case-Anweisungen Varianten der Switch-Analogie. Da unser Gehirn alles, was es als Analogie erkennt, zusammenfasst, führt das zu keiner kognitiven Überlastung.</p>
<p>Wie wir im vorhergehenden Teil gesehen haben, ist das die Struktur einer Analogie, also folgt es der &#8222;4 minus Analogien&#8220; -Regel. Mehr als vier Elemente einzufügen belastet den Leser damit, dass er selbst Elemente zu Chunks zusammenfügen muss. Ohne die Anleitung, die der Autor dem Leser durch die Strukturierung des Codes zur Verfügung stellt könnte der Leser zu einer anderen Aufteilung kommen oder er könnte überhaupt Schwierigkeiten haben, eine Aufteilung zu finden. Das kann zu Missverständnissen führen und diese führen nicht selten zu Fehlern.</p>
<p>Chunking und Analogien mögen einen Einblick in die Kunst des Programmierens geben, vermögen aber nicht alles zu erklären. Beispielsweise ähnelt Joshua Bloch&#8217;s <a href="http://en.wikipedia.org/wiki/Builder_pattern">Erbauermuster</a> [mehr noch <a href="http://martinfowler.com/bliki/FluentInterface.html">Fluent Interfaces</a>, wie sie Martin Fowler beschreibt] der Struktur nach geschriebener Sprache und dass trotz der Einschränkungen eines stark beschränkten Vokabulars.</p>
<pre style="font-size:120%;">    customer.newOrder()
            .with(6, "TAL")
            .with(5, "HPK").skippable()
            .with(3, "LGV")
            .priorityRush();</pre>
<p style="font-size:80%;">Die Struktur des Codes, die ein Fluent Interface ermöglicht, kommt geschriebener Sprache sehr nahe.</p>
<h3>Schlussfolgerungen</h3>
<p>Code verständlich zu gestalten ist das primäre Ziel für einen Großteil der Entwurfsprinzipien in der Softwareentwicklung. Um zu verstehen, was &#8222;Einfachheit&#8220; im Zusammenhang mit Softwareentwicklung bedeutet, müssen wir die Prozesse und deren Beschränkungen verstehen lernen, die es uns ermöglichen Quellcode zu verstehen. Das kognitive Modell kann auch von Neulingen verstanden und gelernt werden, denn man kann zur Veranschaulichung Beispiele &#8222;aus dem richtigen Leben&#8220; verwenden, die auch Nichtprogrammieren vertraut sind.</p>
<p>Die Konzepte der Kognition sind die Fundamente hinter den Entwurfsprinzipien. Das erlernen des kognitiven Modells ist allerdings kein Ersatz dafür, Entwurfsprinzipien zu erlernen und zu verstehen, aber es reduziert die nötige Erfahrung, die der Neuling benötigt, um herauszufinden, unter welchen Umständen er welches Prinzip umsetzen soll. Die daraus entstehende Verbesserung unseres Codes wird uns helfen, die Kosten für Wartung und Support zu reduzieren.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/softwaresanierung.wordpress.com/1061/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/softwaresanierung.wordpress.com/1061/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/softwaresanierung.wordpress.com/1061/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/softwaresanierung.wordpress.com/1061/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/softwaresanierung.wordpress.com/1061/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/softwaresanierung.wordpress.com/1061/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/softwaresanierung.wordpress.com/1061/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/softwaresanierung.wordpress.com/1061/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/softwaresanierung.wordpress.com/1061/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/softwaresanierung.wordpress.com/1061/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/softwaresanierung.wordpress.com/1061/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/softwaresanierung.wordpress.com/1061/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/softwaresanierung.wordpress.com/1061/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/softwaresanierung.wordpress.com/1061/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=1061&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://softwaresanierung.wordpress.com/2011/09/28/code-fur-andere-leute-schreiben-teil-8/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/76e16e21551c9dd5e0e56fdba4bad357?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sebastiankuebeck</media:title>
		</media:content>
	</item>
		<item>
		<title>Code für andere Leute schreiben, Teil 7</title>
		<link>http://softwaresanierung.wordpress.com/2011/09/27/code-fur-andere-leute-schreiben-teil-7/</link>
		<comments>http://softwaresanierung.wordpress.com/2011/09/27/code-fur-andere-leute-schreiben-teil-7/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 07:35:52 +0000</pubDate>
		<dc:creator>sebastiankuebeck</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[agile softwareentwicklung]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[software-sanierung]]></category>
		<category><![CDATA[softwarearchitektur]]></category>
		<category><![CDATA[softwareentwicklung]]></category>

		<guid isPermaLink="false">http://softwaresanierung.wordpress.com/?p=1047</guid>
		<description><![CDATA[Im letzten Teil haben wir erörtert, was man in der Psychologie unter dem Begriff Analogie versteht und auf welche Art und Weise wir Analogie auswählen. In diesem Teil wollen wir gängige Analogiemuster im Quellcode aufspüren. Analogiemuster in Software Die offensichtlichste Art Analogien in Software zu implementieren ist die Verwendung von Interfaces und abstrakten Klassen (siehe [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=1047&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Im <a href="http://softwaresanierung.wordpress.com/2011/09/23/code-fur-andere-leute-schreiben-teil-6/">letzten Teil</a> haben wir erörtert, was man in der Psychologie unter dem Begriff Analogie versteht und auf welche Art und Weise wir Analogie auswählen. In diesem Teil wollen wir gängige Analogiemuster im Quellcode aufspüren.</p>
<h2>Analogiemuster in Software</h2>
<p>Die offensichtlichste Art Analogien in Software zu implementieren ist die Verwendung von Interfaces und abstrakten Klassen (siehe einfache Analogien und Regelanalogien in der Aufzählung unten im <a href="http://softwaresanierung.wordpress.com/2011/09/23/code-fur-andere-leute-schreiben-teil-6/">vorhergehenden Teil</a>), allerdings kann man Analogien auch auf andere Art darstellen.</p>
<p>Bitte berücksichtigen Sie, dass die Codebeispiele in diesem Abschnitt Beispiele für die Strukturierung von Code darstellen. Sie zeigen, wie der Code aussehen könnte aber nicht notwendigerweise wie er aussehen sollte. Eine gute Richtlinie für das Identifizieren von Analogien ist, wenn man &#8222;erraten&#8220; kann, wie der Code logisch fortgesetzt werden kann, wenn das Verhalten um eine neue Variante erweitert werden soll.</p>
<p>Der folgende Code zeigt Beispielsweise das Kontotyp-Attribut für unterschiedliche Terminbörsen als Varianten (<a href="http://de.wikipedia.org/wiki/Eurex">Eurex</a>, <a href="http://en.wikipedia.org/wiki/London_International_Financial_Futures_and_Options_Exchange">Liffe</a>, etc.).</p>
<pre style="font-size:120%;">public String getAccountType(String account) {
    if(exchange.equals("EUREX"))
        return getEurexAccountType(account);
    if(exchange.equals("LIFFE"))
        return getLiffeAccountType(account);
    if(exchange.equals("MONEP"))
        return getMonepAccountType(account);</pre>
<p>Es ist hier einfach zu erraten, wie der Code für die Französische Terminbörse <a href="http://en.wikipedia.org/wiki/MATIF">MATIF</a> erweitert werden muss:</p>
<pre style="font-size:120%;">    if( exchange.equals("MATIF") )
        return getMatifAccountType(account);</pre>
<p>Auf den ersten Blick sieht das Erraten dieser Erweiterung wie das Ergebnis von Erfahrung in der Softwareentwicklung aus. Tatsächlich ist es aber das Ergebnis von Erfahrung im Erkennen von Analogien und diese Fähigkeit erlernen wir bereits in unserer Kindheit! Die unbewusste Annahme, dass der Leser analoge Strukturen erkennen und erstellen kann (die die Anforderungen an die Anwendung widerspiegeln) ist zweifellos eine zentrale Fähigkeit, die auch von Softwareentwicklern verlangt wird, die den Code zum ersten Mal zu Gesicht bekommen (im <a href="http://softwaresanierung.wordpress.com/2011/09/21/code-fur-andere-leute-schreiben-teil-5/">vorletzten Teil</a> haben wir diese Entwickler <em>Neulinge</em> genannt).</p>
<p>Im folgenden Abschnitt werden zahlreiche Sprachmittel von Java vorgestellt, die dazu verwendet werden können, Analogien darzustellen. Diese Sprachmittel sind natürlich auch in anderen Programmiersprachen vorhanden und abhängig von den Sprachmitteln ist in vielen Sprachen natürlich noch mehr möglich.</p>
<h3>Attribute-Only-Analogien</h3>
<p>Die einfachste Art einer Attribute-Only-Analogie ist eine Hashtabelle (Map). In diesem Beispiel werden die einzelnen Terminbörsen als <em>direkte Analogien</em> (siehe <a href="http://softwaresanierung.wordpress.com/2011/09/23/code-fur-andere-leute-schreiben-teil-6/">letzter Teil unten</a>) gesehen. Das einzige Attribut von Interesse ist dabei das Land, in welchem sich die Börse befindet:</p>
<pre style="font-size:120%;">static Map exchangeCountry = new HashMap();

static {
    exchangeCountry.put("EUREX","Germany");
    exchangeCountry.put("CBOT","US");
    exchangeCountry.put("LIFFE","England");
    //can guess what to do
    //to extend for <a href="http://en.wikipedia.org/wiki/New_York_Board_of_Trade">NYBOT</a>......
}

//usage
public String logMessage(String exchangeName) {
    return "Exchange " + exchangeName +
           " is in " +
            exchangeCountry.get(exchangeName);
}</pre>
<h3>Statement-Formanalogien</h3>
<p>In diesem Fall wird dieselbe Ausführung (Form) für unterschiedliche Felder oder Elemente verwendet, um das Verhalten zu implementieren. Die Ähnlichkeit in der Ausführung (Form) des Statements ist der Schlüssel, durch den der Leser die Analogie erkennt. In diesem Beispiel ist das Überprüfen des Feldes die Analogie und jedes Feld der Klasse benötigt seine Eigene Variante zur Überprüfung desselben.</p>
<pre style="font-size:120%;">private Date expirationDate;
private Long contractNumber;
private Double price;
private Double quantity;
private String description;

private boolean isValid()
{
    if(expirationDate == null ||
       !(expirationDate.getTime() &gt; 0))
        return false;

    if(price == null ||
       !(price.doubleValue() &gt; 0))
        return false;

    if(quantity == null ||
       !(quantity.doubleValue() &gt; 0))
        return false;

    //can guess what the code line is
    //for the String parameter
    //"description" ......

    return true;
}</pre>
<h3>Switch-Analogie</h3>
<p>Ähnlich wie bei der Statement-Formanalogie sind die Implementierungen zu <a href="http://softwaresanierung.wordpress.com/2011/09/18/code-fur-andere-leute-schreiben-teil-2/">Chunks</a> gruppiert, allerdings mit einer formelleren Definition des Typs der Variante. Das Beispiel gibt das Ergebnis unterschiedlicher Operationen zurück, die auf zwei Zahlen angewendet werden sollen (Addition, Subtraktion, etc.)</p>
<pre style="font-size:120%;">private int operand;

public double calculate(double first, double second) {
    switch (operand) {
        case MULTIPLY:
            return first * second;
        case DIVIDE:
            return first / second;
        case ADD :
            return first + second;
        case SUBTRACT :
            return first - second;
    }
    return 0;
}</pre>
<h3>Methodennamen-Analogie</h3>
<p>Entweder das Präfix oder das Suffix der Methode wird verwendet, um die Analogie auszudrücken. Das Präfix hat den Vorteil, dass die Gruppierung und damit die Analogie auch dann noch erhalten bleibt, wenn die Methoden alphabetisch sortiert werden. Als Beispiel für die Präfix-Variante dient das <a href="http://de.wikipedia.org/wiki/Visitor">Besuchermuster</a>. Im Beispiel für die Gruppierung mithilfe des Suffix wird ein Objekt des Typs <code style="font-size:120%;">Double</code> in unterschiedliche Datentypen umgewandelt. Diese Form ist nützlich, wenn alle Varianten gemeinsame Abhängigkeiten haben, die in der Klasse zu Chunks zusammengefasst werden können.</p>
<pre style="font-size:120%;">//example 1 - prefix
public void visitExpression(Node a) {};
public void visitBlock(Node a) {};
public void visitFile(Node a) {};

//example 2 - suffix
Double doubleObj = new Double(0);
double a = doubleObj.doubleValue();
int b = doubleObj.intValue();
long c = doubleObj.longValue();
float d = doubleObj.floatValue();</pre>
<h3>Methodenparameter-Analogie</h3>
<p>Der Typ des Parameters, der an eine Methode übergeben wird, kann die verwendete Variante bestimmen. Das folgende Beispiel berechnet das Maximum zweier zahlen:</p>
<pre style="font-size:120%;">float f = Math.max(1.0F, 2.0F);
int i = Math.max(1, 2);
long l = Math.max(1L, 2L);
double d = Math.max(1.0, 2.0);</pre>
<h3>Klassen-/Interface-Analogie</h3>
<p>Die Klassen-/Interface-Analogie erlaubt es, mehrere Elemente (Felder) zu Chunks zusammenzufassen.</p>
<pre style="font-size:120%;">abstract class Shape {
    String name; //square, circle etc
    int numSides;
    abstract double area();
}

class Rectangle extends Shape {
    double length;
    double width;

    double area() {
        return (length * width);
    }
}</pre>
<h3>Anwendungsanalogie</h3>
<p>Die Laufenden Instanzen einer Anwendung sind direkte Analogien voneinander. Konfigurationsdateien und Systemeinstellungen sind die Eigenschaften (Merkmale) dieser Analogie.</p>
<h3>Multiparadigmen-Design</h3>
<p>Die Technik, Analogien in den Anforderungen zu identifizieren und daraufhin die passenden Code-Strukturen auszuwählen wurde erstmals von James Coplien beschrieben (siehe <a href="http://www.amazon.com/Multi-Paradigm-Design-C-James-Coplien/dp/0201824671">Multi-Paradigm Design for C++</a>). Coplien benutzt allerdings den Begriff <em>Domain</em> für Analogieen und <em>Sub-Domains</em> für Varianten. <em>Solution Domains</em> entsprechen den Analogiestrukturen im Code (auch wenn lediglich formale Strukturelemente wie Interface, Template [das mächtigere Pendant zu Generics in C++] etc. identifiziert werden). Die &#8222;<em></em>commonality and variability analysis&#8220; ist der Prozess, mit dem die Analogien identifiziert werden. Beide, Coplien und Grady Booch (in <a href="http://www.amazon.com/Object-Oriented-Analysis-Design-Applications-3rd/dp/020189551X">Object-Oriented Analysis and Design with Applications</a>) beschreiben objektorientiertes Design als &#8222;Aufteilen durch Zusammenfassen&#8220;. Strukturiertes Design ist die Disziplin des Zusammenfassens aber für Thomas Mullen ist objektorientiertes Design Identifizieren und Kodieren von Analogien. Das sind unterschiedliche aber komplementäre Fähigkeiten, die erworben werden müssen, um Software mit gutem Design zu erstellen.</p>
<p>Im <a href="http://softwaresanierung.wordpress.com/2011/09/28/code-fur-andere-leute-schreiben-teil-8/">achten und letzten Teil</a> dieser Serie wird die fundamentale Regel des Softwareentwurfs beschrieben und Schlussfolgerungen aus all den Erkenntnissen, die in den vorangegangenen Teilen gewonnen wurden, gezogen.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/softwaresanierung.wordpress.com/1047/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/softwaresanierung.wordpress.com/1047/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/softwaresanierung.wordpress.com/1047/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/softwaresanierung.wordpress.com/1047/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/softwaresanierung.wordpress.com/1047/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/softwaresanierung.wordpress.com/1047/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/softwaresanierung.wordpress.com/1047/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/softwaresanierung.wordpress.com/1047/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/softwaresanierung.wordpress.com/1047/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/softwaresanierung.wordpress.com/1047/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/softwaresanierung.wordpress.com/1047/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/softwaresanierung.wordpress.com/1047/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/softwaresanierung.wordpress.com/1047/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/softwaresanierung.wordpress.com/1047/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=1047&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://softwaresanierung.wordpress.com/2011/09/27/code-fur-andere-leute-schreiben-teil-7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/76e16e21551c9dd5e0e56fdba4bad357?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sebastiankuebeck</media:title>
		</media:content>
	</item>
		<item>
		<title>Code für andere Leute schreiben, Teil 6</title>
		<link>http://softwaresanierung.wordpress.com/2011/09/23/code-fur-andere-leute-schreiben-teil-6/</link>
		<comments>http://softwaresanierung.wordpress.com/2011/09/23/code-fur-andere-leute-schreiben-teil-6/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 06:30:11 +0000</pubDate>
		<dc:creator>sebastiankuebeck</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[agile softwareentwicklung]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[entwurfsmuster]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[softwarearchitektur]]></category>
		<category><![CDATA[softwareentwicklung]]></category>

		<guid isPermaLink="false">http://softwaresanierung.wordpress.com/?p=955</guid>
		<description><![CDATA[Das letzte große Thema in Thomas Mullen’s Paper widmet sich den Analogien, dem wahrscheinlich wichtigsten Werkzeug menschlichen Denkens. Den Anfang macht die Frage, wie wir in bestimmten Situationen passende Analogien auswählen. Die Auswahl von Analogien Als Analogie bezeichnet man eine Form der Übereinstimmung von Objekten physischer oder abstrakter Natur hinsichtlich gewisser Merkmale. Für viele Psychologen [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=955&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Das letzte große Thema in Thomas Mullen’s <a href="http://homepage.ntlworld.com/b.mullen4/paper/onward004-mullen.pdf">Paper</a> widmet sich den Analogien, dem wahrscheinlich wichtigsten Werkzeug menschlichen Denkens. Den Anfang macht die Frage, wie wir in bestimmten Situationen passende Analogien auswählen.</p>
<h2>Die Auswahl von Analogien</h2>
<p>Als Analogie bezeichnet man eine Form der Übereinstimmung von Objekten physischer oder abstrakter Natur hinsichtlich gewisser Merkmale.</p>
<p>Für viele Psychologen sind Analogie ein zentraler Punkt menschlicher Intelligenz. Manche eröffnen neue Einsichten (z.B. <a href="http://de.wikipedia.org/wiki/Bohrsches_Atommodell">Niels Bohrs Atommodell</a>, indem die Elektronen um den Kern wie Planeten um die Sonne kreisen), andere erlauben uns, bestehende Kenntnisse in neue Situationen anzuwenden (zum Beispiel, wenn wir lernen, ein Motorboot zu fahren, nachdem wir bereits gelernt haben, ein Auto zu fahren). Laut <a href="http://prelectur.stanford.edu/lecturers/hofstadter/analogy.html">Douglas R. Hofstadter</a> sind Analogien ein zentraler Punkt menschlicher Erkenntnis. Sie sind die Bausteine für die Art und Weise, wie wir Konzepte verstehen.</p>
<p><a href="http://xkcd.com/762/"><img class="alignnone" title="Analogies" src="http://imgs.xkcd.com/comics/analogies.png" alt="" /></a></p>
<p style="font-size:80%;">Analogies. Quelle: XKCD.</p>
<p>Holyoak &amp; Thagard <a href="http://cogsci.uwaterloo.ca/Articles/Pages/Analog.Mind.html">identifizieren</a> drei weitläufige Kriterien für die Auswahl von Analogien: Ähnlichkeit, Struktur und Zweck. Ein Spieleprogrammierer könnte beispielsweise das Verhalten eines virtuellen Tigers abhängig von seinem mentalen Zustand modellieren (hungrig, verletzt, bedroht). Dabei werden die mentale Zustände des Tigers als <em>Varianten</em>, die in Abhängigkeit davon modellierte Verhaltensmuster (Bewegungen des Tiers, die Wahrscheinlichkeit eines Angriffs) als <em>Strukturelemente</em> Bezeichnet [Varianten von "Tiger" wären dann "hungriger Tiger", "verletzter Tiger", "bedrohter Tiger"].</p>
<p>Der World Wild Fund for Nature (WWF) sieht den Tiger eher vom Standpunkt des Artenschutzes, dabei sind die Umwelt, die Häufigkeit von Nachwuchs, die aktuelle Population etc. die Strukturelemente der Analogie. In der WWF-Analogie ist der Tiger die Variante [eine Variante von "Gattung" zum Beispiel], sowie andere bedrohte Arten wie der Panda. Es ist also der <em>Zweck</em>, der die Auswahl der Analogie für den Spieleprogrammierer und den WWF bestimmt.</p>
<p><a href="http://www.saynotocrack.com/index.php/2007/03/31/tiger-cares-for-piglets-and-vice-versa/"><img class="alignnone" title="Tiger Cares for Piglets and Vice-Versa" src="http://www.saynotocrack.com/wp-content/uploads/2007/03/tiger-and-piglets-two.jpg" alt="" width="500" height="379" /></a></p>
<p style="font-size:80%;">Der Tiger und die fünf Schweinchen. Quelle: Say No To Crack.</p>
<p>In der Software kann ein und dieselbe Klasse (oder ein und derselbe Codebestandteil) anderen Codebestandteilen unterschiedliche Analogien zur Verfügung stellen. Ein <a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html">Datenzugriffsobjekt</a> wird beispielsweise allen Codebestandteilen Lese- und Schreibverhalten zur Verfügung stehen, die Zugang zu gespeicherten Daten benötigen. Codebestandteilen, die mit der Initialisierung der Anwendung betraut sind, wird dasselbe Datenzugriffsobjekt jedoch einen Konstruktor oder eine Methode <code style="font-size:120%;">setDataSource</code> zur Verfügung stellen, über den oder die das Objekt Zugang zur Datenbank bekommt.</p>
<p>Auch in diesem Fall wird die Auswahl der Analogie durch den Zweck (Zugang zu Daten, Initialisierung) bestimmt. Unterschiedlichen Codebestandteilen unterschiedliche Analogien zur Verfügung zu stellen kann die mentale Belastung beim Verstehen einzelner Codebestandteile reduzieren.</p>
<p><a href="http://www.cc.gatech.edu/classes/AY2010/cs6795_spring/readings/gentner_mapping.pdf">Dedre Gentner</a> schlug 1983 einen Algorithmus vor der den Einfluss der Struktur der Analogie auf die Auswahl beschreibt. Gentner unterscheidet vier Kategorien von Analogien:</p>
<table>
<tbody>
<tr>
<th>Bezeichnung</th>
<th>Beschreibung</th>
<th>Beispiel</th>
</tr>
<tr>
<td>Direkte Analogie</td>
<td align="left">Zahlreiche Objekteigenschaften und Beziehungen zwischen Objekten stimmen überein</td>
<td align="left">Das Sonnensystem K5 ist wie unser eigenes Sonnensystem</td>
</tr>
<tr>
<td>Einfache Analogie</td>
<td align="left">Zahlreiche Beziehungen zwischen Objekten stimmen überein, allerdings wenige Objekteigenschaften</td>
<td align="left">Das Atom ist wie unser Sonnensystem</td>
</tr>
<tr>
<td>Regelanalogie</td>
<td align="left">Wie einfache Analogie, allerdings enthalten die unterschiedlichen Varianten wenige Objekteigenschaften.</td>
<td align="left">Das Atom ist ein System in dem alle Kräfte vom Zentrum ausgehen</td>
</tr>
<tr>
<td>Anomalie</td>
<td align="left">Wenige Beziehungen zwischen Objekten und wenige Eigenschaften stimmen überein</td>
<td align="left">Kaffee ist wie ein Sonnensystem</td>
</tr>
</tbody>
</table>
<p>Diese Kategorien werden in der Softwareentwicklung häufig wie folgt umgesetzt:</p>
<ul>
<li>Alle Instanzen einer Klasse <em>direkte Analogien</em>, wobei die Klassendefinition selbst als Abbildung fungiert. Genauso verhält es sich mit den Zeilen einer Datenbanktabelle, wobei in diesem Fall die Spaltennamen als Abbildung dienen.</li>
<li>Interfaces und abstrakte Klassen können benutzt werden, um die Abbildung von <em>einfachen Analogien</em> zu beschreiben.</li>
<li>Mit einem parametrisierten Datentyp (Generic, Template) wird häufig eine <em>Regelanalogie</em> ausgedrückt. Die Klasse <code style="font-size:120%;">Set&lt;T&gt;</code> hat selbst keine Informationen darüber, welche Objekte später in die Instanz der Klasse aufgenommen werden. Anstelle des konkreten Typs wird in der Klassendefinition einfach der Platzhalter <code style="font-size:120%;">T</code> verwendet.</li>
</ul>
<p>Im nächsten Teil folgen den theoretischen Ausführungen konkrete Beispiele.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/softwaresanierung.wordpress.com/955/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/softwaresanierung.wordpress.com/955/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/softwaresanierung.wordpress.com/955/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/softwaresanierung.wordpress.com/955/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/softwaresanierung.wordpress.com/955/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/softwaresanierung.wordpress.com/955/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/softwaresanierung.wordpress.com/955/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/softwaresanierung.wordpress.com/955/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/softwaresanierung.wordpress.com/955/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/softwaresanierung.wordpress.com/955/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/softwaresanierung.wordpress.com/955/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/softwaresanierung.wordpress.com/955/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/softwaresanierung.wordpress.com/955/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/softwaresanierung.wordpress.com/955/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=955&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://softwaresanierung.wordpress.com/2011/09/23/code-fur-andere-leute-schreiben-teil-6/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/76e16e21551c9dd5e0e56fdba4bad357?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sebastiankuebeck</media:title>
		</media:content>

		<media:content url="http://imgs.xkcd.com/comics/analogies.png" medium="image">
			<media:title type="html">Analogies</media:title>
		</media:content>

		<media:content url="http://www.saynotocrack.com/wp-content/uploads/2007/03/tiger-and-piglets-two.jpg" medium="image">
			<media:title type="html">Tiger Cares for Piglets and Vice-Versa</media:title>
		</media:content>
	</item>
		<item>
		<title>Code für andere Leute schreiben, Teil 5</title>
		<link>http://softwaresanierung.wordpress.com/2011/09/21/code-fur-andere-leute-schreiben-teil-5/</link>
		<comments>http://softwaresanierung.wordpress.com/2011/09/21/code-fur-andere-leute-schreiben-teil-5/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 06:26:58 +0000</pubDate>
		<dc:creator>sebastiankuebeck</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[agile softwareentwicklung]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[software-sanierung]]></category>
		<category><![CDATA[softwarearchitektur]]></category>
		<category><![CDATA[softwareentwicklung]]></category>

		<guid isPermaLink="false">http://softwaresanierung.wordpress.com/?p=915</guid>
		<description><![CDATA[Auf die Ausführungen zur kognitiven Belastung beim Lernen folgt in Mullen&#8217;s Paper ein Abschnitt über den Unterschied in der Art und Weise, wie Neulinge &#8211; also Programmierer, die zum ersten Mal an einer bestimmten Anwendung arbeiten &#8211; und Experten &#8211; dass sind Programmierer, die eine Anwendung schon seit Monaten oder Jahren kennen &#8211; Quellcode lesen [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=915&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Auf die <a href="http://softwaresanierung.wordpress.com/2011/09/20/code-fur-andere-leute-schreiben-teil-4/">Ausführungen zur kognitiven Belastung beim Lernen</a> folgt in Mullen&#8217;s Paper ein Abschnitt über den Unterschied in der Art und Weise, wie Neulinge &#8211; also Programmierer, die zum ersten Mal an einer bestimmten Anwendung arbeiten &#8211; und Experten &#8211; dass sind Programmierer, die eine Anwendung schon seit Monaten oder Jahren kennen &#8211; Quellcode lesen und interpretieren.</p>
<h2>Code für Neulinge und Experten</h2>
<p>Je mehr Erfahrung wir sammeln, desto eher <em>scannen</em> wir den Quellcode, statt ihn zu lesen. In dem Teil unseres Gehirns, indem visuelle Reize verarbeitet werden, werden die eingehenden visuellen Informationen mit Vorlagen aus unserem Gedächtnis verglichen. Diese Vorlagen entstehen in den Monaten und Jahren, in denen wir uns das Expertenwissen über ein Programm aneignen. Diese Vorlagen erlauben es dem Experten, sowohl die Struktur [eines Programms] als auch unübliche oder fehlerhafte Muster unmittelbar zu &#8222;sehen&#8220; und zwar so als ob die Verarbeitung unbewusst geschehen würde (siehe Didierjean, Gobet: <a href="http://bura.brunel.ac.uk/bitstream/2438/854/1/Sherlock-Holmes-and-Expertise.pdf">Sherlock Holmes – An expert’s view of expertise</a>).</p>
<p><img class="alignnone" title="Sharelok Holms" src="http://i.dailymail.co.uk/i/pix/2010/09/11/article-1311129-003132CD00000258-861_468x451.jpg" alt="" width="70%" /></p>
<p style="font-size:80%;">Michael Caine und Ben Kingsley als Sharelock Holms und Dr. Watson. In der Gaunerkomödie <a href="http://www.amazon.de/Genie-Schnauze-Sir-Michael-Caine/dp/B000G73TJ">Genie &amp; Schnauze</a> (engl. Without a Clue) ist Dr. Watson das Genie und Sharelock Holms ein arbeitsloser Schauspieler mit Hang zum Alkohol und zum anderen Geschlecht&#8230;</p>
<p>Dadurch ist es für einen Experten vorteilhaft, soviel Code wie möglich in seinem Blickfeld zu haben. Wie wir im vorigen Teil gesehen haben, wird dadurch auch der Effekt der geteilten Aufmerksamkeit reduziert. Wenn hingegen zuviel Code im Gesichtsfeld des Neulings platziert wird, dann ist es möglich, dass in seinem Gehirn eine kognitive Überlastung platzgreift. Neulinge profitieren davon, wenn der Code so strukturiert ist, dass ihre Aufmerksamkeit zu jedem Zeitpunkt auf ein paar Elemente beschränkt bleibt.</p>
<p>Expertenwissen über ein Programm oder über einen Teil davon is nicht auf Programmierer mit großer Erfahrung beschränkt. Natürlich wird es für einen Softwareexperten einfacher sein als für einen Neuling, sich in eine neue Software einzuarbeiten, allerdings wird jeder Programmierer &#8211; ob Neuling oder Experte &#8211; zum Experten in dem Code, den er selbst schreibt. Schleißlich hätte er nicht die geringste Chance sein Programm überhaupt zum Laufen zu bringen, würden er das zugrundeliegende Problem und die Lösung nicht in allen Einzelheiten verstehen.</p>
<p>Im Übrigen ist das Verstehen eines Programm als Aufgabenstellung vergleichsweise überschaubar, wenn man es beispielsweise mit Aufgabenstellungen der Physik und anderen Disziplinen vergleicht, also ist es üblicherweise eine Frage von Monaten oder einem Jahr bis auch ein unerfahrener Programmierer ein Experte in zumindest einem Teil der Anwendung wird mit der er sich tagtäglich beschäftigt.</p>
<p><a href="http://necsi.edu/wiki/images/a/a1/Quad_chart.jpg"><img class="alignnone" title="Überladene Powerpoint-Präsentation" src="http://necsi.edu/wiki/images/a/a1/Quad_chart.jpg" alt="" /></a></p>
<p style="font-size:80%;">Wer kennt sie nicht? Überladene Powerpointpräsentationen. So hat der Autor alles im Blickfeld aber das Publikum wird völlig überfordert. Quelle: The HG2S Training Blog.</p>
<p>Als Beispiel bevorzugen Neulinge üblicherweise eine agressivere <a href="http://de.wikipedia.org/wiki/Normalisierung_%28Datenbank%29">Normalisierung</a> als Experten, da durch die Normalisierung Daten in Chunks aufgeteilt werden, was die kognitive Überlastung reduziert. Der Experte hat hingegen verwendet die Vorlagen, die sich sein Gehirn im laufe der Zeit zurechtgelegt hat, um die Chunks unmittelbar zu &#8222;sehen&#8220;. Eine weitergehende Normalisierung wird er eher als unnötige Abstraktionsschicht wahrnehmen, die ihm das verstehen [des Datenbankschemas] erschwert.</p>
<p>Solange Neulinge und Experten ein und den selben Quellcode lesen und verstehen müssen wird es also immer gegengesetzte Interessen geben. Die ersteren wollen die kognitive Überlastung durch Aufteilen des Codes in Chunks vermeiden, die anderen möchten so viel Code wie möglich auf einmal im Blickfeld haben. Kompromisse auf beiden Seiten sind also unvermeidlich. Es dauert allerdings nicht lange, bis der Neuling zum Experten in der Anwendung wird, an der er arbeitet und dann wird er von der Codestruktur des Experten profitieren, allerdings haben die meisten Teams bei weitem mehr Neuling als Experten.</p>
<div class='embed-vimeo' style='text-align:center;'><iframe src='http://player.vimeo.com/video/9981123' width='400' height='300' frameborder='0'></iframe></div>
<p style="font-size:80%;">Alles auf einen Blick: Zwei Klassen mit insgesamt 30.000 Zeilen Code. Quelle: Robert C. Martin.</p>
<p>Die Lösung, die der Mehrzahl der Programmierer dient, bedeutet häufig, dass der Experte eine größere Anzahl an Abstraktionsschichten und damit eine für ihn höhere kognitive Belastung akzeptieren muss. Wenn wir mit ein neues Programm schreiben, beginnen wir mit einer Codebasis die klar und einfach ist, aber da der Code mit der Zeit mehr und mehr Anforderungen erfüllen muss, wächst er kontinuierlich. Da wir, was den Code betrifft, den wir selbst schreiben, zwangsläufig Experten sind, werden wir unbewusst danach trachten, immer möglichst viel Code im Blickfeld zu haben. Code Reviews sind unter anderem dabei nützlich, uns auf unnötige Komplexitäten im Quellcode aufmerksam zu machen, über die wir uns als Autoren des Codes nicht bewusst sind, die aber unseren Kollegen das nachvollziehen des Code erschweren.</p>
<p>Im <a href="http://softwaresanierung.wordpress.com/2011/09/23/code-fur-andere-leute-schreiben-teil-6/">sechsten Teil</a> dieser kleinen Serie beschäftigen wir uns mit dem umfangreichsten Teil des Papers: Mit Analogien, dem wahrscheinlich wichtigsten Werkzeug menschlicher Intelligenz.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/softwaresanierung.wordpress.com/915/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/softwaresanierung.wordpress.com/915/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/softwaresanierung.wordpress.com/915/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/softwaresanierung.wordpress.com/915/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/softwaresanierung.wordpress.com/915/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/softwaresanierung.wordpress.com/915/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/softwaresanierung.wordpress.com/915/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/softwaresanierung.wordpress.com/915/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/softwaresanierung.wordpress.com/915/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/softwaresanierung.wordpress.com/915/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/softwaresanierung.wordpress.com/915/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/softwaresanierung.wordpress.com/915/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/softwaresanierung.wordpress.com/915/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/softwaresanierung.wordpress.com/915/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=915&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://softwaresanierung.wordpress.com/2011/09/21/code-fur-andere-leute-schreiben-teil-5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/76e16e21551c9dd5e0e56fdba4bad357?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sebastiankuebeck</media:title>
		</media:content>

		<media:content url="http://i.dailymail.co.uk/i/pix/2010/09/11/article-1311129-003132CD00000258-861_468x451.jpg" medium="image">
			<media:title type="html">Sharelok Holms</media:title>
		</media:content>

		<media:content url="http://necsi.edu/wiki/images/a/a1/Quad_chart.jpg" medium="image">
			<media:title type="html">Überladene Powerpoint-Präsentation</media:title>
		</media:content>
	</item>
		<item>
		<title>Code für andere Leute schreiben, Teil 4</title>
		<link>http://softwaresanierung.wordpress.com/2011/09/20/code-fur-andere-leute-schreiben-teil-4/</link>
		<comments>http://softwaresanierung.wordpress.com/2011/09/20/code-fur-andere-leute-schreiben-teil-4/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 06:16:18 +0000</pubDate>
		<dc:creator>sebastiankuebeck</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[agile softwareentwicklung]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[entwurfsmuster]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[softwarearchitektur]]></category>
		<category><![CDATA[softwareentwicklung]]></category>

		<guid isPermaLink="false">http://softwaresanierung.wordpress.com/?p=877</guid>
		<description><![CDATA[Nachdem wir im dritten Teil dieser Artikelserie über Thomas Mullen&#8217;s Paper die Grundzüge der Funktionsweise des Langzeitgedächtnisses kennengelernt haben, befassen wir uns nun mit den Ursachen dafür, das der Übergang vom Kurzzeit- ins Langzeitgedächtnis nicht problemlos funktioniert. Die kognitiven Belastung beim Lernen In Studien zum Thema kognitive Belastung werden zwei in diesem Zusammenhang relevante Prinzipien [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=877&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nachdem wir im <a href="http://softwaresanierung.wordpress.com/2011/09/19/code-fur-andere-leute-schreiben-teil-3/">dritten Teil</a> dieser Artikelserie über Thomas Mullen&#8217;s <a href="http://homepage.ntlworld.com/b.mullen4/paper/onward004-mullen.pdf">Paper</a> die Grundzüge der Funktionsweise des Langzeitgedächtnisses kennengelernt haben, befassen wir uns nun mit den Ursachen dafür, das der Übergang vom Kurzzeit- ins Langzeitgedächtnis nicht problemlos funktioniert.</p>
<h2>Die kognitiven Belastung beim Lernen</h2>
<p>In Studien zum Thema <a href="http://de.wikipedia.org/wiki/Cognitive_Load_Theory">kognitive Belastung</a> werden zwei in diesem Zusammenhang relevante Prinzipien beschrieben: <em>Redundante Informationen</em> und <em>der Effekt der geteilten Aufmerksamkeit</em>. Wenn Informationen hinzugefügt werden, die bereits bekanntes wiederholen, ohne neue Einsichten zu vermitteln, erschwert das das Lernen. Die redundanten Informationen sind nicht unproblematisch, da sie wertvolle Ressourcen im Kurzzeitgedächtnis blockieren können, und so das Lernen erschweren. Beispielsweise beschreibt ein Kommentar für eine einfache Getter- [oder Setter-] Methode etwas, was sich ohnehin zwangsläufig aus dem Quellcode erschließt:</p>
<pre style="font-size:120%;">/**
 * @return the user name
 */
public String getUserName() {
    return this.userName;
}</pre>
<p>Diese Art Kommentare <em>erschweren</em> sogar das Lesen und Verstehen des Codes, obwohl sie eigentlich das Gegenteil beabsichtigen!</p>
<p>Der Effekt der geteilten Aufmerksamkeit besagt, dass wenn ein Text ein Bild beschreibt und der Text wird an einer anderen Stelle als das Bild positioniert, dann ist es schwieriger, den Text zu verstehen. Das kommt daher, dass das Kurzzeitgedächtnis zusätzliche Informationen über die Verbindung zwischen dem Text und dem Bild zwischenspeichern muss. Das blockiert wiederum die begrenzten Ressourcen im Kurzzeitgedächtnis und damit bleiben weniger Kapazitäten zum Lernen und Begreifen.</p>
<p><img class="alignnone" title="Lernstress" src="http://www.n24.de/media/import/dpaserviceline/dpaserviceline_20090615_14/Lernstress_21530648originallarge-4-3-800-76-0-2919-2130.jpg" alt="" /></p>
<p style="font-size:80%;">Nicht nur Studenten leiden unter kognitiver Belastung. Quelle: n24.de</p>
<p>Oft werden von Programmierern zusätzliche Abstraktionsschichten eingefügt. Damit steigt aber auch die kognitive Belastung für den Leser des Quellcodes, da so neue Verknüpfungen zwischen Code-Bestandteilen entstehen.  Zwischen Abstraktionsschichten hin und her zu navigieren kann zu Zeit- und Kapazitätsproblemen im Kurzzeitgedächtnis führen.</p>
<p>Wenn man beispielsweise die Funktionsweise einer Methode verstehen möchte und dazu zu eine andere Klasse inspizieren muss, dauert das vielleicht ein paar Sekunden (wir erinnern uns, dass Gedächtnisinhalte nur ein paar Sekunden im Kurzzeitgedächtnis bleiben, also zählt jede Sekunde), allerdings muss möglicherweise jede Abstraktionsschicht und deren externe Abhängigkeiten verstanden werden. Das alles benötigt zusätzliche Kapazitäten im Kurzzeitgedächtnis und führt dazu, dass der Ursprüngliche Inhalt aus dem Kurzzeitgedächtnis verschwindet, sodass es keine Möglichkeit mehr gibt, ihn zu trainieren und so ins Langzeitgedächtnis zu überführen.</p>
<p>Wir sind zwar erstaunlich geübt darin, alle diese Informationen durch Chunking im Gedächtnis zu behalten, es gibt da allerdings ein Grenze und wir bekommen keine Warnsignale, wenn wir an diese Granze stoßen oder sie gar Überschreiten. Wir merken das erst, wenn wir uns plötzlich nicht mehr so genau erinnern können, wonach wir eigentlich im Quellcode eigentlich gesucht haben und warum wir an dir Stelle im Quellcode gelandet sind, wo wir uns befinden.</p>
<p style="font-size:80%;">Ein schönes Beispiel für den übermäßigen Einsatz von Abstraktionsschichten und deren negative Auswirkungen auf die Verständlichkeit des Quellcodes ist Jason Tiscioni&#8217;s <a href="http://developers.slashdot.org/comments.pl?sid=33602&amp;cid=3636102">Hello-World-Programm</a>. Durch konsequentes Einfügen von Abstraktionsschichten bläht er dieses einfache Programm&#8230;</p>
<pre style="font-size:120%;">public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}</pre>
<p style="font-size:80%;">&#8230;zu folgendem auf:</p>
<pre style="font-size:110%;">public abstract class AbstractStrategyFactory {
    public abstract MessageStrategy createStrategy(MessageBody mb);
}

public class DefaultFactory extends AbstractStrategyFactory {
    private DefaultFactory() {}

    static DefaultFactory instance;

    public static AbstractStrategyFactory getInstance() {
        if (instance == null)
            instance = new DefaultFactory();
        return instance;
    }

    public MessageStrategy createStrategy(final MessageBody mb) {
        return new MessageStrategy() {
            MessageBody body = mb;

            public void sendMessage() {
                Object obj = body.getPayload();
                System.out.println((String) obj);
            }
        };
    }
}

public class MessageBody {
    Object payload;

    public Object getPayload() {
        return payload;
    }

    public void configure(Object obj) {
        payload = obj;
    }

    public void send(MessageStrategy ms) {
        ms.sendMessage();
    }
}

public interface MessageStrategy {
    public void sendMessage();
}

public class HelloWorld {
    public static void main(String[] args) {
        MessageBody mb = new MessageBody();
        mb.configure("Hello World!");
        AbstractStrategyFactory asf = DefaultFactory.getInstance();
        MessageStrategy strategy = asf.createStrategy(mb);
        mb.send(strategy);
    }
}</pre>
<p>Jede Abstraktionsschicht für sich mag nicht übertrieben schwierig zu verstehen sein, wenn man sie isoliert betrachtet, doch wenn wir nicht aufpassen, überschreiten wir leicht die Grenzen des Kurzzeitgedächtnisses und wir kommen durcheinander. Entwicklungsumgebungen können die kognitive Belastung reduzieren, indem sie beispielsweise eine kurze Vorschau auf die Implementierung einer Methode gewähren. Wir können uns auch schriftliche Notizen machen, um nicht den Faden zu verlieren. Natürlich haben zusätzliche Abstraktionsschichten ihre Vorteile (für das Chunking), allerdings sind sie auch immer mit einer zusätzlichen kognitiven Belastung verbunden.</p>
<p>Im <a href="http://softwaresanierung.wordpress.com/2011/09/21/code-fur-andere-leute-schreiben-teil-5/">nächsten Teil</a> beschäftigen wir uns mit dem Unterschied in der Art und Weise, wie Neulinge und Experten Quellcode lesen und interpretieren.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/softwaresanierung.wordpress.com/877/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/softwaresanierung.wordpress.com/877/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/softwaresanierung.wordpress.com/877/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/softwaresanierung.wordpress.com/877/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/softwaresanierung.wordpress.com/877/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/softwaresanierung.wordpress.com/877/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/softwaresanierung.wordpress.com/877/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/softwaresanierung.wordpress.com/877/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/softwaresanierung.wordpress.com/877/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/softwaresanierung.wordpress.com/877/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/softwaresanierung.wordpress.com/877/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/softwaresanierung.wordpress.com/877/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/softwaresanierung.wordpress.com/877/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/softwaresanierung.wordpress.com/877/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=877&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://softwaresanierung.wordpress.com/2011/09/20/code-fur-andere-leute-schreiben-teil-4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/76e16e21551c9dd5e0e56fdba4bad357?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sebastiankuebeck</media:title>
		</media:content>

		<media:content url="http://www.n24.de/media/import/dpaserviceline/dpaserviceline_20090615_14/Lernstress_21530648originallarge-4-3-800-76-0-2919-2130.jpg" medium="image">
			<media:title type="html">Lernstress</media:title>
		</media:content>
	</item>
		<item>
		<title>Code für andere Leute schreiben, Teil 3</title>
		<link>http://softwaresanierung.wordpress.com/2011/09/19/code-fur-andere-leute-schreiben-teil-3/</link>
		<comments>http://softwaresanierung.wordpress.com/2011/09/19/code-fur-andere-leute-schreiben-teil-3/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 10:29:08 +0000</pubDate>
		<dc:creator>sebastiankuebeck</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[agile softwareentwicklung]]></category>
		<category><![CDATA[clean code]]></category>
		<category><![CDATA[entwurfsmuster]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[software-sanierung]]></category>
		<category><![CDATA[softwarearchitektur]]></category>
		<category><![CDATA[softwareentwicklung]]></category>

		<guid isPermaLink="false">http://softwaresanierung.wordpress.com/?p=838</guid>
		<description><![CDATA[Im zweiten Teil wurden das Chunking und das Kurzzeitgedächtnis ausführlich erläutert und gezeigt, wie sich diese Themen in Entwicklungsprinzipien, Entwurfsmustern und Refactoring-Praktiken niederschlagen. Nun wendet sich Thomas Mullen dem Langzeitgedächtnis zu. Die Struktur des Langzeitgedächtnisses und das Problem mit dem Umlernen Die Speicherung von Gedächtnisinhalten im Langzeitgedächtnis werden erfolgreich als Entscheidungsnetzwerk modelliert. Entscheidungsnetzwerke werden unter [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=838&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Im <a href="http://softwaresanierung.wordpress.com/2011/09/18/code-fur-andere-leute-schreiben-teil-2/">zweiten Teil</a> wurden das Chunking und das Kurzzeitgedächtnis ausführlich erläutert und gezeigt, wie sich diese Themen in Entwicklungsprinzipien, Entwurfsmustern und Refactoring-Praktiken niederschlagen. Nun wendet sich Thomas Mullen dem Langzeitgedächtnis zu.</p>
<h2>Die Struktur des Langzeitgedächtnisses und das Problem mit dem Umlernen</h2>
<p>Die Speicherung von Gedächtnisinhalten im Langzeitgedächtnis werden erfolgreich als <a href="http://bura.brunel.ac.uk/bitstream/2438/2292/1/ICLS-96-unified%20framework.pdf">Entscheidungsnetzwerk</a> modelliert. Entscheidungsnetzwerke werden unter anderem dazu verwendet, um Entscheidungsvorgänge, das Entstehen von Konzepten und das Wiedererkennen zu modellieren.</p>
<p>Die Theorie besagt, dass Gedächtnisinhalte in <em>Netzwerke</em> eingebunden werden. Bevor ein neuer Gedächtnisinhalt in ein solches Netzwerk eingefügt wird, wird erst einmal ein passender Ort dafür gesucht. Daraufhin wird das Netzwerk um das neue Element erweitert oder so modifiziert, dass das neue Element hineinpasst. Ein <em>Knoten</em> des Netzwerks hat neben Beziehungen zu anderen Knoten ein <em>Image</em>. Dieses Image kann ein Buchstabe, ein Wort, ein Ton, ein visuelles Bild oder ein Gefühl sein. Wenn Sie schon einmal eine <a href="http://de.wikipedia.org/wiki/Mind-Map">Mind-Map</a> gesehen haben, wird Ihnen das Prinzip vertraut sein.</p>
<p><a href="http://de.wikipedia.org/w/index.php?title=Datei:Pinwand-Mindmap.jpg&amp;filetimestamp=20080423090644"><img class="alignnone" title="Mind-Map über Mind-Maps" src="http://upload.wikimedia.org/wikipedia/de/thumb/f/f1/Pinwand-Mindmap.jpg/501px-Pinwand-Mindmap.jpg" alt="" width="70%" /></a></p>
<p style="font-size:80%;">Eine Mind-Map über Mind-Maps. Quelle: Wikipedia.</p>
<p>Der Aufbau der Netzwerke geschieht während des <em>Trainings</em>, nachdem diese in das Kurzzeitgedächtnis geladen wurden.Das Antrainieren von neuen Gedächtnisinhalten liegt normalerweise in der Größenordnung von einige Sekunden, allerdings können neue Inhalte das Netzwerk so umstrukturieren, dass Verbindungen zwischen bestehenden Inhalten aufgebrochen werden. Diese existierenden Elemente müssen dann abermals erlernt (<em>umgelernt</em>) werden, damit ein neues Netzwerk entstehen kann, dass alle bereits erlernten Inhalte umfasst. Natürlich ist jedes Umlernen mit einem Zeitaufwand verbunden und es kann für den Lernenden frustriend sein, dabei das Gefühl zu haben, sich rückwärts, also von einer neuen, bedeutsamen Erkenntnis weg zu bewegen.</p>
<p>Bertrand Meyer&#8217;s <a href="http://www.objectmentor.com/resources/articles/ocp.pdf">Erwiterungsprinzip</a> kann man als Echo jenes mentalen Prozesses sehen, der danach trachtet, den Aufwands des Umlernens zu reduzieren. Vom Standpunkt der Evolution ist das durchaus sinnvoll. Wenn ich beispielsweise jemanden sehe, der sich vor schmerzen windet, nachdem er eine schwarze Eidechse mit gelben Flecken gegessen hat,  habe ich eine größere Überlebenschance (und damit die Chance, meine Gene weiterzugeben), wenn ich solche Reptilien meide.</p>
<p><img title="Feuersalamander" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Feuersalamander_portrait.jpg/800px-Feuersalamander_portrait.jpg" alt="" /></p>
<p style="font-size:80%;">Feuersalamander. Quelle: Wikipedia.</p>
<p>Wenn ich daraufhin jemaden eine schwarze Schlange mit gelben Flecken essen sehe, der diese Mahlzeit gut verträgt, möchte ich mich daran erinnern, das Schlangen bekömmlich sind, ohne dass ich darauf vergesse, das Eidechsen giftig sind. Ich möchte also, dass mein Geist offen für Erweiterungen aber [wo es notwendig ist] geschlossen für Änderungen ist und das ist genau das, was das Erweiterungsprinzip aussagt.</p>
<p>Wie bereits im letzten Artikel erwähnt hat sich unser Gehirn dahingehend entwickelt, dass es den Aufwand für das Suchen von Gedächtnisinhalten und für das Umlernen minimiert. Wenn wir also unseren Code so strukturieren, dass er unserem Langzeitgedächtnis ähnelt, wird er leichter und schneller von anderen verstanden werden. Entwicklungsprinzipien geben uns einen Einblick in die Art und Weise, wie unser Gehirn funktioniert, ganz im Gegensatz zu Regeln, die auf mathematischen Verfahren beruhen.</p>
<p><a href="http://softwaresanierung.files.wordpress.com/2011/09/mullenmemorymodel1.jpg"><img class="alignnone size-full wp-image-907" title="MullenMemoryModel" src="http://softwaresanierung.files.wordpress.com/2011/09/mullenmemorymodel1.jpg?w=450&#038;h=364" alt="" width="450" height="364" /></a></p>
<p style="font-size:80%;">Vereinfachtes kognitives Modell. Quelle: Thomas Mullen.</p>
<p>Im <a href="http://softwaresanierung.wordpress.com/2011/09/20/code-fur-andere-leute-schreiben-teil-4/">nächsten Teil</a> beschäftigen wir uns mit der kognitiven Belastung beim Lernen und worauf man aufpassen muss, wenn man diese Belastung soweit wie möglich reduzieren möchte.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/softwaresanierung.wordpress.com/838/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/softwaresanierung.wordpress.com/838/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/softwaresanierung.wordpress.com/838/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/softwaresanierung.wordpress.com/838/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/softwaresanierung.wordpress.com/838/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/softwaresanierung.wordpress.com/838/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/softwaresanierung.wordpress.com/838/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/softwaresanierung.wordpress.com/838/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/softwaresanierung.wordpress.com/838/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/softwaresanierung.wordpress.com/838/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/softwaresanierung.wordpress.com/838/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/softwaresanierung.wordpress.com/838/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/softwaresanierung.wordpress.com/838/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/softwaresanierung.wordpress.com/838/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=softwaresanierung.wordpress.com&amp;blog=10331381&amp;post=838&amp;subd=softwaresanierung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://softwaresanierung.wordpress.com/2011/09/19/code-fur-andere-leute-schreiben-teil-3/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/76e16e21551c9dd5e0e56fdba4bad357?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sebastiankuebeck</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/de/thumb/f/f1/Pinwand-Mindmap.jpg/501px-Pinwand-Mindmap.jpg" medium="image">
			<media:title type="html">Mind-Map über Mind-Maps</media:title>
		</media:content>

		<media:content url="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Feuersalamander_portrait.jpg/800px-Feuersalamander_portrait.jpg" medium="image">
			<media:title type="html">Feuersalamander</media:title>
		</media:content>

		<media:content url="http://softwaresanierung.files.wordpress.com/2011/09/mullenmemorymodel1.jpg" medium="image">
			<media:title type="html">MullenMemoryModel</media:title>
		</media:content>
	</item>
	</channel>
</rss>
