<?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>Compound Thinking</title>
	<atom:link href="http://compoundthinking.com/blog/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://compoundthinking.com/blog</link>
	<description>Thinking about programming in new ways</description>
	<lastBuildDate>Tue, 15 Mar 2011 02:03:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Open Source SourceForge</title>
		<link>http://compoundthinking.com/blog/index.php/2011/03/15/open-source-sourceforge/</link>
		<comments>http://compoundthinking.com/blog/index.php/2011/03/15/open-source-sourceforge/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 02:02:32 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=902</guid>
		<description><![CDATA[It&#8217;s been a crazy, hectic, inspiring week for me. I had 3 talks at PyCon, travel, and the open sourcing of SourceForge.net&#8217;s new developer platform. The new tools, based on TurboGears, Python, MongoDB, RabbitMQ, and too many other python libraries to count, have been a labor of love for many of our developers. Change at [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a crazy, hectic, inspiring week for me.  I had 3 talks at PyCon,  travel, and the open sourcing of SourceForge.net&#8217;s new developer platform.  The new tools, based on TurboGears, Python, MongoDB, RabbitMQ, and too many other python libraries to count, have been a labor of love for many of our developers. </p>
<p><strong>Change at Sf.net</strong></p>
<p>I very much feel like I&#8217;ve been running non-stop for the last couple of months.  Last month we pushed out a new unified theme, while recovering from the attack earlier this year, making many small tweeks to the user interface.  And now to top it all off this month we open sourced our new beta tools.  </p>
<p>I have a feeling 2011 is going to be a long, tiring, and ultimately a great year.   It&#8217;s certainly started out that way! </p>
<p><strong> Open Source, Open Process, and an Open Framework</strong></p>
<p>I think the decision to open source the forge is a huge step forward for sourceforge.net.  We are moving towards:</p>
<ul>
<li> more open processes, </li>
<li> more open source participation,</li>
<li>and a more  open and flexible forge.</li>
</ul>
<p>I can&#8217;t take credit for any of this.  Since I started here two years ago, I&#8217;ve had the pleasure of working with a great team of people who care about Open Source, care about the site, and want to make things better. </p>
<p>We&#8217;ve released several libraries along the way, but I know we&#8217;ve all been looking forward to the release of the forge platform.   It&#8217;s built on a powerful and flexible python stack, and while we know there are many places where we could have done better, we are proud to be a part of building the future of sourceforge.net.  </p>
<p>And I think it&#8217;s paying off, I know that I&#8217;m personally very excited to see community participation already at this week&#8217;s PyCon sprint. </p>
<p>Now that the code is out in the open, and the community is looking at it more deeply, we are going to start focusing a bit more on opening up our development processes.   </p>
<p>We track the work we do right on sourceforge, in the new ticket tracker: </p>
<p><a href="http://sf.net/p/allura/tickets">sf.net/p/allura/tickets<br />
</a></p>
<p>And we are interested in hearing the feedback of the community, and seeing people get involved in the sausage making process. </p>
<p>We&#8217;re also working hard to make this new forge an open platform.   Tools like the tracker, wiki, and forum are all plugins, and new tools can be easily created by anybody with the desire to make it happen.  </p>
<p>Ultimately we think this is going to mean that the open source community gets better tools to manage their projects, and can focus their efforts where it counts &#8212; on doing the work that can change the world. </p>
<p><strong>Feeling the Open Source Love</strong></p>
<p>It&#8217;s kind of humbling to reallize how impossible this project would have been without the contributions of <strong>literally</strong> hundreds of open source developers that gave us everything from webob to mongodb, from html5lib to kombu, and from jquery to python.  </p>
<p>I am so very grateful to live in a world where so many have given so much to make it possible for small teams like ours at sf.net to build stuff that works as quickly as we have.   And given horror stories I&#8217;ve heard this week, I&#8217;m also grateful to be privileged to work for a company that understands that open source and business opportunity can go hand in hand. </p>
<p><strong>Thanks</strong></p>
<p>I particularly want to thank the TurboGears community, which provided us with lots of assistance along the way, and who put up with me being crazily busy and not as attentive as I wanted to be, or should have been.    You guys rock, and we could not have done this without you!</p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2011/03/15/open-source-sourceforge/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TurboGears Joins the Pylons Project</title>
		<link>http://compoundthinking.com/blog/index.php/2010/12/28/turbogears-joins-the-pylons-project/</link>
		<comments>http://compoundthinking.com/blog/index.php/2010/12/28/turbogears-joins-the-pylons-project/#comments</comments>
		<pubDate>Tue, 28 Dec 2010 14:12:40 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SE Michigan Tech]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=890</guid>
		<description><![CDATA[After much debate, discussion, and contemplation, we&#8217;ve made an important decision, that will best ensure the future of TurboGears, and of the ideas on which it was based. TurboGears is merging into the Pylons Project. A bit of background We built TurboGears 2 on top of a the Pylons framework, and I have been working [...]]]></description>
			<content:encoded><![CDATA[<p>After much debate, discussion, and contemplation, we&#8217;ve made an important decision, that will best ensure the future of TurboGears, and of the ideas on which it was based.  TurboGears is merging into the Pylons Project.  </p>
<p><strong>A bit of background</strong></p>
<p>We built TurboGears 2 on top of a the Pylons framework, and I have been working with Ben and the Pylons folks for a couple of years now.</p>
<p>Pylons is a lightweight framework that is neither full stack noropinionated. The Pylons team has recently joined up with the repoze.bfg folks to create a new low-level non-opinionated web application development library called Pyramid which is based on repoze.bfg and now part of the larger Pylons Project.</p>
<p><strong>Pyramid status</strong></p>
<p>You can use Pyramid to build web applications right now. It has more plug points, and is in many ways more flexible and extendable than the original Pylons and will provide an even better foundation for a full stack framework like TurboGears. </p>
<p>Pyramid has a strong, highly documented, well tested, approach,  is already starting to show the fruits of merging in ideas from TurboGears, and Pylons.   We expect it to be a great choice for those who want a flexible, non-opinionated and very fast framework for their projects. </p>
<p><strong>The future of &#8220;Full Stack&#8221; frameworks</strong></p>
<p>Fortunately, that&#8217;s not where the story ends.  The Pylons Project  leaders recognize that a &#8220;low level&#8221; framework is not enough. </p>
<p>Most web developers need to get things done quickly, and want a full stack setup and ready to go, so they can immediately start developing features rather than infrastructure.</p>
<p>That&#8217;s where we come in.  TurboGears was the pioneer of the &#8220;full stack&#8221; set of integrated components approach among the modern Python web frameworks, and we have already developed many full stack tools.</p>
<p><strong>Next Steps</strong></p>
<p>So, our first step will be to add the TurboGears2 package to the legacy support in the Pylons Project.  So, the Pylons 1.x  and Turbogears2 packages will be maintained side by side as part of a single overall project. This change won&#8217;t impact the TG2 code, except that we will be officially acknowledging that both codebases are<br />
tightly linked and now are part of a single project.</p>
<p>Maintaining the existing Pylons1+tg code will only be one part of the larger Pylons Project.</p>
<p><strong>Big Harry Audacious Goal</strong></p>
<p>Ultimately, we will also be working with the Pylons Project folks to create a new generation of rapid application development tools on top of Pyramid, using the TurboGears &#8220;Full Stack&#8221; philosophy. We will help to pick default templating engines, default session support, default data persistence mechanisms, integrate widget libraries and build high level tools like OAuth or OpenID support.</p>
<p>The main benifits of this merger will come when we reach across framework boundaries, work together with with Repoze, Pylons, and other web framework developers to build a set of high level tools that make building complex, modern web applications easier and faster. There&#8217;s a lot we can learn from each-other, and even more that we can do if we work through our differences and find new ways to collaborate.</p>
<p><strong>There is no future but what we make</strong></p>
<p>It&#8217;s been a great ride.   And, it looks like just when we thought things  were settling down, there&#8217;s another drop, and the roller coaster  ride that is TurboGears isn&#8217;t done yet.   I am forever grateful for the chance<br />
to work with all the TurboGears developers, to face challenges, and to build something that&#8217;s been so valuable to so many.  And I&#8217;m looking forward to what we can do together with the Pylons and Repoze folks. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2010/12/28/turbogears-joins-the-pylons-project/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Technical Debt isn&#8217;t always Debt</title>
		<link>http://compoundthinking.com/blog/index.php/2010/10/05/technical-debt-isnt-always-debt/</link>
		<comments>http://compoundthinking.com/blog/index.php/2010/10/05/technical-debt-isnt-always-debt/#comments</comments>
		<pubDate>Tue, 05 Oct 2010 03:15:39 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Lean]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=868</guid>
		<description><![CDATA[After yesterday&#8217;s posts about why you should not focus on reducing technical debt and why that&#8217;s not an excuse to ignore it either. Dave brought up a good point in a comment. Technical debt can be assessed like real debt, to a large degree. How much are you paying monthly because of the debt? An [...]]]></description>
			<content:encoded><![CDATA[<p>After yesterday&#8217;s posts about why you <a href="http://compoundthinking.com/blog/index.php/2010/10/04/focusing-on-removing-technical-debt-is-a-dead-end/">should not focus on reducing technical</a> debt and why that&#8217;s not an excuse to <a href="http://compoundthinking.com/blog/index.php/2010/10/04/ignoring-%e2%80%9ctechnical-debt%e2%80%9d-is-like-playing-with-dynamite/">ignore it</a> either.   Dave brought up a good point in a comment.   </p>
<blockquote><p>Technical debt can be assessed like real debt, to a large degree. How much are you paying monthly because of the debt? An annoying little thing, or wanting to upgrade to a new version just for newness’ sake has a low interest rate.</p>
<p>&#8211; Dave Brondsema
</p></blockquote>
<p>But it got me thinking, perhaps &#8220;debt&#8221; isn&#8217;t the right metaphor for this at all.   Annoying issues that don&#8217;t cost anything, and don&#8217;t technically need to be &#8220;repaid&#8221;  aren&#8217;t properly debt at all.   </p>
<p>Perhaps technical <em>warts</em> would be a better term for those kind of things.   It feels good to fix them.   But rather than feel righteous for spending time fixing them all and &#8220;paying down our debt,&#8221; perhaps we ought to feel a little bit self indulgent for spending time and money on what amounts to cosmetic surgery for our code. </p>
<p>I&#8217;m not saying cosmetic surgery is never valuable, or that warts are never painful, and certainly not that you should ignore them.  After all warts can be cancerous, and could perhaps kill you. But after investigating and discovering that they are benign, perhaps it&#8217;s not worth the cost to have them removed. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2010/10/05/technical-debt-isnt-always-debt/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Ignoring “technical debt” is like playing with dynamite</title>
		<link>http://compoundthinking.com/blog/index.php/2010/10/04/ignoring-%e2%80%9ctechnical-debt%e2%80%9d-is-like-playing-with-dynamite/</link>
		<comments>http://compoundthinking.com/blog/index.php/2010/10/04/ignoring-%e2%80%9ctechnical-debt%e2%80%9d-is-like-playing-with-dynamite/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 17:41:45 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Lean]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=864</guid>
		<description><![CDATA[Earlier today, I posted the somewhat controversial Focusing on Technical Debt is a dead end and apparently I missed some of the subtlety required to get my actual point across. I still don&#8217;t believe that it makes sense to focus on technical debt. Technical debt is a fact of life, and it&#8217;s a sign that [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier today, I posted the somewhat controversial <a href="http://compoundthinking.com/blog/index.php/2010/10/04/focusing-on-removing-technical-debt-is-a-dead-end/">Focusing on Technical Debt is a dead end</a>  and apparently I missed some of the subtlety required to get my actual point across.</p>
<p>I still don&#8217;t believe that it makes sense to <em>focus on technical debt</em>.   </p>
<p>Technical debt is a fact of life, and it&#8217;s a sign that you&#8217;re writing better code now than you did before.   It&#8217;s a sign that the team is learning, and that things are getting better.   So, you should learn to live with it, or even to celebrate it. </p>
<p>But, that does not mean you should ignore technical debt either.   </p>
<p>Technical debt can have real costs, can create real project risk, and most importantly can limit the capacity of the system to produce value.   If it&#8217;s doing that, you need to fix it.  But even then you are better to FOCUS on the long view of increasing the capacity of the system.  In other words: </p>
<ul>
<li>Make sure your whole team is learning from the process</li>
<li>Make sure you fix the things that impede progress rather than just things that bug you</li>
<li>Make sure that you do enough root cause analysis to know why the obstructions got there in the first place</li>
</ul>
<p>In other words elevate the priority of learning above the need to &#8220;fix&#8221; things now.   That way you&#8217;ll avoid future mistakes, get more done, and at the same time continue to deliver value to customers.  </p>
<p>In the end I don&#8217;t like the term &#8220;Technical Debt&#8221; as a catch-all because it&#8217;s a way of lumping all kinds of different code problems together into one basket which results in trivium being treated with the same seriousness as potentially project destroying technical risks.</p>
<p>So, you do need to pay attention to all technical debt, but some of it should be ignored, some of it should be responded to immediately, and some of it should be &#8220;fixed&#8221; when you next work on code that touches that thing.  Not fixing the critical things is dangerous, and I thought everybody knew that.   My point in <a href="http://compoundthinking.com/blog/index.php/2010/10/04/focusing-on-removing-technical-debt-is-a-dead-end/">my last post</a> was that fixing the non-critical things with the same urgency is more insidious danger. </p>
<p>Focusing on it exclusively leads to a weird situation where you&#8217;re fixated on the past, and not moving forward anymore.   And ultimately it short-circuits the <strong>critical</strong> thing, which is growing the capacity of the team to deliver value.</p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2010/10/04/ignoring-%e2%80%9ctechnical-debt%e2%80%9d-is-like-playing-with-dynamite/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Focusing on removing &#8220;technical debt&#8221; is a dead end</title>
		<link>http://compoundthinking.com/blog/index.php/2010/10/04/focusing-on-removing-technical-debt-is-a-dead-end/</link>
		<comments>http://compoundthinking.com/blog/index.php/2010/10/04/focusing-on-removing-technical-debt-is-a-dead-end/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 03:53:41 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=858</guid>
		<description><![CDATA[Americans, myself included, have a very short term perspective. Results matter, and this quarter&#8217;s results matter most. Perhaps next quarter is important too, heck we might even think a year out. But we rarely take the *long* view. Push harder and you can make this quarter&#8217;s numbers a bit better. Push harder and you&#8217;ll get [...]]]></description>
			<content:encoded><![CDATA[<p>Americans, myself included, have a very short term perspective.  Results matter, and this quarter&#8217;s results matter most.   Perhaps next quarter is important too, heck we might even think a year out. </p>
<p>But we rarely take the *long* view.  Push harder and you can make this quarter&#8217;s numbers a bit better.   Push harder and you&#8217;ll get this sale in before the end of the year.</p>
<p>Developers do this too.   We push harder to get a product out the door on time, push harder to get a feature in to this release rather than the next.   </p>
<p>And here&#8217;s one which I think is particularly pernicious, because it seems like long term thinking &#8212; push harder to reduce &#8220;technical debt&#8221; right now.  </p>
<p>Technical debt is the distance between how you&#8217;d write it knowing what you know now, and how you did write it knowing what you knew then.  If you&#8217;re constantly focused on fixing past mistakes, you&#8217;re not learning the things that will turn the code you&#8217;re writing today into &#8220;technical debt.&#8221;</p>
<p>My recomendation is to focus on other things, focus on solving the problems you&#8217;re facing today the best way you know how, focus on cleaning as you go, focus on growing the team&#8217;s ability to learn &#8212; in other words: </p>
<p><strong>Don&#8217;t focus on maximizing the utilization of the system,<br />
focus on growing the capacity of the system. </strong></p>
<p>There are a lot of things in projects I&#8217;ve written that I wouldn&#8217;t do the same way again.   But if I get caught up in fixing every bad API decision in TurboGears or whatever, I would be paralyzed and unable to move forward.  Of course it&#8217;s not hypothetical, I&#8217;ve definitely been there, done that.  But I&#8217;ve learned from that mistake, and hopefully I can <em>maximize the capacity of the system</em> by helping you to avoid it. ;) </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2010/10/04/focusing-on-removing-technical-debt-is-a-dead-end/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>The tech of the new SourceForge</title>
		<link>http://compoundthinking.com/blog/index.php/2010/07/26/the-tech-of-the-new-sourceforge/</link>
		<comments>http://compoundthinking.com/blog/index.php/2010/07/26/the-tech-of-the-new-sourceforge/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 17:28:06 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=839</guid>
		<description><![CDATA[Last week I blogged about the new SourceForge.net and one of the first questions I got was when are we going to &#8220;lift the covers&#8221; and show off our new tech. There&#8217;s definitely more to come in terms of releases and code, but I thought it&#8217;d be worthwhile to start with a quick run through [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I blogged about the new <a href="http://sourceforge.net/p/">SourceForge.net</a> and one of the first questions I got was when are we going to &#8220;lift the covers&#8221; and show off our new tech.  </p>
<p>There&#8217;s definitely more to come in terms of releases and code, but I thought it&#8217;d be worthwhile to start with a quick run through of the tech stack and a bit of a description of what we&#8217;re doing. </p>
<p>Our first rule for libraries and tools on the new forge, was that we needed to use open source everywhere.   Partly this is just because having the freedom to look at the code and modify it where we need fixes, makes it&#8217;s the easiest and best way to develop software.   Partly it&#8217;s because we&#8217;re an open source code hosting platform, and we want to use what we promote.   But perhaps most importantly, it means that we&#8217;re not prevented from sharing our work with others, or from inviting others to work with us in the future. </p>
<p>At the same time we had a company wide decision to standardize on the technology stack that we&#8217;d used in the &#8220;<a href="http://compoundthinking.com/blog/index.php/2009/07/16/turbogears-on-sourceforge/">consume&#8221; project</a> last year.  So, we&#8217;re using:</p>
<ul>
<li>Python,</li>
<li>TurboGears,</li>
<li>MongoDB, </li>
<li>and AMQP (RabbitMQ).</li>
</ul>
<p>The combination of these means that we have:</p>
<ul>
<li>a huge number of libraries available to us, </li>
<li>a web framework that we can turn into a plugin framework for projects and the tools they want, </li>
<li> a schema-free database that lets us easily version documents to keep history on wiki pages, tickets, and other &#8220;artifacts&#8221; within the new forge</li>
<li> a scalable system for handling asynchronous tasks, and propagating update notifications</li>
</ul>
<p>The choice to use Python has been particularly valuable, since there are (literally) dozens of libraries that we were able to use to help us with everything from encrypted cookie sessions, and mongodb drivers, to markdown text processing, and syntax highlighting.</p>
<p>We&#8217;re still in the early days and have a lot more to do, but the goal is an open extensible, system that supports open source projects, and ultimately encourages more people do download and use a wider variety of open source applications. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2010/07/26/the-tech-of-the-new-sourceforge/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A peek at a new Sourceforge.net</title>
		<link>http://compoundthinking.com/blog/index.php/2010/07/13/a-peak-at-a-new-sourceforge-net/</link>
		<comments>http://compoundthinking.com/blog/index.php/2010/07/13/a-peak-at-a-new-sourceforge-net/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 16:37:55 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SE Michigan Tech]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=817</guid>
		<description><![CDATA[So, I&#8217;ve been working on sf.net in various ways for about a year now. http://sourceforge.net/p/. It&#8217;s written in Python using modern open source tools, from RabbitMQ, and MongoDB, to Git and Mercurial. And we are committed to making this the most open forge possible. We&#8217;re committed, to open processes, open code, and perhaps most importantly [...]]]></description>
			<content:encoded><![CDATA[<p>So, I&#8217;ve been working on sf.net in various ways for about a year now.<br />
<a href="http://sourceforge.net/p/">http://sourceforge.net/p/</a>.  It&#8217;s written in Python using modern open source tools, from RabbitMQ, and MongoDB, to Git and Mercurial.   And we are committed to making this the most open forge possible.  We&#8217;re committed, to open processes, open code, and perhaps most importantly open data.<br />
<a href="https://sourceforge.net/p/mramm/todo/"><img src="http://compoundthinking.com/blog/wp-content/uploads/2010/07/tickets.jpg" alt="" title="tickets" width="400" height="315" align='right' /></a></p>
<p>The first thing we did was create some new pages for downloads.  Recently we releases <a href="http://sourceforge.net/downloads">a new service</a> designed just for open source project leaders who want to use <a href="sf.net/directory">sf.net</a> as a directory and downloads service. </p>
<p>But, we&#8217;re also aware that one of the most important services we provide is project hosting.  For the last several months a small group of us have been trying to bring sourceforge.net&#8217;s tools into 2010.  And now we&#8217;re releasing an  early preview of those new developer/community tools:</p>
<p>We have a long way still to go, but every long journey begins with a single step, and today&#8217;s step is allowing you to try the new forge, to create new projects at: </p>
<p><a href="https://sourceforge.net/register">https://sourceforge.net/register</a></p>
<p>Where you can go to get a new project, with our new tracker, wiki, git, svn, and other tools.   Projects can have subprojects, and links to other tools hosted off site, along with the many features that sf.net brings (free web hosting, hosted apps, etc). </p>
<p><strong>But, why do all this?</strong></p>
<p><em>In 1999 SourceForge was cool. </em> </p>
<p>It provided all the tools that an open source project needed to get going, from cvs hosting, to bug tracking, and e-mail list support.</p>
<p>They pioneered free free software project hosting, and helped to transform the software development culture from one which barely new about free software or open source, to one where nearly everybody I know uses open license software. Oh sure, some of them might not know it, but they have it on their phones, in their TVs, their wireless routers &#8212; not to mention all the websites they use everyday that run on open source. </p>
<p><strong>But, time passed.</strong></p>
<p>More alternatives came out, more projects (including my own) started self hosting, and the landscape of open source software development changed.   SourceForge.net took a long time coming out with support for new tools like svn, and then git.   </p>
<p>Still, SourceForge has a special place in my heart.  Partly it&#8217;s nostalgia, I suppose, but I still think: </p>
<ul>
<li>  the core mission is still right</li>
<li>  and there is still a real need</li>
</ul>
<p>We (Open Source developers) still need tools like git, mercurial, and svn hosting.  We still need bug trackers and mailing lists.   And in a meeting of other open source project leaders last fall, nearly every single one of them identified the time wasted integrating and administering these tools as one of their most important frustrations.</p>
<p><strong>Not enough&#8230;</strong></p>
<p>But, for many sourceforge.net and other free project hosting services were just not good enough, they weren&#8217;t scriptable, the weren&#8217;t extensible, their data wasn&#8217;t portable, and so they felt like they had to take on that cost. </p>
<p>And I fundamentally believe that open source projects live an die by communication, and that sourceforge.net can do something new by integrating the various kinds of &#8220;conversations&#8221; that happen around the project.  We can integrate mailing lists and forums, we can integrate SCM and ticket trackers, etc.   </p>
<p><strong>New and improved</strong></p>
<p>So, a couple of us have been quietly working on something new.  The new forge is designed around a few core ideas: </p>
<ul>
<li>   that data should be portable (every project gets their own database, which they can take with them if they want), </li>
<li>   that the open source community ought to be able to extend and enhance the tools they need, </li>
<li>   that integrating and cross linking the various kinds of conversations that open source projects need to have ought to be easier.</li>
</ul>
<p>So, what we&#8217;re announcing today is more of a commitment to getting there on all these things, and a commitment to the &#8220;release early, release often&#8221; project management strategy.    </p>
<p>So, expect us to take your feedback and make things better.   Expect us to release lots of small fixes, and expect a few places where things are broken/incomplete because we value feedback more than polish at this point. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2010/07/13/a-peak-at-a-new-sourceforge-net/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>People VS Process?</title>
		<link>http://compoundthinking.com/blog/index.php/2010/06/29/people-vs-process/</link>
		<comments>http://compoundthinking.com/blog/index.php/2010/06/29/people-vs-process/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 02:27:27 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Lean]]></category>
		<category><![CDATA[Lean IT]]></category>
		<category><![CDATA[Personal Productivity]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[SE Michigan Tech]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=234</guid>
		<description><![CDATA[Lean Manufacturing people go around saying &#8220;it&#8217;s always a process problem.&#8221; Meanwhile Gerry Weinberg, who wrote several books that I love, and gives lots of great advice, including the some of the best advice I&#8217;ve ever read about how to give advice, says &#8220;every problem is a people problem.&#8221; So, which is it? Are bad [...]]]></description>
			<content:encoded><![CDATA[<p>Lean Manufacturing people go around saying &#8220;it&#8217;s always a process problem.&#8221;   </p>
<p>Meanwhile Gerry Weinberg, who wrote several books that I love, and gives lots of great advice, including the some of the best advice I&#8217;ve ever read about <a href="http://www.amazon.com/gp/product/0932633013?ie=UTF8&#038;tag=pragmaticsyst-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0932633013">how to give advice</a>, says &#8220;every problem is a people problem.&#8221;</p>
<p><strong>So, which is it? </strong>  </p>
<p>Are bad things that happen the result of bad processes, are they the result of things people do? </p>
<p>I&#8217;ve been party to a bit of discussion about this in the last month or two, and in the end it&#8217;s all pretty silly.  </p>
<p>Processes are created by people, implemented by people, and are designed to accomplish the goals of people.  </p>
<p><strong>People run processes!</strong> </p>
<p>So, whenever something is broken, it&#8217;s people who will need to find the problem and fix it.   </p>
<p>People can and do think of ways to improve processes everyday, but I&#8217;ll <a href="http://en.wikipedia.org/wiki/Werner_Herzog_Eats_His_Shoe">eat my shoe</a> if you find a process that thinks of a way to improve people. </p>
<p><strong>But there&#8217;s still a HUGE problem. </strong></p>
<p>Modern companies seem to have a <a href="http://bobsutton.typepad.com/my_weblog/2010/02/blame-failure-and-the-no-asshole-rule.html">persistent failing</a> &#8212; they <a href="http://uscnews.usc.edu/business/people_like_to_play_the_blame_game.html">look for people to blame</a> when something goes wrong &#8212; and <em>ignore</em> the context in which those problems happened.   </p>
<p>When something goes wrong,  fire some people, and replace them with new people who make the same mistakes all over again.   </p>
<p><strong>Sometimes you &#8220;get lucky&#8221;. </strong></p>
<p>The company might get lucky and find a person who&#8217;s able to <a href="http://www.amazon.com/gp/product/0385517254?ie=UTF8&#038;tag=pragmaticsyst-20&#038;linkCode=as2&#038;camp=1789&#038;creative=390957&#038;creativeASIN=0385517254">raise awareness,</a><img src="http://www.assoc-amazon.com/e/ir?t=pragmaticsyst-20&#038;l=as2&#038;o=1&#038;a=0385517254" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> reveal the <a href="http://www.poppendieck.com/papers/LeanThinking.pdf">larger contextual problems</a>, and succeeded in spite of the fact that everything&#8217;s stacked against her.   </p>
<p>More often than not though, the <a href="http://bobsutton.typepad.com/.a/6a00d83451b75569e2013482507561970c-pi">poor new guy</a> doesn&#8217;t see the systematic pressures that caused everything to fall apart, at least not until it&#8217;s too late. </p>
<p><strong>Sometimes replacing what&#8217;s broken isn&#8217;t enough. </strong></p>
<p>Sometimes it&#8217;s the equivalent of a mechanic replacing your car&#8217;s engine several times in a row, because it keeps burning up &#8212; without ever checking to make sure oil is flowing normally, and the cooling system is working.</p>
<p><strong>The easy way out.</strong></p>
<p>It&#8217;s often easier to blame people because they don&#8217;t &#8220;control&#8221; them they way they do the context.  This blame game is as old as the hills, but definitely not as pretty.   </p>
<p><strong>Help people fix processes</strong></p>
<p>The solution is to <em>ask people</em> to look for the systematic pressures, give them the tools to find them, and to empower them to change the way work gets done.   </p>
<p><strong>In the end, people will improve the processes, <em>if they believe they are allowed.</em></strong> </p>
<blockquote><p>Sometimes a design isn’t working because you think you can’t change the one element that needs to be changed.</p></blockquote>
<p>  &#8211;<a href="http://37signals.com/svn/posts/2369-sometimes-a-design-isnt-working-because">Ryan</a> (via <a href="http://37signals.com/svn/">svn</a>)</p>
<p>The same thing is true when you are designing the processes by which work gets done.  </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2010/06/29/people-vs-process/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Premature optimization</title>
		<link>http://compoundthinking.com/blog/index.php/2009/12/17/premature-optimization/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/12/17/premature-optimization/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 04:43:44 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Lean IT]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[TurboGears]]></category>
		<category><![CDATA[writing]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=290</guid>
		<description><![CDATA[We all know it&#8217;s bad. But, programming for performance in reasonable ways is good. So, what&#8217;s the difference? Sometimes we think we know that a piece of code is important so we spend some time optimizing it. And in the end it&#8217;s less clear, and less maintainable, and it turns out that our bottlenecks are [...]]]></description>
			<content:encoded><![CDATA[<p>We all know it&#8217;s bad.  But, programming for performance in reasonable ways is good.   So, what&#8217;s the difference?  </p>
<p>Sometimes we think we know that a piece of code is important so we spend some time optimizing it.  And in the end it&#8217;s less clear, and less maintainable, and it turns out that our bottlenecks are all elsewhere. </p>
<p>But, sometimes we do know where bottlenecks are going to be, we&#8217;ve learned from experience, and we know what needs to be done.   </p>
<p>We know that architecture determines performance, and architecture isn&#8217;t easily bolted on at the end of the project.   </p>
<p>So we have a conundrum.   We shouldn&#8217;t optimize yet because we don&#8217;t know where the bottlenecks will be.   We shouldn&#8217;t wait to optimize because we can&#8217;t easily retrofit a good architecture on a complex system. </p>
<p>Some of the conundrum is only apparent &#8212; there&#8217;s a difference between architectural problems that need to be set up front, and the kind of low level micro-optimization that obscures more than it helps.    But, sometimes these conflicts are real &#8212; how do I know if I need a multi-process multi-consumer queue system for PDF generation before we build the system and benchmark it?   If you don&#8217;t need it, that kind of extra architectural complexity just obscures the bit of code that actually solves the problem.  </p>
<p><strong>Solving the problem by going meta</strong></p>
<p>Perhaps the problem really is that we&#8217;re dumb and optimize the wrong things at the wrong time.   The solution to that problem is to get less dumb.   Which means that we ought to spend time  optimizing &#8220;learning&#8221;, both within our project processes, and across projects. </p>
<p>Codifying this learning is what the <a href="http://www.amazon.com/gp/product/0321127420?tag=pragmaticsyst-20">Patterns of Enterprise Application Architecture</a> book was all about.  </p>
<p>And I think it&#8217;s great as far as it goes, and if you haven&#8217;t read it you should <a href="http://www.amazon.com/gp/product/0321127420?tag=pragmaticsyst-20">buy it now</a>. </p>
<p>But there are a lot of patterns that I can identify from my last half dozen projects that aren&#8217;t covered in PoEAA, so it would be great to see a next generation of books and blog posts that cover the modern architectural trade-offs that you have to make, something that covers some of the paterns of the web.</p>
<p>Scalability via in HTTP, etags, caching, and load balancing (the whole RESTful services argument), networked async processing patterns, etc.    Scaling to the public web levels requires a whole different set of architectural principles than scaling to the old &#8220;enterprise&#8221; levels did, and that knowledge seems very much in flux. </p>
<p>It would be great if it also provided some advice for those of us who&#8217;ve moved into what Neil Ford has called the world of the Polyglot Programmer, patterns for coordinating activities across language barriers in a sensible way.   That&#8217;s part of the nature of modern web systems too. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/12/17/premature-optimization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How do we expand Open Source?</title>
		<link>http://compoundthinking.com/blog/index.php/2009/12/14/how-do-we-expand-open-source/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/12/14/how-do-we-expand-open-source/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 03:56:43 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=741</guid>
		<description><![CDATA[So, one thing which keeps comming up in a bunch of different areas of my life is how we can expand the ethic of Open Source development. People want TurboGears to do more than it does, they want other open source projects to grow, they want new open source projects in specific areas, and they [...]]]></description>
			<content:encoded><![CDATA[<p>So, one thing which keeps comming up in a bunch of different areas of my life is how we can expand the <strong>ethic</strong> of Open Source development.   </p>
<p>People want TurboGears to do more than it does, they want other open source projects to grow, they want new open source projects in specific areas, and they want <em>Open Source like activity</em> in other professions like nursing or construction. </p>
<p>I definitely don&#8217;t have the answers.   But I&#8217;ve had this conversation with a lot of folks over the last couple of months, and some of them had some great ideas.</p>
<p>So, in the spirit of opening up a larger conversation about these issues, here are a couple of thoughts distilled from all those conversations. </p>
<p><strong>Institutionalizing Open Source Values</strong></p>
<p>It is of course <em>possible</em> to create cultural institutions around which money can be channeled into Open Source development.  </p>
<p>And all the legal mechanisms needed to structure those institutions in the right way are available today.   </p>
<p>But the trick it seems is to create the institutions in such a way that money is delivered in <strong>small enough amounts that individuals remain in control</strong>.   Money is powerfully persuasive, but one of the keys to the current success of open source is that collective action is always purely voluntary.   </p>
<p>But at the same time the money needs to come in <strong>large enough amounts to make a difference.</strong>   People need to be able to support lives and families on the work they do advancing various projects.   To the extent that this is reliable income, we can remove competing priorities, and developers will be able to devote themselves more fully to projects that advance the common good. </p>
<p>So, the key to making all of this work is going to be the &#8220;bureaucracies&#8221; we create to manage the flow of money.   They need to be tuned properly to the nature of the work, stable enough to provide a level of personal security, and perhaps above all they need to be financially transparent. </p>
<p>Creating the right kinds of organizational structures will help us channel the right amounts of money to the right people, and creating the wrong kinds will create perverse incentives that pollute the whole system.</p>
<p>Most of what&#8217;s been happening so far in this direction are ecosystems of companies built around open source offerings.  This has worked pretty well, but it&#8217;s clear that there can be conflicts of interest, and the nature of commercial ownership leaves even the best run companies vulnerable to sudden changes (acquisition of small open source companies by huge proprietary competitors is already a fact of life). </p>
<p>But, what seems more interesting to me at this point is the number of foundations that are being are created for popular projects or groups of popular projects, etc.</p>
<p>These institutions will continue to grow, but they have the potential to change the way projects are run, so I expect a lot of fits and starts as we mature.   </p>
<p><strong>Open Source for other Professions</strong></p>
<p>With that thought in mind perhaps lawyers, doctors, and other professions already have a form of the Open Source ethic, which has grown up around large institutions, and functions to spread knowledge and advance the state of the art of those groups.  These institutions work to create new knowledge, train practitioners, and they seem to work pretty well.  </p>
<p>If you haven&#8217;t caught on already I think it might be fair to say that this sub-section of these professions is called &#8220;academics.&#8221;  ;) </p>
<p>Of course the university system isn&#8217;t perfect, and it&#8217;s taken hundreds of years to evolve to it&#8217;s current state, but I think it does provide some insight into how we might evolve larger institutional presences around open source, not in the next few years, but in the next few decades. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/12/14/how-do-we-expand-open-source/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rule Mongo with an Iron Fist</title>
		<link>http://compoundthinking.com/blog/index.php/2009/12/09/rule-mongo-with-an-iron-fist/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/12/09/rule-mongo-with-an-iron-fist/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 16:19:54 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=794</guid>
		<description><![CDATA[At geek.net we&#8217;ve been using MongoDB on various projects for the last six months or so. We finally re-factored out our MongoDB related code and created a new library. It&#8217;s battle tested on the project pages of sourceforge.net, and it&#8217;s getting a workout in my new project (no details on that yet). One thing we [...]]]></description>
			<content:encoded><![CDATA[<p>At geek.net we&#8217;ve been using MongoDB on various projects for the last six months or so.   We finally re-factored out our MongoDB related code and created a new library.   It&#8217;s battle tested on the project pages of sourceforge.net, and it&#8217;s getting a workout in my new project (no details on that yet). </p>
<p><a href="http://compoundthinking.com/blog/wp-content/uploads/2009/12/250px-Max_von_Sydow-Ming_the_Merciless.jpg"><img src="http://compoundthinking.com/blog/wp-content/uploads/2009/12/250px-Max_von_Sydow-Ming_the_Merciless-225x300.jpg" alt="250px-Max_von_Sydow-Ming_the_Merciless" title="Ming_the_Merciless" width="225" height="300" align="right"/></a>One thing we learned is that you have to enforce some stuff on the Python side of the world in order to make working with totally schema free data stores easier. </p>
<p>So, just like in Flash Gordan, we&#8217;ve got Ming to rule Mongo. </p>
<p>Rick&#8217;s blogged about it at length here: </p>
<p><a href="http://blog.pythonisito.com/">http://blog.pythonisito.com/</a></p>
<p>And all I can say, is that I&#8217;m very happy with Ming as it is now, and it&#8217;s meeting our needs quite well.   We are of course open to suggestions, and we&#8217;re hoping that we can open up more stuff as we go.</p>
<p>If you want to see the details, they can be found on the (of course) sourceforge.net site: </p>
<ul>
<li><a href="http://merciless.sourceforge.net/tour.html">http://merciless.sourceforge.net/tour.html</a><a href="http://merciless.sourceforge.net/tour.html"></a></li>
<li><a href="http://merciless.sourceforge.net/tour.html">http://sourceforge.net/projects/merciless/</a></li>
</ul>
<p>If you&#8217;re looking for a larger exampel of Ming in actin Chris Perkins (coding machine that he is) and some other TurboGears devs are already looking at building a content management system with Ming and <a href="http://turbogears.org/2.0/">tg2</a>:</p>
<p><a href="http://bitbucket.org/percious/c5t/">http://bitbucket.org/percious/c5t/<br />
</a></p>
<p>If you use Ming, and like it, feel free to let us know.</p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/12/09/rule-mongo-with-an-iron-fist/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Python Template languages (Part 1 &#8212; Django)</title>
		<link>http://compoundthinking.com/blog/index.php/2009/12/09/python-template-languages-part-1-django/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/12/09/python-template-languages-part-1-django/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 08:59:33 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=273</guid>
		<description><![CDATA[I&#8217;ve been thinking a lot about template engines in Python recently. Partly because sourceforge.net&#8217;s new python code needed to choose a template language, and there were some questions about why we would choose one over the others. But beyond that In the past few weeks used Genshi, Mako, Jinja, Django Templates, and Cheetah, and have [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been thinking a lot about template engines in Python recently.  Partly because sourceforge.net&#8217;s new python code needed to choose a template language, and there were some questions about why we would choose one over the others.  </p>
<p>But beyond that   In the past few weeks used <a href="http://genshi.edgewall.org/">Genshi</a>, <a href="http://www.makotemplates.org/">Mako</a>, <a href="http://jinja.pocoo.org/2/documentation/">Jinja</a>, Django Templates, and <a href="http://pypi.python.org/pypi/Cheetah/1.0">Cheetah</a>, and have been looking at, but not yet using out <a href="http://pypi.python.org/pypi/chameleon.genshi">chameleon.genshi</a>.  </p>
<p>I figure all this promiscuous template library usage means that I should put my thoughts down somewhere.  There are advantages and disadvantages of all these libraries, but I think that the choices are pretty clear once you know your constraints. </p>
<p>I&#8217;m not going to commit to covering them all in depth, but I&#8217;m going to try to put my thoughts about them down over the next few days.   </p>
<p>For today let&#8217;s talk about the pros and cons of <strong>Django Templates.</strong>  This is another post that has been developed over the last year or so, where typed stuff up while working on <a href="http://fossfor.us">fossfor.us</a>.   </p>
<p>Django made making fossfor.us easy in lots of ways.   Want threaded comments? Add the existing app in a  couple hours &#8212; Done!   Want OpenID? Again add an app &#8212; Done!</p>
<p>But it also had frustrations, and one of the biggest for me was the template language.   </p>
<p><span id="more-273"></span></p>
<p><strong>First the good</strong></p>
<p>Django templates operate in a sandboxed environment.   This is good because it limits the ways that designers can blow-up your web-app. In fact this seems to be an underlying design decision of the Django framework.   It&#8217;s the reason accessing non-existent variables just returns empty strings, because as the Djanogo book tells me &#8220;you wouldn&#8217;t want a designer to be able to take down your website with a typo.&#8221;</p>
<p>I can respect that, and I definitely see the benefits of sandboxing template code, particularly in places where end-users might be allowed to edit templates.  </p>
<p><strong>Easy to learn, and easy to use</strong><br />
They also provide a <a href="http://docs.djangoproject.com/en/dev/topics/templates/">very simple</a> syntax, that&#8217;s very well documented.   This makes it easy for designers to figure out.   </p>
<p>All of this is good. </p>
<p><strong>But there are some negatives </strong></p>
<p>Django developers seem to love them, but I feel like there are some significant drawbacks to using django templates. </p>
<p><strong>Not trivial to use outside of django.</strong></p>
<p>You can do it, but it&#8217;s not easy, and you end up with a lot of Django loaded that you don&#8217;t need.    Fortunately there&#8217;s Jinja which is somewhat Django template like, but which isn&#8217;t at all dependent on Django itself.   So, if you&#8217;re not using Django, I think it&#8217;s sane to recommend that you use Jinja templates.    And tomorrow I&#8217;ll blog more about why I think that Jinja is just a better version of Django templates. </p>
<p><strong>Won&#8217;t let you follow the fail early philosophy of development</strong></p>
<p>When you use Django Templates in Django, I have two major issues.   THe first is the decision to always treat undefined variables as variables that contain an empty string.   Generally <a href="http://en.wikipedia.org/wiki/Fail-fast">&#8220;fail fast&#8221;</a> is a good engineering principle, because it&#8217;s helps you find problems sooner, and makes debugging much easier.   </p>
<p>Of course the Django guys are smart, and the knew about this so they planned for it.   </p>
<p><strong>Well sort-of</strong>, apparently it&#8217;s easy enough to make invalid variables return something other than an empty string by setting the <code>TEMPLATE_STRING_IF_INVALID</code> config variable to something else, which gets displayed if you access an undefined variable in a template (say you make a typo.  And this does makes it easier to find template errorsmore  quickly. </p>
<p><em>But it&#8217;s not really &#8220;failing fast.&#8221; </em> </p>
<p>I want an all out failure, not a<em> small</em> difference in the rendered page. </p>
<p>With that said, this as faar as it goes, I think it is good.  <code>TEMPLATE_STRING_IF_INVALID</code> should be a configuraiton option, (though perhaps with a better name) and people should turn it on in development and off in production.  Pylons does this with it&#8217;s <code>c</code> variable, and I think it&#8217;s very helpful. </p>
<p>But what I want is the exception, not just some random other text inserted, so then I looked into what it would take to force django template rendering to stop silently suppressing exceptions, and it&#8217;s not that hard on first glance.  </p>
<p>The template renderer depends on a special attribute <code>silent_variable_failure</code> being set to <code>True</code> on the exception, so all we would have to do is just disable this checking when the <code>fail_fast</code> config value was set to <code>True</code> and we&#8217;d be good to go.   </p>
<p><strong>Seemed like a good idea, but in reality &#8212; not so good. </strong></p>
<p>Django&#8217;s admin will totally break if you do such a thing, and it turns out that even setting the TEMPLATE_STRING_IF_INVALID parameter makes these pages render quite badly.   </p>
<p>I ultimately found this tidbit in the Django Template Docs: </p>
<blockquote><p>While TEMPLATE_STRING_IF_INVALID can be a useful debugging tool, it is a bad idea to turn it on as a &#8216;development default&#8217;.</p>
<p>Many templates, including those in the Admin site, rely upon the silence of the template system when a non-existent variable is encountered. If you assign a value other than &#8221; to TEMPLATE_STRING_IF_INVALID, you will experience rendering problems with these templates and sites.</p>
<p>Generally, TEMPLATE_STRING_IF_INVALID should only be enabled in order to debug a specific template problem, then cleared once debugging is complete</p></blockquote>
<p>Oops, that&#8217;s exactly what I don&#8217;t want.   In practice this was not as bad as I thought it would be, but it was not good, and it made my life harder because the time between making a typo in a template and finding the problem increased, which also increased the dificulty of finding the cause of the problem. </p>
<p><strong>My other frustration with Django Templates</strong></p>
<p>Beyond that, the fact that Django template sandboxing excludes all expressions pushes lots and lots of work into filters and up into the &#8220;views&#8221; which other frameworks call &#8220;controllers&#8221; and means that django views mix <strong>presentation</strong> and <strong>action</strong> logic even more than is common in other MVC like web frameworks (Rails, Pylons, TurboGears, etc.).</p>
<p>Having a full featured experssion language like <strong>python</strong> in templates has been very useful to me in capturing presentation logic <strong>in the template</strong>. </p>
<p>And at the same time creating anything like a &#8220;<strong><a href="http://jinja.pocoo.org/2/documentation/templates#macros">macro</a></strong>&#8221; or a &#8220;<strong><a href="http://genshi.edgewall.org/wiki/Documentation/xml-templates.html#id4">template function</a></strong>&#8221; (a bit of reusable template code) requires some <a href="http://docs.djangoproject.com/en/dev/howto/custom-template-tags/">slightly complicated</a> python gymnastics.  </p>
<p>I&#8217;m certainly no MVC purist, but I think that in the new post web-2.0 world where applications have HTLM frontends, rich javascript front-ends, and even flex/silverlight clients, it makes a lot of sense to keep presentation logic out of the &#8220;view/controller&#8221; and let that focus on handling HTTP requests, and marshaling the data required by whatever presentation technology (html, html+javascript, flex, rich-client + JSON, or whatever) you happen to use.  </p>
<p>And I really want to be able to have code-reuse in templates without jumping through hoops.   That&#8217;s part of what a template language is <strong>for</strong>, so I really don&#8217;t like giving it up. </p>
<p><strong>Conclusion</strong></p>
<p>With all of that said, if the benifits of Django (reusable apps mainly) are important to your project, you should use Django, and if you are using Django you <strong>absolutely should</strong> use Dango Templates.    They aren&#8217;t bad really.   It&#8217;s just that I&#8217;m used to the other options that do it better.</p>
<p>So, ultimately if you&#8217;re not already using Django, I think you should consider one of the other options, as I think they all do better on template code reuse, and allowing fail fast behavior. </p>
<p><strong>More Soon</strong></p>
<p>Tomorrow I&#8217;ll try to write a bit more about Jinja, but I think <a href="http://lucumr.pocoo.org/2008/9/16/why-jinja-is-not-django-and-why-django-should-have-a-look-at-it">this post</a> pretty much sumarizes why I think that Django Template users outside Django proper should really just use <a href="http://jinja.pocoo.org/2/documentation/">Jinja2</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/12/09/python-template-languages-part-1-django/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Thinking about the Dip</title>
		<link>http://compoundthinking.com/blog/index.php/2009/12/02/thinking-about-the-dip/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/12/02/thinking-about-the-dip/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 12:50:42 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=222</guid>
		<description><![CDATA[I recently read Seth G&#8217;s book &#8220;the dip&#8221; which I&#8217;ve heard described variously as a book about choosing your battles, a book about quitting, or a book about mastery. And it is about all those things. Because all those things revolve around a central idea: sometimes things get harder before they get easier. That &#8220;harder&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>I recently read Seth G&#8217;s book &#8220;the dip&#8221; which I&#8217;ve heard described variously as a book about choosing your battles, a book about quitting, or a book about mastery.  </p>
<p>And it is about all those things.  Because all those things revolve around a central idea:  </p>
<blockquote><p>sometimes things get harder before they get easier. </p></blockquote>
<p>That &#8220;harder&#8221; is what Seth calls the dip.  </p>
<p>And it is is difficult, but it&#8217;s also important because it makes being on the other side more valuable &#8212; after all not just anybody is willing to work their way through that dip. </p>
<p>For Seth, there&#8217;s obviously a lot about marketing, and reaching a wide audience. Obviously, it takes work to develop a new skill, grow a network of helpful people, or sell a new product.  But given that our economy is &#8220;dipping&#8221; and that many of us have personal dips to work through, I&#8217;m finding Seth&#8217;s message very timely and relevant at the moment. </p>
<p><strong>Getting through the dip is about the choices you make</strong></p>
<p>If you&#8217;re like me and the people I know in southeast michigan, you are actually facing multiple &#8220;dips&#8221; at once.   We are struggling our way through problems at work, financial problems, interpersonal problems, and we&#8217;re trying to figure out what to do about all those things.   </p>
<p>One of the core ideas in &#8220;The Dip&#8221; is that you have to choose which battles you will fight, or you&#8217;ll loose them all.   Some battles beg to be lost.  You have to give up fighting on some fronts in order to win on others. </p>
<p>So, to go back to <a href="http://compoundthinking.com/blog/index.php/2009/12/01/things-ive-learned-about-time-management/">yesterday&#8217;s post</a>, you have to say No to some things, in order to make it through any of the dips.   You can&#8217;t have everything, you have to choose.   And once you choose, you have to make it happen. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/12/02/thinking-about-the-dip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Things I&#8217;ve learned about Time Management</title>
		<link>http://compoundthinking.com/blog/index.php/2009/12/01/things-ive-learned-about-time-management/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/12/01/things-ive-learned-about-time-management/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 14:41:42 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Personal Productivity]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[System Administration]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=613</guid>
		<description><![CDATA[It&#8217;s easy enough to say that you don&#8217;t have enough time, but the reality is that time is the medium in which we live. Complaining you don&#8217;t have enough time very much like a fish complaining that he doesn&#8217;t have enough water. So, rather than complaining about the amount of time I have, I&#8217;ve been [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s easy enough to say that you don&#8217;t have enough time, but the reality is that time is the medium in which we live.   Complaining  you don&#8217;t have enough time very much like a fish complaining that he doesn&#8217;t have enough water.   So, rather than complaining about the amount of time I have, I&#8217;ve been learning to think about my time management issues differently. </p>
<p><strong>Where David Allen lead me wrong</strong></p>
<p>The first insight I had is that Getting Things Done (GTD) has steared me wrong.   This is hard to say because I think it&#8217;s a great book with a lot of great insights.   In particular the strong admonition to get everything you need to do down on paper has changed the way I live and think.   That list includes all the major and minor commitments I&#8217;ve made, and having it out of my head and in a system that I trust reduced my stress levels imensely.  </p>
<p>But I found that I still have a lot of stress. And I found that I was still thrashing back and forth between projects without making the kind of decisive progress on any of them that I wanted to.   </p>
<p><strong>Why wasn&#8217;t the GTD process enough?</strong></p>
<p>Because, as I eventually learned the GTD &#8220;inbox processing&#8221; strategy as described in the book is broken.  You are supposed to choose between three options for each input: do it, deligate it, or defer it.   But really there&#8217;s a key fourth option that is the really important one if you&#8217;re life is anything like mine.  </p>
<p>What is that  all important forth option?</p>
<ul>
<li><strong>Don&#8217;t do it.</strong>  Say no.   Avoid adding another commitment to your list.</li>
</ul>
<p><strong>Wait, there&#8217;s <em>science</em> behind this!</strong></p>
<p>This is really critical because like any queue that&#8217;s processed by a limited resource (in this case my time and attention) filling it too full actually causes the system to break down.  This process of breakdown even has a technical name that feels exactly right, it&#8217;s called &#8220;<a href="http://en.wikipedia.org/wiki/Thrash_(computer_science)">thrashing</a>.&#8221;  </p>
<p>Every programmer and computer user knows what this is like.  Open too many apps at once, and your machine grinds to a halt, data keeps getting swapped out to disk and the rate at which the machine can process information goes down exponentially. </p>
<p>Ok, so know I knew the name for my problem.   Naming it is good, but it&#8217;s not the solution. </p>
<p><strong>So, how do I stop thrashing about and get stuff done? </strong></p>
<p>At some point, i&#8217;m not exactly sure where, I had a realization that in life, just like a manufacturing line, or a software resource issue, there are two keys to preventing thrashing.   </p>
<ol>
<li> Avoid too much multitasking.   A system spends time switching between tasks and is less efficent when time-windows for work are too small, and task-switching happens too often.</li>
<li>When multiple commitments are being made that require real-time or near real-time responses, you have to keep the task-switching window short enough that high-priority tasks can be scheduled immediately.  This, of course, creates a tension with the first principle which suggests larger time windows between task-switching.</li>
</ol>
<p>This is where Getting Things Done&#8217;s todo list system provided me with a <strong>lot</strong> of help. It helped me reduce my task-switching costs, and that&#8217;s allowed me to get a better balance on these two pressures.  </p>
<p><strong>Letting the work FLOW</strong></p>
<p>I think there&#8217;s a very clear analogy with what happened at Toyota in the early days.   Manufacturers had die presses which took a long time to change, so they would run them for a long time.  This was great in that it helped keep the machine working and limited the downtime.   But it also meant that there were long delays in the system since the switching time and the time for the long runs added up.    Toyota decided that since they couldn&#8217;t afford more machines, they needed to figure out ways to reduce the cost of switching, which reduced total cycle time, made them more responsive to bugs (quality problems) and helped them to get more done in less time.  </p>
<p>Reducing the cost of switching made it possible for the system to run differently, rather than batching up lots of work and pushing it through, it Toyota discovered that you could pull what you needed through the system just in time.  This same thing works for time management, when you aren&#8217;t overloaded you can be more responsive to today&#8217;s needs, and you avoid the inevitable mismatches that come with long delays between request and response. </p>
<p><strong>What happens when there&#8217;s still too much to do? </strong></p>
<p>But, to come back to my main point, <strong>even when you&#8217;ve done everything you can do to reduce the task-switching costs, you still can have significant thrashing problems</strong> when the resource (that&#8217;s you or me) gets overscheduled.   </p>
<p>Most projects I&#8217;ve worked on ended up in this situation at some point, where working harder stopped producing results because of schedule pressure and resource contention.   </p>
<p><strong>This is why saying no is a critical skill.</strong> </p>
<p>If you limit the commitments you make, you can provide rapid turn around on the commitements you do make, and everything runs much more smoothly because you&#8217;re thrashing less, and wasting less time on task switching. </p>
<p>Beyond the basics, I&#8217;ve discovered that one really critical notion is to have enough slack in your system to handle emergencies.  If you schedule the system full, any high-priority, high-urgency task that enters the system can break the whole process.</p>
<p><strong>Without <em>slack</em> in the system emergencies snowball&#8230;</strong></p>
<p>I know this from experience, as I&#8217;ve had my share of emergencies in the last couple of years, and when there was slack in the system things settled down quickly, and when there wasn&#8217;t I ended up with new emergencies caused by the first emergency delaying things just a little bit too much.  </p>
<p>So, when you are tempted to take on another commitment, think about what would happen to your life if you had to take a week off to deal with a death in the family, or to help a sick relative.  If you don&#8217;t see any path to recovery, perhaps you&#8217;re over-scheduling your most important resource &#8212; you.  </p>
<p><strong>When No, really means Yes</strong></p>
<p>In the end I discovered the biggest irony of time management: it&#8217;s only when you say  <strong>No</strong> to some things, that you have the ability to say <strong>Yes</strong>, and make real commitments.   </p>
<p>When you say no to helping a friend move, or to visiting family, or whatever feels valuable to you you <strong>will</strong> feel terrible.   But, if you don&#8217;t say no sometimes to at least some of these things, you&#8217;ll end up not being able to do any of those things anyway, because you&#8217;re always behind and never quite able to fulfill the commitments you make. </p>
<p>I learned the hard way, hopefully you don&#8217;t have to ;) </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/12/01/things-ive-learned-about-time-management/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Power, Authority, Force and the politics of software</title>
		<link>http://compoundthinking.com/blog/index.php/2009/11/30/power-authority-force-and-the-politics-of-software/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/11/30/power-authority-force-and-the-politics-of-software/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 20:20:44 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=728</guid>
		<description><![CDATA[Bruce Eckel recently posted &#8220;We No Longer Need Power,&#8221; and Ian Bicking recently gave a talk &#8220;Toward a new self-definition for open source&#8220;. Both raise similar points, &#8220;power&#8221; seems to be handled differently &#8212; actually they both say better &#8212; in open source communities and open spaces conferences than traditional companies. I agree, but I [...]]]></description>
			<content:encoded><![CDATA[<p>Bruce Eckel recently posted &#8220;<a href="http://www.artima.com/forums/flat.jsp?forum=106&#038;thread=267861#349892">We No Longer Need Power</a>,&#8221; and Ian Bicking recently gave a talk &#8220;<a href="http://blog.ianbicking.org/2009/09/10/a-new-self-definition-for-foss/">Toward a new self-definition for open source</a>&#8220;.  Both raise similar points, &#8220;power&#8221; seems to be handled differently &#8212; actually they both say better &#8212; in open source communities and open spaces conferences than traditional companies.</p>
<p>I agree, but I think that any discussion power politics is pretty risky, particularly since we use authority, power and force pretty interchangeably in many situations.   And it&#8217;s hard to nail down exactly what people mean because there&#8217;s some confusion even at the level of what the words mean.   </p>
<p>So, from my perspective (heavily influenced by <a href="http://en.wikipedia.org/wiki/Hannah_Arendt">Hannah Arendt</a> here&#8217;s a reasonable definition of terms: </p>
<ul>
<li><strong>Power</strong>: group action in service of some goal</li>
<li><strong>Authority</strong>: some kind of status &#8220;given&#8221; to an individual, which gives her influence over the actions of others. </li>
<li><strong>Force</strong>: the ability to make somebody do something they would not do on their own </li>
<li><strong>Violence</strong>: the act of causing of physical, social, or economic damage to an individual or group. </li>
</ul>
<p><em>( * Arednt fans should note that I am using force differently than she does.) </em></p>
<p><strong>Power and Authority in Open Source</strong></p>
<p>Open Source projects have powerful people, in that they have people who somehow manage to get a group of people to work in common on some larger goal. And there&#8217;s often some sort of formal authority which resides in the BDFL or project leaders.   Authority often centers around who has commit access and who can flip the commit bit.    But there&#8217;s very little force or violence involved, and the authority that we give is always tentative and revokable in the case of an &#8220;unfriendly&#8221; fork of the community. </p>
<p>The fact that there&#8217;s often not much money going on reduces the chance of economic violence and removes the main way that developers encounter force.   So, nobody can force you to work on stuff you don&#8217;t want to, and nobody can force you to stop working on the things you  really want to see done.  </p>
<p><strong>Open source is Force/Violence free</strong></p>
<p>At least that&#8217;s how it often seems.   But I there can be significant social pressures to work on one thing rather than another, and many people often feel like they have a right to tell you what you <strong>ought</strong> to be working on.   </p>
<p>None of this counts as force, but it does seem to indicate some imbalances in the system, where there are producers and consumers of open source and the producers seem to often feel like they can never do enough to please all of their consumers.   </p>
<p>And because there&#8217;s a lack of resources going to the producers, it&#8217;s consumers are often frustrated by the slop pace of development.  But all of that is another post for another day. </p>
<p><strong>P.S.  A Science Fiction book recommendation</strong></p>
<p>Ursula K. LeGuin wrote a great book that I&#8217;ve been thinking a lot about when talking to people about the subject of the difference between &#8220;commercial&#8221; software culture, and the somewhat anarchistic Open Source culture.   The book <a href="http://www.amazon.com/gp/product/0061054887/pragmaticsyst-20">The Dispossessed</a>,  is one of my favorite Science Fiction novels, and and though it came long before &#8220;Open Source&#8221; or even &#8220;Free Software&#8221; even existed as such, I think it has a lot to say about the strengths and limitations of the &#8220;Free Software&#8221; culture.   </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/11/30/power-authority-force-and-the-politics-of-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
