<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">

<channel>
	<title>Psi Team Blog</title>
	<link>http://planet.psi-im.org/</link>
	<language>en</language>
	<description>Psi Team Blog - http://planet.psi-im.org/</description>

<item>
	<title>Remko Tron&#231;on: Migrating from Openfire to Prosody</title>
	<guid>http://el-tramo.be/?p=426</guid>
	<link>http://el-tramo.be/blog/openfire-to-prosody-migration</link>
	<description>&lt;p&gt;Because &lt;a href=&quot;http://www.igniterealtime.org/projects/openfire/index.jsp&quot;&gt;Openfire&lt;/a&gt; has been hogging too much of my limited &lt;a href=&quot;http://el-tramo.be&quot;&gt;el-tramo.be&lt;/a&gt; server resources lately, and because I don&#8217;t need a beast of an XMPP server for only 2 users, I decided to replace it by the lightweight &lt;a href=&quot;http://prosody.im/&quot;&gt;Prosody&lt;/a&gt;. The migration went flawless, with the help of two tools: &lt;a href=&quot;http://www.kismith.co.uk/wordpress/index.php/2008/11/30/sleek-migrate/&quot;&gt;Sleek Migrate&lt;/a&gt;, and a &lt;a href=&quot;http://git.el-tramo.be/browse/xep227-to-prosody.git/&quot;&gt;Prosody XEP-0227 Importer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-426&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;First of all, I used Sleek Migrate to retrieve the roster (and other) data from the server, and store it in the standard &lt;a href=&quot;http://xmpp.org/extensions/xep-0227.html&quot;&gt;XEP-0227&lt;/a&gt; format. I extended the tool a bit such that it supports Openfire&#8217;s User Import/Export format, a format generated by an &lt;a href=&quot;http://www.igniterealtime.org/projects/openfire/plugins/userimportexport/readme.html&quot;&gt;Openfire plugin&lt;/a&gt; that is distributed with the server software by default. Using this format as input for Sleek Migrate avoids the need to create a user file manually. The changes I made to Sleek Migrate are currently available from &lt;a href=&quot;http://git.el-tramo.be/browse/sleekmigrate.git/&quot;&gt;my Git repository&lt;/a&gt;, awaiting to be pushed to the main repository.&lt;/p&gt;
&lt;p&gt;I then wrote a short script that populates the Prosody data dir with the server data from the XEP-0227 XML file. Currently, the script only generates roster and account data, but adding &lt;a href=&quot;http://xmpp.org/extensions/xep-0054.html&quot;&gt;vCard&lt;/a&gt; and &lt;a href=&quot;http://xmpp.org/extensions/xep-0049.html&quot;&gt;Private XML Storage&lt;/a&gt; (used amongst others to store &lt;a href=&quot;http://xmpp.org/extensions/attic/xep-0048-1.0.html&quot;&gt;MUC bookmarks&lt;/a&gt;) should not be very hard. Until Prosody creates a native XEP-0227 importer, you can get the script from &lt;a href=&quot;http://git.el-tramo.be/browse/xep227-to-prosody.git/&quot;&gt;my Git repository&lt;/a&gt;.&lt;/p&gt;</description>
	<pubDate>Fri, 03 Jul 2009 07:07:19 +0000</pubDate>
	<dc:creator>Remko Tron&#231;on</dc:creator>
</item>
<item>
	<title>Justin Karneges: Psi 0.13-rc2 released</title>
	<guid>http://delta.affinix.com/2009/06/30/psi-013-rc2-released/</guid>
	<link>http://delta.affinix.com/2009/06/30/psi-013-rc2-released/</link>
	<description>&lt;p&gt;Psi 0.13-rc2 is here!&#160; Notably, voice calling is now a standard feature of the Windows version.&#160; Please &lt;a href=&quot;https://sourceforge.net/project/showfiles.php?group_id=14635&amp;amp;package_id=143053&amp;amp;release_id=693421&quot;&gt;download and test&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Final on July 13th if no showstoppers are found.&lt;/p&gt;
&lt;p&gt;New in 0.13&lt;br /&gt;
- Voice calls (Jingle RTP).&lt;br /&gt;
- Basic XMPP URI handler.&lt;br /&gt;
- Ability to permanantly trust certificates at connect time.&lt;br /&gt;
- Mini command system (Ctrl+7 in chat window).&lt;br /&gt;
- Various bugfixes.&lt;/p&gt;
&lt;p&gt;If you are building from source (e.g. on Linux) and want voice calls, you will need to obtain the &lt;a href=&quot;http://delta.affinix.com/psimedia/&quot;&gt;PsiMedia plugin separately&lt;/a&gt;.&#160; On Linux, the plugin file is called libgstprovider.so, and must be put in Psi&amp;#8217;s $LIBDIR/psi/plugins directory.&#160; You&amp;#8217;ll know it worked if &amp;#8220;About GStreamer&amp;#8221; appears in the Help menu.&lt;/p&gt;</description>
	<pubDate>Tue, 30 Jun 2009 07:12:34 +0000</pubDate>
	<dc:creator>justin</dc:creator>
