<?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 &#187; Ruby</title>
	<atom:link href="http://compoundthinking.com/blog/index.php/category/programming/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://compoundthinking.com/blog</link>
	<description>Thinking about programming in new ways</description>
	<lastBuildDate>Mon, 26 Jul 2010 17:28:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>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>Working at SourceForge</title>
		<link>http://compoundthinking.com/blog/index.php/2009/04/09/working-at-sourceforge/</link>
		<comments>http://compoundthinking.com/blog/index.php/2009/04/09/working-at-sourceforge/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 14:20:53 +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[Ruby on Rails]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=621</guid>
		<description><![CDATA[I&#8217;ve been at SourceForge for a couple of months now, it&#8217;s been great, the work is surprisingly fun and rewarding. There&#8217;s a local office, and so I actually get to g and hang out with smart people whenever I want. I can still work from home, but having someplace to go in to has been [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been at SourceForge for a couple of months now, it&#8217;s been great, the work is surprisingly fun and rewarding.   There&#8217;s a local office, and so I actually get to g and hang out with smart people whenever I want.  I can still work from home, but having someplace to go in to has been a refreshing change. </p>
<p>I haven&#8217;t gotten to know many people outside the engineering team in Dexter, but they are great guys. </p>
<p>There&#8217;s lots of good stuff happening here, support for bazar, mercurial, git, trac, and other options on SourceForge itself, improved feeds, and other API&#8217;s for getting at SF data, etc.   But I&#8217;m only peripherally  aware of all that at the moment because I was hired to work on &#8220;totally new stuff&#8221; which is written in Python. </p>
<p><strong>What I&#8217;m working on</strong></p>
<p>Our first new project is a site called <a href="http://fossfor.us">FossFor.Us</a>, and it was the vision for this site, and the team that is working on this and other new stuff, that sold me on the coming to work for Sourceforge.     It&#8217;s written in Django, and it&#8217;s been my first really large Django project, and while the experience has been pretty positive, there have been a number of things that have renewed my commitment to TurboGears development &#8212; but that&#8217;s a blog post for another day.  </p>
<p>The backstory to the FossFor.Us site is that open source project hosting providers (Sourceforge and it&#8217;s recent competitors) have traditionally been pulled in two very different directions by  two very different sets of users: </p>
<ul>
<li>developers of open source software</li>
<li>and people who just want to<em use software to do stuff</em>.</em></li>
</ul>
<p>And that tension has held us back in the past, we have to serve everybody with the same portal, and it ends up not serving either community as well as it should.   But since developers are the most vocal users, it&#8217;s been the second class of user that&#8217;s been most neglected.</p>
<p><a href="http://fossfor.us"><img src="http://compoundthinking.com/blog/wp-content/uploads/2009/04/foss_blog_image.jpg" alt="foss_blog_image" title="foss_blog_image" width="400" height="229" /></a></p>
<p>These people are just looking to get things done, and don&#8217;t care about the &#8220;project&#8221; part of open source software, they are, at least at first, only interested in the &#8220;product.&#8221;   In many ways the Free and Open Source Software community has not served these people well. </p>
<p><a href="http://fossfor.us">Fossfor.us</a> is in it&#8217;s first incarnation an attempt to create a window on the free software world, that&#8217;s just about finding and using software.   But in a larger sense it&#8217;s an attempt to help us as a community to connect with potential users better. </p>
<p><strong>I think connecting FOSS geeks and users is  actually <em>important</em><br />
</strong></p>
<p>It&#8217;s important because people aren&#8217;t aware that there are free options, and are paying for software they can&#8217;t afford.   There&#8217;s a prototypical user (based on a real person) that we talk about a lot, who&#8217;s a single mom, has an old laptop, and struggles week to week to pay her bills, but who bought Photoshop, because &#8220;that&#8217;s how you edit photos.&#8221;    Her family could have used that money to more productive ends, but because she needed to edit photos, and didn&#8217;t know about the free alternatives all those opportunities are just lost.    </p>
<p>Of course the same thing is true of small business owners, who could use free software to reduce their &#8220;overhead&#8221; costs, and actually spend money on creating things people love.   Free software has the potential to lubricate the wheels of the economy, encourage entrepreneurial activity, and enrich people&#8217;s lives.    </p>
<p>All of this is to say I think <a href="http://fossfor.us">fossfor.us</a> is a way to serve the world by making the product of all the open source developer&#8217;s labor more easily available and more accessible to real people.   And when my mom actually used it to find some software a couple weeks ago, I knew we&#8217;d done something right.</p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2009/04/09/working-at-sourceforge/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Just say no to &#8220;software engineering&#8221;</title>
		<link>http://compoundthinking.com/blog/index.php/2008/11/24/just-say-no-to-software-engineering/</link>
		<comments>http://compoundthinking.com/blog/index.php/2008/11/24/just-say-no-to-software-engineering/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 04:42:33 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[Philosophy]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=524</guid>
		<description><![CDATA[I was reading Jacob Kaplan-Moss&#8217;s blog article on &#8220;syntactic sugar&#8221; and I realized that there&#8217;s something sitting just below the surface of what he&#8217;s saying, something important, something counter to the standard &#8220;software development is an engineering discipline&#8221; view of our work. Jacob rails against those who say the differences between modern computer languages amount [...]]]></description>
			<content:encoded><![CDATA[<p>I was reading Jacob Kaplan-Moss&#8217;s blog article on &#8220;<a href="http://www.jacobian.org/writing/syntactic-sugar/">syntactic sugar</a>&#8221; and I realized that there&#8217;s something sitting just below the surface of what he&#8217;s saying, something important, something counter to the standard &#8220;software development is an engineering discipline&#8221; view of our work. </p>
<p>Jacob rails against those who say the differences between modern computer languages amount to nothing more than &#8220;syntactic sugar.&#8221;  Ultimately he argues that: <strong>Syntactic sugar matters.</strong> </p>
<p>Sure it makes no &#8220;technical&#8221; difference but it does make a huge difference &#8212; because <em> it changes the way we think</em> about writing software.  </p>
<p>I&#8217;ll loop back to that in a second, but first a quick detour through another recent blog post:</p>
<blockquote><p>Eventually you come to realize that in order to truly succeed, you have to write programs that can be understood by <em>both the computer and your fellow programmers</em>.</p>
<p>Of all the cruel tricks in software engineering, <strong>this has to be the cruelest</strong>&#8230;. Even when you&#8217;re writing code explicitly intended for the machine, you&#8217;re still writing. For other people. Fallible, flawed, distracted human beings just like you. And that&#8217;s the truly difficult part.
</p></blockquote>
<p>&#8211;<a href="http://www.codinghorror.com/blog/archives/001184.html">Jeff Attwod</a></p>
<p>The thread that ties both of these together is that they highlight the way that people and by people I mean software developers, tend to forget is that <strong>code is always two things</strong>: </p>
<ul>
<li>A series of instructions or declarations processed by a computer.</li>
<li>A series of instructions or declarations processed by one or more human beings.</li>
</ul>
<p><a href="http://compoundthinking.com/blog/wp-content/uploads/2008/11/istock_000002486766xsmall.jpg"><img src="http://compoundthinking.com/blog/wp-content/uploads/2008/11/istock_000002486766xsmall.jpg" alt="" title="Gear Head" width="247" height="246" align = 'right' /></a>Code is a machine construct, but it&#8217;s also a social construct.   Software engineering is a strange name for our discipline, since the hard work of programming isn&#8217;t just getting code that machines can run, but in creating abstractions that allow human beings to learn, understand, and evolve the code over time.  We didn&#8217;t invent Structured Programming, or Object Oriented Programming because they help the computer understand what we mean &#8212; we created them because they provide us with tools to help us <em>as human beings</em> to be able to understand the code we write.  </p>
<p>Non-software Engineers aren&#8217;t concerned primarily with the practice of communicating complex thoughts and ideas to others.  This is a vast oversimplification,  but I think it&#8217;s fair to say that they are interested in constructing mathematical models of how things things behave, so that they can build stuff that works.  </p>
<p>But that&#8217;s not what we are, we are creative writers, we invent new ways of thinking about the world, and we try to communicate them to each other every day.   </p>
<p>Software Engineers do create incredibly complex systems, and operate under constraints that other writers do not &#8212; what we write has two audiences, one human, and one non-human.   Writing for the non-human audience alone will result in code that&#8217;s incomprehensible to other programmers, but the opposite is also true.   Computer programming is hard &#8212; and it&#8217;s hard for a very specific reason  &#8212; because it requires thinking like other people, and not thinking like people at all. </p>
<p>Fortunately, the problem is simplified a bit by the fact that other programmers have learned at least somewhat to think like silicon and metal, so you can lean a little bit in that direction and still be understood.  But still you have a very exacting, very alien audience, and a very exacting, very human one &#8212; and programming languages must be designed to balance the needs of both.</p>
<p>So, perhaps we ought to stop calling ourselves software developers, software architects, or software engineers, and start calling ourselves software writers.  </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2008/11/24/just-say-no-to-software-engineering/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>REST is a design for the long run</title>
		<link>http://compoundthinking.com/blog/index.php/2008/10/20/rest-is-a-design-for-the-long-run/</link>
		<comments>http://compoundthinking.com/blog/index.php/2008/10/20/rest-is-a-design-for-the-long-run/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 18:46:30 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=511</guid>
		<description><![CDATA[Found this quote in a recent discussion or REST. REST is software design on the scale of decades: every detail is intended to promote software longevity and independent evolution. Many of the constraints are directly opposed to short-term efficiency.]]></description>
			<content:encoded><![CDATA[<p>Found this quote in a <a href="http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven">recent discussion</a> or REST. </p>
<blockquote><p>REST is software design on the scale of decades: every detail is intended to promote software longevity and independent evolution. Many of the constraints are directly opposed to short-term efficiency.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2008/10/20/rest-is-a-design-for-the-long-run/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Threads, Processes, Rails, TurboGears, and Scalability</title>
		<link>http://compoundthinking.com/blog/index.php/2008/05/14/threads-processes-rails-trubogears-and-scalability/</link>
		<comments>http://compoundthinking.com/blog/index.php/2008/05/14/threads-processes-rails-trubogears-and-scalability/#comments</comments>
		<pubDate>Wed, 14 May 2008 00:30:24 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=306</guid>
		<description><![CDATA[Threads may not be be best way, or the only way, to scale out your code. Multi-process solutions seem more and more attractive to me. Unfortunately multi-process and the JVM are currently two tastes that don&#8217;t taste great together. You can do it, but it&#8217;s not the kind of thing you want to do too [...]]]></description>
			<content:encoded><![CDATA[<p>Threads may not be be best way, or the only way, to scale out your code.   Multi-process solutions seem more and more attractive to me.</p>
<p>Unfortunately multi-process and the JVM are currently two tastes that don&#8217;t taste great together.   You can do it, but it&#8217;s not the kind of thing you want to do too much.   So, the Jruby guys had a problem &#8212; Rail&#8217;s scalability story is only multi-process (rails core is NOT thread safe), and Java&#8217;s not so good that that&#8230;. </p>
<p>Solution:  Running &#8220;multiple isolated execution environments&#8221; in a single java process.</p>
<p>I think that&#8217;s a neat hack.    The JRuby team is to be congratulated in making this work.  It lets Rails mix multi-process concurrency with multi-threaded concurrency, if only on the JVM.  But it&#8217;s likely to incur <em>some</em> memory bloat, so it&#8217;s probably not as good as it would be if Rails itself were to become threadsafe. </p>
<p><a href='http://compoundthinking.com/blog/wp-content/uploads/2007/01/istock_000000305278small.jpg'><img align="left" src="http://compoundthinking.com/blog/wp-content/uploads/2007/01/istock_000000305278small.jpg" alt="" title="Gears" width="300" height="199" class="alignright size-medium wp-image-191" /></a><br />
I&#8217;m not sure that the Jython folks have done anything like this.   And I&#8217;m not sure they should.   It&#8217;s a solution python folks don&#8217;t really have.  Django used to have some thread-safety issues, but those <a href="http://groups.google.com/group/django-users/msg/484af837e2e08cf9">have been worked out</a> on some level.  While the Django people aren&#8217;t promising anything about thread safety,  it seems that there are enough people using it in a multi-threaded environment to notice if anything&#8217;s not working right.   </p>
<p>At the same time, TurboGears has been threadsafe, from the beginning, as has Pylons, Zope, and many other python web dev tools.  The point is, you have good web-framework options, without resorting to multiple python environments in one JVM. </p>
<p><strong>Why you actually want multi-threaded execution&#8230;<br />
</strong></p>
<p>In TurboGears we&#8217;ve found that the combination of <em>both multi-threaded and multi-process</em> concurrency works significantly better than either one would alone. This allows us to use threads to maximize the throughput of one process up to the point where python&#8217;s interpreter lock becomes the bottleneck, and use multi-processing to scale beyond that point, and to provide additional system redundancy. </p>
<p>A multi threaded system is particularly important for people who use Windows, which makes multi-process computing much more memory intensive than it needs to be. As my Grandma always said Windows &#8220;can&#8217;t fork worth a damn.&#8221;  ;)  </p>
<p>But, given how hard multi-threaded computing can be to get right TurboGears and related projects work hard to keep our threads isolated and not manipulate <em>any</em> shared resources across threads.  So, really it&#8217;s kinda like shared-memory optimized micro-processes running inside larger OS level processes, and that makes multi-threaded applications a lot more reasonable to wrap your brain around.   Once you start down the path of lock managment the non-deterministic character of the system can quickly overwhelm your brain.  </p>
<p>As far as i can see, the same would be true for a Ruby web server in Ruby 1.9, where there is both OS level thread support and an interpreter lock. </p>
<p>I&#8217;m well aware of the fact that stackless, twisted, and Nginx have proved that there are other (asynchronous) methods that can easily outperform the multi-threaded+multi-process model throughput/concurrency per unit of server hardware.   The async model requires thinking about the problem space pretty differently, so it&#8217;s not a drop in replacement, but for some problems async is definitely <em>the</em> way to go.  </p>
<p>Anyway, hats off to the Jruby team, and here&#8217;s hoping that Rails itself becomes threadsafe at some point in the future. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2008/05/14/threads-processes-rails-trubogears-and-scalability/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>For some (very small) values of done&#8230;</title>
		<link>http://compoundthinking.com/blog/index.php/2008/05/05/for-some-very-small-values-of-done/</link>
		<comments>http://compoundthinking.com/blog/index.php/2008/05/05/for-some-very-small-values-of-done/#comments</comments>
		<pubDate>Mon, 05 May 2008 12:56:32 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=307</guid>
		<description><![CDATA[What does done mean? Somebody was telling me that Ruby 1.9 was &#8220;pretty much done&#8221; last night. What is Ruby 1.9? Do we have a spec? A test suite? Anything? If the answer is no, it&#8217;s not ready. &#8211;Charels Nutter (in a comment here) Partly that&#8217;s because Charels wants 1.9 as a reference implementation &#8212; [...]]]></description>
			<content:encoded><![CDATA[<p>What does done mean?   Somebody was telling me that Ruby 1.9 was &#8220;pretty much done&#8221; last night.   </p>
<blockquote><p>What is Ruby 1.9? Do we have a spec? A test suite? Anything? If the answer is no, it&#8217;s not ready.</p>
<p>&#8211;Charels Nutter (in a comment <a href="http://headius.blogspot.com/2008/04/promise-and-peril-for-alternative-ruby.html">here</a>)
</p></blockquote>
<p>Partly that&#8217;s because Charels wants 1.9 as a reference implementation &#8212; not just usable interpreter. </p>
<p>But, that highlights one of the reasons I like the way python is developed.   There is a test suite, there is a reasnably complete set of specifications.   So, from here, it looks like Python 3 is a lot &#8220;more done&#8221; than Ruby 1.9.   But that&#8217;s OK, they are both way more done that Perl 6. ;)   </p>
<p>I&#8217;m still looking forward to Ruby 1.9, and python 3.0.  </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2008/05/05/for-some-very-small-values-of-done/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>So many revolutions, so little time.</title>
		<link>http://compoundthinking.com/blog/index.php/2008/04/30/so-many-revolutions-so-little-time/</link>
		<comments>http://compoundthinking.com/blog/index.php/2008/04/30/so-many-revolutions-so-little-time/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 16:28:22 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[IT Management]]></category>
		<category><![CDATA[Lean IT]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[SE Michigan Tech]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/?p=305</guid>
		<description><![CDATA[Tim Bray is blogging about &#8220;inflection points&#8221; in the uptake of various technologies. Python get&#8217;s a very positive review: Today you’d be nuts not to look seriously at PHP, Python, and Ruby. So, the rise of the so-called scripting languages is one of the inflection points, but it&#8217;s not the only one. He singles out [...]]]></description>
			<content:encoded><![CDATA[<p>Tim Bray is blogging <a href="http://www.tbray.org/ongoing/When/200x/2008/04/24/Inflection">about &#8220;inflection points&#8221;</a> in the uptake of various technologies. </p>
<p>Python get&#8217;s a very positive review: </p>
<blockquote><p>Today you’d be nuts not to look seriously at PHP, Python, and Ruby.</p></blockquote>
<p>So, the rise of the so-called scripting languages is one of the inflection points, but it&#8217;s not the only one.  </p>
<p>He singles out web-framework development as one place where there&#8217;s a lot of stuff happening, and a lot of new &#8220;rails-like&#8221; frameworks are cropping up all the time.   TurboGears will live or die in the context of a much larger web-development revolution, and we need to be prepared to make our way forward in the midst of that. </p>
<p>What comes after rails will not be a rails clone.  It will learn the right lessons from rails, avoid the pitfalls of rails, but it will also need to carve out something new and better than rails.    For RDBMS users, I think the key difference between TG and Rails is the power and flexibility of SQLAlchemy.   We need to &#8220;sell&#8221; this better.</p>
<p>There are a lot of other revolutions coming <a href="http://www.tbray.org/ongoing/When/200x/2008/04/24/Inflection">according to Tim</a>.   And I do think we&#8217;re looking at big changes in terms of everything from programming language choice, to web-development tools, to end-user desktops, and data persistence mechanisms.    We&#8217;re also just beginning to see what the world of high-end javascript and other &#8220;rich&#8221; internet applications is going to do to our view of end-user software.  </p>
<p>He doesn&#8217;t even mention the rise of EC2 and the Google App Engine as sea-changes in the way we buy computational resources, and I think that&#8217;s going to have a huge impact.  </p>
<p>In the end my prediction is that the way we develop applications will change more in the next 5 years than it did in the last 5, and it&#8217;s time to start getting our heads wrapped around these issues, or we&#8217;ll be left behind. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2008/04/30/so-many-revolutions-so-little-time/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>JVM as platform for dynamic languages?</title>
		<link>http://compoundthinking.com/blog/index.php/2008/02/27/jvm-as-platform-for-dynamic-languages/</link>
		<comments>http://compoundthinking.com/blog/index.php/2008/02/27/jvm-as-platform-for-dynamic-languages/#comments</comments>
		<pubDate>Wed, 27 Feb 2008 19:05:58 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/index.php/2008/02/27/jvm-as-platform-for-dynamic-languages/</guid>
		<description><![CDATA[Martin Fowler recently blogged about how to choose between the emerging JRuby and Groovy scripting languages on the JVM. He pretty much ignores both Rhino, and Jython, which is strange since Jython is the grand-daddy of dynamic languages on the JVM, and Rhino seems to have the most internal support from Sun, and has been [...]]]></description>
			<content:encoded><![CDATA[<p>Martin Fowler recently blogged about how to choose between the emerging JRuby and Groovy scripting languages on the JVM.  He pretty much ignores both Rhino, and Jython, which is strange since Jython is the grand-daddy of dynamic languages on the JVM, and Rhino seems to have the most internal support from Sun, and has been getting some serious press in the blogosphere.  And I think his failure to address Jython, and Rhino reduces the value of the article. </p>
<p>But he does, finally, at the end of his article, he get around to a quick mention of Jython in the context of asking a bigger question: </p>
<blockquote><p>Will either matter to Java? After all Jython&#8217;s been around for a long time without making a huge impact on the JVM. Tool support is frankly pathetic for any of these languages when you compare it to what you have for Java at the moment.</p></blockquote>
<p>This question is skating right around <strong>the critical issue,</strong> without ever touching it directly. </p>
<p><strong>Why is there so little uptake for dynamic languages on the JVM?  And what will it take to change that? </strong> </p>
<p>Another way to ask the same question would be: We have a lot of deep experience with C integration in the Perl/Python/Ruby communities, but there is no such deep experience with the JVS as a platform for scripting languages.  <strong>Why?</strong></p>
<p>To sharpen the question a bit further, we should note that the Jython/java integration story is in many ways<strong>better</strong> than the Python/C story.  In Python 2.5, c-types makes using C libraries from python easier than ever &#8212; but you don&#8217;t have to do <em>anything special at all</em> to use Java libraries from jython. In spite of this, Jython and all the other new &#8220;dynamic languages&#8221; on the JVM have not become a popular way to work with Java libraries. </p>
<p><strong>Why?</strong></p>
<p>I&#8217;m going to address this from the perspective of  Jython user, because that&#8217;s the JVM/dynamic language experience that I have. But, I&#8217;ve played with Jruby enough to know that the issues are similar. </p>
<p>One problem that seems to stop python programmers from flowing over into Jython easily is the impedance mismatch between the way things are done in Python and the way they would be done in Java. As a python developer you find yourself constantly switching mental gears to write anything complex in Jython.   You&#8217;re thinking about the python code you&#8217;d write, and things sort of flow until you run up to something in a java library which requires you to <em>look at the world in a fundamentally different way. </em></p>
<p>Of course, the same is could be said to be true of Python and C.  Sure, you could argue that C programmers and python have more similar pragmatic approach to library development, but I don&#8217;t think that&#8217;s the main difference.  The main difference is that developers tend to &#8220;wrap&#8221; C libraries and provide &#8220;pythonic&#8221; bindings which reduce the impedance mismatch.   Nobody seems to do this in jython, partly because it&#8217;s just too easy to ignore the need for good pythonic API&#8217;s and just <em>get something done</em>.  It seems that easy is sometimes the enemy of good &#8212; which is definitely not news to any experienced programmer. </p>
<p>But, perhaps there is another possible reason, is that the JVM was written explicitly for java, and is not particularly friendly to dynamic languages.   Reflection is slow, and in general features used by dynamic languages haven&#8217;t been a priority for the JVM.   Fortunately there&#8217;s some <a href="http://openjdk.java.net/projects/mlvm/subprojects.html">work happening already</a> to make the JVM a much, much friendlier place for dynamic languages.   But I don&#8217;t expect that Jython is going to be faster than C Python any time soon.  So that, means that the JVM as a platform needs to offer something more than just a good way to implement python. I&#8217;ve heard some rumblings from the Jython team that this may not be a significant factor in the future, but it&#8217;s certainly colored people&#8217;s perceptions in the past.   </p>
<p>This brings us back to the fundamental nature of the JVM as a viable platform.   It&#8217;s one thing to have languages that run on the JVM, and call that the platform, but the language and the managed runtime environment are only part of the picture &#8212; in my experience the platform is defined as much by it&#8217;s libraries as anything else. </p>
<p>I think this is the main problem that the JVM will face as it evolves into a multi-language platform over the next few years &#8212; the java standard library is <a href="http://blogs.concedere.net:8080/blog/discipline/software+engineering/?permalink=The-Sad-History-of-Complexity-Pt-1.html">complex</a> in unexpected ways (how do you open a file and process it line by line &#8212; I always have to look it up?) and that makes it difficult to use as the foundation for a vibrant scripting platform.   </p>
<p>If however people aren&#8217;t working with java libraries, you&#8217;re just running Jython on the JVM, and all you get is a slower slightly more out of date version of Python, with fewer libraries, and that&#8217;s not a very compelling case.   Perhaps you need to run on the JVM for political reasons, or you need access to one of the java libraries that don&#8217;t have an obvious python equivalent, like i-text or lucene.   But except for those relatively narrow use cases, why wouldn&#8217;t you stick with CPython? </p>
<p><strong>The Microsoft threat</strong></p>
<p>Microsoft intentionally has worked to create libraries that make sense for C# users, but which are accessible from languages like VB.net, and IronPython.   Thus they have created an alternative Python platform which is much more interesting than Jython.   And to be successful in turning the JVM into a multi-language platform I think something similar needs to happen to Java.  </p>
<p>At least right now, the situation the way that Groovy, Jython, Scala and JRuby have been implemented makes it unclear how well you&#8217;ll be able to integrate libraries written in one of these languages with libraries from another. Effectively this places Java libraries at the center, and relegates dynamic languages to &#8220;second class&#8221; status. At this moment, writing libraries in Jython that would be in an attempt to make them usable to Jruby and Groovy folks seems like a fools errand.  </p>
<p>So, having a common core of reusable libraries written in Java seems like a key ingredient in making the JVM a better platform.   These libraries would have to be built: </p>
<p>* with multi-language reuse in mind<br />
* in ways that don&#8217;t require lots of boilerplate code<br />
* to work well with dynamically typed languages </p>
<p>That kind of standard library would benefit <strong>all</strong>of these new players on the JVM.   And that&#8217;s what I think Sun ought to invest in if they want the JVM to become a platform that JRuby, Jython, Scala, Groovy, and whatever else comes next, can thrive. </p>
<p><strong>Another Microsoft Threat</strong></p>
<p>At the same time, Microsoft has been widening the gap in another way, by introducing the DLR &#8212;  a new set of tools for dynamic language implementors.   </p>
<p>Much of the thinking behind the DLR comes from Jim Hugunin (the original implementor of Jython), and if it works the DLR will help to make dynamic languages first class citizens on the Microsoft CLR since you will be able to use them to write libraries that are cross-compatible, making IronPython libraries usable in IronRuby, etc. </p>
<p>The aforementioned project to make the JVM more friendly to dynamic languages is a good place for language implementors to work together.   And it would be very interesting to see the jython, jruby, and other language implementors get together and provide a good solid answer to the DLR.    I&#8217;ve been talking to some of the Jython guys this week, and they tell me that this is happening, and that a lot of the work is already done.   </p>
<p>Given the politics of language communities, and the necessities of the Open Source development model, I&#8217;m sure this has been more  difficult than it could have been, so I&#8217;m very excited to hear that the people involved have taken the time to make that happen.  I haven&#8217;t seen a lot of talk about this on the internets, but it looks like people are quietly doing the right thing without running the hype machine in overdrive which is refreshing. </p>
<p>After talking to the Jython guys this week, I&#8217;m actually pretty optimistic about the JVM.  It&#8217;s growing in a direction that provides a solid memory-managed platform for the dynamic languages of the present and future, and it could become a platform for collaboration between language developers.   </p>
<p>The CLR could do the same thing, but I want to see it happen on the JVM, because that would make it free in all the important senses of the word. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2008/02/27/jvm-as-platform-for-dynamic-languages/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>TurboGears 2 sprint</title>
		<link>http://compoundthinking.com/blog/index.php/2007/10/15/turbogears-2-sprint/</link>
		<comments>http://compoundthinking.com/blog/index.php/2007/10/15/turbogears-2-sprint/#comments</comments>
		<pubDate>Mon, 15 Oct 2007 13:43:36 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[IT Management]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/index.php/2007/10/15/turbogears-2-sprint/</guid>
		<description><![CDATA[I&#8217;ll be hosting a TG2 sprint here in Ann Arbor Michigan on October 27th, hopefully we&#8217;ll also have a large virtual presence from folks around the world. I&#8217;ve created a page on the Wiki for Sprint Organization tasks: http://docs.turbogears.org/SprintOrganization If the sprint goes well it could get us very, very close to the point where [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll be hosting a TG2 sprint here in Ann Arbor Michigan on <strong>October 27th</strong>, hopefully we&#8217;ll also have a large virtual presence from folks around the world. </p>
<p>I&#8217;ve created a page on the Wiki for Sprint Organization tasks: <a href="http://docs.turbogears.org/SprintOrganization">http://docs.turbogears.org/SprintOrganization</a></p>
<p>If the sprint goes well it could get us very, very close to the point where we could reasonably do a TurboGears 2 technology preview release.   </p>
<p>The main things we&#8217;ll need to do is sync up with the latest pylons, improve our tests, and do some basic doc organization work (migrate some information from the doc strings to the docs wiki, and create some pages which link to external docs).   There&#8217;s lots of other things I want to do like improve out user authentication/authorization/registration support, or create a toolbox tool for helping create SQLAlchemy models. So, there&#8217;s tasks for anybody who can lend a hand.  </p>
<p>If you&#8217;re available and want to help out (either attending physically or virtually), feel free to add your name to the <a href="http://docs.turbogears.org/SprintOrganization">wiki</a>.</p>
<p>Likewise, if you can host a in-person sprint in another location, please feel free to edit the wiki with that information.</p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2007/10/15/turbogears-2-sprint/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Relational Databases as an &#8220;implementaiton detail?&#8221;</title>
		<link>http://compoundthinking.com/blog/index.php/2007/09/29/relational-databases-as-an-implementaiton-detail/</link>
		<comments>http://compoundthinking.com/blog/index.php/2007/09/29/relational-databases-as-an-implementaiton-detail/#comments</comments>
		<pubDate>Sat, 29 Sep 2007 18:03:49 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/index.php/2007/09/29/relational-databases-as-an-implementaiton-detail/</guid>
		<description><![CDATA[I found this little tidbit in amidst the hugely overraught comment treads on Derik&#8217;s post describing his return to PHP from the wonderful world of Ruby on Rails: I loved the part about the database as an &#8220;implementation detail.&#8221; That sings to me. &#8211;Daniel Waite And, in spite of the poetic hyperbole of folks like [...]]]></description>
			<content:encoded><![CDATA[<p>I found this little tidbit in amidst the hugely overraught comment treads on<a href="http://www.oreillynet.com/ruby/blog/2007/09/7_reasons_i_switched_back_to_p_1.html"> Derik&#8217;s post</a> describing his return to PHP from the wonderful world of Ruby on Rails: </p>
<blockquote><p>I loved the part about the database as an &#8220;implementation detail.&#8221; That sings to me.</p></blockquote>
<p>&#8211;<a href="http://www.rabbitcreative.com/">Daniel Waite</a></p>
<p>And, in spite of the poetic hyperbole of folks like Daniel, I think relational databases exist for good reasons and knowing about how they work is a good thing.  Active record treats the database kinda like a big hash table in the sky, which is OK for some applications, but not so OK for others.</p>
<p>I find that large, complex apps have a way of growing in unexpected ways over time &#8212; and relational algebra is much better designed to handle unexpected requests for complex datasets than hash tables or even the most well designed objects.   SQL, and relational algebra are implementation details in the same way that using a hammer is an implementation detail in building a tree house.   Sure you can do without, but you will have a harder time, and will definitely <em>end up building a  different treehouse!</em><em><br />
</em><br />
<img align="left" src='http://compoundthinking.com/blog/wp-content/uploads/2007/09/istock_000002108956xsmall.jpg' alt='Database' /> </p>
<p>Don&#8217;t misunderstand me, Object&#8217;s are good things, and I sure as hell hope people understand them, use them, and make great software with them.  But relational algebra is a good thing too.   And it&#8217;s  become clear that any really good database toolkit can&#8217;t forsake one in favor of the other, and that&#8217;s why SQLAlchemy, Storm, DejaVu, and Hibernate are all better tools than Rails&#8217; Active Record.   </p>
<p>As for Derik&#8217;s original article.  In spite of all the brouhaha, Derek&#8217;s post basically says: &#8220;hey I liked Rails, and I learned a lot about good programming from it.  And ultimately it was easier to get my site rewrite done in PHP because I learned rails first.&#8221;   </p>
<p>I think it&#8217;s obvious that Rails could have done the job for Derek, but two things got in the way:</p>
<ul>
<li> everything was already in PHP so Rails wasn&#8217;t and incremental update, it was a rewrite.</li>
<li>Active Record got in the way of using SQL as a relational algebra engine, rather than a glorified hash persistence mechanism.</li>
</ul>
<p>TurboGears users should pay attention to both points.  If you have a large complex app, you&#8217;ll be better off with an ORM that treats SQL as a full partner, which is why we&#8217;re migrating the defaults to SQLALchemy which does a fantastic job of making <strong>both</strong> relatinal algebra, and object oriented programming part of it&#8217;s core. </p>
<p>The second point is much harder to deal with, but if you can wrap existing application functionality in a larger TurboGears app, and migrate it piece by piece you&#8217;ll definitely have more success.  I&#8217;ve been doing a lot of Web Service architecture stuff this year, and that&#8217;s proven to be a great way to connect existing resources to TurboGears applications. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2007/09/29/relational-databases-as-an-implementaiton-detail/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Change the World &#8212; One Program at a Time</title>
		<link>http://compoundthinking.com/blog/index.php/2007/05/23/change-the-world-one-program-at-a-time/</link>
		<comments>http://compoundthinking.com/blog/index.php/2007/05/23/change-the-world-one-program-at-a-time/#comments</comments>
		<pubDate>Wed, 23 May 2007 03:38:07 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/index.php/2007/05/23/change-the-world-one-program-at-a-time/</guid>
		<description><![CDATA[This is a very late comment about Pycon2007. At that conference one Ruby/Rails book author said something like; &#8220;I really like the vibe here. Everybody here is talking about making a difference, educating third world children, building better communities, and making the world a better place.&#8221; And he was setting this as a stark contrast [...]]]></description>
			<content:encoded><![CDATA[<p>This is a very late comment about Pycon2007.   </p>
<p>At that conference one Ruby/Rails book author said something like; &#8220;I really like the vibe here.   Everybody here is talking about making a difference, educating third world children, building better communities, and making the world a better place.&#8221;  And he was setting this as a stark contrast to his experience of RailsConf where &#8220;everybody was talking about how much money they made.&#8221; </p>
<p>On one level it&#8217;s hard to fault the Rails conf people for this.  Money does on some level validate what they&#8217;ve been doing, and it <em>is</em>good to feel that kind of validation.  </p>
<p>But, I think it&#8217;s fair to say that the Rails people have been too focused on proving something, and that has lead to a perception that many rails folks have a chip on their shoulder, or are totally focused on money as a metric of success.  The extent that some elements in the Rails community have embraced this perception (as <a href="http://www.martinfowler.com/bliki/RailsConf2007.html">mentioned</a> on Martin Fowler&#8217;s recent blog posting), is actually a bit frighting. </p>
<p>So, I think Chad is doing exactly the right thing by encouraging the Rails community to take a look at how they can improve their image.  A couple days ago Chad posted a blog entry entitled &#8220;<a href="http://www.chadfowler.com/2007/5/19/changing-the-world">Change the world</a>&#8221; and I hope that it makes an impact in the Rails community.  I definitely see Chad Fowler many of the other members of the Rails community that I know personally as good guys, and I&#8217;d like to see the current negative stereotyping of the rails community come to an end.    </p>
<p>I&#8217;d like to see the Rails community as a whole step up to the plate, and focus their attention and marketing efforts on new projects with altruistic goals.  Turn the whold Buzz machine towards something that will really change people&#8217;s lives &#8212; replacing Java just isn&#8217;t a worthwhile goal when compared with helping to feed hungry people. </p>
<p>So, in the hope that a little good natured competition can spur things forward, I&#8217;d just like to mention that I think the Python community is beating the pants off of the rails community in the change the world department.  Here are a couple of projects that I could think of off of the top of my head which the Python community is working on:  </p>
<ul>
<li><a href="http://irrepressible.info/">Irrepressible.info</a> &#8212; which is focused on fighting censorship</li>
<li>the <a href="http://www.laptop.org/">OLPC project</a> &mdash; which aims to bring better educational materials to millions of underprivileged childeren around the world</li>
<li>the <a href="http://www.openplans.org/">Open Planning Project </a>&#8211; which aims to provide tools for grass roots community improvement tools.</li>
</ul>
<p>On another note, over the last 6 months or so Compound Thinking has been been working for Philantech on a project called <a href="http://www.philantech.com/products.htm">PhilanTrack</a> which takes a slightly different tack.   The goal of the Philantrack project is to make it easier to manage the process of giving, receiving and reporting on grants.   </p>
<p>The idea is that &#8220;greasing the wheels&#8221; of grant giving, and allowing non-profit organizations to focus more on <em>doing the work</em>, will make the nonprofits more efficient, more fun, and ultimately make the world a better place.</p>
<p>We may not think about it, but we geeks have a lot of individual power, and collectively we really can make the world a better place.  If you&#8217;re working on a Rails or Python app that can change the world for the better, drop a comment here and let us all know. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2007/05/23/change-the-world-one-program-at-a-time/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>TurboGears 1.1 Sprint May 26th</title>
		<link>http://compoundthinking.com/blog/index.php/2007/05/15/turbogears-11-sprint-may-26th/</link>
		<comments>http://compoundthinking.com/blog/index.php/2007/05/15/turbogears-11-sprint-may-26th/#comments</comments>
		<pubDate>Tue, 15 May 2007 01:56:30 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[SE Michigan Tech]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/index.php/2007/05/15/turbogears-11-sprint-may-26th/</guid>
		<description><![CDATA[I&#8217;m trying to help organize a globally distributed TurboGears sprint for may 26th. And it would be a great place to get your feed wet with developing for the TurboGears core. So, if you&#8217;re up for a learning experience, and you&#8217;ve got some time it would be great if you could lend a hand. If [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://compoundthinking.com/blog/wp-content/uploads/2007/05/istock_000000305278small.jpg' alt='GearWoman' align="right" style="width:300px"/>I&#8217;m trying to help organize a globally distributed TurboGears sprint for may 26th.  And it would be a great place to get your feed wet with developing for the TurboGears core.   So, if you&#8217;re up for a learning experience, and you&#8217;ve got some time it would be great if you could lend a hand. </p>
<p>If anybody is willing to show up in Ann Arbor, I can provide food, a place to hack, and some good clean post-sprint debauchery.  For, unfortunately those sprinting outside of the Ann Arbor area will have to provide their own space, food, and most of all their own debauchery. </p>
<p>If you&#8217;re interested in participating in the sprint, please join the Sprint Coordination  mailing list.   </p>
<p>We&#8217;ve got folks committed to: </p>
<ul>
<li>Migrating test infrastructure to CherryPy 3</li>
<li>Finalizing the TurboGears 1.1 configuration system, and implementing what we decide on </li>
<li>Workiing on the turbogears SQLAlchemy integration to make it easier to use multiple databases</li>
<li>Doing some general clean up of open tickets</li>
</ul>
<p>My personal goal is to help get the trunk into a usable state, which means tackling the configuration issue.   Once people can run their existing projects on the trunk, TG developers (like me) will be able to do our daily work on turbogears projects on the trunk.    Which in turn should help us to attract more developers and testers and continue to make TurboGears a great tool for rapid web application development. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2007/05/15/turbogears-11-sprint-may-26th/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Code Mash</title>
		<link>http://compoundthinking.com/blog/index.php/2006/11/27/code-mash/</link>
		<comments>http://compoundthinking.com/blog/index.php/2006/11/27/code-mash/#comments</comments>
		<pubDate>Mon, 27 Nov 2006 00:10:38 +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[Ruby on Rails]]></category>
		<category><![CDATA[SE Michigan Tech]]></category>
		<category><![CDATA[TurboGears]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/index.php/2006/11/27/code-mash/</guid>
		<description><![CDATA[Some friends of mine are putting together a non-denominational developers conference called code-mash in Ohio this January. Looks like Python and Ruby are both going to have a good number of talks. I&#8217;ll be talking about SQLAlchemy, which is the best object relational mapper I&#8217;ve ever seen. There&#8217;ll be talks about Test Driven Development in [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.codemash.org"><img id="image174" align = "right" src="http://compoundthinking.com/blog/wp-content/uploads/2006/11/codemash_logo1.jpg" alt="CodeMashLogo" /></a>Some friends of mine are putting together a non-denominational developers conference called <a href="http://www.codemash.org/">code-mash</a> in Ohio this January.   </p>
<p>Looks like Python and Ruby are both going to have a good number of talks.   I&#8217;ll be talking about SQLAlchemy, which is the best object relational mapper I&#8217;ve ever seen.  There&#8217;ll be talks about Test Driven Development in Python, Enterprise Architectural Patterns for Python developers, along with lots of cool talks about Lean Software Development, the side benefits of Test Driven development. </p>
<p>You can still submit a talk proposal before November 30th, and you&#8217;ll get free room and board.  I think it would be great to see somebody talk about Dabo and Desktop application Development in Python, and they seem to be missing any talk about OSX/Cocoa stuff, which I&#8217;m sure is because they haven&#8217;t had any proposals yet. </p>
<p>It would also be nice to see a good cross platform development with Mono talk&#8230; </p>
<p>I&#8217;m really excited by the opportunity to get developers of all kinds together and talk about how to be productive and learn more about the strengths and weaknesses of the various tools/frameworks people are using. </p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2006/11/27/code-mash/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Why I Like Python more than Ruby</title>
		<link>http://compoundthinking.com/blog/index.php/2006/06/30/why-i-like-python-more-than-ruby/</link>
		<comments>http://compoundthinking.com/blog/index.php/2006/06/30/why-i-like-python-more-than-ruby/#comments</comments>
		<pubDate>Fri, 30 Jun 2006 13:16:01 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/index.php/2006/06/30/why-i-like-python-more-than-ruby/</guid>
		<description><![CDATA[Note: I&#8217;ve been sitting on this one for a week. I don&#8217;t want to be misunderstood, Ruby is my second favorite language, and it has a lot to love. But I keep coming back to Python, and I think I know why. So, here goes: Yesterday Last Week, I in response to a post by [...]]]></description>
			<content:encoded><![CDATA[<p>Note:  I&#8217;ve been sitting on this one for a week.  I don&#8217;t want to be misunderstood, Ruby is my second favorite language, and it has a lot to love.   But I keep coming back to Python, and I think I know why.   So, here goes:</p>
<p><img align="left" alt="roots 3" id="image123" title="roots 3" src="http://compoundthinking.com/blog/wp-content/uploads/2006/06/root3.jpg" /><strike>Yesterday</strike> Last Week, I in response to a post by Dave Thomas, I wrote about optimizing for readability.</p>
<p>Dave Thomas post basically amounts to an homage to Ruby at the expense of Perl.</p>
<p>Dave likes Ruby because it is far more readable, and therefor more maintainable than Perl.  So far I&#8217;m totally on the same page.   Readability is critical to maintainability and extensibility, and that&#8217;s where most of the work on any successful software project is going to be done.</p>
<p>But, here&#8217;s where we part company at least a little bit.</p>
<p>I happen to prefer Python over Ruby because optimizing for readability is much more a part of the philosophy behind Python.  Most of the lines from the Zen of Python have readability implications:</p>
<pre>Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
<img id="image123" alt="roots 3" src="http://compoundthinking.com/wp-content/uploads/2006/06/root3.jpg" />Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.</pre>
<p><strong>Ruby makes better choices than Perl</strong></p>
<p>But the language is still built around something they call &#8220;the principle of least surprise,&#8221; and the least surprised person here is the initial developer, not the code reader.</p>
<p>In practice means that there are several different names for the same array methods, and many array methods that are only slightly different from one another.   If you are familiar with another language&#8217;s way to do it, the &#8220;least surprising&#8221; thing would be for that same method to just work on Ruby arrays right?</p>
<p>And this can make it easier to get started with Ruby.  But there&#8217;s a downside, when reading Ruby code this means you may need to learn and remember all 78 different array methods.   Some of them are obvious, .last will give the last element in the array.  No worries there, and I like humane interfaces which give you easily understood and convenient functions, but this is just one example of how Ruby takes it too far, by forgetting that you will eventually have to figure out what eacy of those functions does in somebody else&#8217;s code.</p>
<p><em>Quick Ruby Quiz:</em></p>
<ul>
<li>is there a difference between array.size and array.length ?   (no)</li>
<li>How about array.map! and array.collect! ?  (no)</li>
<li>What about array.delete_if and array.reject ? (yes, reject returns nul if no changes are made)</li>
<li>And for extra credit, why is there an array.collect (non-destructive) and an array.collect! (destructive) but not an non-destructive version of array.map! ?</li>
</ul>
<p>I&#8217;ve been reading more Rails code recently, and while I like Ruby, and I admire Rails, I find myself constantly wishing I could hold more of this stuff in my head.  I learned to write Ruby pretty quickly, but reading other people&#8217;s code has taken longer &#8212; just because there are lots of nooks and crannies in the built-in classes and modules that will take me a while to learn.</p>
<p><strong>But Python makes better choices than Ruby</strong>:</p>
<p>Don&#8217;t get me wrong, I like Ruby.   And it&#8217;s not particularly difficult to read.  But the philosophy of the language designers led to design choices that emphasize writability over readability.   And in that department I think the advantage has to go to Python.   Python lists are easy to use, but more importantly I understood all of the list methods and how to use them in the matter of a few min.   Perhaps Ruby&#8217;s arrays are more powerful that Python lists, but so far I&#8217;ve yet to find something that can be done in Ruby that can&#8217;t be done easily in Python.</p>
<p>I mean, think about it &#8212; even the things people complain about in Python, like the explicit self or significant whitespace, are designed to with readability in mind.</p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2006/06/30/why-i-like-python-more-than-ruby/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>An Optimization That&#8217;s Never Premature</title>
		<link>http://compoundthinking.com/blog/index.php/2006/06/25/an-optimization-thats-never-premature/</link>
		<comments>http://compoundthinking.com/blog/index.php/2006/06/25/an-optimization-thats-never-premature/#comments</comments>
		<pubDate>Sun, 25 Jun 2006 05:47:56 +0000</pubDate>
		<dc:creator>Mark Ramm</dc:creator>
				<category><![CDATA[IT Management]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://compoundthinking.com/blog/index.php/2006/06/25/an-optimization-thats-never-premature/</guid>
		<description><![CDATA[I&#8217;m pretty sure every software developer worth his or her salt, has heard of Fred Brook&#8217;s C.A.R Hoare&#8217;s statement, &#8220;premature optimization is the root of all evil,&#8221; famously repeated by Donald Kunth. One of the things you quickly learn when doing software optimization is that everything is a trade-off, you can increase performance by increasing [...]]]></description>
			<content:encoded><![CDATA[<p><img id="image121" alt="roots" src="http://compoundthinking.com/blog/wp-content/uploads/2006/06/roots.jpg" />I&#8217;m pretty sure every software developer worth his or her salt, has heard of <strike>Fred Brook&#8217;s</strike> C.A.R Hoare&#8217;s statement, &#8220;premature optimization is the root of all evil,&#8221; famously repeated by Donald Kunth.   One of the things you quickly learn when doing software optimization is that everything is a trade-off, you can increase performance by increasing complexity, decreasing reliability, limiting the degree of precision required, etc.</p>
<p>But I think there is one optimization that is<em> never</em> premature &#8212; readability.</p>
<p>I&#8217;m not the only one who sees readability as a key metric in writing maintainable software.   Dave Thomas (author of The Pragmatic Programmer, and Ruby advocate) recently wrote the following:</p>
<blockquote><p>But there was a problem [with my use of Perl]. Perl is a great language&#8230;. But even on my most charitable days I could never really claim that these Perl programs were exemplars of readability. And, in turn, this lack of readability made it hard for me to pick one of them up six months after I&#8217;d written it and make some changeâ€”even small alterations could involve long periods of head-scratching as I tried to work out exactly what the entries in my hash of arrays of hash references actually contained.</p></blockquote>
<p>Amen, Dave! If you can&#8217;t read you code: you can&#8217;t adapt it to changing requirements, you can&#8217;t build new features into it, you can&#8217;t optimize it&#8217;s performance. In other words, you can&#8217;t maintain it.<br />
And the documented truth of software development is that most of the time and money spent on any sucessful software product is going to be spent in maintenance and upgrades &#8212; not initial development.</p>
<p>Writing code that is difficult to read is like running up your credit card buying expensive toys; even though you don&#8217;t pay today, the bill is going to come due eventually &#8212; and the longer you wait the more it&#8217;ll cost.</p>
]]></content:encoded>
			<wfw:commentRss>http://compoundthinking.com/blog/index.php/2006/06/25/an-optimization-thats-never-premature/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
