<?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>TSCHITSCHEREENGREEN live &#187; Python</title>
	<atom:link href="http://www.tschitschereengreen.com/blog/index.php/category/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tschitschereengreen.com/blog</link>
	<description>Tschitschereengreen - the yoosic coding division</description>
	<lastBuildDate>Fri, 02 Jul 2010 11:57:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>ttg@DjangoCon 2010</title>
		<link>http://www.tschitschereengreen.com/blog/index.php/2010/05/25/645/</link>
		<comments>http://www.tschitschereengreen.com/blog/index.php/2010/05/25/645/#comments</comments>
		<pubDate>Tue, 25 May 2010 13:35:48 +0000</pubDate>
		<dc:creator>Luc</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Vorträge]]></category>
		<category><![CDATA[djangocon]]></category>
		<category><![CDATA[enterprise]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[SAP]]></category>
		<category><![CDATA[sponsorship]]></category>
		<category><![CDATA[Vortrag]]></category>

		<guid isPermaLink="false">http://www.tschitschereengreen.com/blog/?p=645</guid>
		<description><![CDATA[Wie in der News-Sektion bereits bekannt gegeben, betreuen wir die DjangoCon 2010 als offizieller Hauptsponsor. Dieses Engagement war uns wichtig, schließlich arbeiten wir seit mehr als drei Jahren kommerziell mit Django und bemühen uns sehr,  unserer Begeisterung über dieses mächtige wie flexible Framework regelmäßigen Ausdruck zu verleihen. Die Vortragsthemen klingen durchweg interessant. Neben Ausblicken auf [...]]]></description>
			<content:encoded><![CDATA[<p>Wie in der News-Sektion bereits <a href="http://www.tschitschereengreen.de/news.html#djangocon-2010-tschitschereengreen" target="_self">bekannt gegeben</a>, betreuen wir die <a href="http://www.djangocon.eu/" target="_blank">DjangoCon 2010</a> als offizieller Hauptsponsor. Dieses Engagement war uns wichtig, schließlich arbeiten wir seit mehr als drei Jahren kommerziell mit Django und bemühen uns sehr,  unserer Begeisterung über dieses mächtige wie flexible Framework <a href="http://www.tschitschereengreen.com/blog/index.php/category/technology/frameworks/django/" target="_self">regelmäßigen Ausdruck</a> zu verleihen.</p>
<p>Die <a href="http://djangocon.eu/schedule/" target="_blank">Vortragsthemen</a> klingen durchweg interessant. Neben Ausblicken auf die zukünftigen Entwicklungen und Features stellen Best Practices aus dem professionellem Entwickleralltag (Testing, Performanceoptimierung, Deployment) einen zweiten Schwerpunkt dar. Auch neue Datenbankkonzepte und -technologien, wie NoSQL und CouchDB werden heiß gehandelt. Jirka sprach gestern bereits zum Thema „Django at the Enterprise“ über die Integration von Django-Projekten in andere Plattformen, wie in <a href="http://java.sun.com/javaee/" target="_blank">Java EE</a>-basierte  Systemlandschaften mittels <a href="http://www.jython.org/" target="_blank">Jython</a>. Die Beherrschung dieses Themas insbesondere in Bezug auf <a href="http://www.tschitschereengreen.com/blog/index.php/2010/04/12/performance-optimierung-von-jython-und-django/" target="_self">Performance</a> ebnet den Weg für Django-basierte Portalentwicklung in großen Unternehmen, a.k.a. the clients with the deep pockets.</p>
<p>Bis Freitag dauert die DjangoCon noch an, davon werden die letzten zwei Tage im <a href="http://djangode.pbworks.com/EDC10-Sprints/" target="_blank">Sprint</a> verbracht. Sportsgeist bewiesen die Organisatoren auch bei der zeitlichen Planung der Fachkonferenz, denn der erste Veranstaltungstag, Pfingstmontag (24.05.), ist in Deutschland nach wie vor ein gesetzlicher Feiertag. Manchmal möchte das Pony auch in der Freizeit ausgeritten werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tschitschereengreen.com/blog/index.php/2010/05/25/645/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Performance-Optimierung von Jython und Django, Teil 2</title>
		<link>http://www.tschitschereengreen.com/blog/index.php/2010/04/14/590/</link>
		<comments>http://www.tschitschereengreen.com/blog/index.php/2010/04/14/590/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 12:48:56 +0000</pubDate>
		<dc:creator>Luc</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[engine]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jython]]></category>
		<category><![CDATA[optimierung]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[profiling]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://www.tschitschereengreen.com/blog/?p=590</guid>
		<description><![CDATA[Wie im Auftakt-Eintrag beschrieben, handelt dieser Post von Maßnahmen und Erkenntnissen bei der Performance-Optimierung von Jython und Django. Als erstes Testszenario für die Optimierung verwendeten wir eine normale Datenbankabfrage über den Django Object Relational Mapper (ORM). len(Foo.objects.all()) Zum Profiling der Abfrage nutzten wir die Python-Bordwerkzeuge profile und pstats. Nach einem ersten Profiling zeigte sich die [...]]]></description>
			<content:encoded><![CDATA[<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --> <!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		A:link { so-language: zxx } -->Wie im <a href="http://www.tschitschereengreen.com/blog/index.php/2010/04/12/performance-optimierung-von-jython-und-django/" target="_blank">Auftakt-Eintrag</a> beschrieben, handelt dieser Post von Maßnahmen und Erkenntnissen bei der Performance-Optimierung von Jython und Django.</p>
<p>Als erstes Testszenario für die Optimierung verwendeten wir eine normale Datenbankabfrage über den Django <a href="http://docs.djangoproject.com/en/dev/topics/db/queries/#retrieving-objects" target="_blank">Object Relational Mapper (ORM)</a>.<span id="more-590"></span></p>
<blockquote><p>len(Foo.objects.all())</p></blockquote>
<p>Zum Profiling der Abfrage nutzten wir die Python-Bordwerkzeuge <a href="http://docs.python.org/library/profile.html" target="_blank">profile und pstats</a>. Nach einem ersten Profiling zeigte sich die <strong>deepcopy()</strong>-Funktion mit 6218 Aufrufen und über einer halben Sekunde kumulierter Laufzeit als erster Ansatzpunkt.</p>
<p>In zwei internen Funktionen wurden Dictionaries in <strong>try/except</strong>-Statements verwendet. Laut den <a href="http://wiki.python.org/moin/PythonSpeed/PerformanceTips#InitializingDictionaryElements" target="_blank">Python-Tipps zum Umgang mit Dictionaries</a> ist dies ein sinnvolles Vorgehen, falls zu beschreibende Schlüssel erwartungsgemäß schon im Dictionary vorhanden sind. Hier jedoch wird das Dictionary mit neuen Werten gefüllt, daher war das Auftreten von Exceptions eher die Regel als die <em>Ausnahme</em>. Zu prüfen, ob ein Schlüssel schon vorhanden ist, ist in diesem Fall also effizienter (und mehr <em>pythonic</em>).</p>
<p>Dieser Fall stellt sich am Beispiel der Funktion <strong>_keep_alive()</strong> aus Lib/copy.py wie folgt dar:</p>
<blockquote><p>
try:<br />
&nbsp;&nbsp;&nbsp;&nbsp;memo[id(memo)].append(x)<br />
except KeyError:<br />
&nbsp;&nbsp;&nbsp;&nbsp;memo[id(memo)]=[x]</p></blockquote>
<p>Diese Konstruktion wird umgeschrieben zu</p>
<blockquote><p>
if id(memo) in memo:<br />
&nbsp;&nbsp;&nbsp;&nbsp;memo[id(memo)].append(x)<br />
else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;memo[id(memo)]=[x]</p></blockquote>
<p>Weiter fällt auf, dass <strong>id(memo)</strong> in jedem Zweig der <strong>if/else</strong>-Anweisung doppelt angefasst werden muss. Aus diesem Grund bietet sich die Auslagerung des Ausdruckes in eine gemeinsame Referenz an. Die zeitliche Einsparung ist vergleichsweise gering, jedoch preisgünstig, weil man ohnehin schon den Code anfasst.</p>
<blockquote><p>id_memo = id(memo)<br />
if id_memo in memo:<br />
&nbsp;&nbsp;&nbsp;&nbsp;memo[id_memo].append(x)<br />
else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;memo[id_memo] = [x]</p></blockquote>
<p>Wirkung dieser einfachen Maßnahmen: Eine Laufzeitreduzierung von 0.36 auf 0.08 sec in <strong>_keep_alive()</strong> und von 0.3 auf 0.1 sec in <strong>_deepcopy_tuple()</strong>, in der eine ähnliche <strong>try/except</strong>-Konstruktion vorhanden war.</p>
<p>Als nächsten Ansatzpunkt für Optimierungen fielen uns JSON-Felder ins Auge, insbesondere deren Konvertierung beim Datenbankzugriff. Mehr dazu im nächsten Blogeintrag.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tschitschereengreen.com/blog/index.php/2010/04/14/590/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Performance-Optimierung von Jython und Django</title>
		<link>http://www.tschitschereengreen.com/blog/index.php/2010/04/12/performance-optimierung-von-jython-und-django/</link>
		<comments>http://www.tschitschereengreen.com/blog/index.php/2010/04/12/performance-optimierung-von-jython-und-django/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 16:19:44 +0000</pubDate>
		<dc:creator>Luc</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[engine]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jython]]></category>
		<category><![CDATA[optimierung]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[profiling]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://www.tschitschereengreen.com/blog/?p=583</guid>
		<description><![CDATA[Im Rahmen eines laufenden Projektes befassen wir uns mit der Performance-Optimierung von Jython. Hintergrund ist die Integration von Django in eine Java-Umgebung auf der Basis von Apache Tomcat. Bei Jython handelt es sich um eine Umsetzung von Python in Java, welche als Bindeglied zwischen diesen Sprachen dient. In diesem Zusammenhang erweist sich die Erweiterung django-jython [...]]]></description>
			<content:encoded><![CDATA[<p>Im Rahmen eines laufenden Projektes befassen wir uns mit der Performance-Optimierung von <a href="http://www.jython.org" target="_blank">Jython</a>. Hintergrund ist die Integration von <a href="http://www.djangoproject.com" target="_blank">Django</a> in eine Java-Umgebung auf der Basis von <a href="http://tomcat.apache.org" target="_blank">Apache Tomcat</a>.</p>
<p>Bei Jython handelt es sich um eine Umsetzung von Python in Java, welche als Bindeglied zwischen diesen Sprachen dient. In diesem Zusammenhang erweist sich die Erweiterung <a href="http://packages.python.org/django-jython" target="_blank">django-jython</a> als sehr nützlich für das Deployment und den Datenbankzugriff von Django-Projekten. Mit django-jython kann ein Projekt einschließlich zugehöriger Bibliotheken über einen <a href="http://docs.djangoproject.com/en/dev/ref/django-admin" target="_blank">Django Management Command</a> in eine .war-Datei kompiliert werden. Für das Deployment wird diese Datei nur noch dem Anwendungsserver – hier Apache Tomcat – übergeben.</p>
<p>Bei der Entwicklung für unser Projekt stellten wir wesentliche Geschwindigkeitsunterschiede zwischen Python und Jython fest. Das Laden einer Referenzseite mit umfangreichen Datenbankoperationen dauerte mit Python 1.5, mit Jython ganze 11 Sekunden. Somit lag die Notwendigkeit einer Optimierung der Geschwindigkeit auf der Hand. Unsere Maßnahmen und Erkenntnisse auf diesem Weg wollen wir in diesem und nachfolgenden Blogeinträgen weitergeben.</p>
<p>Ausgangspunkt für die Optimierung ist ein System in der Konfiguration Apache Tomcat 6.0.20, Jython 2.5.1 und Django 1.1. Um nicht in der Vergangenheit zu optimieren, wechselten wir Jython von stable auf trunk aus  &#8211; die letzte veröffentlichte Version stammte vom September 2009. Zunächst wollte unser Django-Projekt nicht auf trunk laufen, Fehlermeldung:</p>
<blockquote><p>java.lang.NoSuchMethodError: org.python.core.Py.makeClass(Ljava/lang/String;[Lorg/python/core/PyObject;Lorg/python/core/PyCode;Lorg/python/core/PyObject;)Lorg/python/core/PyObject;</p></blockquote>
<p>Nach Identifikation des verursachenden Commits erwies sich der vermeintliche Bug als eine <a href="http://jython.svn.sourceforge.net/viewvc/jython?view=rev&amp;sortby=rev&amp;revision=6959" target="_blank">Änderung</a> im Jython-Compiler. Für die Neukompilierung des Quellcodes mussten alle vorhandenen .class-Dateien gelöscht werden. Leichte Übung.</p>
<p>Die Umstellung von Jython stable auf trunk reduzierte die Laufzeit von besagten 11 auf immerhin 6 Sekunden. Nun konnte es an die eigentliche Optimierung gehen. Mehr dazu im nächsten Blogeintrag.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tschitschereengreen.com/blog/index.php/2010/04/12/performance-optimierung-von-jython-und-django/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Code Esthetics Pt II &#8211; CamelCase &amp; Co.: Paradigmen für den perfekten Code</title>
		<link>http://www.tschitschereengreen.com/blog/index.php/2010/01/12/code-esthetics-pt-ii-camelcase-co-paradigmen-fur-den-perfekten-code/</link>
		<comments>http://www.tschitschereengreen.com/blog/index.php/2010/01/12/code-esthetics-pt-ii-camelcase-co-paradigmen-fur-den-perfekten-code/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 14:43:41 +0000</pubDate>
		<dc:creator>jerk</dc:creator>
				<category><![CDATA[Coders best practice]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Rapid Development Frameworks]]></category>
		<category><![CDATA[Code Esthetics]]></category>

		<guid isPermaLink="false">http://www.tschitschereengreen.com/blog/?p=438</guid>
		<description><![CDATA[Ich muss leider den nächsten Workshop absagen, da ich es zeitlich einfach nicht schaffe diesen adequat vorzubereiten. In Absprache mit Prof. Wiedemann, werden wir einen Ausweichtermin im April aussuchen und vorher entsprechend kommunizieren.]]></description>
			<content:encoded><![CDATA[<p>Ich muss leider den nächsten Workshop absagen, da ich es zeitlich einfach nicht schaffe diesen adequat vorzubereiten. In Absprache mit Prof. Wiedemann, werden wir einen Ausweichtermin im April aussuchen und vorher entsprechend kommunizieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tschitschereengreen.com/blog/index.php/2010/01/12/code-esthetics-pt-ii-camelcase-co-paradigmen-fur-den-perfekten-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fazit: neue Werkzeuge in der Softwareentwicklung</title>
		<link>http://www.tschitschereengreen.com/blog/index.php/2009/11/19/fazit-neue-werkzeuge-in-der-softwareentwicklung/</link>
		<comments>http://www.tschitschereengreen.com/blog/index.php/2009/11/19/fazit-neue-werkzeuge-in-der-softwareentwicklung/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 21:54:13 +0000</pubDate>
		<dc:creator>jerk</dc:creator>
				<category><![CDATA[Agile Software Development]]></category>
		<category><![CDATA[Coders best practice]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[From Inside]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Rapid Development Frameworks]]></category>
		<category><![CDATA[Agiles Projektmanagement]]></category>
		<category><![CDATA[Coder]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Developer]]></category>
		<category><![CDATA[Entwickler]]></category>
		<category><![CDATA[Intuition]]></category>
		<category><![CDATA[Optimierung IT Projekt]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Seminar]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.tschitschereengreen.com/blog/?p=331</guid>
		<description><![CDATA[Wie bereits angekündigt habe ich heute meinen Vortrag auf die Einladung von Herr Prof. Wiedemann an der HTW Dresden gehalten. Die Folien finden sich hier zum Download: 11-2009 Allgmeine Praesentation TTS HTW &#8211; Neue Werkzeuge.pdf Das Fazit: die Präsentation kam sehr gut an. Habe ein nettes Kompliment von einer anwesenden Professorin zum Vortrag erhalten . [...]]]></description>
			<content:encoded><![CDATA[<p>Wie bereits <a href="http://www.tschitschereengreen.com/blog/index.php/2009/11/06/seminar-neue-technologien-in-der-softwareentwicklung/">angekündigt </a>habe ich heute<a href="https://www.xing.com/events/werkzeuge-softwareentwicklung-halbe-entwicklungsdauer-spass-erfolgreich-424001/guestlist?participation[yes]=true"> meinen Vortra</a>g auf die Einladung von <a href="https://www.xing.com/profile/Thomas_Wiedemann2">Herr Prof. Wiedemann</a> an der HTW Dresden gehalten.</p>
<p>Die Folien finden sich hier zum Download: <a href='http://www.tschitschereengreen.com/blog/wp-content/uploads/2009/11/11-2009-Allgmeine-Praesentation-TTS-HTW-Neue-Werkzeuge.pdf'>11-2009 Allgmeine Praesentation TTS HTW &#8211; Neue Werkzeuge.pdf</a></p>
<p>Das Fazit: die Präsentation kam sehr gut an. Habe ein nettes Kompliment von einer anwesenden Professorin zum Vortrag erhalten <img src='http://www.tschitschereengreen.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  . Darüber hinaus geb es ne Menge Fragen und ich musste nach 50% Inhalten und 75% Zeit den Turbo einschalten. <span id="more-331"></span>Alles in allem hoffe ich, dass es die Erwartungen erfüllt hat und einen Einblick in aktuelle Trends und die Arbeitsweise von Tschitschereengreen vermittelt hat.</p>
<p>Die vielfältigen Fragen waren sehr spannend und wären es sicher wert tiefere Diskussionen hierzu zu führen. Hier ein paar Beispiele:<br />
* In der sich so schnell verändernden Welt der Webtechnologien: welche Rolle wird Java hier zukünftig spielen? Vor allem jetzt wo Google, das im den <a href="http://code.google.com/webtoolkit/">Web Toolkits</a> verwendet, wird es da einen neuen Aufschwung geben?<br />
* Was bedeutet diese schnelle Veränderung für die Lehre? Was ist wenn, die heute vermittelte Inhalte in 3-4 Jahren, wenn die Studenten fertig sind, nicht mehr relevant sind? (Grossartige Frage eines Professors/Professorin)<br />
* Wie passen die aktuellen Web-Sprachen mit Java-Enterprise-Applikationen zusammen?<br />
* Was passiert, wenn in Ihrem Unternehmen ein Entwickler ausfällt?<br />
* etc&#8230; spannend, spannend die Themen</p>
<p>Zum Abschluss habe ich noch wie versprochen, zwei Veranstaltungen vorgestellt, welche wir weiterführend umsetzen könnten. Das Interesse war vor allem für das Seminar: <strong>Code Esthetics</strong> am grössten. Die erste Veranstaltung wird daher am 3.12.2009 um 17.00 stattfinden und je nach Bedarf aller 2 Wochen wiederholt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tschitschereengreen.com/blog/index.php/2009/11/19/fazit-neue-werkzeuge-in-der-softwareentwicklung/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Intuition &amp; Debugging</title>
		<link>http://www.tschitschereengreen.com/blog/index.php/2009/11/16/intuition-debugging/</link>
		<comments>http://www.tschitschereengreen.com/blog/index.php/2009/11/16/intuition-debugging/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 19:10:40 +0000</pubDate>
		<dc:creator>jerk</dc:creator>
				<category><![CDATA[Agile Software Development]]></category>
		<category><![CDATA[Coders best practice]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Rapid Development Frameworks]]></category>
		<category><![CDATA[Agiles Projektmanagement]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Intuition]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Rationalität]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.tschitschereengreen.com/blog/?p=326</guid>
		<description><![CDATA[Bei der Zusammenarbeit mit einem Kollegen hat sich in diesem konkreten Fall gezeigt, dass ein nüchternes nur auf Rationalität und Logik basierendes Debugging sehr effizient sein kann. Allerdings dürfte es einem einzelnen Entwickler sehr schwer fallen, jeden Aspekt einer selbst geschriebenen Software ausschliesslich rational zu betrachten und gemäss den Grundsätzen der Logik zu analysieren. Ich [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.tschitschereengreen.com/blog/index.php/2009/11/15/rationalitat-vs-intuition/">Bei der Zusammenarbeit mit einem Kollegen</a> hat sich in diesem konkreten Fall gezeigt, dass ein nüchternes nur auf Rationalität und Logik basierendes Debugging sehr effizient sein kann. Allerdings dürfte es einem einzelnen Entwickler sehr schwer fallen, jeden Aspekt einer selbst geschriebenen Software ausschliesslich rational zu betrachten und gemäss den Grundsätzen der Logik zu analysieren. </p>
<p>Ich kenne das aus der eigenen Erfahrung. Vor allem, wenn man an sein Ziel kommen will, der Bug eigentlich nur nervt, dann ist man sehr oft dabei <em>&#8220;intuitive Abkürzungen&#8221;</em> zu nehmen. <span id="more-326"></span>Das das sehr gefährlich ist und nur teilweise zum Erfolg führt, hat mich die eigene Coding-Praxis gelehrt. Denn so gut wie meine Fehleranalyse, war dann auch mein Code. Sprich, wenn die Probleme nur intuitiv bekannt sind, dann kann der erarbeitete Bugfix ebenfalls nur intuitiv richtig sein. Dass damit bereits die Grundlage für den nächsten Bug/-fix gelegt ist, erschliesst sich sicherlich jeden.</p>
<p>Bei der Arbeit als Projektmanager habe ich dabei zwei Szenarien erlebt: a) den Entwickler, der mit einer Software arbeitet (Open Source, Closed Source) welche Ihm nur zu einem bestimmten Prozentsatz bekannt ist. Zusätzlich erschwert wird das Thema, wenn die Sprache/Entwicklungsumgebung nicht 100%ige Nachvollziehbarkeit aller vom Code ausgeführten Aktionen sicherstellt. Hier habe ich Intuition von Entwicklern sehr zu schätzen gelernt. Wo bei es hier gigantische Unterschiede gibt, grundsätzlich gilt, wie im <a href="http://de.wikipedia.org/wiki/Intuition">Wikipedia-Artikel</a> nachlesbar: je mehr Arbeitserfahrung , desto besser die auf Intuition basierenden Ergebnisse.</p>
<p>b) Das zweite Szenario, ist z.B. die Arbeit mit Werkzeugen wie <a href="http://www.python.org">Python </a>o.ä. Hier ist gewährleistet, dass jeder einzelne Schritt des Codes nachvollzogen und geprüft werden kann. Hier ist es immer besser, sich ausschliesslich rational dem Problem zu nähern und dieses Schritt für Schritt einzugrenzen. In der Regel ist man schneller, als mit Anzahl x intuitiven Versuchen den Fehler zu identifizieren.</p>
<p>Ein weiteres Problem ist mir vor allem bei der Arbeit mit Scriptsprachen aufgefallen. Die vermeintliche unmittelbare Überprüfbarkeit des Ergebnisses verleitet (bin of genug selbst Opfer gewurden) sich auf ein Try-and-Error-Coding zu verlassen. Wenn diese zusätzlich auf durch Intuition basierden Bugfixes verlässt, ist die Gefahr gross, das der Fehler nur oberflächlich behoben, aber nicht entgültig entfernt wird.</p>
<p>Grundsätzlich bin ich daher ein grosser Freund von Entwicklungssystemen (Sprache, IDE, Tools) welche grosse Transparenz bei der Softwareentwicklung sicherstellen. <a href="http://www.php.net">PHP </a>(hier vor allem das Zend Studio) liefert hier eine recht gute Grundlage. Python ist allerdings hier deutlich besser, da die Sprache an sich besser lesbar und inhaltlich stringenter aufgebaut ist.</p>
<p>Python bietet darüber hinaus deutlich mehr Tools zur Nachvollziehbarkeit des Codes, als PHP. Das kann aber aus meiner Sicht auch ein Nachteil sein. Denn die Arbeitsweise des Softwareentwicklers (v.a. das rationale Analysieren vs. der bewusste Einsatz intuitiver Fähigkeiten) sind sicherlich deutlich entscheidender für das schnelle Finden der korrekten Fehlerursache. Die Tools können das nur unterstützen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tschitschereengreen.com/blog/index.php/2009/11/16/intuition-debugging/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>What does TTS right now?</title>
		<link>http://www.tschitschereengreen.com/blog/index.php/2008/07/17/what-does-tts-right-now/</link>
		<comments>http://www.tschitschereengreen.com/blog/index.php/2008/07/17/what-does-tts-right-now/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 08:50:08 +0000</pubDate>
		<dc:creator>jerk</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.tschitschereengreen.com/blog/2008/07/17/what-does-tts-right-now/</guid>
		<description><![CDATA[Building web apps for a large publisher, a CRM system for the worlds largest car manufacturer, working on projects for Germanys Top Business Angels, improving internal workflows and infrastructure, thinking about better deployment processes, reworking the General Terms and Conditions, thinking about: testing, especially near-time testing, future growth, general strategy, a new office kitchen]]></description>
			<content:encoded><![CDATA[<p>Building web apps for a large publisher, a CRM system for the worlds largest car manufacturer, working on projects for Germanys Top Business Angels, improving internal workflows and infrastructure, thinking about better deployment processes, reworking the General Terms and Conditions, thinking about: testing, especially near-time testing, future growth, general strategy, a new office kitchen</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tschitschereengreen.com/blog/index.php/2008/07/17/what-does-tts-right-now/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tschitschereengreen CRM Update</title>
		<link>http://www.tschitschereengreen.com/blog/index.php/2007/10/18/tschitschereengreen-crm-update/</link>
		<comments>http://www.tschitschereengreen.com/blog/index.php/2007/10/18/tschitschereengreen-crm-update/#comments</comments>
		<pubDate>Thu, 18 Oct 2007 16:06:40 +0000</pubDate>
		<dc:creator>jerk</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.tschitschereengreen.com/blog/2007/10/18/tschitschereengreen-crm-update/</guid>
		<description><![CDATA[Tina and Corinna requested the following changes: &#187; Assign Categories and a Category-Filter to persons &#187; Add a comment field to each person &#187; Sort companies alphabetically &#187; Assign Priority to a person Download Tschitschereengreen CRM v0.2 For an update: &#187; Backup your person_person table with -c -t parameters /w mysqldump &#187; Remove person_person table [...]]]></description>
			<content:encoded><![CDATA[<p>Tina and Corinna requested the following changes:</p>
<ul>
<li><span class="green">&raquo; </span> Assign Categories and a Category-Filter to persons</li>
<li><span class="green">&raquo; </span>Add a comment field to each person</li>
<li><span class="green">&raquo; </span>Sort companies alphabetically</li>
<li><span class="green">&raquo; </span>Assign Priority to a person</li>
</ul>
<p><a href="http://www.tschitschereengreen.com/blog/wp-content/uploads/2007/10/ttscrm.0.2.tgz">Download Tschitschereengreen CRM v0.2</a></p>
<p>For an update:</p>
<ul>
<li><span class="green">&raquo; </span>Backup your person_person table with -c -t parameters /w mysqldump</li>
<li><span class="green">&raquo; </span>Remove person_person table</li>
<li><span class="green">&raquo; </span>Execute a &#8220;dbsync&#8221;</li>
<li><span class="green">&raquo; </span>Insert data back into person_person table</li>
<li><span class="green">&raquo; </span>Enable user access to the modules Category and Priority and add some of them</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tschitschereengreen.com/blog/index.php/2007/10/18/tschitschereengreen-crm-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django based CRM</title>
		<link>http://www.tschitschereengreen.com/blog/index.php/2007/10/15/django-based-crm/</link>
		<comments>http://www.tschitschereengreen.com/blog/index.php/2007/10/15/django-based-crm/#comments</comments>
		<pubDate>Mon, 15 Oct 2007 13:16:10 +0000</pubDate>
		<dc:creator>jerk</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.tschitschereengreen.com/blog/2007/10/15/django-based-crm/</guid>
		<description><![CDATA[For internal purposes we decided to build a small CRM for Tina and Corinna to track their communication. I simply used the Django-Admin interface, created a nice model and adjusted the Interface. The CRM is capable of managing Company and Person Objects as well as tracking passed communication and the integration of a followup-flag which [...]]]></description>
			<content:encoded><![CDATA[<p>For internal purposes we decided to build a small CRM for Tina and Corinna to track their communication.</p>
<p>I simply used the Django-Admin interface, created a nice model and adjusted the Interface.</p>
<p>The CRM is capable of managing Company and Person Objects as well as tracking passed communication and the integration of a followup-flag which indicates what kind of action should follow at which date.</p>
<p>I attached this to this blog post. Feel free to use it: <a href="http://www.tschitschereengreen.com/blog/wp-content/uploads/2007/10/ttscrm.zip">Download</a></p>
<p>The duration of development was 4h.</p>
<p><a href='http://www.tschitschereengreen.com/blog/wp-content/uploads/2007/10/screenshot_tts_crm.jpg' title='Tschitschereengreen Customer Relationship Management'><img src='http://www.tschitschereengreen.com/blog/wp-content/uploads/2007/10/screenshot_tts_crm.jpg' alt='Tschitschereengreen Customer Relationship Management' width="400"/></a></p>
<p><a href='http://www.tschitschereengreen.com/blog/wp-content/uploads/2007/10/screenshot_tts_crm_ii.jpg' title='Tschitschereengreen Customer Relationship Management II'><img src='http://www.tschitschereengreen.com/blog/wp-content/uploads/2007/10/screenshot_tts_crm_ii.jpg' alt='Tschitschereengreen Customer Relationship Management II' width="400"/></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tschitschereengreen.com/blog/index.php/2007/10/15/django-based-crm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Structured Code Review &#8211; improving your code quality</title>
		<link>http://www.tschitschereengreen.com/blog/index.php/2007/09/14/structured-code-review-improving-your-code-quality/</link>
		<comments>http://www.tschitschereengreen.com/blog/index.php/2007/09/14/structured-code-review-improving-your-code-quality/#comments</comments>
		<pubDate>Fri, 14 Sep 2007 13:10:55 +0000</pubDate>
		<dc:creator>jerk</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.tschitschereengreen.com/blog/2007/09/14/structured-code-review-improving-your-code-quality/</guid>
		<description><![CDATA[We decided to implement Review Board (by VMWare) to use for our code reviews because code review inside trac was like a pain in the &#8230; The installation took some time, because we were using Trac on the same machine and had to convert our existing SQLite Trac DBs. Furthermore we were setting up Apache [...]]]></description>
			<content:encoded><![CDATA[<p>We decided to implement <a href="http://reviewboard.chipx86.com/">Review Board (by VMWare)</a> to use for our code reviews because code review inside trac was like a pain in the &#8230;</p>
<p>The installation took some time, because we were using Trac on the same machine and had to <a href="http://trac.edgewall.org/wiki/TracUpgrade#From0.8.xto0.9">convert our existing SQLite Trac DBs</a>. Furthermore we were setting up Apache with the conf files included with reviewboard. And after some permission adjustments and log-based debugging the whole system was up and running.</p>
<p>Reviewboard allows your developers to upload all changes as diff files according with ticket information and a comment. The reviewer then can check the change and approve it &#8211; the changes are commited by the system upon approval. Very nice are the in place comments, where you can discuss the code just aside the code you&#8217;re talking about.</p>
<p>Especially the pre-commit-review is very nice and avoids lots of overhead for merging and checking already commited code.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tschitschereengreen.com/blog/index.php/2007/09/14/structured-code-review-improving-your-code-quality/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