</item>
<item>
	<title>Justin Karneges: Psi 0.13-rc1 released</title>
	<guid>http://delta.affinix.com/2009/05/23/psi-013-rc1-released/</guid>
	<link>http://delta.affinix.com/2009/05/23/psi-013-rc1-released/</link>
	<description>&lt;p&gt;Psi 0.13-rc1 is here!&#160; Please &lt;a href=&quot;https://sourceforge.net/project/showfiles.php?group_id=14635&amp;amp;package_id=143053&amp;amp;release_id=684643&quot;&gt;download and test&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Final on June 6th if no showstoppers are found.&lt;/p&gt;
&lt;p&gt;New in 0.13&lt;br /&gt;
- Voice calls for Mac OS X and Linux (Jingle RTP).&lt;br /&gt;
- Basic XMPP URI handler.&lt;br /&gt;
- Ability to permanantly trust certificates at connect time.&lt;br /&gt;
- Mini command system (Ctrl+7 in chat window).&lt;br /&gt;
- Various bugfixes.&lt;/p&gt;
&lt;p&gt;If you are building from source (e.g. on Linux) and want voice calls, you will need to obtain the &lt;a href=&quot;http://delta.affinix.com/psimedia/&quot;&gt;PsiMedia plugin separately&lt;/a&gt;.&#160; On Linux, the plugin file is called libgstprovider.so, and must be put in Psi&amp;#8217;s $LIBDIR/psi/plugins directory.&#160; You&amp;#8217;ll know it worked if &amp;#8220;About GStreamer&amp;#8221; appears in the Help menu.&lt;/p&gt;</description>
	<pubDate>Sat, 23 May 2009 20:19:48 +0000</pubDate>
	<dc:creator>justin</dc:creator>
</item>
<item>
	<title>Remko Tron&#231;on: &#8220;Beautiful Testing&#8221; XMPP Chapter</title>
	<guid>http://el-tramo.be/?p=367</guid>
	<link>http://el-tramo.be/blog/beautiful-xmpp-testing-intro</link>
	<description>&lt;p&gt;&lt;a href=&quot;http://adam.goucher.ca/&quot;&gt;Adam Goucher&lt;/a&gt; and Tim Riley (Director of QA at Mozilla) &lt;a href=&quot;http://adam.goucher.ca/?p=684&quot;&gt;announced&lt;/a&gt; a few months ago that they are putting together a &lt;a href=&quot;http://oreilly.com/catalog/9780596159818&quot;&gt;&lt;em&gt;Beautiful Testing&lt;/em&gt;&lt;/a&gt; book for O&#8217;Reilly. I took the opportunity to write a chapter about testing in the context of XMPP (more specifically, about testing protocol implementations in &lt;a href=&quot;http://swift.im&quot;&gt;Swift&lt;/a&gt;),  and just submitted the final draft for technical review. The book is expected to be released this August.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-367&quot;&gt;&lt;/span&gt;Although there are many types of testing being done in the XMPP world, the chapter focuses on the beauty of testing the functionality of XMPP protocol implementations. After a brief introduction on XMPP, it starts out with a description of unit testing simple IQ request/response protocols, and  then gradually moves on to higher-level testing of more complex, multi-stage protocols such as session initialization. As you might expect from a developer like me, the chapter is quite heavy on the (C++) code, but I&#8217;m told it compensates for the rest of the book &lt;img src=&quot;http://el-tramo.be/wordpress/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;As with all other books in the O&#8217;Reilly &#8220;Beautiful&#8221; series (which started with &lt;em&gt;&lt;a href=&quot;http://oreilly.com/catalog/9780596510046/&quot;&gt;Beautiful Code&lt;/a&gt;&lt;/em&gt;, but has since been followed up by &lt;em&gt;&lt;a href=&quot;http://oreilly.com/catalog/9780596517984/&quot;&gt;Beautiful Architecture&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a href=&quot;http://oreilly.com/catalog/9780596518028/&quot;&gt;Beautiful Teams&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a href=&quot;http://oreilly.com/catalog/9780596527488/&quot;&gt;Beautiful Security&lt;/a&gt;&lt;/em&gt;, and &lt;em&gt;&lt;a href=&quot;http://oreilly.com/catalog/9780596157111/&quot;&gt;Beautiful Data&lt;/a&gt;&lt;/em&gt;), all proceeds of the book go to charity, in this case &lt;a href=&quot;http://www.nothingbutnets.net/&quot;&gt;&#8220;Nothing But Nets&#8221;&lt;/a&gt; (which provides mosquito netting to malaria infested areas of Africa). This means that I can plug this book as much as I want, and still have the feeling I&#8217;m actually doing a noble, unselfish thing. (contrary to when I casually mention that you can buy our book &lt;em&gt;&lt;a href=&quot;http://oreilly.com/catalog/9780596521264/&quot;&gt;XMPP: The Definitive Guide&lt;/a&gt;&lt;/em&gt; at very sharp prices these days). Some time after the book&#8217;s release this summer, I will even make a free version of the chapter available here, so check back soon!&lt;/p&gt;</description>
	<pubDate>Sun, 03 May 2009 11:57:21 +0000</pubDate>
	<dc:creator>Remko Tron&#231;on</dc:creator>
</item>
<item>
	<title>Kevin Smith: Psi under new^h^h^h^h old management</title>
	<guid>http://www.kismith.co.uk/wordpress/?p=112</guid>
	<link>http://www.kismith.co.uk/wordpress/index.php/2009/03/05/psi-under-old-management/</link>
	<description>&lt;p&gt;A copy of an email I just sent to the Psi development list:&lt;/p&gt;
