<?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>www.christian-rehn.de</title>
	<atom:link href="http://www.christian-rehn.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.christian-rehn.de</link>
	<description>Ein Blog über Informatik und Anderes...</description>
	<lastBuildDate>Sat, 04 Feb 2012 22:20:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Restklassenringe</title>
		<link>http://www.christian-rehn.de/2012/01/17/restklassenringe/</link>
		<comments>http://www.christian-rehn.de/2012/01/17/restklassenringe/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 21:45:46 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Informatik]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[Kryptographie]]></category>
		<category><![CDATA[Mathe]]></category>

		<guid isPermaLink="false">http://www.christian-rehn.de/?p=1002</guid>
		<description><![CDATA[Im ersten Semester lernt man im Informatikstudium Restklassenringe kennen. Diese bilden die mathematische Basis für diverse Kryptographie (beispielsweise RSA), aber auch anderes Zeug wie CRC. Gestern hatte ich im Forum mal ne oberflächliche Einführung in das Thema gegeben. Und damit das nicht verloren geht, will ich das hier nochmal posten. Wer also kein Informatik studiert, [...]]]></description>
			<content:encoded><![CDATA[<p>Im ersten Semester lernt man im Informatikstudium Restklassenringe kennen. Diese bilden die mathematische Basis für diverse Kryptographie (beispielsweise <a href="http://de.wikipedia.org/wiki/RSA-Kryptosystem" rel="nofollow" class="liwikipedia">RSA</a>), aber auch anderes Zeug wie <a href="http://de.wikipedia.org/wiki/Cyclic_Redundancy_Check" rel="nofollow" class="liwikipedia">CRC</a>. <a href="http://forum.delphi-treff.de/showthread.php?31218-1-mod-N&#038;p=225265&#038;viewfull=1#post225265" class="lidt">Gestern</a> hatte ich im Forum mal ne oberflächliche Einführung in das Thema gegeben. Und damit das nicht verloren geht, will ich das hier nochmal posten. Wer also kein Informatik studiert, aber aus welchen Gründen auch immer wissen will, was modulare Arithmetik ist und wie man in Restklassenringen rechnet, hier eine knappe Einführung. <span id="more-1002"></span></p>
<h3>Höhere Mathematik für programmierende Nicht-Akademiker &#8212; Heute: Restklassenringe</h3>
<h4>Grundlagen: Algebraische Strukturen</h4>
<p>In der Mathematik basiert alles auf Mengen (Mengenlehre, Schnittmenge, Teilmenge, Vereinigungsmenge und so). Mit den Elementen einer Menge kann man rechnen, d.h. es gibt verschiedene Operationen, die auf der Menge definiert sind.</p>
<p>Aus der Schule kennen wir die Menge der Reellen Zahlen: <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-a6e421454947c585b8fb5ae10299f873_l3.png" class="ql-img-inline-formula" alt="&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#82;&#125;" title="Rendered by QuickLaTeX.com" style="vertical-align: 0px;"/>. Aus der Menge der Reellen Zahlen <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-a6e421454947c585b8fb5ae10299f873_l3.png" class="ql-img-inline-formula" alt="&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#82;&#125;" title="Rendered by QuickLaTeX.com" style="vertical-align: 0px;"/> machen wir eine algebraische Struktur, indem wir ihr Operationen spendieren: <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-d39e16378674f11e80b94f96840998ea_l3.png" class="ql-img-inline-formula" alt="&#40;&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#82;&#125;&#44;&#32;&#43;&#44;&#32;&#92;&#99;&#100;&#111;&#116;&#41;" title="Rendered by QuickLaTeX.com" style="vertical-align: -4px;"/></p>
<p>Wendet man eine der Operationen auf ein Element der Menge an, erhält man als Ergebnis wieder ein Element der Menge. <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-b4b9de55a58b31ecf62b96650f553528_l3.png" class="ql-img-inline-formula" alt="&#50;&#43;&#51;&#32;&#61;&#32;&#53;" title="Rendered by QuickLaTeX.com" style="vertical-align: -1px;"/> und <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-8a0860fa2a79839e8c6052cea0390a6c_l3.png" class="ql-img-inline-formula" alt="&#50;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#51;&#32;&#61;&#32;&#54;" title="Rendered by QuickLaTeX.com" style="vertical-align: 0px;"/> (5 und 6 sind wieder reelle Zahlen). Das nennt man Abgeschlossenheit.</p>
<p>Es gibt verschiedene Arten von algebraischen Strukturen für die jeweils andere Anforderungen gelten. So gibt es beispielsweise Gruppen, Ringe und Körper. Die Unterschiede sind hier erstmal nicht weiter wichtig.</p>
<h4>Beispiel</h4>
<p>Man kann nicht nur mit den Reellen Zahlen rechnen, sondern beispielsweise auch mit Natürlichen Zahlen (<img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-bc8e16cdad5408a0b540d2bc0098bcfb_l3.png" class="ql-img-inline-formula" alt="&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#78;&#125;" title="Rendered by QuickLaTeX.com" style="vertical-align: 0px;"/>). Das haben wir in der Grundschule gelernt. Wir haben da erfahren, dass <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-b37ec0173c89eafccc93899c81c56a61_l3.png" class="ql-img-inline-formula" alt="&#53;&#45;&#55;" title="Rendered by QuickLaTeX.com" style="vertical-align: 0px;"/> &#8220;nicht geht&#8221;. Später haben wir negative Zahlen kennen gelernt und auf einmal ging das doch. Trotzdem haben uns unsere Lehrer in der Grundschule nicht angelogen. <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-b37ec0173c89eafccc93899c81c56a61_l3.png" class="ql-img-inline-formula" alt="&#53;&#45;&#55;" title="Rendered by QuickLaTeX.com" style="vertical-align: 0px;"/> geht wirklich nicht &#8212; in der Halbgruppe <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-69a9b2b54926609b61c878264b524905_l3.png" class="ql-img-inline-formula" alt="&#40;&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#78;&#125;&#44;&#32;&#43;&#41;" title="Rendered by QuickLaTeX.com" style="vertical-align: -4px;"/>.</p>
<p>In der Programmierung begegnen uns ständig solche algebraischen Strukturen. <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-5c3faf943c52a2d069f6358a0e8c66d6_l3.png" class="ql-img-inline-formula" alt="&#40;&#92;&#116;&#101;&#120;&#116;&#116;&#116;&#123;&#83;&#116;&#114;&#105;&#110;&#103;&#125;&#44;&#32;&#43;&#41;" title="Rendered by QuickLaTeX.com" style="vertical-align: -4px;"/> ist z.B. auch eine Halbgruppe. Wir können Strings konkatenieren und erhalten wieder Strings (String ist abgeschlossen bezüglich der Operation <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-47d6b18a339be8f5213c6c01ed051045_l3.png" class="ql-img-inline-formula" alt="&#43;" title="Rendered by QuickLaTeX.com" style="vertical-align: -1px;"/>) und <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-47d6b18a339be8f5213c6c01ed051045_l3.png" class="ql-img-inline-formula" alt="&#43;" title="Rendered by QuickLaTeX.com" style="vertical-align: -1px;"/> ist assoziativ: <code class="codecolorer text mac-classic"><span class="text">('a' + 'b') + 'c' = 'a' + ('b' + 'c')</span></code>. Diese zwei Eigenschaften brauchen wir um <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-f3a14a102bd4e89944c317c67c8f689e_l3.png" class="ql-img-inline-formula" alt="&#40;&#92;&#105;&#116;&#101;&#120;&#116;&#116;&#116;&#123;&#83;&#116;&#114;&#105;&#110;&#103;&#125;&#44;&#32;&#43;&#41;" title="Rendered by QuickLaTeX.com" style="vertical-align: -4px;"/> Halbgruppe nennen zu können. Außerdem haben wir noch den Leerstring als neutrales Element. <code class="codecolorer text mac-classic"><span class="text">'a' + '' = 'a'</span></code>. Wir dürfen <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-5c3faf943c52a2d069f6358a0e8c66d6_l3.png" class="ql-img-inline-formula" alt="&#40;&#92;&#116;&#101;&#120;&#116;&#116;&#116;&#123;&#83;&#116;&#114;&#105;&#110;&#103;&#125;&#44;&#32;&#43;&#41;" title="Rendered by QuickLaTeX.com" style="vertical-align: -4px;"/> deshalb sogar einen &#8220;Monoid&#8221; nennen.</p>
<h4>Inverse Elemente</h4>
<p>Die Operationen <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-4d9521b52a5c0a70956f069f1dbcd50e_l3.png" class="ql-img-inline-formula" alt="&#45;" title="Rendered by QuickLaTeX.com" style="vertical-align: 4px;"/> und <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-b3a8c7971ac58d360789cab357572369_l3.png" class="ql-img-inline-formula" alt="&#47;" title="Rendered by QuickLaTeX.com" style="vertical-align: -5px;"/> haben wir oben nicht etwa vergessen. Sie ergeben sich quasi automatisch aus <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-47d6b18a339be8f5213c6c01ed051045_l3.png" class="ql-img-inline-formula" alt="&#43;" title="Rendered by QuickLaTeX.com" style="vertical-align: -1px;"/> und <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-109d503c9f8a740d7eb085ef5842be2c_l3.png" class="ql-img-inline-formula" alt="&#92;&#99;&#100;&#111;&#116;" title="Rendered by QuickLaTeX.com" style="vertical-align: 3px;"/>. <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-980b5c0aa5802ad18551249169497b0d_l3.png" class="ql-img-inline-formula" alt="&#55;&#32;&#45;&#32;&#53;" title="Rendered by QuickLaTeX.com" style="vertical-align: 0px;"/> ist nämlich nichts anderes als <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-b000a0b9186dcd6a4d5efb55e79aa42f_l3.png" class="ql-img-inline-formula" alt="&#55;&#32;&#43;&#32;&#40;&#45;&#53;&#41;" title="Rendered by QuickLaTeX.com" style="vertical-align: -4px;"/>, wobei <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-7b5b9d9f382b11767d19f257afca0019_l3.png" class="ql-img-inline-formula" alt="&#45;&#53;" title="Rendered by QuickLaTeX.com" style="vertical-align: 0px;"/> das inverse Element (bezüglich der Addition) von <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-8995e2084120c1c1f4b53f490d281bc4_l3.png" class="ql-img-inline-formula" alt="&#53;" title="Rendered by QuickLaTeX.com" style="vertical-align: 0px;"/> ist. Das inverse Element bezüglich der Multiplikation wäre <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-e174a73678f6bd6f70d7aaec8f911349_l3.png" class="ql-img-inline-formula" alt="&#92;&#102;&#114;&#97;&#99;&#123;&#49;&#125;&#123;&#53;&#125;" title="Rendered by QuickLaTeX.com" style="vertical-align: -6px;"/>, d.h. <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-81e05a1c530c931c88aa57c297773b02_l3.png" class="ql-img-inline-formula" alt="&#48;&#44;&#50;" title="Rendered by QuickLaTeX.com" style="vertical-align: -4px;"/>. Ein Element verknüpft mit seinem inversen ergibt immer das neurale Element (bezüglich der Operation). <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-9168b3d067e6cc1e95e61dbe9c474d91_l3.png" class="ql-img-inline-formula" alt="&#53;&#32;&#43;&#32;&#40;&#45;&#53;&#41;&#32;&#61;&#32;&#48;" title="Rendered by QuickLaTeX.com" style="vertical-align: -4px;"/> (additiv inverses) <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-e28c1f31e552823b4c6f03f7df45d424_l3.png" class="ql-img-inline-formula" alt="&#53;&#32;&#92;&#99;&#100;&#111;&#116;&#32;&#48;&#44;&#50;&#32;&#61;&#32;&#49;" title="Rendered by QuickLaTeX.com" style="vertical-align: -4px;"/> (multiplikativ inverses).</p>
<h4>Restklassenringe</h4>
<p>Ein Restklassenring ist eine algebraische Struktur, bei der die Menge Restklassen sind. Eine Restklasse ist z.B. <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-304e8fdf1a19589a934c86bea03c985a_l3.png" class="ql-img-inline-formula" alt="&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#90;&#125;&#47;&#50;&#52;&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#90;&#125;" title="Rendered by QuickLaTeX.com" style="vertical-align: -5px;"/>. <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-304e8fdf1a19589a934c86bea03c985a_l3.png" class="ql-img-inline-formula" alt="&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#90;&#125;&#47;&#50;&#52;&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#90;&#125;" title="Rendered by QuickLaTeX.com" style="vertical-align: -5px;"/> hat genau <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-762747d84dc941b4e4b85f0d3d4eb09e_l3.png" class="ql-img-inline-formula" alt="&#50;&#52;" title="Rendered by QuickLaTeX.com" style="vertical-align: -1px;"/> Elemente, nämlich die Zahlen 0 bis 23. Definiert man noch Addition und Multiplikation, erhält man einen Restklassenring: <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-b17b19616231fede5b25a5c5c5eb0162_l3.png" class="ql-img-inline-formula" alt="&#40;&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#90;&#125;&#47;&#50;&#52;&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#90;&#125;&#44;&#32;&#43;&#44;&#32;&#92;&#99;&#100;&#111;&#116;&#41;" title="Rendered by QuickLaTeX.com" style="vertical-align: -5px;"/>.</p>
<p>In einem Restklassenring rechnet es sich in etwa so, wie mit Uhrzeiten. Nach 23 Uhr kommt wieder 0 Uhr:</p>
<p> 20 (Uhr) + 7 (Stunden) = 27 (Uhr) = 3 (Uhr)</p>
<p> oder mathematisch geschrieben:</p>
<p><img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-524ac816b85aabc0748c922c3a9a449b_l3.png" class="ql-img-inline-formula" alt="&#32;&#50;&#48;&#32;&#43;&#32;&#55;&#32;&#40;&#92;&#109;&#111;&#100;&#32;&#50;&#52;&#41;&#32;&#61;&#32;&#50;&#55;&#32;&#40;&#92;&#109;&#111;&#100;&#32;&#50;&#52;&#41;&#32;&#61;&#32;&#51;&#32;&#40;&#92;&#109;&#111;&#100;&#32;&#50;&#52;&#41;" title="Rendered by QuickLaTeX.com" style="vertical-align: -4px;"/></p>
<p> Die Modulooperation gibt also an, in welchem Restklassenring du dich befindest. Hier in <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-304e8fdf1a19589a934c86bea03c985a_l3.png" class="ql-img-inline-formula" alt="&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#90;&#125;&#47;&#50;&#52;&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#90;&#125;" title="Rendered by QuickLaTeX.com" style="vertical-align: -5px;"/>. Alle &#8220;Zahlen&#8221; die den selben Rest beim Teilen durch 24 aufweisen sind in der selben Restklasse und damit &#8220;gleich&#8221;. Also:</p>
<p><img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-96eddb60c5806a9e29030b0dbe6dfdef_l3.png" class="ql-img-inline-formula" alt="&#50;&#55;&#32;&#61;&#32;&#51;&#32;&#40;&#92;&#109;&#111;&#100;&#32;&#50;&#52;&#41;" title="Rendered by QuickLaTeX.com" style="vertical-align: -4px;"/></p>
<p> Um entsprechend einfacher rechnen zu können, benutzt du die Modulo-Operation und erhältst immer eine Zahl zwischen 0 und 23:</p>
<p><img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-db56b2c410e3ecad9f3435a0aa5a0b7e_l3.png" class="ql-img-inline-formula" alt="&#50;&#55;&#32;&#92;&#109;&#111;&#100;&#32;&#50;&#52;&#32;&#61;&#32;&#51;" title="Rendered by QuickLaTeX.com" style="vertical-align: -1px;"/></p>
<p> Genau so ist es mit den negativen Zahlen:</p>
<p> 0 (Uhr) &#8211; 1 (Stunde) = -1 (Uhr) = 23 Uhr</p>
<p> oder mathematisch:</p>
<p><img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-9044b28a7b4321f2d324426fb0c3850f_l3.png" class="ql-img-inline-formula" alt="&#48;&#32;&#45;&#32;&#49;&#32;&#40;&#92;&#109;&#111;&#100;&#32;&#50;&#52;&#41;&#32;&#61;&#32;&#45;&#49;&#32;&#40;&#92;&#109;&#111;&#100;&#32;&#50;&#52;&#41;&#32;&#61;&#32;&#50;&#51;&#32;&#40;&#92;&#109;&#111;&#100;&#32;&#50;&#52;&#41;" title="Rendered by QuickLaTeX.com" style="vertical-align: -4px;"/></p>
<h4>Achtung</h4>
<p>Die Modulo-Operation ist nicht in jeder Programmiersprache gleich definiert. Manchmal entspricht sie der oben verwendeten mathematischen Definition, manchmal ist es anders. Will man in Restklassenringen rechnen, muss man das für negative Zahlen bedenken und ggf. Korrekturen vornehmen. http://en.wikipedia.org/wiki/Modulo_operation#Common_pitfalls</p>
<h4>Ausblick</h4>
<p>Alle Restklassenringe <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-4e21a346fe8d19cc344e5184c63d242c_l3.png" class="ql-img-inline-formula" alt="&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#90;&#125;&#47;&#112;&#92;&#109;&#97;&#116;&#104;&#98;&#98;&#123;&#90;&#125;" title="Rendered by QuickLaTeX.com" style="vertical-align: -5px;"/> mit einer Primzahl <img src="http://www.christian-rehn.de/wp-content/ql-cache/quicklatex.com-3bf85f1087e9fbed3a319341134ac1a2_l3.png" class="ql-img-inline-formula" alt="&#112;" title="Rendered by QuickLaTeX.com" style="vertical-align: -4px;"/>, sind nicht nur Ringe, sondern Körper, d.h. jedes Element hat ein multiplikatives inverses Element. Das ist in der Kryptographie wichtig und wird u.a. bei RSA verwendet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.christian-rehn.de/2012/01/17/restklassenringe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wie behandelt man eigentlich Akkus?</title>
		<link>http://www.christian-rehn.de/2011/12/14/wie-behandelt-man-eigentlich-akkus/</link>
		<comments>http://www.christian-rehn.de/2011/12/14/wie-behandelt-man-eigentlich-akkus/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 17:15:37 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Anderes]]></category>
		<category><![CDATA[Akkus]]></category>

		<guid isPermaLink="false">http://www.christian-rehn.de/?p=996</guid>
		<description><![CDATA[Die Frage hab ich mir grad letztens mal wieder gestellt. Man will ja die Lebensdauer seiner Akkus nicht unnötig verkürzen. Dass es den berüchtigten Memory-Effekt bei den aktuellen Lithium-Akkus nicht mehr gibt, ist ja mehr oder weniger bekannt. Was aber nun wirklich zu beachten ist, ist gar nicht so leicht heraus zu finden. Im Netz [...]]]></description>
			<content:encoded><![CDATA[<p>Die Frage hab ich mir grad letztens mal wieder gestellt. Man will ja die Lebensdauer seiner Akkus nicht unnötig verkürzen. Dass es den berüchtigten Memory-Effekt bei den aktuellen Lithium-Akkus nicht mehr gibt, ist ja mehr oder weniger bekannt. Was aber nun wirklich zu beachten ist, ist gar nicht so leicht heraus zu finden. Im Netz findet man teilweise widersprüchliche Informationen. Auch kann sich durch den technischen Fortschritt so einiges geändert haben (und so wie ich das sehe, hat es das auch). So findet man massig Material aus zweifelhaften Quellen und weiß hinterher nicht mehr so richtig, was man denken soll. Und weils so schön ist, spendiere ich dem Netz eine weitere fragwürdige Quelle. <img src='http://www.christian-rehn.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Hier erstmal zwei Links, die vielleicht ganz interessant sind:</p>
<ul>
<li><a href="http://www.tecchannel.de/pc_mobile/notebook/432097/akkus_notebook_lebensdauer_kapazitaet_ladezyklen_lithium_ionen_laufzeit/" class="liexternal">http://www.tecchannel.de/pc_mobile/notebook/432097/akkus_notebook_lebensdauer_kapazitaet_ladezyklen_lithium_ionen_laufzeit/</a></li>
<li><a href="http://de.wikipedia.org/wiki/Lithium-Ionen-Akkumulator#Hinweise_zum_Umgang_mit_Li-Ionen-Akkus" rel="nofollow" class="liwikipedia">http://de.wikipedia.org/wiki/Lithium-Ionen-Akkumulator#Hinweise_zum_Umgang_mit_Li-Ionen-Akkus</a></li>
</ul>
<p>Folgendes meine ich, herausgefunden zu haben: <span id="more-996"></span></p>
<ul>
<li>Die Ladeelektronik moderner Akkus verhindert das Überladen. Das ist auch sehr wichtig.</li>
<li>Ebenso verhindert die (Ent-)Ladeelektronik das Tiefentladen. Das heißt, dass der Verbraucher sich lieber vorher abschaltet bzw. die Akkuelektronik die Leistungsabnahme verweigert, bevor der Akku wegen Tiefentladung kaputt geht. Man kann da also fast nichts falsch machen.</li>
<li>Dieses &#8220;fast&#8221; bezieht sich auf die Lagerung. Ein Lithium-Akku hat eine Selbstentladungsrate von etwa 1-2% pro Monat. Ein fast leerer Akku kann sich also trotz der intelligentesten Elektronik bei langer Lagerung langsam weiter entladen (d.h. Tiefentladen werden) und damit Schaden nehmen.</li>
<li>Längere Zeit mit voller Spannung tut dem Akku wohl auch nicht gut (aufgrund irgendwelcher chemischer Degenerierungs-Prozesse, die durch die hohe Spannung begünstigt werden oder so).</li>
<li>Ähnliche oder andere lebensdauerverringernde Prozesse gibt es wohl auch irgendwie bei niedrigem Akkustand.</li>
<li>Man lagert einen Lithium-Akku also am besten in etwa halb-vollem Zustand. Ob &#8220;halb-voll&#8221; 40%, 50%, 60% oder 75% heißt, ist wohl strittig. Ich hab auch schon die Empfehlung gelesen, den Akku leer zu lagern. Diese Empfehlung kann ich aber nicht logisch nachvollziehen.</li>
<li>Ein weiterer limitierender Faktor ist die Zahl der Ladezyklen. Akkus verkraften nur eine endliche Zahl an Ladezyklen und gehen danach langsam kaputt. Das sind bei Lithium-Akkus so irgendwas zwischen 300 und 800 Zyklen.</li>
<li>Daraus ergibt sich, dass man je nach Nutzung an nem Akku hoffentlich mindestens ein Jahr Spaß haben sollte und Lebensdauern von mehr als eins-zwei Jahrzehnten utopisch sind.</li>
<li>Darüber, inwieweit sich halbe Ladezyklen anteilig anrechnen lassen, herrscht wohl irgendwie Uneinigkeit. Auch ist mir nicht ganz klar, ab welchem Ladezustand die unvorteilhaften Prozesse nun wirklich eine Rolle spielen. Ob man jetzt also besser regelmäßig von 50% auf 100%, von 10% auf 100%, von 50% auf 90% oder anders laden soll, ist mir immer noch unklar.</li>
<li>Mini-Ladezyklen, wie sie z.B. auftreten können, wenn man ein Notebook ständig am Netz betreibt ohne den Akku zu entfernen, sind wohl eher weniger gut.</li>
<li>Ein weiterer wichtiger Punkt ist die Temperatur. Die ideale Betriebstemperatur liegt wohl zwischen 20 und 40°C. Das ist für Handys ziemlich problemlos, bei Notebooks aber nur selten erreichbar. Auch das ist wohl der Gesundheit der Akkus abträglich. Und natürlich sollte man Akkus (Handys&#8230;) nicht nachts im kalten Auto lassen (oder im Sommer im heißen Auto).</li>
<li>Über Lagertemperatur liest man unterschiedliches. Von Kühlschrank bis Zimmertemperatur.</li>
<li>Lithium-Akku ist nicht gleich Lithium-Akku. Es können unterschiedliche Materialien verwendet werden und diese können auch noch in unterschiedlicher Qualität verarbeitet sein und von unterschiedlicher Reinheit sind. Und das hat wohl einen bedeutenden Effekt auf die Lebensdauer. Und man sieht das den Akkus nicht an.</li>
<li>Lithium-Polymer-Akkus haben eine höhere Energiedichte (sind also bei gleicher Kapazität kompakter und eignen sich deshalb besonders für Mobilgeräte. Allerdings verkraften sie etwas weniger Ladezyklen als &#8220;normale&#8221; Lithium-Ion-Akkus.</li>
<li>Zudem ist die Leistungsabnahme des Gerätes bzw. die Dimensionierung des verwendeten Akkus entscheidend für die Akkulebensdauer. Unterdimensionierte Akkus altern auch schneller.</li>
<li>Alles in Allem ist eine gewisse Alterung also gar nicht zu vermeiden. Da Akkus vor dem Kauf u.U. ja auch noch ne Zeit lang gelagert werden und der Alterungsprozess da natürlich auch schon läuft, muss man hoffen, dass man keine allzu alten Akkus kauft. Das Herstellungsdatum steht da nur sehr selten drauf.</li>
<li>Aufgrund der generellen Alterung macht es also wohl auch wenig Sinn, gleich ein Ersatzakku mit dem Gerät mitzukaufen. Außer vielleicht man benutzt beide Akkus alternierend.</li>
</ul>
<p>Mein Fazit:</p>
<ul>
<li>Ich werde Akkus in halb-vollem Zustand bei Zimmertemperatur lagern und alle zwei, drei Monate den Akku ggf. wieder auf halb-voll bringen.</li>
<li>Als Kompromisslösung versuche ich Akkus von 25 auf 100% zu laden.</li>
<li>Bei längerem Netzbetrieb werde ich den Akku entfernen und wie oben beschrieben &#8220;lagern&#8221;.</li>
<li>Ich gehe mal davon aus, dass unter realen Bedingungen ein häufig genutzter Akku auch bei guter Pflege nicht viel länger als 3-4 Jahre hält.</li>
</ul>
<p>So richtig sicher bin ich mir aber irgendwie immer noch nicht, ob das das Richtige ist. Ich könnte natürlich beim jeweiligen Hersteller nachfragen. Ob ich da aber jemanden kriege, der a) Ahnung hat (und nicht nur einen 08-15-geschulten Support-Mitarbeiter) und mir b) auch die ungeschönte Wahrheit erzählen will, ist fraglich. Bis auf weiteres werde ich also wohl meinem gepflegten Halbwissen vertrauen müssen&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.christian-rehn.de/2011/12/14/wie-behandelt-man-eigentlich-akkus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Daemon&#8221; und &#8220;Darknet&#8221;</title>
		<link>http://www.christian-rehn.de/2011/12/12/daemon-und-darknet/</link>
		<comments>http://www.christian-rehn.de/2011/12/12/daemon-und-darknet/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 16:50:47 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Anderes]]></category>
		<category><![CDATA[Bücher]]></category>

		<guid isPermaLink="false">http://www.christian-rehn.de/?p=992</guid>
		<description><![CDATA[&#8220;Wie ich sehe, sind Sie mit den Mordfällen Pavlos und Singh befasst. Um Ihnen unnötigen Aufwand zu ersparen, sage ich Ihnen: Ich habe beide getötet. Warum, werden Sie bald erfahren. Allerdings haben Sie ein Problem. Sie können mich nicht verhaften. Sie können mich nicht aufhalten. Denn ich bin tot.&#8221; Vor einiger Zeit habe ich Neuromancer [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>
&#8220;Wie ich sehe, sind Sie mit den Mordfällen Pavlos und Singh befasst. Um Ihnen unnötigen Aufwand zu ersparen, sage ich Ihnen: Ich habe beide getötet. Warum, werden Sie bald erfahren. Allerdings haben Sie ein Problem. Sie können mich nicht verhaften. Sie können mich nicht aufhalten. Denn ich bin tot.&#8221;
</p></blockquote>
<p>Vor einiger Zeit habe ich <a href="http://de.wikipedia.org/wiki/Neuromancer" rel="nofollow" class="liwikipedia">Neuromancer</a> von William Gibson gelesen. Ein bekanntes, viel gelobtes Buch. Und um ehrlich zu sein, war ich enttäuscht. Mal davon abgesehen, dass es manchmal unnötig schwer zu verstehen ist und wirr erscheint (insbesondere am Anfang; wird später besser; so richtig in Fahrt kommt die Geschichte aber nie), ist dort alles, was Technik betrifft&#8230; merkwürdig bzw. unrealistisch. Gut, das Buch stammt aus den 80er Jahren, aber dennoch: Mir hat das Buch nicht sonderlich gefallen udn so hab ich die beiden Folgebände gar nicht erst gelesen.</p>
<p>Ganz anders ist es mit dem, was ich jetzt gelsen habe: <a href="http://de.wikipedia.org/wiki/Daniel_Suarez" rel="nofollow" class="liwikipedia">Daemon und Darknet von Daniel Suarez</a>. Suarez ist Softwareentwickler und das merkt man. Technisch gesehen hat das, was er schreibt, im Großen und Ganzen Hand und Fuß. Und für einen Informatik-Studenten ist es ausgesprochen angenehm, wenn man einen Roman liest, in dem Begriffe wie &#8220;IP-Adresse&#8221;, &#8220;Formatstring-Hack&#8221; und &#8220;Quellcode&#8221; in einem technisch nachvollziehbaren Zusammenhang stehen. Man kann die Bücher auch lesen ohne diese Begriffe zu verstenen. Wenn man sie aber kennt und sieht, dass sie richtig verwendet werden, ist der Roman nochmal so gut. Auch die deutsche Übersetzung macht das nicht kaputt (im Gegensatz zu Fachliteratur lese ich Romane lieber in der deutschen Übersetzung). Es gibt zwar ein paar Stellen, bei denen ich vermute, dass die Übersetzung etwas Merkwürdiges gemacht hat. Das ist eindeutig im Rahmen und tut dem Lesegenuss keinen Abbruch.</p>
<p>Nun, worum gehts? Matthew Sobol ist Chef einer großen Computerspielefirma. Und er ist totsterbenskrank. Er leidet an einer Krankheit, an der er langsam aber sicher stirbt. Kurz nachdem aber die Meldung über seinen Tod durch die Medien geht, geschehen merkwürdige Dinge. Der Daemon, eine verteilte KI, die Sobol auf Basis seiner Computerspiele entwickelt hat, erwacht zum Leben und verfolgt düstere Pläne. Der Daemon wirbt Leute an, begeht Morde und infiltriert Firmennetze. Der Daemon übernimmt die Welt. Und gewisse Leute versuchen das zu verhindern.</p>
<p>Das hört sich ziemlich nach schwarz/weiß-Malerei mit vorhersehbarem Plot an, aber genau das ist es nicht. überhaupt nicht. Diverse <a href="http://de.wikipedia.org/wiki/Plot_point" rel="nofollow" class="liwikipedia">Plot Points</a> erzeugen nicht nur Spannung, sondern weichen auch die zu Anfang scheinbar noch herrschende schwarz/weiß- bzw. gut/böse-Trennung auf.</p>
<p>Wie von einem Thriller kaum anders zu erwarten, gehen massenweise Autos kaputt und an Toten mangelt es auch nicht. Und wie von Science-Fiction zu erwarten gibt es immer mal wieder (oder andauernd) Technik die so (noch) nicht existiert. Aber Daemon ist mehr als nur ein Thriller mit starkem Technikanteil. Manche Teile lesen sich wie ein Computerspiel, andere sind in hohem Maße gesellschaftskritisch. Es ist ein intelligenter Roman, der nachdenklich stimmt. Gerade auch, weil er sehr real wirkt. Viel tennt uns nicht von der Welt des Romans &#8212; sowohl gesellschaftlich als auch technologisch.</p>
<p>Ich könnte jetzt noch in den Krümeln suchen. Ich könnte erklären, was technisch so nicht funktioniert (z.B. das Portieren einer Computerspiel-Auto-KI auf ein richtiges Auto) und warum die Features des Daemon übertrieben gut sind und kaum Bugs zu haben scheint. Oder ich könnte mich fragen, warum sich ein hochgradig verteiltes System zumindest an einer Stelle (kurz vor Schluss) wie ein zentralisiertes zu verhalten scheint. Ich könnte auch aufzählen, welche Kleinigkeiten man meiner Meinung nach an der Geschichte verbessern könnte. Das würde dem Roman aber nicht gerecht. Im Vergleich zu dem, was andere Romanschreiber fabrizieren, ist das lächerlicher Kleinkram. &#8220;Daemon&#8221; ist ein guter Roman. Die Geschichte erschafft im wahrsten Sinne des Wortes eine eigene Welt; sie ist spannend, gut erzählt und regt sogar zum Nachdenken an. </p>
<p>Kurz: Ein intelligenter Roman, der mir viel Spaß gemacht hat.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.christian-rehn.de/2011/12/12/daemon-und-darknet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile: Wenn &#8220;agil&#8221; draufsteht&#8230;</title>
		<link>http://www.christian-rehn.de/2011/12/03/agile-wenn-agil-draufsteht/</link>
		<comments>http://www.christian-rehn.de/2011/12/03/agile-wenn-agil-draufsteht/#comments</comments>
		<pubDate>Sat, 03 Dec 2011 21:42:34 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Dilbert]]></category>

		<guid isPermaLink="false">http://www.christian-rehn.de/?p=983</guid>
		<description><![CDATA[&#8230; ist wohl nicht immer agil drin. Leider wird Agile Softwareentwicklung oft so verstanden, wie in obigem nicht nur einmal zitiertem Dilbert-Comic. Mein Eindruck ist manchmal, dass das Wort &#8220;agil&#8221; dazu benutzt wird, dem Nichtvorhandensein einer strukturierten und durchdachten Vorgehensweise einen Namen zu geben. Aber genau das ist agile Softwareentwicklung eben *nicht*. Agile Softwareentwicklung heißt [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230; ist wohl nicht immer agil drin. </p>
<p><a href="http://dilbert.com/strips/comic/2007-11-26/" title="Dilbert.com" class="liimagelink"><img src="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/00000/1000/700/1791/1791.strip.gif" border="0" alt="Dilbert.com" width="500" /></a></p>
<p>Leider wird Agile Softwareentwicklung oft so verstanden, wie in obigem nicht nur einmal zitiertem Dilbert-Comic. Mein Eindruck ist manchmal, dass das Wort &#8220;agil&#8221; dazu benutzt wird, dem Nichtvorhandensein einer strukturierten und durchdachten Vorgehensweise einen Namen zu geben. Aber genau das ist agile Softwareentwicklung eben *nicht*. Agile Softwareentwicklung heißt nicht einfach mal drauflos coden und hoffen, dass alles schon irgendwie gut geht. </p>
<p>Letztens hab ich auf heise <a href="http://www.heise.de/developer/artikel/Auswertung-der-Umfrage-Softwaretest-in-der-Praxis-1369290.html" class="liexternal">eine interessante Umfrage</a> gesehen, die genau das zeigt. Zumindest ist das meine Interpretation der Daten.</p>
<p>Nach der Umfrage nutzen 17% gar kein Vorgehensmodell. Dazu kommen die oben genannten Feigenblatt-Agilen und wohl auch ein paar Feigenblatt-Phasenorientierten. Wenn man jetzt auch noch bedenkt, wer die Fragen beantwortet hat (Tester, Entwickler, Manager, &#8230;), dann zeigt sich, dass Entwickler deutlich häufiger angeben, keinem Vorgehensmodell zu folgen. Da aber wohl die Entwickler diejenigen sind, die das am besten wissen sollten, vermute ich mal, dass die 26% (Entwickler, die angegeben haben, keinem Vorgehensmodell zu folgen) eher stimmen als die 17% (Durchschnitt über alle Rollen). Da klaffen wohl Anspruch und Wirklichkeit etwas auseinander.</p>
<p>Aber gucken wir mal genauer:</p>
<ul>
<li>27% der &#8220;agilen&#8221; nutzen ein &#8220;eigenes agiles Vorgehensmodell&#8221;. Soso&#8230;</li>
<li>57% nutzen Scrum (weil es grad in Mode ist, das zu behaupten)</li>
<li>Nur bei 43% der &#8220;agilen&#8221; Projekten sind Unit-Tests vollständig automatisiert. Knapp 30% haben eine Automatisierungsquote unter 70%. Und nennen sich dabei &#8220;agil&#8221;.</li>
</ul>
<p>Die genannte Statistik hat sich jetzt auf Tests konzentriert. Ich schätze mal, wenn man da in andere Richtungen fragt, wird man ein ähnliches Bild erhalten: Nicht alle, die behaupten, agile Softwareentwicklung zu betreiben, tun das auch. </p>
<p>Pi mal Daumen schätze ich also mal, ein Drittel der agilen sind nicht wirklich agil. Grob geraten sind wohl 50% phasenorientiert 20% agil und 30% gar nix. Und die Übergänge sind fließend.</p>
<p>Teilweise herrscht auch ein falsches Verständnis: Auf ner Firmenkontaktmesse hab ich auch mal gehört, &#8220;agil&#8221; sei ja gar nicht neu; früher nannte man das nur iterativ. Aber so ist es natürlich nicht. Die Aussage ist in etwa genauso richtig, wie zu behaupten, dass früher (&#8220;prozedural&#8221;) Klassen einfach structs oder records geheißen haben. Technisch mag das bis zu einem gewissen Grad stimmen (aber auch nur zum Teil). Jedoch hat sich die Denkweise geändert. Und die Denkweise ist es, die den großen Unterschied macht &#8212; sowohl bei der Objektorientierung alsauch bei der agilen Softwareentwicklung.</p>
<p>Nichtsdestotrotz gibt es auch Firmen, die Agilität richtig verstehen und richtig anwenden. Durch die ein oder andere Exkursion hab ich da auch schon welche kennen lernen dürfen. Effektiv ist in den meisten Firmen, die ich bisher kennen gelernt habe, Agilität zumindest ein Thema. Ich denke, man kann also behaupten Agile Softwareentwicklung ist mittlerweile im Mainstream angekommen. Nur heißt das eben noch nicht, dass alle, die sich &#8220;agil&#8221; nennen, das auch sind.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.christian-rehn.de/2011/12/03/agile-wenn-agil-draufsteht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gefangen, nicht gefunden! #20</title>
		<link>http://www.christian-rehn.de/2011/11/19/gefangen-nicht-gefunden-20/</link>
		<comments>http://www.christian-rehn.de/2011/11/19/gefangen-nicht-gefunden-20/#comments</comments>
		<pubDate>Sat, 19 Nov 2011 11:41:53 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Gefangen, nicht gefunden!]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Bugs]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://www.christian-rehn.de/?p=902</guid>
		<description><![CDATA[Informatik Kurzer Realitätsabgleich: In My life as a Code Economist erklärt Eric Sink, warum es sinnvoll sein kann, Bugs im System zu lassen. Einen sehr guten Vortrag über die Grundlagen von git gibts hier: http://blip.tv/scott-chacon/git-talk-4113729 Sehr schön ist hier insbesondere die grafische Repräsentation des Repositorys. Die ist wichtig zum Verständnis. Manchmal etwas schnell um dem [...]]]></description>
			<content:encoded><![CDATA[<h3>Informatik</h3>
<ul>
<li>Kurzer Realitätsabgleich: In <a href="http://www.ericsink.com/articles/Four_Questions.html" class="liexternal">My life as a Code Economist</a> erklärt Eric Sink, warum es sinnvoll sein kann, Bugs im System zu lassen.</li>
<li>Einen sehr guten Vortrag über die Grundlagen von git gibts hier: <a href="http://blip.tv/scott-chacon/git-talk-4113729" class="liexternal">http://blip.tv/scott-chacon/git-talk-4113729</a> Sehr schön ist hier insbesondere die grafische Repräsentation des Repositorys. Die ist wichtig zum Verständnis. Manchmal etwas schnell um dem inhaltlich zu folgen, aber dennoch gut verständlich.</li>
<li><a href="http://eagain.net/articles/git-for-computer-scientists/" class="liexternal">git for Computer Scientists</a>. Sehr schön! Da wünscht man sich mehr von. Das hier sind ja nur die aller grundlegendsten Dinge.</li>
<li><a href="http://www.infoq.com/presentations/Where-Did-My-Architecture-Go" class="liexternal">Where Did My Architecture Go?</a> ist ein sehr interessanter Vortrag über Softwarearchitektur und wie man auf diese aufpasst.</li>
<li>Es gibt wieder neue Folgen von Tatort Internet. <img src='http://www.christian-rehn.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Also nicht von <a href="http://de.wikipedia.org/wiki/Tatort_Internet" rel="nofollow" class="liwikipedia">diesem fragwürdigen Blödsinn auf RTL2</a> sondern von der Artikel-Serie auf Heise-Security (<a href="http://www.heise.de/security/artikel/Tatort-Internet-Nach-uns-die-SYN-Flut-1285780.html" class="liexternal">1</a> <a href="http://www.heise.de/security/artikel/Tatort-Internet-Ferngesteuert-1320475.html/from/atom10" class="liexternal">2</a>) Sehr interessant.</li>
<li><a href="http://programmers.stackexchange.com/questions/17443/what-does-it-mean-to-write-good-code/17503#17503" class="liexternal">&#8220;A good coder writes code that looks like it was easy and straightforward to do&#8221;</a> (<a href="http://www.nickhodges.com/post/Flotsam-and-Jetsam-41.aspx" class="liexternal">via</a>)</li>
<li>Ein paar Lustige Bugs: <a href="https://bugs.launchpad.net/ubuntu/+source/file/+bug/248619" class="liexternal">OpenOffice kann dienstags nicht drucken</a>, <a href="http://www.ibiblio.org/harris/500milemail.html" class="liexternal">E-Mails nur im Umkreis von 500 Meilen</a> (<a href="http://blog.fefe.de/?ts=b04b7f9d" class="liexternal">via</a>)
</ul>
<h3>Anderes</h3>
<ul>
<li>Boa bin ich langsam. Das hier liegt schon seit Ewigkeiten hier um. Ein Punkt oben war noch &#8220;Die Delphi-Tage sind ausverkauft&#8221; (aus verständlichen Gründen hab ich das vor dem Posten wieder gelöscht; Anachronismen sind nicht sonderlich hilfreich) und WordPress zeigt den 16. August als Erstellungsdatum&#8230;</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.christian-rehn.de/2011/11/19/gefangen-nicht-gefunden-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Warum manchmal unerklärliche Dinge geschehen</title>
		<link>http://www.christian-rehn.de/2011/11/09/warum-manchmal-unerklarliche-dinge-geschehen/</link>
		<comments>http://www.christian-rehn.de/2011/11/09/warum-manchmal-unerklarliche-dinge-geschehen/#comments</comments>
		<pubDate>Wed, 09 Nov 2011 15:34:10 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Bugs]]></category>
		<category><![CDATA[DBC]]></category>
		<category><![CDATA[WLAN]]></category>

		<guid isPermaLink="false">http://www.christian-rehn.de/?p=969</guid>
		<description><![CDATA[&#8220;Schon traurig, dass von mir als Informatiker manchmal als einziger Lösungsvorschlag &#8216;Stecker ziehen und wieder reinstecken&#8217; kommt. &#8212; Und noch trauriger ist es, dass das auch noch hilft.&#8221; Manchmal passieren Dinge, die uns unerklärlich, ja unglaublich erscheinen. In den letzten paar Tagen, durfte ich an ein paar WLANs rumbasteln und dabei sind diverse solcher Dinge [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Schon traurig, dass von mir als Informatiker manchmal als einziger Lösungsvorschlag &#8216;Stecker ziehen und wieder reinstecken&#8217; kommt. &#8212; Und noch trauriger ist es, dass das auch noch hilft.&#8221;</p>
<p>Manchmal passieren Dinge, die uns unerklärlich, ja unglaublich erscheinen. In den letzten paar Tagen, durfte ich an ein paar WLANs rumbasteln und dabei sind diverse solcher Dinge passiert. Und das hat mich dann dazu gebracht, obiges zu meinem Cousin zu sagen. Das will ich mal zum Anlass nehmen und etwas darüber sagen, wie diese unerklärlichen Dinge geschehen.</p>
<p>Aber was ist denn nun passiert?</p>
<ul>
<li>Der neue WLAN-Router tut nicht so, wie er soll. Zuerst kommt er ins Internet, aber das WLAN geht nicht. Dann geht WLAN aber kein Internet mehr. Nach ein paar mal neu Booten und Stecker ziehen und wieder reinstecken, tut es wieder.</li>
<li>Ein anderer WLAN-Router (gleiches Modell) hat laut LED eine Verbindung mit dem Internet. Das Kabel steckt aber nicht im WAN-Port. Netzstecker ziehen und wieder reinstecken und es geht.</li>
<li>Der selbe WLAN-Router ist per Ping zu erreichen, zeigt bei Eingabe der IP in den Browser keine Konfigurationsoberfläche (Timeout). Ein Reset behebt das Problem.</li>
<li>Bei selben Gerät ein Admin-Passwort eingerichtet (händisch in beide Edit-Felder eingetragen und gespeichert). Danach nimmt er das Passwort beim Anmelden aber nicht mehr an. Nach einem Reset nochmal versucht (diesmal langsam eingetippt). Selbes Problem. Dann Dummy-Passwort &#8220;abc&#8221; zum Probieren. Lustigerweise funktioniert das jetzt. Dann das Wunsch-Passwort nicht eingetippt, sondern per Copy&#8217;n'Paste jeweils eingefügt. Wieder &#8220;Benutzername oder Kennwort falsch&#8221;.</li>
<li>Einen WLAN-AccessPoint als Repeater konfiguriert. Datendurchsatz ca. 40kbps (ja 40kbps bei 802.11n und ner Entfernung von 20cm). Neu Starten hilft diesmal nicht. Zum Testen als AP-Client konfiguriert: selbes Problem. Zum Testen mit anderem AccessPoint verbunden: Klappt problemlos. Wieder zurück zum eigentlich gewünschten AccessPoint: Wieder ewig lahm. Neu Starten hilft immer noch nicht. Einen Tag später nochmal versucht: Klappt auf Anhieb.</li>
<li>Bei Verwendung des neues Repeaters friert der Rechner ein (Maus und Tastatur reagieren nicht mehr). Der Rechner war per Ethernet-Kabel mit dem Repeater verbunden. Selbst nach Abziehen des Kabels (also der Rechner ist mit dem Repeater nicht mehr verbunden. Beide stehen nur nebeneinander) besteht das Problem weiterhin. Ein bisschen WLAN lässt den Rechner einfrieren.</li>
<li>Auch ein DSL-Router war mal per Ping zu erreichen und per Browser nicht. Wieder behob ein Steckerziehen das Problem.</li>
</ul>
<p>Aber wie kann das alles sein? Und was hat das mit Software-Entwicklung zu tun? Ich wage mich mal an eine Erklärung des Unerklärlichen. <span id="more-969"></span></p>
<p>Software zu schreiben, die einfach tut, was sie soll, ist leicht. Aber Software zu schreiben, die auch noch dann funktioniert, wenn der User einen Fehler gemacht hat oder sonstige unerwartete Ereignisse passieren, ist schwer. Deshalb werden wir als Entwickler darauf getrimmt, Randfälle zu bedenken.</p>
<p>In meinem diesjährigen Vortrag auf den Delphi-Tagen (<a href="http://www.christian-rehn.de/2011/09/11/enbugging-wie-wir-fehler-machen-und-wie-wir-sie-vermeiden/" title="Enbugging — Wie wir Fehler machen und wie wir sie vermeiden" class="liinternal">Enbugging</a>) hab ich <a href="http://de.wikipedia.org/wiki/Design_by_Contract" rel="nofollow" class="liwikipedia">Design by Contract</a> als Denkweise vorgestellt: Man betrachtet Methoden als Verträge. Wenn der Caller seinen Teil der Vereinbarung einhält (Precondition), garantiert der Calee, also die Methode, ihren Teil (Nachbedingung). Darüber hinaus gibt es noch Invarianten, die immer gelten müssen [1].</p>
<p>Es gibt Programmiersprachen (z.B. <a href="http://www.christian-rehn.de/2011/08/03/eiffel-das-esperanto-unter-den-programmiersprachen/" title="Eiffel: Das Esperanto unter den Programmiersprachen" class="liinternal">Eiffel</a>), die DBC von Haus aus unterstützen. Zumindest aber gibt es in den allermeisten Sprachen ein <a href="http://de.wikipedia.org/wiki/Assertion_(Informatik)" rel="nofollow" class="liwikipedia">Assert</a>-Statement, mit dem man auch viel in die Richtung machen kann. Viel wichtiger als die konkreten Sprachfeatures finde ich allerdings die zugrundeliegende Denkweise. Durch diese ist man nämlich gezwungen, die ganzen Randfälle und Fehlermöglichkeiten zu bedenken. Die Sprachfeatures helfen dann dabei, diese Denkweise auch wirklich anzuwenden.</p>
<p>Das klingt alles sehr akademisch, ist aber außerordentlich praxisrelevant. Wenn man diese Denkweise nämlich nicht anwendet, bzw. die Sonderfälle nicht bedenkt, kommt es zu den oben beschriebenen Merkwürdigkeiten.</p>
<p>Stecker ziehen und wieder reinstecken bzw. neu starten hilft deshalb, weil das System sich dann wieder in einem validen Zustand befindet. Ganz deutlich sieht man das an dem Beispiel mit dem Router, dessen LED behauptet, er wäre mit dem Internet verbunden, obwohl das WAN-Kabel gar nicht angeschlossen war. Das sind inkonsistente Zustände. Die LED behauptet was anderes als das Kabel. Und intern gibt es wahrscheinlich noch ein paar Variablen, von denen die einen behaupten, Internet wäre da und die anderen behaupten das Gegenteil. Das Neustarten behebt das Problem, aber nicht die Ursache. Normalerweise hätte das System gar nicht erst in diesen Zustand kommen sollen. </p>
<p>Es gibt also irgend eine Kombination von Eingaben (Tastendrücke, Signale auf den Leitungen, was weiß ich), die zu diesem invaliden Zustand führt. Das kann etwas ganz Verrücktes sein, wie dreimal Taste 1 drücken, dann Taste 4 gedrückt halten und dabei das Kabel reinstecken. Das für sich genommen erscheint ziemlich unwahrscheinlich, aber meist gibt es viele unterschiedliche solcher Möglichkeiten und <a href="http://de.wikipedia.org/wiki/Murphys_Gesetz" rel="nofollow" class="liwikipedia">Murphys Gesetz</a> zufolge wird einer dieser Fälle auch eintreten.</p>
<p>Jetzt mag man geneigt sein, zu behaupten, dass kein Mensch solche abstrusen Fälle bedenken kann. Und natürlich wird man das auch kaum tun. Das Prinzip, das hier mal wieder hilft, ist das altbekannte <a href="http://de.wikipedia.org/wiki/Divide_and_Conquer" rel="nofollow" class="liwikipedia">Divide and Conquer</a>: Man bedenkt die Problemfälle nicht für das ganze System, sondern getrennt für jedes Modul bzw. jede Methode. Und damit wären wir wieder bei DBC. Diese Denkweise schützt uns davor, all diese überaus nervigen Merkwürdigkeiten in unserer Software zu vermeiden oder zumindest stark zu reduzieren [2].</p>
<p>Es gibt auch Verfahren, die wirklich 100%ig sicher stellen, dass gewisse Zustände nie erreicht werden. Ganze Heerscharen von Informatikern an den Unis beschäftigen sich mit Verfahren zur formalen Verifikation. So etwas ist allerdings sehr aufwändig und skaliert meist nicht auf Code realer Größe. Es gibt hier ein paar Ausnahmen und manches davon wird bei sicherheitskritischen Systemen, bei Autos, Flugzeugen und ähnlichem auch tatsächlich gemacht. Für das typische Informationssystem ist das aber eher weniger geeignet. Hier finde ich robuste Programmierung durch die oben beschriebene Denkweise wichtiger und sinnvoller.</p>
<p>Schauen wir uns jetzt noch kurz an, was ich als konkrete Ursache der obigen Probleme vermute:</p>
<ul>
<li>Beim Problem &#8220;Ping möglich, HTTP aber nicht&#8221; gab es wohl einen Absturz des internen Webservers. Ausgelöst vermutlich durch irgendwelche nicht bedachten Sonderfälle.</li>
<li>Das mit dem nicht akzeptierten Passwort war ein Problem mit der Passwortlänge. Das Passwort war einfach zu lang. Und statt eine Fehlermeldung auszugeben, wurde das Passwort beim Einspeichern einfach nach 9(?) Zeichen abgeschnitten. Ich hatte sowas schon fast vermutet und deshalb testweise das kopierte Passwort beim Einloggen schrittweise gekürzt. Und irgendwann hats eben geklappt. Dass da wohl jemand vergessen hatte, die Vorbedingung &#8220;Passwortlänge < 9 Chars" zu prüfen, brauche ich wohl nicht erst zu erwähnen.</li>
<li>Das mit dem atemberaubend schlechtem WLAN-Durchsatz kann ich mir immer noch nicht erklären.</li>
<li>Und bei dem Fall mit dem Einfrieren des Rechners bei WLAN in der Nähe, war wohl der angeschlossene (aber nicht verwendete) WLAN-Stick bzw. dessen Treiber verantwortlich. Der hat irgendwelche Signale gesehen (802.11n statt 802.11g [3]), die er so gar nicht einordnen konnte. Dann hat er nen Fehler produziert, der das System einfrieren lies. Vielleicht nen Deadlock im Treiber.</li>
</ul>
<p>[1] Es gibt verschiedene Arten von Invarianten, bei denen das &#8220;immer&#8221; jeweils andere Stellen meint. Für das, was ich hier sagen will, spielen solche Feinheiten aber keine Rolle.<br />
[2] Menschen sind nicht perfekt und damit sind Fehler unausweichlich.<br />
[3] Wobei das WLAN eigentlich im Gemischtbetrieb läuft. Merkwürdig.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.christian-rehn.de/2011/11/09/warum-manchmal-unerklarliche-dinge-geschehen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile: Definition of Done und Failure Mode Programming</title>
		<link>http://www.christian-rehn.de/2011/10/16/agile-definition-of-done-und-failure-mode-programming/</link>
		<comments>http://www.christian-rehn.de/2011/10/16/agile-definition-of-done-und-failure-mode-programming/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 13:53:36 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[90-90 rule]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[DoD]]></category>
		<category><![CDATA[Failure Mode Programming]]></category>

		<guid isPermaLink="false">http://www.christian-rehn.de/?p=965</guid>
		<description><![CDATA[Einer der Begriffe, die bei Agilen Softwareentwicklungsprozessen immer wieder zu hören sind, ist &#8220;Definition of Done&#8221; (DoD). Man soll also vorher definieren, was man unter &#8220;fertig&#8221; versteht. Das hört sich erstmal trivial an. Und der triviale Grund, dass man ansonsten aneinander vorbei redet, leuchtet auch jedem ein. &#8220;Ist Feature X jetzt endlich fertig?&#8221; &#8220;Ja, hab [...]]]></description>
			<content:encoded><![CDATA[<p>Einer der Begriffe, die bei Agilen Softwareentwicklungsprozessen immer wieder zu hören sind, ist &#8220;<a href="http://agilesoftwaredevelopment.com/2006/05/definition-of-done" class="liexternal">Definition of Done</a>&#8221; (DoD). Man soll also vorher definieren, was man unter &#8220;fertig&#8221; versteht. Das hört sich erstmal trivial an. Und der triviale Grund, dass man ansonsten aneinander vorbei redet, leuchtet auch jedem ein.</p>
<p>&#8220;Ist Feature X jetzt endlich fertig?&#8221;<br />
&#8220;Ja, hab ich gestern eingecheckt.&#8221;<br />
&#8220;Dann können wir morgen also deployen.&#8221;<br />
&#8220;Neinnein, da muss noch die QA drüber. Da ist noch nix getestet.&#8221;</p>
<p>&#8220;Ist Feature Y jetzt endlich fertig?&#8221;<br />
&#8220;Fast. Zu 90% ist es fertig. Ich muss nur noch&#8230;&#8221;</p>
<p>Wenn man einmal definiert, was &#8220;fertig&#8221; bedeutet, kommt es zu weniger Missverständnissen. Mal ganz davon abgesehen, dass man so auch leichter dieses &#8220;fast fertig&#8221; ausmerzen kann. Entweder ist ein Feature &#8220;done&#8221; oder eben nicht. Zu 90% fertig bedeutet ja meist, dass noch (weitere) 90% vor einem liegen. Das ist die so genannte <a href="http://en.wikipedia.org/wiki/Ninety-ninety_rule" rel="nofollow" class="liwikipedia">90-90 rule</a>. Und diese ist nur zu oft wahr. Auch, wenn mans vielleicht nicht wahr haben will (mich teilweise auch noch eingeschlossen; ich arbeite daran).</p>
<p>Das ist alles klar und allgemein bekannt. Aber es gibt noch einen anderen Grund für eine DoD: <span id="more-965"></span> Angenommen man steht unter Zeitdruck (und bei Sprints/Iterationen von zwei Wochen Länge, ist das schnell passiert). Bis Morgen Mittag um 12 muss das Feature fertig sein. Wie schnell ist es da passiert, dass man das nötige Refactoring doch sein lässt und vielleicht auch nur halbherzig testet und dokumentiert &#8212; nur um das Feature &#8220;fertig&#8221; zu kriegen.</p>
<p>Genau genommen ist besagtes Feature aber noch nicht fertig, denn es gibt noch eine gewisse Menge Arbeit, die &#8220;für dieses Feature&#8221; noch getan werden muss. Und dann ist man auch schon in der nächsten Iteration, hat neue Aufgaben und das Feature bleibt schlecht getestet und das nötige Refactoring wird auch nicht gemacht. Probleme häufen sich auf, es gibt ne Menge Arbeit, die keiner sieht, aber dennoch getan werden muss. Kurz: Man schludert beim Programmieren.</p>
<p>Außerdem neigt man zu &#8220;Failure Mode Programming&#8221; [1]. Anstatt sauber zu programmieren und zu testen, fixt man nur Bugs und guckt, dass man die Software irgendwie ans Laufen kriegt. Man ist quasi im &#8220;Fehler- bzw. Bugfix-Modus&#8221; statt im normalen &#8220;Programmiermodus&#8221;. Fast unbewusst kehrt man zum altbekannten &#8220;Code and Fix&#8221; zurück, das man doch eigentlich nicht mehr machen wollte. Zeitdruck drängt einen in diese Richtung. </p>
<p>Aber eine klare Definition of Done hilft, sich davor zu schützen. Wenn das Refactoring und eine gewisse Testabdeckung zur DoD dazu gehört, dann ist ein Feature, das nicht sauber entwickelt wurde, dem Tests fehlen und für das noch kein Refactoring gemacht wurde, eben noch nicht fertig. Auch wenn es &#8220;im Prinzip läuft&#8221;.</p>
<p>Bei der <a href="http://www.christian-rehn.de/2011/10/09/summerschool-agile-software-development/" class="liinternal">Summerschool &#8220;Agile Software Development&#8221;</a> hab ich das genau so erlebt. Wir hatten Sprints von etwa zwei Stunden Länge. Und uns fehle eine DoD. Und obwohl ich normalerweise eher einer bin, der zu viel als zu wenig Wert auf sauberen Code legt, bin auch ich in den &#8220;Failure Mode&#8221; zurück gefallen. Ich denke, wenn wir klar kommuniziert hätten, was &#8220;fertig&#8221; bzw. &#8220;done&#8221; heißt, wären wir unterm Strich schneller gewesen. Failure Mode Programming reduziert Codequalität und damit auch die Produktivität. </p>
<p>Kaum hatten wir uns mal in Ruhe hingesetzt und sind den Code Zeile für Zeile durchgegangen, anstatt nur zu debuggen, hatten wir den Fehler auch schon gefunden und dabei auch noch einige Unsauberkeiten ausgebessert. Ein Debugger ist ein tolles Werkzeug und ich verzichte nur sehr ungern darauf, aber letztendlich ist einmal sauber programmieren schneller, als schnell programmieren und dann debuggen.</p>
<p>Das selbe hätte ich zwar auch schon vorher gesagt, aber echter Zeitdruck, macht die Situation anders. Man muss sich das wohl wirklich jedes Mal wieder vor Augen führen. Und eine DoD kann <acronym title='In My Humble Opinion - Meiner bescheidenen Meinung nach'>IMHO</acronym> dabei helfen. An weiteren Maßnahmen arbeite ich noch.</p>
<p>[1] Irgendwo hab ich den Begriff mal gelesen oder zumindest einen ähnlichen. Ich finds gerade nicht. Zur Not ist es eben eine Eigenkreation&#8230; <img src='http://www.christian-rehn.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.christian-rehn.de/2011/10/16/agile-definition-of-done-und-failure-mode-programming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile: Frequency Reduces Pain</title>
		<link>http://www.christian-rehn.de/2011/10/12/agile-frequency-reduces-pain/</link>
		<comments>http://www.christian-rehn.de/2011/10/12/agile-frequency-reduces-pain/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 09:08:40 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Gall's Law]]></category>
		<category><![CDATA[Martin Fowler]]></category>

		<guid isPermaLink="false">http://www.christian-rehn.de/?p=962</guid>
		<description><![CDATA[Quasi alle mir bekannten agilen Methoden basieren auf einem weiteren grundlegenden Gedanken, der allerdings nur selten genannt wird, wenn Agile Softwareentwicklung erklärt wird: Frequency Reduces Pain oder anders ausgedrückt: &#8220;if it hurts, do it more often&#8221;. Integration, Tests, Schätzungen, Refactoring, alles das kann sehr unangenehm werden. Deshalb wird das alles in agilen Prozessen viel öfter [...]]]></description>
			<content:encoded><![CDATA[<p>Quasi alle mir bekannten agilen Methoden basieren auf einem weiteren grundlegenden Gedanken, der allerdings nur selten genannt wird, wenn Agile Softwareentwicklung erklärt wird: <a href="http://martinfowler.com/bliki/FrequencyReducesDifficulty.html" class="liexternal">Frequency Reduces Pain</a> oder anders ausgedrückt: &#8220;if it hurts, do it more often&#8221;. Integration, Tests, Schätzungen, Refactoring, alles das kann sehr unangenehm werden. Deshalb wird das alles in agilen Prozessen viel öfter gemacht &#8212; in kleineren, überschaubareren Schritten. </p>
<p>Integration kann man nicht vermeiden. Irgendwann muss man eben mal alles zusammenwerfen und gucken, ob es funktioniert. Je größer die Software und je später die Integration, desto schwieriger wird das Ganze. Deshalb macht man es viel öfter. Nämlich mindestens einmal täglich. Und auf einmal wird alles viel einfacher. </p>
<p>Schön zusammengefasst ist das außerdem in <a href="http://en.wikipedia.org/wiki/Gall" s_law" rel="nofollow" class="liwikipedia">Gall&#8217;s Law</a>:</p>
<blockquote><p>
A complex system that works is invariably found to have evolved from a simple system that worked. The inverse proposition also appears to be true: A complex system designed from scratch never works and cannot be made to work. You have to start over, beginning with a working simple system.
</p></blockquote>
<p>Integration ist nur ein Beispiel. Das genannte Prinzip steckt in ganz vielen agilen Praktiken und ist außerdem der Grund dafür, dass agile Prozesse hochgradig iterativ sind: Wenn es schwer ist, Software fertig zu kriegen, dann kriegen wir sie eben alle zwei Wochen fertig. Wenn Schätzen schwer ist, dann schätzen wir eben alle zwei Wochen neu, aber dafür kleinere Arbeitspakete. Wenn Testen nervig ist, machen wir es zum Prinzip und schreiben Tests vor dem eigentlichen Code, sodass unser Code unweigerlich testbar wird. Wenn Refactoring fehleranfällig ist, machen wirs doch besser andauernd &#8212; immer mal wieder ein bisschen.</p>
<p>Softwareentwicklung ist wie Markklößchensuppe essen: Nicht alle auf einmal, sondern einer nach dem anderen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.christian-rehn.de/2011/10/12/agile-frequency-reduces-pain/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile: Was ist das eigentlich?</title>
		<link>http://www.christian-rehn.de/2011/10/09/agile-was-ist-das-eigentlich/</link>
		<comments>http://www.christian-rehn.de/2011/10/09/agile-was-ist-das-eigentlich/#comments</comments>
		<pubDate>Sun, 09 Oct 2011 21:16:49 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[Martin Fowler]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://www.christian-rehn.de/?p=959</guid>
		<description><![CDATA[In der letzten Zeit hab ich mich eingehend mit agiler Software-Entwicklung beschäftigt. Das hatte ich schon eine ganze Zeit lang vor, aber praktischerweise hatte ich von der Uni aus die Aufgabe mit ein paar Kommilitonen mir Scrum anzusehen und darüber zu referieren. Außerdem habe ich gerade an der Summerschool &#8220;Agile Software-Entwicklung&#8221; teilgenommen. Das hab ich [...]]]></description>
			<content:encoded><![CDATA[<p>In der letzten Zeit hab ich mich eingehend mit agiler Software-Entwicklung beschäftigt. Das hatte ich schon eine ganze Zeit lang vor, aber praktischerweise hatte ich von der Uni aus die Aufgabe mit ein paar Kommilitonen mir <a href="http://de.wikipedia.org/wiki/Scrum" rel="nofollow" class="liwikipedia">Scrum</a> anzusehen und darüber zu referieren. Außerdem habe ich gerade an der <a href="http://www.christian-rehn.de/2011/10/09/summerschool-agile-software-development/" class="liinternal">Summerschool &#8220;Agile Software-Entwicklung&#8221;</a> teilgenommen. Das hab ich dann mal zum Anlass genommen, mich etwas intensiver mit der Thematik zu beschäftigen.</p>
<p>Bei Agiler Softwareentwicklung gehen die Meinungen typischerweise stark auseinander. Je nachdem wem man zuhört, ist man geneigt entweder den einen oder den anderen recht zu geben. Beide Argumentationsweisen, beide Softwareentwicklungsphilosophien hören sich, für sich alleine betrachtet, vollkommen vernünftig an. Das hilft natürlich nicht sonderlich weiter, wenn man sich eine eigene Meinung bilden will und so schreibe ich das hier hauptsächlich, um mir selbst hier einigermaßen Klarheit zu verschaffen.</p>
<p>Ursprünglich hatte ich einen vergleichsweise langen Artikel geplant. Ich denke aber, dass mehrere kleinere Artikel eher gelesen werden als ein großer. Außerdem dauert ein großer Artikel immer so lange zu schreiben. Nachdem ich jetzt schon über zwei Monate immer mal wieder an dem Text sitze und immer noch erst etwa ein Drittel steht, habe ich mich nun entschlossen, eine Artikelserie daraus zu machen. </p>
<p>Die Artikelserie spiegelt meine momentanen Gedanken zu dem Thema wider. Ich kann nicht sagen, ob ich bei dieser Meinung, die ich hier mal herausarbeite, bleiben werde. Ich bin einfach selbst mal gespannt, wie ich zur Thematik stehen werde, wenn ich mit der Zeit mehr Einsicht gewinne. Nun gut. Ich hab jedenfalls einiges gelesen und mir meine Gedanken dazu gemacht. Los geht es mit einem geschichtlichen Überblick über die Thematik.<br />
<span id="more-959"></span></p>
<p>Als man mit dem Programmieren Mitte des letzten Jahrhunderts anfing, machte man sich über solche Dinge keine Gedanken. Man programmierte einfach. Und das auf einem Niveau, das man sich heute gar nicht mehr vorstellen kann. Erkenntnisse wie Kapselung, Abstrakte Datentypen, Strukturierte Programmierung, &#8220;goto statement considered harmful&#8221; und all das Zeug, das heute so selbstverständlich ist, dass sich keiner mehr darüber Gedanken macht, waren noch nicht bekannt bzw. noch umstrittener Forschungskram. </p>
<p>Nichtsdestotrotz wurden die Programme komplexer und größer. Und weil Murphys Gesetz auch damals schon gegolten hat, endete das Ganze in einer ziemlichen Katastrophe. Genaugenommen in dem, was man die <a href="http://de.wikipedia.org/wiki/Softwarekrise" rel="nofollow" class="liwikipedia">Softwarekrise</a> nennt.</p>
<p>Als Antwort auf die Softwarekrise entstanden Softwaretechnik und <a href="http://de.wikipedia.org/wiki/Softwareengineering" rel="nofollow" class="liwikipedia">Software-Engineering</a>. Auf der einen &#8212; technischen &#8212; Seite entwickelten sich Programmiersprachen und Tools weiter und die oben genannten Erkenntnisse setzten sich langsam durch. Auf der anderen &#8212; organisatorischen &#8212; Seite gelangte man zu der Erkenntnis, dass man Software, wie andere komplexe Systeme auch, mit Ingenieursmethoden entwickeln sollte.</p>
<p>Statt dem einfachen &#8220;Code and Fix&#8221; ging man nun also die Sache systematisch an. Wir spezifizieren unser System zu Tode, bis es sich nicht mehr rühren kann; produzieren Berge von Dokumentation; versuchen jeden Schritt voraus zu planen; und überlegen uns zudem diverse Mechanismen zur Qualitätssicherung. Das funktioniert. Manchmal. Unter gewissen Umständen. Teilweise ziemlich gut sogar. Manchmal funktioniert es auch nicht, aber in jedem Fall ist es enorm aufwändig.</p>
<p>Die Softwarekrise war also immer noch nicht überwunden und es scheiterten immer noch reihenweise große Softwareprojekte &#8212; teilweise allerdings aus anderen Gründen. Das Problem war jetzt weniger mangelnde Planung, sondern vielmehr zu viel Planung bzw. die daraus erwachsende Schwerfälligkeit. Typischerweise versuchte man Anforderungen ein für allemal am Anfang eines Projekts aufzunehmen und dann jegliche Änderung an diesen zu minimieren.</p>
<p>Was aber, wenn man die Anforderungen nicht so recht versteht? Oder der Kunde noch gar nicht so genau weiß, was er möchte? Oder sich seine Wünsche mit der Zeit ändern, weil sich die Situation geändert hat? Und diese Bedingungen sind eben keine Einzelfälle.</p>
<p>Softwareentwicklung ist wohl manchmal wirklich etwas anderes, als &#8220;andere&#8221; Ingenieurswissenschaften. Die Informatik sitzt eh zwischen allen Stühlen. Softwareentwicklung ist kreative Arbeit mit besonderen Anforderungen. Folgendes bringt es eigentlich auf den Punkt:</p>
<blockquote><p>
&#8220;When was the last time someone asked the designers of the Empire State building to add ten new floors at the bottom, put a pool on the top, and have all of this done before Monday morning?&#8221; (<a href="http://msdn.microsoft.com/en-us/library/ee817667.aspx" class="liexternal">original</a>; <a href="http://www.nickhodges.com/post/Flotsam-and-Jetsam-46.aspx" class="liexternal">via</a>)
</p></blockquote>
<p>Und wegen diesen anderen Voraussetzungen, den sich ändernden, unklaren Anforderungen und <a href="http://martinfowler.com/articles/newMethodology.html" class="liexternal">weiteren Unterschieden</a> zu traditioneller Ingenieursarbeit, funktionieren plangetriebene Ansätze bei der Softwareentwicklung doch nicht immer so gut, wie erhofft.</p>
<p>Jedenfalls waren einige mit der Situation ziemlich unzufrieden und so entstanden in den 90er Jahren diverse Softwareentwicklungsmethoden, die sich als leichtgewichtige Alternativen zu den schwerfälligen traditionellen Prozessen verstanden. Eine <a href="http://martinfowler.com/articles/newMethodology.html" class="liexternal">neue Herangehensweise</a> entstand. Im Februar 2001 setzten sich dann 17 Verfechter dieser Ansätze zusammen, um heraus zu finden, ob sie etwas gemeinsam hätten. Und das hatten sie. So entstand der Begriff &#8220;Agile Softwareentwicklung&#8221; und das <a href="http://agilemanifesto.org/" class="liexternal">Manifesto for Agile Software Development</a> (&#8220;Agile Manifesto&#8221;). </p>
<p>Im Kern geht es darum, Personen, Kommunikation und Kundenorientierung über Dokumentation und Pläne zu stellen. Das heißt nicht, dass man in der agilen Softwareentwicklung nicht mehr dokumentiert oder plant. Man versucht es nur, auf ein sinnvolles Minimum zu reduzieren.</p>
<p>Es gab jetzt also eine Community mit ähnlichen Ideen, Werten und Prinzipien, sowie eine Hand voll unterschiedlicher aber im Kern ähnlicher Methoden bzw. Prozesse. Von diesen war <a href="http://de.wikipedia.org/wiki/Extreme_Programming" rel="nofollow" class="liwikipedia">Extreme Programming</a> (XP) zuerst am erfolgreichsten. Mittlerweile setzt sich aber <a href="http://de.wikipedia.org/wiki/Scrum" rel="nofollow" class="liwikipedia">Scrum</a> immer weiter durch und immer öfter hört man auch von <a href="http://de.wikipedia.org/wiki/Kanban_in_der_IT" rel="nofollow" class="liwikipedia">Kanban</a>. Daneben existieren noch weitere wie Crystal, FDD, DSDM und andere. Eine besondere Verbreitung dieser Methoden ist mir bisher aber noch nicht aufgefallen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.christian-rehn.de/2011/10/09/agile-was-ist-das-eigentlich/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Summerschool &#8220;Agile Software Development&#8221;</title>
		<link>http://www.christian-rehn.de/2011/10/09/summerschool-agile-software-development/</link>
		<comments>http://www.christian-rehn.de/2011/10/09/summerschool-agile-software-development/#comments</comments>
		<pubDate>Sun, 09 Oct 2011 16:12:39 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Studium]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Teamarbeit]]></category>

		<guid isPermaLink="false">http://www.christian-rehn.de/?p=956</guid>
		<description><![CDATA[Der FIT hat in diesem Jahr neben den schon mehrmals angebotenen &#8212; und im übrigen ebenfalls empfehlenswerten &#8212; Firmenexkursionen auch eine Veranstaltung zum Thema Agile Softwareentwicklung angeboten: Summerschool &#8220;Agile Software Development&#8221;. Als ich die Ankündigung gelesen hatte, wusste ich sofort, dass ich da mitmachen wollte. Mit agiler Softwareentwicklung wollte ich mich sowieso mal beschäftigen. Außerdem [...]]]></description>
			<content:encoded><![CDATA[<p>Der <a href="http://fit.cs.uni-kl.de/" class="liexternal">FIT</a> hat in diesem Jahr neben den schon mehrmals angebotenen &#8212; und im übrigen ebenfalls empfehlenswerten &#8212; <a href="http://fit.cs.uni-kl.de/service/fit4jobs/" class="liexternal">Firmenexkursionen</a> auch eine Veranstaltung zum Thema <a href="http://de.wikipedia.org/wiki/Agile_Softwareentwicklung" rel="nofollow" class="liwikipedia">Agile Softwareentwicklung</a> angeboten: <a href="http://fit.cs.uni-kl.de/service/summerschool/" class="liexternal">Summerschool &#8220;Agile Software Development&#8221;</a>.</p>
<p>Als ich die Ankündigung gelesen hatte, wusste ich sofort, dass ich da mitmachen wollte. Mit agiler Softwareentwicklung wollte ich mich sowieso mal beschäftigen. Außerdem sollte das Ganze auch sehr praxisnah sein. (Wenn man auf ner Uni studiert, sind wirklich praxisnahe Lehrveranstaltungen eher selten.) Und zum Dritten bot sich so mal wieder die Gelegenheit, mit ein paar Firmen in Kontakt zu kommen. <span id="more-956"></span></p>
<p>Die Teilnehmerzahl war auf 20 beschränkt, wir waren letztendlich dann aber doch nur 17. Ich hätte gedacht, der Zuspruch wäre größer. Die Veranstaltung war auf jeden Fall klasse.</p>
<h3>Bälle, Papierflieger und Lego</h3>
<p>Am ersten Tag haben wir Ball gespielt, Papierflieger gebastelt und Legostädte gebaut. Ja, wirklich. Auf spielerische Art haben wir <a href="http://de.wikipedia.org/wiki/Scrum" rel="nofollow" class="liwikipedia">Scrum</a> beigebracht bekommen und eingeübt. Und ich muss sagen, das hat ziemlich gut gepasst. In kurzen Sprints (Iterationen) von wenigen Minuten haben wir so langsam ein Gefühl für agile Denkweise bekommen. Und es hat ne Menge Spaß gemacht. Man hat auch gemerkt, dass die beiden ScrumMaster, die das mit uns gemacht haben, wirklich Ahnung von der Materie haben und mit Spaß bei der Sache waren.</p>
<h3>Praktisches</h3>
<p>Aber wir haben auch wirklich programmiert und Scrum in kleinen Softwareentwicklungsprojekten eingesetzt. So haben wir einen kleinen Taschenrechner in C# programmiert, eine Android-App geschrieben, eine Webanwendung mit JSF erstellt und gestreamte Börsendaten geparst. Das war alles sehr interessant und so hatte die Veranstaltung noch einen zweiten Lerneffekt: Wir haben einen Einblick in verschiedene Technologien erhalten und diese zumindest ein kleines bisschen angewendet.</p>
<h3>Agile Praktiken</h3>
<p>Neben dem reinen Vorgehensmodell Scrum haben wir noch <a href="http://de.wikipedia.org/wiki/Pair-Programming" rel="nofollow" class="liwikipedia">Pair-Programming</a>, <a href="http://en.wikipedia.org/wiki/Planning_poker" rel="nofollow" class="liwikipedia">Planning-Poker</a> und <a href="http://de.wikipedia.org/wiki/Testgetriebene_Entwicklung" rel="nofollow" class="liwikipedia">TDD</a> als agile Praktiken kennen gelernt. Anderes wie beispielsweise <a href="http://de.wikipedia.org/wiki/Continuous_Integration" rel="nofollow" class="liwikipedia">Continuous Integration</a> wurde nicht behandelt.</p>
<h3>Begriffe und Details</h3>
<p>Auch manche Begrifflichkeiten und Details wurde nicht erklärt. <a href="http://en.wikipedia.org/wiki/The_Chicken_and_the_Pig" rel="nofollow" class="liwikipedia">Chickens and Pigs</a>, <a href="http://martinfowler.com/bliki/XpVelocity.html" class="liexternal">Velocity</a>, und anderer Kleinkram. </p>
<p>Letztendlich bedeutet das, dass wir weniger einen 2-wöchigen Scrum-Kurs bekommen haben, sondern mehr eine Veranstaltung bei der Scrum und Agile Softwareentwicklung einen zwar signifikanten, aber dennoch nur einen Teil darstellten. </p>
<p>Aber das war nicht schlecht. Im Gegenteil. Wahrscheinlich haben wir so mehr mitgenommen, als wenn es ein reiner Scrum-Kurs geworden wäre.</p>
<h3>Teamarbeit</h3>
<p>Teamarbeit ist ein wichtiger Punkt. Agile Softwareentwicklung ist stark teamfokussiert und das hat man gemerkt. Sind die Teams eingespielt, kennen sich die einzelnen Entwickler also untereinander, harmonieren sie miteinander und haben sie auch in etwa gleiche Fähigkeiten, funktioniert Scrum ziemlich gut. Trifft das nicht zu, hakt es an mehreren Ecken und Enden. Es &#8220;läuft nicht ganz rund&#8221;. Plangetriebene Ansätze verkraften da vermutlich etwas mehr an Unstimmigkeiten.</p>
<p>Man konnte das sehr schön sehen und ich halte das für eine wichtige Erkenntnis und eine gute Erfahrung.</p>
<h3>Technik</h3>
<p>Die Technik hat leider nicht immer so funktioniert, wie erhofft. SDKs und Application Server funktionierten aufgrund von fehlenden Benutzerrechten nicht und <acronym title='Subversion - ein Versionsverwaltungssystem'>SVN</acronym>-Repositorys waren auch nicht immer vorhanden. Das war mitunter etwas nervig.</p>
<h3>Kontakte</h3>
<p>Die Firmen, die das Ganze betreut haben, machen das natürlich nicht ganz uneigennützig. Als Informatik-Student befindet man sich in der vorteilhaften Position, dass einen die Arbeitgeber umwerben, wohingegen in anderen Branchen mehr Bewerber als Stellen existieren. Und da bei der &#8220;Summerschool&#8221; nicht nur Personaler anwesend waren, sondern wirkliche Entwickler, hatte man die Möglichkeit, diese entsprechend auszufragen.</p>
<p>Wenn man die richtigen Fragen stellt, erhält man so einen Einblick, wie in den jeweiligen Unternehmen Software entwickelt wird. Und, wenn man wie ich, nicht mehr allzu lange zu studieren hat (in anderthalb Jahren bin ich fertig), ist so ein Einblick schon ganz gut. Man will ja schließlich wissen, wo man sich bewerben soll und wo eher nicht.</p>
<h3>Meine Meinung zu Scrum und Co.</h3>
<p>Nicht alles, was gelobt wird ist gut und nicht alles, was von anderen verteufelt wird ist schlecht. Agile Softwareentwicklung ist ein kontroverses Thema &#8212; je nachdem, wen man fragt, erhält man eine andere Antwort. Das alles hilft natürlich nicht unbedingt dabei, sich eine halbwegs klare Meinung zu bilden. Meine Meinung zum Thema ist mittlerweile differenzierter, als dass sie in diesen Artikel noch hineinpassen würde. Ich werde diese also schrittchenweise nachliefern.</p>
<h3>Fazit</h3>
<p>Im Endeffekt war es eine ausgesprochen gelungene Veranstaltung. Es hat ne Menge Spaß gemacht, wir haben viel gelernt, Erfahrungen gesammelt, Einblicke erhalten und am Schluss eine Teilnahmebescheinigung erhalten, die sich bei Bewerbungen bestimmt gut macht.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.christian-rehn.de/2011/10/09/summerschool-agile-software-development/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