&lt;p&gt;Hi all,&lt;br /&gt;
 After a few days, I&amp;#8217;ve given up doing a long and explanatory post.&lt;br /&gt;
After four and a half great years of Psi, I know that I don&amp;#8217;t have the&lt;br /&gt;
energy for running the project that I had back in 2004 when Justin&lt;br /&gt;
handed over to me. Fortunately, Justin is recharged, active again, and&lt;br /&gt;
available to continue his calling as project leader, so I&amp;#8217;m handing&lt;br /&gt;
project leadership back to him. I won&amp;#8217;t be going anywhere, so please&lt;br /&gt;
feel free to contact me about Psi things, and maybe I&amp;#8217;ll even have a&lt;br /&gt;
chance to write some code again, I&amp;#8217;ll certainly still be around the&lt;br /&gt;
XMPP world doing some new and interesting things &lt;img src=&quot;http://www.kismith.co.uk/wordpress/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Thanks to everyone for their support over the last 4 1/2 years in&lt;br /&gt;
allowing me such a rewarding role.&lt;/p&gt;
&lt;p&gt;I hand you now to the new project leader of Psi &amp;#8230; Justin Karneges.&lt;br /&gt;
Good luck to Justin &lt;img src=&quot;http://www.kismith.co.uk/wordpress/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</description>
	<pubDate>Thu, 05 Mar 2009 22:16:54 +0000</pubDate>
	<dc:creator>Kev</dc:creator>
</item>
<item>
	<title>Remko Tron&#231;on: XMPP 101 @ FOSDEM</title>
	<guid>http://el-tramo.be/?p=303</guid>
	<link>http://el-tramo.be/blog/xmpp-101-fosdem</link>
	<description>&lt;p&gt;The slides of the &lt;em&gt;&#8220;XMPP 101&#8221;&lt;/em&gt; talk that &lt;a href=&quot;http://stpeter.im&quot;&gt;Peter&lt;/a&gt; and I gave at &lt;a href=&quot;http://fosdem.org&quot;&gt;FOSDEM&lt;/a&gt; are available below. This presentation gives a fast-paced introduction to XMPP, and is mostly based on &lt;a href=&quot;http://oreilly.com/catalog/9780596157197/&quot;&gt;&#8220;XMPP: The Definitive Guide&#8221;&lt;/a&gt;. If all goes well, we will be giving a more extended version of this talk as a tutorial at &lt;a href=&quot;http://en.oreilly.com/oscon2009&quot;&gt;OSCON&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-303&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;__ss_1097174&quot;&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://el-tramo.be/files/blog/xmpp-101-fosdem.pdf&quot;&gt;PDF&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Wed, 04 Mar 2009 19:00:45 +0000</pubDate>
	<dc:creator>Remko Tron&#231;on</dc:creator>
</item>
<item>
	<title>Remko Tron&#231;on: Swift Messaging</title>
	<guid>http://el-tramo.be/?p=291</guid>
	<link>http://el-tramo.be/blog/swift-announce</link>
	<description>&lt;p&gt;I&#8217;m excited to announce a new player in the Jabber/XMPP game: &lt;a href=&quot;http://swift.im&quot;&gt;Swift&lt;/a&gt;. Shortly after finishing the &lt;a href=&quot;http://oreilly.com/catalog/9780596157197/&quot;&gt;XMPP book&lt;/a&gt;, I started working on Swift, a pragmatic, cross-platform, user-friendly IM client. Together with &lt;a href=&quot;http://kismith.co.uk&quot;&gt;Kevin Smith&lt;/a&gt;, we are building this project from the ground up, driving its development using agile methodologies. Underneath the IM client, we are working on an extensible and robust XMPP library, written in C++.&lt;/p&gt;
&lt;p&gt;Until we launch the project and its &lt;a href=&quot;http://swift.im&quot;&gt;website&lt;/a&gt;, you can subscribe to the Swift &lt;a href=&quot;http://blog.swift.im&quot;&gt;blog&lt;/a&gt; and &lt;a href=&quot;http://identi.ca/group/swift&quot;&gt;identi.ca group&lt;/a&gt; to stay up to date with the latest news and developments around the project. Thanks to &lt;a href=&quot;http://dave.cridland.net&quot;&gt;Dave Cridland&lt;/a&gt; for lending us his graphical capabilities and drawing us a pretty logo.&lt;/p&gt;</description>
	<pubDate>Tue, 03 Mar 2009 18:31:25 +0000</pubDate>
	<dc:creator>Remko Tron&#231;on</dc:creator>
</item>
<item>
	<title>Remko Tron&#231;on: We have an animal</title>
	<guid>http://el-tramo.be/?p=274</guid>
	<link>http://el-tramo.be/blog/xmppbook-cover</link>
	<description>&lt;p&gt;O&#8217;Reilly just sent us the cover for our &lt;a href=&quot;http://oreilly.com/catalog/9780596157197/&quot;&gt;upcoming XMPP Book&lt;/a&gt;, and it seems we got the world&#8217;s smallest ungulate: the &lt;a href=&quot;http://en.wikipedia.org/wiki/Kanchil&quot;&gt;lesser mouse-deer&lt;/a&gt;. I haven&#8217;t seen one in real life before, am not sure I ever want to, but still: great! Have a look below to see what the cover of the book will look like when it hits the stores in 2 months.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-274&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;aligncenter&quot; title=&quot;Cover of &#8220;XMPP: The Definitive Guide&#8221;&quot; src=&quot;http://el-tramo.be/files/blog/xmppbook-cover.png&quot; alt=&quot;&quot; width=&quot;350&quot; height=&quot;460&quot; /&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 08 Feb 2009 12:25:02 +0000</pubDate>
	<dc:creator>Remko Tron&#231;on</dc:creator>
</item>
<item>
	<title>Remko Tron&#231;on: Final revision of the XMPP book submitted</title>
	<guid>http://el-tramo.be/?p=270</guid>
	<link>http://el-tramo.be/blog/xmppbook-final</link>
	<description>&lt;p&gt;After a few weeks of heavy labour and long nights, &lt;a href=&quot;http://stpeter.im&quot;&gt;Peter&lt;/a&gt;, &lt;a href=&quot;http://kismith.co.uk&quot;&gt;Kevin&lt;/a&gt;, and I just submitted the final revision of &lt;a href=&quot;http://oreilly.com/catalog/9780596157197/&quot;&gt;&#8220;XMPP: The Definitive Guide&#8221;&lt;/a&gt; to the folks at O&#8217;Reilly. All the feedback from our (thorough) reviewers has been processed, we added quite a few extra bits and clarifications (58 pages to be exact), polished the whole thing up, and went through the resulting manuscript with a fine toothed comb. We hope the people who will read this book will be as satisfied with the end result as we are. If all goes according to plan, the book should roll out of the presses in about 2 months. In the mean time, you can expect an update to the &lt;a href=&quot;http://oreilly.com/catalog/9780596157197/&quot;&gt;on-line rough cut version of the book&lt;/a&gt; in the next couple of days.&lt;/p&gt;</description>
	<pubDate>Mon, 02 Feb 2009 23:54:21 +0000</pubDate>
	<dc:creator>Remko Tron&#231;on</dc:creator>
</item>
<item>
	<title>Kevin Smith: Why I /do/ document and unit test</title>
	<guid>http://www.kismith.co.uk/wordpress/?p=103</guid>
	<link>http://www.kismith.co.uk/wordpress/index.php/2009/01/17/why-unit-test/</link>
	<description>&lt;p&gt;I&amp;#8217;ve just read Justin&amp;#8217;s &lt;a href=&quot;http://delta.affinix.com/2009/01/17/why-i-dont-document-or-unit-test/&quot;&gt;Why I don&amp;#8217;t document or unit test&lt;/a&gt; post that explains the way he works, so here&amp;#8217;s a counterpoint from the way I work. I&amp;#8217;ve inherited not documenting and not unit testing from Justin for the Psi project, where it&amp;#8217;s fairly hard to change, and at my day job I unit test and document quite a lot, so I&amp;#8217;ve worked with both approaches - this post mimicks Justin&amp;#8217;s, as I would have written it - it will only make sense immediately after reading his article.&lt;/p&gt;
&lt;h2&gt;Why I document and unit test&lt;/h2&gt;
&lt;p&gt;I write documentation and create unit tests, because they&amp;#8217;re great things. Software projects are, almost universally, written to address a perceived problem, and fail if they can&amp;#8217;t address this need, so they need to be tested. Similarly, very little software is write-only, and if someone needs to read it, it needs to be understandable; it needs documentation. Not all projects satisfy these criteria, but those that do are successful and fun to work with. Maybe that&amp;#8217;s because you have some degree of certainty that your code does what you want it to, maybe it&amp;#8217;s because you can stand straight and say &amp;#8220;I did what I thought was best&amp;#8221; and not feel guilty, maybe it&amp;#8217;s because you can show your code to people and not have to make excuses, or explain what your method &amp;#8216;doSomethingWithSideEffects()&amp;#8217; does, maybe it&amp;#8217;s because your unit tests caught a critical bug that you &lt;em&gt;just know&lt;/em&gt; would have taken you days to find in 6 months without them, maybe it&amp;#8217;s just a matter of pride in your craft as a developer. Tests are particularly gratifying - when they pass you can move on, and when they fail you save yourself a lot of heartache (and headache) in the future.&lt;/p&gt;
&lt;p&gt;Or maybe it&#8217;s because documentation and tests add such huge value to everything else that you&amp;#8217;re doing. I&amp;#8217;ve worked (and continue to) in both professional and open-source environments where code is unit tested and sufficiently documented - I suspect that it takes a brave person to notice that an undertested, underdocumented project is a well of unproductivity and to invest the manpower to turn it around, usually in the face of considerable pressure for more, more, more, now, now, now. On the other hand, I can&amp;#8217;t imagine any type of person who&amp;#8217;d deliberately go the other way. I think the biggest problem for a lot of people is legacy - it&amp;#8217;s hard to update your practices when you&amp;#8217;re knee deep in code that&amp;#8217;s certifiably untestable, but I never hear those that do as much as they are able to do complaining about the results.&lt;/p&gt;
&lt;p&gt;Deferring documentation and testing is a misguided attempt to get the most bang for your development buck this morning by sacrificing your productivity this afternoon. By the time this afternoon comes, you find yourself wondering why you don&amp;#8217;t have the time anymore to be productive. It&#8217;s easy to be lazy about these things if you don&amp;#8217;t believe in them, but if you don&amp;#8217;t believe your code is worth testing are you saying that you don&amp;#8217;t believe the code is worth writing? If it&amp;#8217;s worth writing &lt;em&gt;something&lt;/em&gt;, surely it&amp;#8217;s worth writing the &lt;em&gt;right thing&lt;/em&gt;. Do you find yourself saying that you don&amp;#8217;t want to add features now because you&amp;#8217;re going to rewrite it later? How bad must the code quality have been for you not to trust yourself to add a new feature without breaking something? Yes, there is an overhead writing code that can be unit tested - that overhead is the overhead of writing code that works. If you find yourself resisting testing, is it because you know that your code is broken, but you can&amp;#8217;t bear to find out how badly? Would unit testing your code show that you wasted a lot of time that could have been saved if you&amp;#8217;d written the tests before? If you do fall into this trap, then you&amp;#8217;re going to have a hard time getting out of it, because you&amp;#8217;ll be wondering how much time you&amp;#8217;ve wasted. Ostrichs aren&amp;#8217;t the only creature that (mythically) can bury its head in the sand. &lt;/p&gt;
&lt;h2&gt;I document my code, because I like my design&lt;/h2&gt;
&lt;p&gt;Do you find yourself writing a big paragraph of Doxygen, or Javadoc comment for your method? Why? Shouldn&amp;#8217;t your method name tell you what it does? Shouldn&amp;#8217;t your method parameters&amp;#8217; names, plus their type (if such is your language) tell you how to call it? If not, why not? If your method is called &amp;#8220;addTwoNumbers(int num1, int num2)&amp;#8221;, you shouldn&amp;#8217;t be documenting to say that, by the way, it also resets some internal mutable state; if you need to put that comment in, the smart money says that your code&amp;#8217;s broken. Why bother spending the time with sensible naming and self-documenting code when you don&amp;#8217;t even know that you need this method? Back up a minute - why are you writing this method if you don&amp;#8217;t know that you need it yet? Yes, requirements for a project change (and we embrace those changes, as Agile developers), and if code goes out of (project) scope, we&amp;#8217;re glad that our methods were small, single-responsibility methods so we don&amp;#8217;t spend time splitting out the functionality we don&amp;#8217;t need from that we do. We&amp;#8217;re also glad that we wrote no more code for that requirement than we were sure that we needed. &lt;/p&gt;
&lt;p&gt;It happens in software that you have to refactor stuff.  That&#8217;s just the way it goes.  Requirements are never right first time, but at least we know that, and we keep checking them with the users of the system, and the users of our methods, as appropriate. When you know that your requirements are going to change, you have no business writing code that&amp;#8217;s going to be hard to refactor, or code that doesn&amp;#8217;t need to be there. You had your requirements from your user, and turned those into the minimal API requirements for your code, wrote your unit tests to assert that the minimal requirements are met, and wrote the minimal code to satisfy the tests, and therefore the requirements. You really don&amp;#8217;t want to be committing to such a heavy design up front that it&amp;#8217;s going to be a hassle to update it.&lt;br /&gt;
As the saying could go: code that needs documentation is worse than wrong documentation, is worse than no documentation.&lt;/p&gt;
&lt;p&gt;In general, if the code is such that other developers are able to tell you what your code does from the class, method and variable names, your energies are being well spent.&lt;/p&gt;
&lt;h2&gt;I test, because I care about my implementation&lt;/h2&gt;
&lt;p&gt;And I always care about my implementation - you do too, or you wouldn&amp;#8217;t be so far down this gargantuan post. There&amp;#8217;re only three reasons that immediately come to my mind why you might not care about your implementation:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You hate the task that your code is written for. This is going to be a problem if you&amp;#8217;re captured by an evil genius, ideally with a cat, and are working on an advanced intelligence, or orbital laser platform, to be used to enslave all mankind, but for most of us this doesn&amp;#8217;t apply.&lt;/li&gt;
&lt;li&gt;You simply don&amp;#8217;t care about the result. You&amp;#8217;re demotivated, and if it doesn&amp;#8217;t work then it&amp;#8217;s someone else&amp;#8217;s problem to solve, the testers will pick up the problems and you&amp;#8217;ll be on holiday when the bug reports come in. This isn&amp;#8217;t you.&lt;/li&gt;
&lt;li&gt;You &lt;em&gt;do&lt;/em&gt; care about your implementations, but you don&amp;#8217;t know how to do a job your proud of, so you tell yourself that you don&amp;#8217;t care about them as a self-preservation mechanism. This may be you, it&amp;#8217;s been most of us. Thankfully there are smart people who&amp;#8217;ve written books giving advice on how to be a better developer. In fact, titles like Agile Software Development, Clean Code, Extreme Programming Explained, and The Pragmatic Programmer make this post redundant - read them and save yourself reading the rest of my post. Books may not make you smarter, but they&amp;#8217;re not going to make you a worse developer.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&amp;#8217;s possible to get tied up with design, and delegate implementation to being a second class entity. Think about this for a moment. What&amp;#8217;s design, and what&amp;#8217;s implementation? When class A calls a few methods on class B, what is that code - design or implementation? It may be a design for class B, but it&amp;#8217;s the implementation of class A. Don&amp;#8217;t get too hung up on which is which - generally the design is driven by the needs of the implementation. You know what methods class B needs once you&amp;#8217;ve written class A&amp;#8217;s method that makes the calls. Divorcing design and implementation is a great way to make sure your code isn&amp;#8217;t going to do quite what it was meant to. I&amp;#8217;ve done this, you may have done this. Live and learn. This is just another case of &amp;#8216;code what you need&amp;#8217;. If you only code what you need, you only test what you need (equally: if you only test what you need then you only code what you need).&lt;/p&gt;
&lt;p&gt;Some people will start testing and find that they can&amp;#8217;t test it all. If this is you, and you&amp;#8217;re finding that your methods have side-effects that you can&amp;#8217;t test, then you&amp;#8217;re one of the lucky ones: congratulations! Your unit testing has found problems with your code even before you&amp;#8217;ve written your first line of a test. There is a definite desire for mutable objects (objects whose state can be changed through method calls) - certainly, Java code would look very different if ArrayLists were immutable, but this doesn&amp;#8217;t mean that your objects should be mutable. In the rare cases where your object /does/ need to be mutable, make it explicit: don&amp;#8217;t have a method that does one thing superficially, but also changes state. Oh, and don&amp;#8217;t make classes such that your objects can get into an inconsistent state, either - a common example of this from my past is constructing an object, but requiring another &amp;#8217;set&amp;#8217; method call before the object is usable. I kick myself when I wonder why I didn&amp;#8217;t pass the value in the constructor. If you can&amp;#8217;t unit test your code, you probably need to reconsider your approach. The obvious counter to this is a dependency on external state (particularly databases, or networks) - unit testers get around this with mock objects that look like the external state object, but are deterministically controllable from the tests, and you can easily fall in love with them very quickly.&lt;/p&gt;
&lt;p&gt;In general, code that works will continue working if you don&amp;#8217;t touch it.  Psi&amp;#8217;s a great case in point - if it didn&amp;#8217;t consist of a majority of working code, then nobody would use it. It hasn&amp;#8217;t traditionally had any unit tests, and that&amp;#8217;s taken its toll on development - development cycles are long because no-one dares to refactor the code to support new features, and once the features are in, release candidate cycles are typically even longer because it&amp;#8217;s difficult (and demoralising) to hunt down the bugs that have been introduced, especially when the bugs often cause crashes in unrelated code, due to mutable objects. Until we build up adequate tests, the cycle will continue, as people spend their energies on new features, avoiding fixing bugs that&amp;#8217;re difficult to reproduce, or are in code that is perceived to be risky to modify. That doesn&amp;#8217;t mean that Psi&amp;#8217;s buggy, or that it will become buggy - we don&amp;#8217;t leave the Release Candidate phase until we have reasonable confidence that we&amp;#8217;ve got all those bugs out, and we do a pretty good job of it (I hope). It&amp;#8217;d just be nice to not need to introduce them, or spend so much time in RC getting rid of them.&lt;/p&gt;
&lt;h2&gt;There are no exceptions (almost)&lt;/h2&gt;
&lt;p&gt;It&amp;#8217;s easy in the early stages of a project to neglect testing, or to write code whose behaviour isn&amp;#8217;t obvious, but this is the greatest of false economies - when your early code doesn&amp;#8217;t work, your later code isn&amp;#8217;t going to work. It&amp;#8217;s also easy to slip into the mindset that unless you can get complete coverage &lt;em&gt;now&lt;/em&gt; you shouldn&amp;#8217;t test at all. If, for some reason, you can&amp;#8217;t get as much coverage as you want, every behaviour that you test is another bug that can&amp;#8217;t happen.&lt;/p&gt;
&lt;h2&gt;About Documentation&lt;/h2&gt;
&lt;p&gt;Above, I claim that all code should be self-documenting. I stand by that - it should be obvious what code does from its method name and signature. That doesn&amp;#8217;t mean that I believe code should never have a Doxygen comment, or a Javadoc - some people (that I respect) hold this opinion, and I may too, some day. At the moment, though, I can still see a value in a greater explanation in a comment, especially if there&amp;#8217;s a business requirement that makes something non-obvious - you know the sort of thing &amp;#8220;oh, yeah, all numbers must always be rounded up, 2.1 is really 3&amp;#8243;. &lt;em&gt;Why&lt;/em&gt; you have to do something, where it&amp;#8217;s not obvious, is a great thing to document. If you have to document &lt;em&gt;what&lt;/em&gt; you&amp;#8217;re doing then you probably need to consider why it&amp;#8217;s not obvious from your code.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Deferring documentation or unit tests is not always about laziness.  It&#8217;s about efficiency. Note my usage of the word &#8220;defer&#8221; - someone else will need to understand your code eventually, and you&amp;#8217;re going to need to do the testing, either manually or automatically, to make it work someday. You&amp;#8217;re sacrificing your efficiency later for a tiny gain now. It&amp;#8217;s clear to me that it&amp;#8217;s necessary to prioritise the tasks with highest impact first, with your tests to ensure that they work, and to only put effort into the next features once all the problems with the first code are solved, and the probability of later needing to expend considerable effort fixing them, or being unable to modify them for fear of breaking them, is low.&lt;/p&gt;
&lt;p&gt;Happy coding!&lt;/p&gt;
&lt;p&gt;Here ends my version - thanks to Justin for providing the original as a talking piece, which gave me a chance to get some thoughts down on electrons that previously I hadn&amp;#8217;t taken the time to express.&lt;/p&gt;</description>
	<pubDate>Sat, 17 Jan 2009 18:17:19 +0000</pubDate>
	<dc:creator>Kev</dc:creator>
</item>
<item>
	<title>Justin Karneges: Psi in 2009</title>
	<guid>http://delta.affinix.com/2009/01/08/psi-in-2009/</guid>
	<link>http://delta.affinix.com/2009/01/08/psi-in-2009/</link>
	<description>&lt;p&gt;So Psi moves along sluggishly as usual.&#160; 0.13 was not released by Christmas.&#160; There were reasonable explanations for that.&#160; Despite this, I think 2009 will be a good year for Psi, and possibly its best year yet.&lt;/p&gt;
&lt;p&gt;I suppose I can&amp;#8217;t put words in anyone else&amp;#8217;s mouth, but I have high hopes we&amp;#8217;ll see Kev and Remko return to regular development after their XMPP book, and that Misha will finally be contributing Yandex stuff back.&#160; As for myself, these past few months stand as a record for the longest time Barracuda let me focus on Psi issues (which, being all Jingle stuff targetting Psi 0.14 or later, is easy to miss).&lt;/p&gt;
&lt;p&gt;So, post-book and post-0.13, I predict a sudden surge of visible development, and more attention to submitted patches.&lt;/p&gt;
&lt;p&gt;Despite the perception that Psi lags &amp;#8220;behind&amp;#8221; other client projects, keep in mind we have a number of significant features that have already been started (with major progress) and just need to be finished:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jingle audio and video&lt;/li&gt;
&lt;li&gt;Whiteboarding&lt;/li&gt;
&lt;li&gt;WebKit chat windows&lt;/li&gt;
&lt;li&gt;Revamped message history interface&lt;/li&gt;
&lt;li&gt;Revamped roster&lt;/li&gt;
&lt;li&gt;Plugins&lt;/li&gt;
&lt;li&gt;Bonjour chat&lt;/li&gt;
&lt;li&gt;Automatic updates&lt;/li&gt;
&lt;li&gt;Certificate/SmartCard authentication&lt;/li&gt;
&lt;li&gt;SSO&lt;/li&gt;
&lt;li&gt;XMPP URIs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Feel free to add more to this list.&#160; I often forget what&amp;#8217;s on the back burner.&lt;/p&gt;
&lt;p&gt;Do note that the above is not a list of priority features, just a list of features that are partially complete for one reason or another.&#160; The priorities going forward are a topic of a different message.&#160; I just wanted to show that when you count all of this unfinished stuff, Psi is farther along than it appears to be.&#160; The project has been around for so many years, and yet there is still so much to do. &lt;img src=&quot;http://delta.affinix.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s to Psi in 2009!&#160; I look forward to a great year with all of you.&lt;/p&gt;</description>
	<pubDate>Thu, 08 Jan 2009 20:19:02 +0000</pubDate>
	<dc:creator>justin</dc:creator>
</item>
<item>
	<title>Kevin Smith: XMPP: The Definitive Guide - Rough Cuts edition</title>
	<guid>http://www.kismith.co.uk/wordpress/?p=95</guid>
	<link>http://www.kismith.co.uk/wordpress/index.php/2008/12/19/xmpptdg-roughcut/</link>
	<description>&lt;p&gt;It&amp;#8217;s been an exciting time recently for the &amp;#8220;XMPP: The Definitive Guide&amp;#8221; book that Peter, Remko and I have been working on. Just over a week ago, &lt;a href=&quot;http://el-tramo.be/blog/xmppbook-roughcuts&quot;&gt;Remko announced the availability of the book in the Rough Cuts scheme&lt;/a&gt;, where you can buy a PDF of the unfinished manuscript to read now, and receive the full version when it&amp;#8217;s ready. Then, earlier this week, &lt;a href=&quot;https://stpeter.im/?p=2378&quot;&gt;Peter posted about our submission of the full manuscript to O&amp;#8217;Reilly&lt;/a&gt;, ready for technical review. Now  it&amp;#8217;s my turn with the good news: O&amp;#8217;Reilly have updated &lt;a href=&quot;http://oreilly.com/catalog/9780596157197/&quot;&gt;the Rough Cut of the book&lt;/a&gt; with our submission, meaning that there is a complete, current book on the XMPP technologies available.&lt;/p&gt;
&lt;p&gt;There will still be changes to the manuscript as a result of reviewers&amp;#8217; comments, but we think this is now a text we&amp;#8217;re happy to have available. O&amp;#8217;Reilly have feedback mechanisms for Rough Cuts, so if you read the book and anything is unclear (or, let us hope not, wrong) please help us make this book something that can guide current and future developers in their work with XMPP.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://oreilly.com/catalog/9780596157197/&quot;&gt;XMPP: The Definitive Guide&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Fri, 19 Dec 2008 07:51:12 +0000</pubDate>
	<dc:creator>Kev</dc:creator>
</item>
<item>
	<title>Remko Tron&#231;on: Rough cuts of XMPP book now available</title>
	<guid>http://el-tramo.be/?p=248</guid>
	<link>http://el-tramo.be/blog/xmppbook-roughcuts</link>
	<description>&lt;p&gt;While &lt;a href=&quot;http://kismith.co.uk&quot;&gt;Kevin&lt;/a&gt;, &lt;a href=&quot;http://stpeter.im&quot;&gt;Peter&lt;/a&gt;, and I are working very hard to finish the first draft of our &lt;a href=&quot;http://el-tramo.be/blog/xmppbook-intro&quot;&gt;upcoming book&lt;/a&gt; &lt;em&gt;&#8216;XMPP: The Definitive Guide&lt;/em&gt;&#8217;, O&#8217;Reilly has recently released early versions of most of the chapters of the book as &lt;a href=&quot;http://oreilly.com/catalog/9780596157197/&quot;&gt;Rough Cuts&lt;/a&gt;. People interested in learning about XMPP &lt;em&gt;today&lt;/em&gt; can now get a preliminary version of the book, and get updates as the book progresses.&lt;/p&gt;</description>
	<pubDate>Wed, 10 Dec 2008 16:25:10 +0000</pubDate>
	<dc:creator>Remko Tron&#231;on</dc:creator>
</item>
<item>
	<title>Hal Rottenberg: Psi Keeps Rollin&#8217;</title>
	<guid>http://halr9000.com/article/657</guid>
	<link>http://halr9000.com/article/657</link>
	<description>&lt;a href=&quot;http://halr9000.com/article/category/software/instant-messaging/jabber&quot; title=&quot;Jabber&quot;&gt;&lt;img src=&quot;http://halr9000.com/wp-content/icons/topic_jabber.png&quot; align=&quot;right&quot; width=&quot;64&quot; height=&quot;87&quot; alt=&quot;Jabber&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://halr9000.com/article/category/software/instant-messaging/psi&quot; title=&quot;Psi&quot;&gt;&lt;img src=&quot;http://halr9000.com/wp-content/icons/topic_psi.png&quot; align=&quot;right&quot; width=&quot;64&quot; height=&quot;64&quot; alt=&quot;Psi&quot; /&gt;&lt;/a&gt;
&lt;p&gt;We&#8217;ve averaged 1,500 downloads a day of &lt;a href=&quot;http://psi-im.org&quot;&gt;Psi&lt;/a&gt; for years. It truly amazes me. We&#8217;re almost at 2.4 MILLION downloads, can you believe it? &lt;/p&gt;
&lt;p&gt;I whipped up this chart from Sourceforge data:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://halr9000.com/stuff/PsiKeepsRollin_9AAD/image.png&quot;&gt;&lt;img title=&quot;image&quot; height=&quot;427&quot; alt=&quot;image&quot; src=&quot;http://halr9000.com/stuff/PsiKeepsRollin_9AAD/image_thumb.png&quot; width=&quot;659&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
	<pubDate>Thu, 04 Dec 2008 17:00:00 +0000</pubDate>
	<dc:creator>halr9000</dc:creator>
</item>
<item>
	<title>Hal Rottenberg: PowerShell Script: Decode Psi Passwords</title>
	<guid>http://halr9000.com/article/653</guid>
	<link>http://halr9000.com/article/653</link>
	<description>&lt;a href=&quot;http://halr9000.com/article/category/software/instant-messaging/jabber&quot; title=&quot;Jabber&quot;&gt;&lt;img src=&quot;http://halr9000.com/wp-content/icons/topic_jabber.png&quot; align=&quot;right&quot; width=&quot;64&quot; height=&quot;87&quot; alt=&quot;Jabber&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://halr9000.com/article/category/programming/scripting/powershell&quot; title=&quot;Powershell&quot;&gt;&lt;img src=&quot;http://halr9000.com/wp-content/icons/topic_powershell.png&quot; align=&quot;right&quot; width=&quot;70&quot; height=&quot;53&quot; alt=&quot;Powershell&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://halr9000.com/article/category/software/instant-messaging/psi&quot; title=&quot;Psi&quot;&gt;&lt;img src=&quot;http://halr9000.com/wp-content/icons/topic_psi.png&quot; align=&quot;right&quot; width=&quot;64&quot; height=&quot;64&quot; alt=&quot;Psi&quot; /&gt;&lt;/a&gt;
&lt;p&gt;This came out of a question in the &lt;a href=&quot;http://psi-im.org&quot;&gt;Psi&lt;/a&gt; chat room this morning. A user wanted to retrieve a password which was saved in the Psi config file. We don&#8217;t use any strong crypto here on the basis that if someone has access to your user profile, you have bigger problems than your IM accounts. There was a Perl script around which did the trick.&amp;#160; I couldn&#8217;t wrap my head around that, so pulled in a buddy (&lt;a href=&quot;http://huddledmasses.org/&quot;&gt;Joel Bennett&lt;/a&gt;) who did the porting to &lt;a title=&quot;Microsoft Windows PowerShell command line shell and scripting language&quot; href=&quot;http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx&quot; target=&quot;_blank&quot;&gt;PowerShell&lt;/a&gt;.&amp;#160; Here it is:&lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;</description>
	<pubDate>Mon, 01 Dec 2008 17:38:55 +0000</pubDate>
	<dc:creator>halr9000</dc:creator>
</item>

</channel>
</rss>
