<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0"> <channel><title>GrokCode</title> <link>http://grokcode.com</link> <description /> <lastBuildDate>Fri, 27 Jan 2012 18:20:32 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/GrokCode" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="grokcode" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><thespringbox:skin xmlns:thespringbox="http://www.thespringbox.com/dtds/thespringbox-1.0.dtd">http://feeds.feedburner.com/GrokCode?format=skin</thespringbox:skin><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">GrokCode</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item><title>Be a Paranoid Pessimistic Programmer</title><link>http://grokcode.com/722/be-a-paranoid-pessimistic-programmer/</link> <comments>http://grokcode.com/722/be-a-paranoid-pessimistic-programmer/#comments</comments> <pubDate>Tue, 22 Nov 2011 06:04:34 +0000</pubDate> <dc:creator>Jess Johnson</dc:creator> <category><![CDATA[Career]]></category> <category><![CDATA[best practices]]></category> <category><![CDATA[paranoia]]></category> <category><![CDATA[pessimism]]></category> <category><![CDATA[programmer]]></category> <category><![CDATA[programming]]></category> <category><![CDATA[programming advice]]></category> <category><![CDATA[the pragmatic programmer]]></category> <guid isPermaLink="false">http://grokcode.com/?p=722</guid> <description><![CDATA[We aren&#8217;t copy writers or social media experts; we&#8217;re programmers. We need to constantly foresee and prevent problems before they happen. Cultivating a healthy paranoia and a heavily pessimistic attitude is the path to becoming a better programmer. Why Be Paranoid and Pessimistic Being paranoid and pessimistic will save your ass constantly. Before even talking [...]]]></description> <content:encoded><![CDATA[<p>We aren&#8217;t copy writers or social media experts; we&#8217;re programmers. We need to constantly foresee and prevent problems before they happen. Cultivating a healthy paranoia and a heavily pessimistic attitude is the path to becoming a better programmer.<span
id="more-722"></span></p><h2>Why Be Paranoid and Pessimistic</h2><p>Being paranoid and pessimistic will save your ass constantly. Before even talking about actual code, backups, debuggers, <a
href="http://grokcode.com/717/how-to-use-source-control-effectively/">source control</a>, error logging, automated deployment scripts, and almost all tools of the programming trade are predicated on the pessimistic idea that stuff goes wrong often, and there must be procedures in place to identify, correct, and prevent errors.</p><p>Another side effect of being paranoid is coding defensively. No matter if you are coding against libraries, code written by other developers on your team, or code written by yourself, it is important to code defensively, because everybody and everything is fallible.</p><p>Defensive code makes fewer assumptions and carefully handles error cases instead of failing silently or producing undefined behavior. This leads to code that is easier to maintain and less prone to bugs.</p><p>Libraries are updated, frameworks evolve, requirements change. Programmers are <a
href="http://www.kalzumeus.com/2011/11/17/i-saw-an-extremely-subtle-bug-today-and-i-just-have-to-tell-someone/">constantly fighting against entropy</a>. Defensive programming guards against the effects of software entropy by reducing the possibility that changes in one part of a system will cause subtle bugs somewhere else.</p><p>It is important expect the unexpected in all things.</p><blockquote><p>It seems that there&#8217;s a mantra that every programmer must memorize early in his or her career. It is a fundamental tenet of computing, a core belief that we learn to apply to requirements, designs, code, comments, just about everything we do. It goes</p><p>THIS CAN NEVER HAPPEN&#8230;</p><p><cite>- <a
href="http://www.amazon.com/gp/product/020161622X?ie=UTF8&#038;tag=grok-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=020161622X">The Pragmatic Programmer</a> by Andrew Hunt &#038; David Thomas</cite></p></blockquote><p>Embracing paranoia and pessimism will automatically lead to wonderful things like:</p><ul><li>Explicitly stating preconditions, postconditions, and invariants</li><li>If it can&#8217;t happen, using assertions to ensure that it won&#8217;t</li><li>Always using source control</li><li>Crashing early &#8211; a dead program normally does a lot less damage than a cripple one</li></ul><p>All of the above are widely considered good practice, and techniques recommended in <a
href="http://www.amazon.com/gp/product/020161622X?ie=UTF8&#038;tag=grok-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=020161622X">The Pragmatic Programmer</a>.</p><h2>When to stop being paranoid and pessimistic</h2><p>You should never stop being paranoid or pessimistic, but when interacting with non-technical people, you need to change your game face.</p><p>Let&#8217;s say you get a phone call from your boss who is a search engine optimization guy. He is wondering if you can build a tool to check how a website ranks in the search engines for various keywords.</p><p>You are a good programmer. A paranoid programmer. A pessimistic programmer. You immediately start thinking about the most significant challenges involved. That to do this project right, you will need to account for differences in search results across geographic areas. That means a distributed architecture of some kind, and most likely reports with combined rankings plus rankings broken out by geographic area. Now, if we use too many geographic areas and check them too often, we will significantly change the search volume for a particular term, which can have indirect effects on rankings. Plus scraping results is probably against Google&#8217;s ToS&#8230;</p><p><em>Swallow those words.</em></p><p>Your boss is a marketer at heart. He is an optimist. He needs to be an optimist in order to sell stuff. He doesn&#8217;t want to hear about worst case scenarios or most significant challenges. He needs to know about them, but wrap them up in a language he is better equipped to understand.</p><p>&#8220;Hrmmm. There are already similar tools out there, so I&#8217;m sure this is something we can do. However, I don&#8217;t think creating this tool will be as simple as it first appears. The most straightforward way to collect the data is to do some searches programmatically and then scrape the page to get rankings, but I think this is against Google&#8217;s ToS, and could get us in hot water with Google. We will also have to account for things like geographical rankings differences. I&#8217;m sure there are ways around these issues, but I&#8217;m not sure what the solution will look like yet without doing a bit more research.&#8221;</p><p>See the difference? Instead of your boss getting what sounds to him like a litany of problems, he is now getting some reassurance that it can be done, it just isn&#8217;t as easy as he probably thinks it is, and will take some thought to get everything right.</p><p>The only problem with pessimistic problem solving is that it is often misunderstood by optimists (read: management, sales, marketing, etc.). You don&#8217;t want to be known as the person who spits out a list of problems at every new idea. Try instead to be known as the person who solves problems before anyone else realizes that a problem exists.</p><p>So unless you are communicating with optimists, go forth and spread paranoia and pessimism.</p> <img src="http://feeds.feedburner.com/~r/GrokCode/~4/BAUkmniL7LM" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://grokcode.com/722/be-a-paranoid-pessimistic-programmer/feed/</wfw:commentRss> <slash:comments>8</slash:comments> </item> <item><title>What Is This Cloud Thing Anyway?</title><link>http://grokcode.com/724/cloud-computing/</link> <comments>http://grokcode.com/724/cloud-computing/#comments</comments> <pubDate>Sun, 21 Aug 2011 19:42:41 +0000</pubDate> <dc:creator>Jess Johnson</dc:creator> <category><![CDATA[Extras]]></category> <category><![CDATA[cloud]]></category> <category><![CDATA[cloud computing]]></category> <category><![CDATA[IaaS]]></category> <category><![CDATA[Paas]]></category> <category><![CDATA[SaaS]]></category> <guid isPermaLink="false">http://grokcode.com/?p=724</guid> <description><![CDATA[Cloud computing is the most poorly-defined, over-hyped technology that has hit the tech sector for a long time. The technology behind cloud computing isn&#8217;t particularly new or innovative, and the hype is all out of proportion to the tech involved. The true innovation of the cloud isn&#8217;t the tech at all. The promises of cloud [...]]]></description> <content:encoded><![CDATA[<p>Cloud computing is the most poorly-defined, over-hyped technology that has hit the tech sector for a long time. The technology behind cloud computing isn&#8217;t particularly new or innovative, and the hype is all out of proportion to the tech involved. The true innovation of the cloud isn&#8217;t the tech at all.<span
id="more-724"></span></p><h2>The promises of cloud computing</h2><p>Its hard to do any reading on cloud computing without running into promises that sound too good to be true: &#8220;With the cloud, individuals and small businesses can snap their fingers and instantly set up enterprise-class services.&#8221;<sup>[<a
href="http://grokcode.com/724/cloud-computing/#footnote_0_724" id="identifier_0_724" class="footnote-link footnote-identifier-link" title=" Roy Stephan, Director of IT architecture and engineering &amp;#8211; Intelligent Decisions in CNNMoney Why the cloud is now the hottest trend in tech. ">1</a>]</sup> Or to hear people proclaiming that the cloud is the <em>only</em> solution: &#8220;The future is the cloud. Not because it is trendy but because only the cloud can scale.&#8221;<sup>[<a
href="http://grokcode.com/724/cloud-computing/#footnote_1_724" id="identifier_1_724" class="footnote-link footnote-identifier-link" title=" Sean McGrath in ITWorld Only the cloud can scale ">2</a>]</sup></p><h2>The reality</h2><p>Despite the cloud being billed as the next evolution of the internet, the reality is that cloud computing has been around for a long time under different monikers: hosted services, Software as a Service (SaaS), shared infrastructure. For the most part, the cloud is made up of all the same technology that existed before the cloud hype got started. It is composed of standard operating systems, databases, load balancers, management tools, and so on.</p><p>The innovation isn&#8217;t in the tech at all &#8211; it is in the operations model.</p><p>The innovation is that individuals and small businesses now have access to resources on-demand and at scale without having to maintain the hardware and the expertise to run it in-house. It allows them to experiment and iterate cheaply and quickly.</p><p>Individuals have the ability to quickly provision a <a
href="http://grokcode.com/709/ruby-on-rails-cloud-hosting-reviews/">ruby on rails setup</a>, deploy their application, and then crank up the power if the application becomes popular, or simply throw the instance away if it doesn&#8217;t work out. That is the true power of cloud computing. It gives individuals and small businesses access to resources that were previously only cost-effective for the enterprise.</p><h2>Confusion and angst in the tech sector</h2><p>There is tension in the tech sector because cloud computing is such a poorly defined concept, and it is usually defined in terms of the technology. When looking only at the tech involved, the amount of hype around cloud computing is completely disproportionate to any advancements in tech needed to create cloud products.</p><blockquote><p>The cloud hype is getting thicker and smellier every day. All the cloud excitement is coming from those who hope to profit from it, the vendors and breathless tech journalists who can&#8217;t think of anything worthwhile to write about. They&#8217;re working very hard to make it sound like a wonderful thing, a miracle of rare device that will transform life as we know it.<cite>Carla Schroder, Editor &#8211; LinuxToday.com on <a
href="http://blog.linuxtoday.com/blog/2010/03/keep-your-cloud-1.html">Keep your cloud</a></cite></p></blockquote><p>Even worse, &#8220;cloud&#8221; has become just a catchy word that is sprinkled over marketing copy to boost customer acquisition and increase buy-in (or something).</p><blockquote><p>The interesting thing about cloud computing is that we&#8217;ve redefined cloud computing to include everything that we already do. I can&#8217;t think of anything that isn&#8217;t cloud computing with all of these announcements. The computer industry is the only industry that is more fashion-driven than women&#8217;s fashion. Maybe I&#8217;m an idiot, but I have no idea what anyone is talking about. What is it? It&#8217;s complete gibberish. It&#8217;s insane. When is this idiocy going to stop? We&#8217;ll make cloud computing announcements. I&#8217;m not going to fight this thing. But I don&#8217;t understand what we would do differently in the light of cloud.<cite>Larry Ellison, CEO &#8211; Oracle Corporation</cite></p></blockquote><p>Anyway, that&#8217;s my take on the cloud. The innovative part has nothing to do with the tech and everything to do with the operations model. I suppose <a
href="http://www.amazon.com/gp/product/0470484705/ref=as_li_ss_tl?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399373&amp;creativeASIN=0470484705">Cloud Computing For Dummies</a> will tell you something very different.</p><ol
class="footnotes"><li
id="footnote_0_724" class="footnote"> Roy Stephan, Director of IT architecture and engineering &#8211; Intelligent Decisions in CNNMoney <a
href="http://money.cnn.com/2011/02/09/technology/cloud/index.htm">Why the cloud is now the hottest trend in tech.</a></li><li
id="footnote_1_724" class="footnote"> Sean McGrath in ITWorld <a
href="http://www.itworld.com/offbeat/53445/only-cloud-can-scale">Only the cloud can scale</a></li></ol><img src="http://feeds.feedburner.com/~r/GrokCode/~4/dJbKoEKdhYg" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://grokcode.com/724/cloud-computing/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>How To Use Source Control Effectively</title><link>http://grokcode.com/717/how-to-use-source-control-effectively/</link> <comments>http://grokcode.com/717/how-to-use-source-control-effectively/#comments</comments> <pubDate>Thu, 30 Jun 2011 13:58:29 +0000</pubDate> <dc:creator>Jess Johnson</dc:creator> <category><![CDATA[Tips & Tutorials]]></category> <category><![CDATA[code]]></category> <category><![CDATA[revision control]]></category> <category><![CDATA[source control]]></category> <category><![CDATA[version control]]></category> <guid isPermaLink="false">http://grokcode.com/?p=717</guid> <description><![CDATA[There are a number of great version control[1] systems out there; the most important thing is to pick one and learn to use it effectively. No matter which source control system you decide to use, there are a number of universal principles that will help you to get the most out of source control. Always [...]]]></description> <content:encoded><![CDATA[<p>There are a number of great version control<sup>[<a
href="http://grokcode.com/717/how-to-use-source-control-effectively/#footnote_0_717" id="identifier_0_717" class="footnote-link footnote-identifier-link" title="The terms &amp;#8216;version control&amp;#8217;,  &amp;#8216;source control&amp;#8217;, and &amp;#8216;revision control&amp;#8217; are used interchangeably here.">1</a>]</sup> systems out there; the most important thing is to pick one and learn to use it effectively. No matter which source control system you decide to use, there are a number of universal principles that will help you to get the most out of source control.<span
id="more-717"></span></p><h2><em>Always</em> use source control</h2><p>There is no reason not to use source control. Even for a solo project. Even for a toy project. Even if you never make mistakes. Just use it. Source control offers so many benefits like rollbacks, code diffs, backups, and commit logs that every project will benefit from it.</p><h2>Don&#8217;t break the build</h2><p>Don&#8217;t commit code if it breaks the build. You don&#8217;t want to force other people to sift through your code looking for the problem that broke the build before they can continue with their own work.</p><h2>Commit early, commit often</h2><p>Don&#8217;t go dark. Committing early and often gives you a backup, an incremental log of progress, easier merges, and lets the team know what you are doing.</p><h2>Remove unused code immediately</h2><p>Don&#8217;t commit code with large blocks of old code commented out or unused, deprecated functions. If you need to get this code back at some point, you can always get it from the repository. Keep the current working copy of the source as clean and cruft-free as possible.</p><h2>Keep a good commit log</h2><p>Leave good comments in the commit log. Searching the commit log should allow you to find which commits implemented a specific feature or fixed a specific bug. Skimming the commit log should provide a good history of the project and give some hints as to it&#8217;s maturity.</p><h2>Whitespace</h2><p>Don&#8217;t commit whitespace, formatting, or code style changes at the same time as other changes. If you must make these types of changes to the code base, commit them separately. This will keep the diffs vastly more readable.</p><h2>Minimal Changeset</h2><p>When doing bugfixes, make the minimal set of changes needed to fix the bug. If a rewrite of a module is really in order, do the rewrite, but err on the side of making the absolute minimal set of changes needed to fix the bug. This way the changelog will clearly reflect the exact source of the bug and the changes needed for the fix.</p><h2>One bugfix per commit</h2><p>Again, keep the changelog clear by doing only one bugfix per commit (unless multiple bugs are very closely related). One bugfix per commit makes rollbacks easier and leaves a clear track of how the bug was fixed that will be valuable later if a regression test fails or if the fix created unintended side effects.</p><h2>Notify the team of new commits</h2><p>Other team members working on the code base should be immediately and automatically notified of any changes that have the potential to affect them. This could be setup in different ways depending on the project and the workflow used by the team. One of the easiest and most effective ways to set this up is an automated email including the commit message and the diff to all members of the team working on that particular module. Notifications keep all team members appraised of the current state of the code and give them a heads up if they are likely encounter problems merging their own code.</p><h2>Integrate source control with other tools</h2><p>Source control should be integrated with other tools used on the project like bug tracking, continuous integration, and IDEs. This makes it easy to cross-reference the commit that fixed a bug, created a bug, or broke the build. Integration with an IDE gives you the option to do source control operations like diff, status, and commit within the IDE without having to drop to the command line or a separate tool.</p><p>The above basic principles of version control will make you effective with any type of version control system out there. Have more source control tips? Leave them in the comments.</p><ol
class="footnotes"><li
id="footnote_0_717" class="footnote">The terms &#8216;version control&#8217;,  &#8216;source control&#8217;, and &#8216;revision control&#8217; are used interchangeably here.</li></ol><img src="http://feeds.feedburner.com/~r/GrokCode/~4/hP8qbachOfM" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://grokcode.com/717/how-to-use-source-control-effectively/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Ruby on Rails Cloud Hosting Reviews</title><link>http://grokcode.com/709/ruby-on-rails-cloud-hosting-reviews/</link> <comments>http://grokcode.com/709/ruby-on-rails-cloud-hosting-reviews/#comments</comments> <pubDate>Fri, 17 Jun 2011 15:57:46 +0000</pubDate> <dc:creator>Jess Johnson</dc:creator> <category><![CDATA[Programming Languages]]></category> <category><![CDATA[cloud]]></category> <category><![CDATA[cloud hosting]]></category> <category><![CDATA[cloud platform]]></category> <category><![CDATA[dotcloud]]></category> <category><![CDATA[engine yard]]></category> <category><![CDATA[heroku]]></category> <category><![CDATA[hosting]]></category> <category><![CDATA[rails]]></category> <category><![CDATA[RoR]]></category> <category><![CDATA[ruby]]></category> <category><![CDATA[winnie cloud]]></category> <guid isPermaLink="false">http://grokcode.com/?p=709</guid> <description><![CDATA[Cloud platforms are extremely useful when launching a minimum viable product because most of the system administration is handled by the hosting provider, while reserving the option to scale up later if required. Some cloud platforms offer free starter plans to bootstrap applications without making an initial investment. Here is a look at the available [...]]]></description> <content:encoded><![CDATA[<p>Cloud platforms are extremely useful when launching a minimum viable product because most of the system administration is handled by the hosting provider, while reserving the option to scale up later if required. Some cloud platforms offer free starter plans to bootstrap applications without making an initial investment. Here is a look at the available options for Ruby on Rails cloud hosting providers, including comments on which one is most appropriate for various types of projects.<span
id="more-709"></span></p><p>The hosting platforms covered below provide a Rails environment right out of the box. It is certainly possible to run directly on AWS (or another cloud platform) with a bit more setup work, but that is beyond the scope of this article.</p><p><a
href="http://www.engineyard.com/"><img
src="http://grokcode.com/wordpress/wp-content/uploads/engineyard-ruby-hosting.png" alt="Engine Yard Ruby on Rails Hosting" width="360" height="184" class="alignleft size-full wp-image-711" /></a></p><h2><a
href="http://www.engineyard.com/">Engine Yard</a></h2><p><em>Setup and deploy process:</em> After creating an Engine Yard account, setup and deploy is as simple as <code>gem install engineyard</code> then <code>ey deploy</code> from within the app directory.</p><p><em>Starter plan:</em> Engine Yard offers 500 free compute hours on a High-CPU Medium instance to test out the service.</p><p><em>Other plans:</em> Plans are completely customizable. You choose the number and type of instances, and then pay per hour for instances, plus extra storage and bandwidth costs. Full pricing details are <a
href="http://www.engineyard.com/products/appcloud/pricing">here</a>.</p><p><em>Version Control:</em> Must use Git for version control.</p><p><em>Conclusion:</em> Engine Yard&#8217;s pricing structure is geared towards projects that require compute time, not 24/7 availability, making it most appropriate for data crunching. For web apps that need to be available all the time, but may be idle or nearly idle much of the time, another provider will be more cost effective.</p><p><a
href="http://www.heroku.com/"><img
src="http://grokcode.com/wordpress/wp-content/uploads/heroku-ruby-hosting.png" alt="Heroku Ruby on Rails Hosting" width="360" height="184" class="alignleft size-full wp-image-710" /></a></p><h2><a
href="http://www.heroku.com/">Heroku</a></h2><p><em>Setup and deploy process:</em> Simple git based workflow. <code>sudo gem install heroku</code> then <code>heroku create sushi</code> will create an app called sushi. Deploying is as easy as <code>git push heroku master</code>.</p><p><em>Starter plan:</em> The free starter plan includes one worker (a background process running your code and processing jobs from a queue) and a 5MB shared database.</p><p><em>Other plans:</em> The number of dynos and workers can be adjusted dynamically to handle traffic spikes or provide more proccessing power. Dynos and workers are priced by the hour, and dedicated databases are priced based on the size and number of connections required. See the <a
href="http://heroku.com/pricing">full pricing details</a> for your particular situation.</p><p><em>Version Control:</em> Must use Git for version control.</p><p><em>Conclusion:</em> Heroku&#8217;s free starter plan makes it an ideal choice for bootstrapping a web application and scaling up as needed.</p><p><a
href="http://www.winniecloud.com/"><img
src="http://grokcode.com/wordpress/wp-content/uploads/winnie-cloud-ruby-hosting.png" alt="Winnie Cloud Ruby Hosting" width="360" height="184" class="alignleft size-full wp-image-712" /></a></p><h2><a
href="http://www.winniecloud.com/">Winnie Cloud</a></h2><p><em>Setup and deploy process:</em> Push to a Git repo managed by Winne Cloud.</p><p><em>Starter plan:</em> Free 30 day trial of the staging environment.</p><p><em>Other plans:</em> Winnie Cloud offers either a production working instance or a staging working instance. PostgreSQL, MongoDB, and Redis are available at extra cost.</p><p><em>Version Control:</em> Must use Git for version control.</p><p><em>Conclusion:</em> It appears that Winnie Cloud started as an internal product of Rails programming shop Ragnarson. It doesn&#8217;t seem to be as mature as the other Ruby on Rails platforms, but might be a good option for those who are looking for both Ruby on Rails consulting and a cloud hosting platform in one package.</p><p><a
href="http://www.dotcloud.com/"><img
src="http://grokcode.com/wordpress/wp-content/uploads/dotcloud-ruby-hosting.png" alt="Dotcloud Ruby Hosting" width="360" height="184" class="alignleft size-full wp-image-712" /></a></p><h2><a
href="http://www.dotcloud.com/">DotCloud</a></h2><p><em>Setup and deploy process:</em> After creating a DotCloud account, setup and deploy operations are done via the DotCloud command line interface. The CLI handles setting up the stack, deploy, rollback, and a number of other operations. The CLI integrates with Git and Murcurial.</p><p><em>Starter plan:</em> DotCloud offers a free starter plan with two services, where a service is a single connection to a stack component. Or if you were lucky enough to get in during the private beta, there is a free VIP plan.</p><p><em>Other plans:</em> The pro plan at $99 per month allows four services, and a flexible enterprise plan is also available with pricing depending on the requirements of the project.</p><p><em>Version Control:</em> Works with all types of version control, although Git and Mercurial have the best integration with DotCloud&#8217;s CLI.</p><p><em>Conclusion:</em> DotCloud is a more general platform than the others; it allows developers to mix and match stack components. Currently in beta: Java, PHP, PostgreSQL, Python, Redis, Ruby, and SMTP. There are a number of other components in alpha or on the roadmap for future support. It&#8217;s most appropriate for people who need support for a variety of stack components and don&#8217;t mind running on a beta platform.</p><h2>Final Words</h2><p>Each RoR platform has its particular strength, and picking the right one at the beginning will save headaches and money further down the road. This article covers the technical details of the different cloud platforms, but glosses over other important considerations like the reliability, transparency, and quality of support offered by the platform.</p><p>Please chime in with a comment describing your experiences if you have used any of the above cloud platforms.</p> <img src="http://feeds.feedburner.com/~r/GrokCode/~4/_FpgrGjONBs" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://grokcode.com/709/ruby-on-rails-cloud-hosting-reviews/feed/</wfw:commentRss> <slash:comments>11</slash:comments> </item> <item><title>The Ergonomic Keyboard Productivity Myth</title><link>http://grokcode.com/701/the-ergonomic-keyboard-productivity-myth/</link> <comments>http://grokcode.com/701/the-ergonomic-keyboard-productivity-myth/#comments</comments> <pubDate>Fri, 15 Apr 2011 15:45:56 +0000</pubDate> <dc:creator>Jess Johnson</dc:creator> <category><![CDATA[Books & Tools]]></category> <category><![CDATA[ergonomics]]></category> <category><![CDATA[goldtouch]]></category> <category><![CDATA[keyboard]]></category> <category><![CDATA[productivity]]></category> <category><![CDATA[research]]></category> <guid isPermaLink="false">http://grokcode.com/?p=701</guid> <description><![CDATA[Keyboard manufacturers would have you believe that ergonomic keyboards increase worker productivity, reduce injuries, and increase typing speed, but the real benefits are murky. The body of research on ergonomic keyboards is inconclusive, with a number of studies showing that ergonomic keyboards are of dubious value or that they decrease productivity. There are a few [...]]]></description> <content:encoded><![CDATA[<p>Keyboard manufacturers would have you believe that ergonomic keyboards increase worker productivity, reduce injuries, and increase typing speed, but the real benefits are murky. The body of research on ergonomic keyboards is inconclusive, with a number of studies showing that ergonomic keyboards are of dubious value or that they decrease productivity.<span
id="more-701"></span></p><p>There are a few different ergonomic keyboard designs, the most popular are shown below from left to right: the split keyboard, the angled split keyboard (sometimes called a Klockenburg keyboard), and the contoured keyboard.</p><p><a
href="http://www.amazon.com/gp/product/B000A6PPOK/ref=as_li_ss_tl?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B000A6PPOK"><img
class="alignleft size-full wp-image-708" src="http://grokcode.com/wordpress/wp-content/uploads/keyboard-split.jpg" alt="Split Ergonomic Keyboard" width="220" /></a><a
href="http://www.amazon.com/gp/product/B0006VJE82/ref=as_li_ss_tl?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B0006VJE82"><img
class="alignleft size-full wp-image-706" src="http://grokcode.com/wordpress/wp-content/uploads/keyboard-goldtouch.jpg" alt="Goldtouch Ergonomic Keyboard" width="220" /></a><a
href="http://www.amazon.com/gp/product/B000LVJ9W8/ref=as_li_ss_tl?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B000LVJ9W8"><img
class="alignleftlast size-full wp-image-705" src="http://grokcode.com/wordpress/wp-content/uploads/keyboard-contoured.jpg" alt="Contoured Ergonomic Keyboard" width="220" /></a></p><p>So which of these will make you the most productive? The most likely to prevent carpal tunnel and other injuries dreaded by programmers? Probably none of them.</p><p>There is research showing that ergonomic keyboards increase typing speed. There is research showing that the same keyboard decreases typing speed. Studies show that ergonomic keyboards increase productivity, that they decrease productivity, that they decrease injuries, and that they have no effect on the number or severity of injuries. Whatever conclusion you wish to show regarding ergonomic keyboards, you are bound to find at least a few studies supporting that conclusion.</p><p>Sifting through the research, the only clear trend that emerges is that much of the research showing the benefits of ergonomic keyboards was done by manufacturers of ergonomic keyboards, by companies who are in the business of injury prevention consultation, or companies that have some other vested interest in the success of ergonomic keyboards. Further muddying the waters, Google Scholar search results on the topic of ergonomic keyboards are polluted by marketing documents disguised as research, such as this <a
href="https://www.goldtouch.com/Resources/Studies/GoldtouchCostSavings.pdf">document</a> by Goldtouch, a popular brand of adjustable split angled keyboards.</p><p><a
href="http://www.amazon.com/gp/product/B001IOHAVO/ref=as_li_ss_tl?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B001IOHAVO"><img
class="alignleft size-full wp-image-707" src="http://grokcode.com/wordpress/wp-content/uploads/keyboard-normal.jpg" alt="Standard Keyboard" width="300" height="185" /></a>So which keyboard should you buy? Scientifically speaking, it probably doesn&#8217;t make a damn bit of difference as long as you are comfortable and have had sufficient time to adapt to any peculiarities of your keyboard. Test a few out and then get a keyboard that you like. No matter if that is an ergonomic keyboard, a <a
href="http://www.amazon.com/gp/product/B001IOHAVO/ref=as_li_ss_tl?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B001IOHAVO">cheapo minimalist keyboard</a>, an <a
href="http://www.amazon.com/gp/product/B002WPNUIU/ref=as_li_ss_tl?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399349&amp;creativeASIN=B002WPNUIU">old school mechanical keyboard with backlighting</a>, a<a
href="http://www.amazon.com/gp/product/B003XWLDGM/ref=as_li_ss_tl?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399349&amp;creativeASIN=B003XWLDGM"> medical grade waterproof keyboard</a>, or whatever keyboard makes you happy.</p><p>There are plenty of other tweaks you can make to your work environment that <em>do</em> increase productivity (and are backed by solid scientific evidence). Read more about <a
href="http://grokcode.com/655/how-to-increase-productivity-by-reordering-your-office/">how to increase productivity by reordering your office</a>, but forget about ergonomic keyboards.</p> <img src="http://feeds.feedburner.com/~r/GrokCode/~4/aPgj9pQAvrI" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://grokcode.com/701/the-ergonomic-keyboard-productivity-myth/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Scientifically Proven Tips For a More Productive Office</title><link>http://grokcode.com/655/how-to-increase-productivity-by-reordering-your-office/</link> <comments>http://grokcode.com/655/how-to-increase-productivity-by-reordering-your-office/#comments</comments> <pubDate>Tue, 15 Mar 2011 16:58:50 +0000</pubDate> <dc:creator>Jess Johnson</dc:creator> <category><![CDATA[Career]]></category> <category><![CDATA[ambient temperature]]></category> <category><![CDATA[color temperature]]></category> <category><![CDATA[ergonomic chair]]></category> <category><![CDATA[ergonomics]]></category> <category><![CDATA[gtd]]></category> <category><![CDATA[increase productivity]]></category> <category><![CDATA[nature]]></category> <category><![CDATA[office]]></category> <category><![CDATA[office productivity]]></category> <category><![CDATA[productivity]]></category> <guid isPermaLink="false">http://grokcode.com/dev/?p=655</guid> <description><![CDATA[Research shows that reordering your office can significantly boost productivity. Here are four simple tweaks, all backed by scientific research, that you can make to your work environment today to increase your productivity. Bring Nature into the Office Studies have shown that certain types of environments are restorative: they reduce mental fatigue, increase the ability [...]]]></description> <content:encoded><![CDATA[<p>Research shows that reordering your office can significantly boost productivity. Here are four simple tweaks, all backed by scientific research, that you can make to your work environment today to increase your productivity.<span
id="more-655"></span></p><h2 id="nature">Bring Nature into the Office</h2><p><a
href="http://www.amazon.com/gp/product/B002F914G8?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B002F914G8"><img
class="alignleft size-full wp-image-694" title="Bamboo Plant" src="http://grokcode.com/wordpress/wp-content/uploads/bamboo-plant2.jpg" alt="Bamboo Plant" width="224" height="300" /></a></p><p>Studies have shown that certain types of environments are restorative: they reduce mental fatigue, increase the ability to concentrate, and improve health, leading to an increase in productivity. One of the most effective restorative environments is nature. An office with a window that has a natural view is enough to trigger the benefits.</p><blockquote><p>Those with a view of nature felt less frustrated and more patient, found their job more challenging, expressed greater enthusiasm for it, and reported higher life satisfaction as well as overall health.<sup>[<a
href="http://grokcode.com/655/how-to-increase-productivity-by-reordering-your-office/#footnote_0_655" id="identifier_0_655" class="footnote-link footnote-identifier-link" title="Rachel Kaplan, The role of nature in the context of the workplace, Landscape and Urban Planning, Volume 26, Issues 1-4, Special Issue Urban Design Research, October 1993, Pages 193-201, ISSN 0169-2046, DOI: 10.1016/0169-2046(93)90016-7.">1</a>]</sup></p></blockquote><p>Colorful, diverse landscapes with natural composition are preferred, and views of trees, water, and sky can increase the restorative effect.</p><h3>Take action to increase productivity</h3><p>Take micro-breaks throughout the day to gaze at the natural elements around you. If you aren&#8217;t lucky enough to have an office with a window, or if your view is a cityscape instead of a landscape, you can still bring touches of nature to your office. <a
href="http://www.amazon.com/gp/product/B002F914G8?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B002F914G8">Live plants</a>, <a
href="http://www.amazon.com/gp/product/B000BSDY0E/ref=as_li_ss_tl?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B000BSDY0E">tabletop fountains</a>, or <a
href="http://www.amazon.com/gp/product/B0033YWCXS/ref=as_li_ss_tl?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B0033YWCXS">posters of nature scenes</a> will do the job as well.</p><hr
class="fancy" /><h2 id="light">Use High Color Temperature Light Sources</h2><p>Research has shown that working under light with a high color temperature has a number of benefits such increased mental acuity, vitality, and alertness, increased work performance, reduced fatigue, reduced daytime sleepiness, and improved mental health.</p><p>&#8220;Color temperature&#8221; refers to the color of the light produced; it is independent of the brightness of the bulb. Bluer lights increase productivity and alertness, while yellower lights promote relaxation. Most compact fluorescent bulbs have a color temperature of 2700K or 2850K, and the highest color temperature that is readily available commercially is 6500K.</p><p>Studies have shown that the 7500K light sources are correlated with higher mental acuity compared to 3000K light sources.<sup>[<a
href="http://grokcode.com/655/how-to-increase-productivity-by-reordering-your-office/#footnote_1_655" id="identifier_1_655" class="footnote-link footnote-identifier-link" title="Deguchi T, Sato M: The effect of color temperature of lighting sources on mental activity level. Ann Physiol Anthropol 1992, 11:37-43.">2</a>]</sup> 5000K sources are correlated with reduced drowsiness compared to 3000K.<sup>[<a
href="http://grokcode.com/655/how-to-increase-productivity-by-reordering-your-office/#footnote_2_655" id="identifier_2_655" class="footnote-link footnote-identifier-link" title="Noguchi H, Sakaguchi T: Effect of illuminance and color temperature on lowering of physiological activity. Appl Human Sci 1999, 18:117-123.">3</a>]</sup> 17,000K sources are correlated with improved concentration and thought clarity compared to 4000K.<sup>[<a
href="http://grokcode.com/655/how-to-increase-productivity-by-reordering-your-office/#footnote_3_655" id="identifier_3_655" class="footnote-link footnote-identifier-link" title="Peter R Mills, Susannah C Tomkins, and Luc JM Schlangen, The effect of high correlated colour temperature office lighting on employee wellbeing and work performance, Journal of Circadian Rhythms 2007, 5:2 DOI:10.1186/1740-3391-5-2">4</a>]</sup></p><h3>Take action to increase productivity</h3><p>Choose light bulbs that have a high color temperature and a comfortable brightness. Try these <a
href="http://www.amazon.com/gp/product/B00481HIBG/ref=as_li_ss_tl?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B00481HIBG">23 watt bulbs</a>, or these <a
href="http://www.amazon.com/gp/product/B0041DLW3G/ref=as_li_ss_tl?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B0041DLW3G">26 watt (equivalent to 100w incandecents) bulbs</a>.</p><hr
class="fancy" /><h2 id="chair">Use a Highly Adjustable Chair</h2><p><img
class="alignleft size-full wp-image-697" src="http://grokcode.com/wordpress/wp-content/uploads/ergonomic-chair-pain.png" alt="Pain reduction and productivity increases" width="400" height="363" /></p><p>A highly adjustable chair combined with ergonomics training has been shown to improve health by reducing the incidence of musculoskeletal pain an injury. A reduction in bodily pain was observed throughout the day, and the study found a significant economic benefit in investing in an ergonomic chair.</p><blockquote><p>[...] the chair-with-training intervention is associated with productivity improvements of $354 per worker per day and has a benefit-to-cost ratio of 22:1<sup>[<a
href="http://grokcode.com/655/how-to-increase-productivity-by-reordering-your-office/#footnote_4_655" id="identifier_4_655" class="footnote-link footnote-identifier-link" title="Amick, Benjamin C. III, PhD; Robertson, Michelle M. PhD; DeRango, Kelly PhD; Bazzani, Lianna MPH; Moore, Anne PhD; Rooney, Ted MPH; Harrist, Ron PhD, Effect of Office Ergonomics Intervention on Reducing Musculoskeletal Symptoms, Spine, Volume 28, Issue 24, 15 December 2003, Pages 2706-2711">5</a>]</sup></p></blockquote><p>An ergonomic char is one of the more expensive workspace changes to implement, but the benefit-to-cost ratio clearly shows that it is worth it.</p><h3>Take action to increase productivity</h3><p>Invest in a highly adjustable chair and learn how to use it properly. Have a look at <a
href="http://www.amazon.com/gp/product/B0014YGGKE?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B0014YGGKE">Herman Miller&#8217;s line of highly adjustable Aeron chairs</a>. Use a chair with adjustable armrests in height, width, and pivot, adjustable chair height, a flexible back support, adjustable firmness support in the lower back, adjustable seat depth, and a gliding mechanism that allows the seat to glide forward as you recline.</p><hr
class="fancy" /><h2 id="temp">Keep the Ambient Temperature Comfortable</h2><p>There has been quite a bit of research on the effect temperature has on productivity. The graph below is taken from a meta-study which summarizes the findings of a number of studies on the relationship between temperature and performance.</p><p><img
class="aligncenter size-full wp-image-700" src="http://grokcode.com/wordpress/wp-content/uploads/productivity-decrease-by-temperature.png" alt="Productivity Decrease Versus Temperature" width="700" height="397" /></p><p>There is a lot of variation in the optimal temperature in terms of productivity. This may be caused by personal variations in comfort zone temperature, seasonal variations, or climate differences between the locales where the studies were conducted.</p><p>Further muddying the issue is that some studies provide evidence that for optimal work performance the temperature should be in the comfort zone, but other studies show that temperatures outside of the comfort zone cause arousal effects that increase performance.</p><blockquote><p>Based on our review, available data do not provide compelling or consistent evidence that temperature variations within the comfort zone significantly affect worker performance. However, performance decrements are more clearly established for temperatures outside of the comfort zone. Decrements are most clearly documented for high temperatures.<sup>[<a
href="http://grokcode.com/655/how-to-increase-productivity-by-reordering-your-office/#footnote_5_655" id="identifier_5_655" class="footnote-link footnote-identifier-link" title="Seppanen, Olli, Fisk, William J., &amp;amp; Faulkner, David. (2003). Cost benefit analysis of the night-time ventilative cooling in office building. Lawrence Berkeley National Laboratory: Lawrence Berkeley National Laboratory. LBNL Paper LBNL-53191.">6</a>]</sup></p></blockquote><h3>Take action to increase productivity</h3><p>Maintain an ambient temperature that is comfortable or slightly cooler than your comfort zone. Avoid working in high temperatures.</p><ol
class="footnotes"><li
id="footnote_0_655" class="footnote">Rachel Kaplan, <a
href="http://deepblue.lib.umich.edu/bitstream/2027.42/30542/1/0000175.pdf">The role of nature in the context of the workplace</a>, Landscape and Urban Planning, Volume 26, Issues 1-4, Special Issue Urban Design Research, October 1993, Pages 193-201, ISSN 0169-2046, DOI: 10.1016/0169-2046(93)90016-7.</li><li
id="footnote_1_655" class="footnote">Deguchi T, Sato M: The effect of color temperature of lighting sources on mental activity level. Ann Physiol Anthropol 1992, 11:37-43.</li><li
id="footnote_2_655" class="footnote">Noguchi H, Sakaguchi T: <a
href="http://www.jstage.jst.go.jp/article/ahs/18/4/117/_pdf">Effect of illuminance and color temperature on lowering of physiological activity</a>. Appl Human Sci 1999, 18:117-123.</li><li
id="footnote_3_655" class="footnote">Peter R Mills, Susannah C Tomkins, and Luc JM Schlangen, <a
href="http://www.jcircadianrhythms.com/content/5/1/2">The effect of high correlated colour temperature office lighting on employee wellbeing and work performance</a>, Journal of Circadian Rhythms 2007, 5:2 DOI:10.1186/1740-3391-5-2</li><li
id="footnote_4_655" class="footnote">Amick, Benjamin C. III, PhD; Robertson, Michelle M. PhD; DeRango, Kelly PhD; Bazzani, Lianna MPH; Moore, Anne PhD; Rooney, Ted MPH; Harrist, Ron PhD, <a
href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.90.2069&amp;rep=rep1&amp;type=pdf">Effect of Office Ergonomics Intervention on Reducing Musculoskeletal Symptoms</a>, Spine, Volume 28, Issue 24, 15 December 2003, Pages 2706-2711</li><li
id="footnote_5_655" class="footnote">Seppanen, Olli, Fisk, William J., &amp; Faulkner, David. (2003). <a
href="http://escholarship.org/uc/item/3j82f642.pdf">Cost benefit analysis of the night-time ventilative cooling in office building</a>. Lawrence Berkeley National Laboratory: Lawrence Berkeley National Laboratory. LBNL Paper LBNL-53191.</li></ol><img src="http://feeds.feedburner.com/~r/GrokCode/~4/gosiOs_psHQ" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://grokcode.com/655/how-to-increase-productivity-by-reordering-your-office/feed/</wfw:commentRss> <slash:comments>19</slash:comments> </item> <item><title>Meta: The Anatomy of the GrokCode Redesign</title><link>http://grokcode.com/667/grokcode-redesign-is-now-live/</link> <comments>http://grokcode.com/667/grokcode-redesign-is-now-live/#comments</comments> <pubDate>Thu, 20 Jan 2011 16:57:00 +0000</pubDate> <dc:creator>Jess Johnson</dc:creator> <category><![CDATA[Extras]]></category> <category><![CDATA[CSS3]]></category> <category><![CDATA[grokcode]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[redesign]]></category> <guid isPermaLink="false">http://grokcode.com/dev/?p=667</guid> <description><![CDATA[The grokcode.com redesign is now live. GrokCode is built on WordPress, and uses a custom theme. It is valid HTML5 and CSS3. Here is a quick overview of what&#8217;s new, what&#8217;s changed, and what&#8217;s still broken. Also a few notes on browser and operating system compatibility. This is the third design since GrokCode went live [...]]]></description> <content:encoded><![CDATA[<p>The grokcode.com redesign is now live. GrokCode is built on WordPress, and uses a custom theme. It is valid HTML5 and CSS3. Here is a quick overview of what&#8217;s new, what&#8217;s changed, and what&#8217;s still broken. Also a few notes on browser and operating system compatibility.<span
id="more-667"></span></p><p>This is the third design since GrokCode went live in 2007. Unfortunately I don&#8217;t have a screenshot of the first design, but it was ugly enough that perhaps it is better off forgotten.</p><p><img
class="alignleft wp-image-682" src="http://grokcode.com/wordpress/wp-content/uploads/grokcode1.png" alt="GrokCode before" width="340px" height="180px" /><img
class="wp-image-681" src="http://grokcode.com/wordpress/wp-content/uploads/grokcode2.png" alt="GrokCode after" width="340px" height="180px" /></p><h2>What&#8217;s different?</h2><p>There are quite a few changes, but they all tie back to 3 main goals: keep the emphasis on the articles, include more information for prospective clients, and try not to be so ugly.</p><h3>Emphasize the articles</h3><p>The programming and software development articles are the heart of GrokCode, and I wanted that to be obvious. The article pages are now less cluttered and there are fewer distractions.</p><p>GrokCode has never been ad-heavy, and the new design further reduces the number of ads. Many pages are add-free, and there is never more than one ad per page. If you would like to support the continued creation of new articles, you can buy yourself a few <a
href="http://grokcode.com/11/the-top-9-in-a-hackers-bookshelf/">computer science and programming books</a> (or anything else) from <a
href="http://www.amazon.com/gp/redirect.html?ie=UTF8&amp;location=http%3A%2F%2Fwww.amazon.com%2F&amp;tag=grok-20&amp;linkCode=ur2&amp;camp=1789&amp;creative=390957">Amazon</a>.</p><p>Other tweaks to improve readability and keep the layout neat include cleaning up the sidebar, moving comments to their own page, and switching to a fixed-width layout.</p><h3>Meet new clients</h3><p>The old design had virtually no information for prospective clients. There was a portfolio of work, but no information about how I work, what I do, and nothing to even really suggest that I am taking new projects. The new design remedies this with new information on <a
href="http://grokcode.com/hire/">working with me</a>, a better <a
href="http://grokcode.com/about/">about page</a>, and an <a
href="http://grokcode.com/programmer-portfolio/">updated portfolio</a>. The idea is to make this info accessible and obvious, but not in-your-face.</p><h3>Don&#8217;t be ugly</h3><p>Even though I am not a designer or a frontend developer, I do all of the GrokCode designs myself from scratch to get a peek into how the other half lives. I was aiming for a beautiful, minimalist, and a slightly retro look, and I spent quite a bit of time reading and learning about logo design, color selection, typography, copy writing, etc. In the end I&#8217;m satisfied that it&#8217;s not ugly.</p><p>Design critiques are welcome in the comments.</p><h2>What&#8217;s broken?</h2><p>The switch went off without too many problems. Other than a problem with the feeds, all of the remaining issues that I am aware of are all &#8220;won&#8217;t fixes&#8221; or &#8220;can&#8217;t fixes.&#8221;</p><h3>Feeds</h3><p>The only lingering issue that I have on my list to fix is that the feeds aren&#8217;t working quite right yet. If you are subscribed to the feed via RSS or email, you probably saw that a bunch of old articles were marked as new and resent. You may also be seeing an excerpted feed. Sorry about that. If you haven&#8217;t yet subscribed to the feed, you can <a
href="http://grokcode.com/feed/">subscribe here</a>; things will be back to normal shortly.</p><h3>Details</h3><p>A few of the details are &#8220;broken by design,&#8221; which is to say that some of the nice extras degrade gracefully on older browsers and some browsers don&#8217;t properly render valid HTML5. Since this is a personal site, I have the luxury of saying that I don&#8217;t care too much if things are a little wonky on browsers that don&#8217;t comply with standards.</p><p><img
class="alignleft size-full wp-image-686" title="firefox" src="http://grokcode.com/wordpress/wp-content/uploads/firefox.png" alt="" width="180" height="139" /><img
class="alignleft size-full wp-image-689" title="ie" src="http://grokcode.com/wordpress/wp-content/uploads/ie.png" alt="" width="180" height="139" />If you are one of the 17% of GrokCode visitors using an outdated or non-standards compliant browser (*cough* IE) things just won&#8217;t look as nice. Have a look at Firefox 3.5 vs. IE 8.</p><p>The retro style is a bit spoiled by the boxy links, and the some of the finer details like rounded corners and transparency are lost.</p><h3>Fonts</h3><p>Again, the fonts aren&#8217;t exactly broken, but some people will have a better experience than others.</p><p><img
class="alignleft size-full wp-image-687" title="font-ubuntu" src="http://grokcode.com/wordpress/wp-content/uploads/font-ubuntu.png" alt="" width="180" height="280" /><img
class="alignleft size-full wp-image-688" title="font-windowsxp" src="http://grokcode.com/wordpress/wp-content/uploads/font-windowsxp.png" alt="" width="180" height="280" />If you are one of the 32% of GrokCode readers on Windows XP, the fonts will be rendered poorly. This isn&#8217;t just a problem with GrokCode or web pages in general &#8211; Windows XP is just bad at fonts. I had no idea that the problem was this bad until doing cross-browser testing, and I used to use XP quite often. I had to modify the original design so that it would be readable on XP (I believe Vista and 7 are better).</p><p>Have a look at the side by side of Ubuntu and Windows XP. You are looking at the difference between aliased and anti-aliased text.</p><p>Other than that, I think everything is working fine. If you see anything strange or something doesn&#8217;t seem to be working, please let me know via comments or <a
href="mailto:jess@grokcode.com">email</a>. Friendly advice and constructive criticism on the redesign are also welcome.</p> <img src="http://feeds.feedburner.com/~r/GrokCode/~4/gxTTxQgMmVQ" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://grokcode.com/667/grokcode-redesign-is-now-live/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Test Driven Development and the Meaning of Done</title><link>http://grokcode.com/439/test-driven-development-and-the-meaning-of-done/</link> <comments>http://grokcode.com/439/test-driven-development-and-the-meaning-of-done/#comments</comments> <pubDate>Sun, 24 Oct 2010 06:17:24 +0000</pubDate> <dc:creator>Jess Johnson</dc:creator> <category><![CDATA[Tips & Tutorials]]></category> <category><![CDATA[Coders at Work]]></category> <category><![CDATA[no silver bullet]]></category> <category><![CDATA[TDD]]></category> <category><![CDATA[Test Driven Development]]></category> <guid isPermaLink="false">http://grok-code.com/?p=439</guid> <description><![CDATA[There is quite a bit of disagreement on how Test Driven Development affects development speed and code quality. As with any programming methodology, the success of TDD depends on many variables, but research suggests that the most critical factor in the success of TDD projects is the definition of done. Case studies of projects developed [...]]]></description> <content:encoded><![CDATA[<p>There is quite a bit of disagreement on how Test Driven Development affects development speed and code quality. As with any programming methodology, the success of TDD depends on many variables, but research suggests that the most critical factor in the success of TDD projects is the definition of done. Case studies of projects developed at IBM and Microsoft bring a bit of empirical evidence to a debate that has been dominated mainly by anecdotes and opinion.<span
id="more-439"></span></p><p>Just a quick refresher, TDD looks like this:</p><ol><li>Create a test</li><li>Run all tests, making sure the new test fails</li><li>Write the minimum amount of code to make the test pass</li><li>Run all of the tests to ensure they pass</li><li>Refactor the code, making sure that the tests still pass</li><li>Repeat for each new code module being developed</li></ol><p>TDD has strong supporters and detractors. At one extreme, agile consultants like Robert Martin (Uncle Bob) fiercely advocate a TDD process in all cases, asserting that unit testing saves time during development. On the other side, grey beards like Knuth talk about using a large up front design process with absolutely no testing until the end of a project. These are the outliers though &#8211; not many of us make our living as an Agile consultant and author, nor are we writing <a
href="http://grokcode.com/484/knuths-taocp-vol-4a-now-available-for-preorder/">the definitive text on Computer Science</a>.</p><p><a
title="Coders At Work" href="http://www.amazon.com/gp/product/1430219483?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1430219483"><img
class="alignleft size-full wp-image-451" title="Coders At Work" src="http://grokcode.com/wordpress/wp-content/uploads/codersatwork1.jpg" alt="Coders At Work" width="166" height="240" /></a>Peter Seibel used excepts of his book, <a
title="Coders At Work" href="http://www.amazon.com/gp/product/1430219483?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1430219483">Coders at Work</a>, to put together a nice <a
href="http://gigamonkeys.com/blog/2009/10/05/coders-unit-testing.html">synopsis of both sides of the TDD debate</a>. The central criticism of TDD is that it slows developers down, while TDD proponents claim that unit testing does not slow a project down, and that in cases TDD actually speeds things up. So who is right here?</p><p><a
title="TDD Research" href="http://research.microsoft.com/en-us/projects/esm/nagappan_tdd.pdf">Research done by IBM and Microsoft</a> indicates that TDD teams took 15-35% longer than teams using more traditional development practices. However, the bug density of projects developed using TDD decreased 40-90% relative to similar projects that did not practice TDD. There is nothing here to support the claim that Test Driven Development is faster, but the study leaves an important question unanswered.</p><p>If we control for defect rate, is TDD faster? Could the non-TDD teams have produced code with a similar defect rate if they had used as much development time as the TDD teams? I would be willing to bet that they could. So why didn&#8217;t the non-TDD teams take more time in order to reduce their defect rate? Why did they declare the project done and ship with so many outstanding bugs?</p><p>The IBM-Microsoft research used case studies of real projects developed in a professional setting. Accordingly, these projects experienced the same schedule pressures and race-to-the-finish bug fixing sessions that professional programmers are all too familiar with. TDD developers iterate rapidly between test and code. Since testing is such an integral part of the development methodology, they are unlikely to skimp on test coverage even when deadlines loom. However non-TDD teams are more likely to back load testing, which allows them to met unrealistic deadlines by sacrificing testing time. Anecdotal evidence certainly supports this scenario.</p><blockquote><p>There’s bound to be stuff where this would have gone faster if we’d had unit tests or smaller modules or whatever. That all sounds great in principle. Given a leisurely development pace, that’s certainly the way to go. But when you’re looking at, “We’ve got to go from zero to done in six weeks,” well, I can’t do that unless I cut something out. And what I’m going to cut out is the stuff that’s not absolutely critical. And unit tests are not critical.<cite>-Jamie Zawinski in <a
href="http://www.amazon.com/gp/product/1430219483?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1430219483">Coders at Work</a></cite></p></blockquote><p>Shunting the testing phase off until the end of a project makes it particularly vulnerable to schedule pressure, because the code is in some sense done when all of the features have been implemented. Even though the code is buggy, there is in fact a shippable product. It may be very tempting to just ship it, especially if the project has already experienced scheduling delays. In contrast, the same application developed with TDD won&#8217;t be nearly as vulnerable to schedule pressure because the test-up-front methodology delays the point where there is a shippable product.</p><p>So perhaps the most valuable effect of TDD is just a side effect of upfront unit testing: it relieves schedule pressure and allows teams to delay the point at which code can be called done.</p> <img src="http://feeds.feedburner.com/~r/GrokCode/~4/j7ztdetLJQo" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://grokcode.com/439/test-driven-development-and-the-meaning-of-done/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> <item><title>Java Build Systems: A Sad State of Affairs</title><link>http://grokcode.com/538/java-build-systems-a-sad-state-of-affairs/</link> <comments>http://grokcode.com/538/java-build-systems-a-sad-state-of-affairs/#comments</comments> <pubDate>Mon, 04 Oct 2010 12:00:53 +0000</pubDate> <dc:creator>Jess Johnson</dc:creator> <category><![CDATA[Books & Tools]]></category> <category><![CDATA[ant]]></category> <category><![CDATA[build tools]]></category> <category><![CDATA[buildr]]></category> <category><![CDATA[gradle]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[make]]></category> <category><![CDATA[maven]]></category> <category><![CDATA[rake]]></category> <guid isPermaLink="false">http://grok-code.com/?p=538</guid> <description><![CDATA[The evolution from Make, to Ant, and then to Maven has done precious little to advance the state of Java build tools. Developers are still stuck with poorly thought-out tools that force us to violate DRY and write XML tag soup. Your team may be better served using a less popular alternative.]]></description> <content:encoded><![CDATA[<p>The evolution from Make, to Ant, and then to Maven has done precious little to advance the state of Java build tools. Developers are still stuck with poorly thought-out tools that force us to violate DRY and write XML tag soup. Your team may be better served using a less popular alternative.<span
id="more-538"></span></p><h2>In the beginning there was Make.</h2><p>But Makefiles aren&#8217;t natively compatible with Windows, nor are they inherently portable across Unixes. For a platform-independent language like Java, this was a big problem. Even for applications that did not require platform independence, Makefiles were perhaps an overly complex solution for Java builds.</p><h2>Then there was Ant.</h2><p>Ant stepped in and did a good job of addressing the major problems with Make for Java builds. Since Ant itself is written in Java and it abstracts away many of the details of the underlying OS, build files are for the most part platform-independent. Ant was also written specifically to work with Java, so it has some built in assumptions about the build process which reduce the number of things that need to be stated explicitly.</p><p>So Ant was an improvement over Make in some ways, but it introduced its own set of problems.</p><h3>XML and the angle bracket tax.</h3><p>Ant build files are pure XML. The unavoidable verbosity of XML compared to flat files, JSON, YAML, or virtually anything else is a clear violation of DRY (Don&#8217;t Repeat Yourself). This verbosity is expensive in terms of readability, clarity, and ultimately the time it takes humans to parse and extract the precious few bits of information hidden amongst the garbage. I won&#8217;t go into this too much as it has already been discussed to death.<sup>[<a
href="http://grokcode.com/538/java-build-systems-a-sad-state-of-affairs/#footnote_0_538" id="identifier_0_538" class="footnote-link footnote-identifier-link" title="See Jeff Atwood&amp;#8217;s XML: The Angle Bracket Tax and a rebuttal by Norman Walsh Defending the Tax for a nice overview of the discussion.">1</a>]</sup></p><p>I&#8217;m sure some will say that nobody should be mucking about in the build files anyway. In this day and age, the IDE should handle all of that ickiness. Fair enough. Until Netbeans creates a build file that can&#8217;t be read by the next Netbeans version, or until my team switches IDEs, or until I decide I want to use Emacs instead, or until I want to set up a continuous integration server and have to add some custom targets not handled by the IDE. Eventually something will happen and you will need to <del
datetime="2011-01-12T16:06:51+00:00">peak</del> peek under the covers.</p><p>And build files created by IDEs are not pretty. They work nicely when they work, but they are far more complicated than they need to be since they are designed to be general enough to support all kinds of crap.</p><p>The reality is that build files need to be hand-crafted for all but the simplest use cases, and the angle bracket tax must be paid.</p><h3>XML as programming language</h3><p>XML isn&#8217;t a language, it is a way of marking up documents. It is completely inappropriate for a build system where you often need the flexibility of a programming language. Lets look at conditionals as an example. Sure, there are ways of faking conditionals in XML markup, but which would you rather read?</p><p>A conditional in any sane language (here we use Ruby):</p><div
class="wp_syntax"><table><tr><td
class="line_numbers"><pre>1
2
3
</pre></td><td
class="code"><pre class="ruby"><span class="kw1">if</span> prop1 <span class="kw1">and</span> prop2 <span class="kw1">and</span> <span class="kw1">not</span> prop3
    <span class="kw3">print</span> <span class="st0">&quot;Doing stuff<span class="es0">\n</span>&quot;</span>
<span class="kw1">end</span></pre></td></tr></table></div><p>Or a pseudo conditional in Ant:</p><div
class="wp_syntax"><table><tr><td
class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td
class="code"><pre class="xml"><span class="sc3"><span class="re1">&lt;target</span> <span class="re0">name</span>=<span class="st0">&quot;cond&quot;</span> <span class="re0">depends</span>=<span class="st0">&quot;cond-if&quot;</span><span class="re2">/&gt;</span></span>
&nbsp;
<span class="sc3"><span class="re1">&lt;target</span> <span class="re0">name</span>=<span class="st0">&quot;check-cond&quot;</span><span class="re2">&gt;</span></span>
  <span class="sc3"><span class="re1">&lt;condition</span> <span class="re0">property</span>=<span class="st0">&quot;cond-is-true&quot;</span><span class="re2">&gt;</span></span>
    <span class="sc3"><span class="re1">&lt;and<span class="re2">&gt;</span></span></span>
      <span class="sc3"><span class="re1">&lt;not<span class="re2">&gt;</span></span></span>
        <span class="sc3"><span class="re1">&lt;equals</span> <span class="re0">arg1</span>=<span class="st0">&quot;${prop1}&quot;</span> <span class="re0">arg2</span>=<span class="st0">&quot;$${prop1}&quot;</span> <span class="re2">/&gt;</span></span>
      <span class="sc3"><span class="re1">&lt;/not<span class="re2">&gt;</span></span></span>
      <span class="sc3"><span class="re1">&lt;not<span class="re2">&gt;</span></span></span>
        <span class="sc3"><span class="re1">&lt;equals</span> <span class="re0">arg1</span>=<span class="st0">&quot;${prop2}&quot;</span> <span class="re0">arg2</span>=<span class="st0">&quot;$${prop2}&quot;</span> <span class="re2">/&gt;</span></span>
      <span class="sc3"><span class="re1">&lt;/not<span class="re2">&gt;</span></span></span>
      <span class="sc3"><span class="re1">&lt;equals</span> <span class="re0">arg1</span>=<span class="st0">&quot;${prop3}&quot;</span> <span class="re0">arg2</span>=<span class="st0">&quot;$${prop3}&quot;</span> <span class="re2">/&gt;</span></span>
    <span class="sc3"><span class="re1">&lt;/and<span class="re2">&gt;</span></span></span>
  <span class="sc3"><span class="re1">&lt;/condition<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/target<span class="re2">&gt;</span></span></span>
&nbsp;
<span class="sc3"><span class="re1">&lt;target</span> <span class="re0">name</span>=<span class="st0">&quot;cond-if&quot;</span> <span class="re0">depends</span>=<span class="st0">&quot;check-cond&quot;</span> <span class="re0">if</span>=<span class="st0">&quot;cond-is-true&quot;</span><span class="re2">&gt;</span></span>
  <span class="sc3"><span class="re1">&lt;echo</span> <span class="re0">message</span>=<span class="st0">&quot;Doing stuff&quot;</span><span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/target<span class="re2">&gt;</span></span></span></pre></td></tr></table></div><p>The above example is straight out of the official Ant FAQ. Yuck.</p><p>Or maybe you want to loop through a set of files and perform a set of operations on them.  XML (and by extension Ant) is not the tool of choice for this. We really want a simple Turing-complete language, not an ad hoc set of XML tag soup for a build system. A complex build process is a dynamic series of operations; it is unwieldy to shoehorn this into the XML syntax which was intended for a different purpose.</p><h3>Ant&#8217;s implementation</h3><p>Even ignoring for a moment the gross inappropriateness of XML, Ant&#8217;s implementation leaves much to be desired.</p><p>Take as an example a problem I ran into recently: use a set of jar files in the classpath, and then copy the jars and package them up with an application. Seems fairly simple right? Wrong. I could set up the classpath as a property, but Ant&#8217;s copy task requires a <code>FileSet</code>. OK. But creating a <code>FileSet</code> requires a base directory containing all of my jars. Some of my jars live with my project, and others are part of Tomcat on the machine I am using to build. So now what? Use root as the base directory? That seems ugly. Surely there must be a way to convert my classpath property to a <code>FilesSet</code>? Or to use Ant&#8217;s <code>Path</code> which can contain multiple files. Nope. If there is a way, it is well hidden. Maybe I could just shell out and use copy on the local machine. In that case I loose the platform independence Ant gives me; why didn&#8217;t I stick with Makefiles? So in the end the solution is to list the files twice: once in a format that I can use in a classpath, and again in a format that can be used for copy. So now I&#8217;m violating DRY again, but on a whole different level.</p><p>Ant doesn&#8217;t just encourage the creation of unmaintainable copypasta, it requires it.</p><p>We need something better.</p><h2>Along comes Maven.</h2><p>Maven&#8217;s philosophy is convention over configuration. So far so good. But Maven uses XML too, so it comes with all of the problems inherent in that choice. In fact, Maven completely ignores all of the pain points created by Ant, and aims to solve a completely different problem.</p><p>Maven&#8217;s &#8220;killer feature&#8221; is that it will check your project dependencies and pull new versions from upstream. Its design encourages you to ride the upgrade treadmill. Maybe I don&#8217;t want to put my application at risk of breaking every time upstream does something clever. Some applications don&#8217;t need shiny features, they need stability. This is something Java people should understand; the whole Java ecosystem revolves around an excellent set of standard libraries that are well tested and solid.</p><p>But even more troubling is that Maven introduces non-determinism into the build process.</p><blockquote><p>You have no control over, and limited visibility into, the dependencies specified by your dependencies. Builds <em>will</em> break because different copies of Maven <em>will</em> download different artifacts at different times; your local build <em>will</em> break again in the future when the dependencies of your dependencies accidentally release new, non-backwards compatible changes without remembering to bump their version number. Those are just the innocent failures, too; the far more likely scenario is your project depends on a specific version of some other project which in turn depends on the LATEST version of some other project, so you still get hosed even when downstream providers <em>do</em> remember to bump versions! Every release of every dependency’s dependencies becomes a new opportunity to waste several hours tracking down strange build failures.</p><p>But Maven is even worse than that: not only does Maven automatically resolve your project’s dependencies, it automatically resolves its own plugins’ dependencies, too! So now not only do you have to worry about separate instances of Maven accidentally downloading incompatible artifacts (or the same instance downloading incompatible artifacts at different times), you also have to worry about your build tool itself behaving differently across different machines at different times!<cite>-Kent R. Spillner on <a
href="http://kent.spillner.org/blog/work/2009/11/14/java-build-tools.html">Ant vs. Maven</a></cite></p></blockquote><h2>We still need something better.</h2><p>So whats next?</p><p>There aren&#8217;t any clear successors to Maven; certainly there is nothing on the horizon that looks like it is on the way to attracting the level of popularity currently enjoyed by Ant or Maven.</p><p>One interesting option comes full circle: <a
href="http://rake.rubyforge.org/">Rake</a> &#8211; Ruby Make. Rake looks quite promising; it uses Ruby syntax, not XML, and comes with a library of prepackaged tasks to make build files simpler. Other tools to investigate are <a
href="http://jmk.sourceforge.net/edu/neu/ccs/jmk/index.html">Make in Java &#8211; JMK</a> and <a
href="http://java-source.net/open-source/build-systems/apb">APB</a>.</p><p><strong>Update:</strong> Several people in the comments are recommending <a
href="http://buildr.apache.org/">Buildr</a> or <a
href="http://gradle.org">Gradle</a>.</p><ol
class="footnotes"><li
id="footnote_0_538" class="footnote">See Jeff Atwood&#8217;s <a
href="http://www.codinghorror.com/blog/2008/05/xml-the-angle-bracket-tax.html">XML: The Angle Bracket Tax</a> and a rebuttal by Norman Walsh <a
href="http://norman.walsh.name/2008/05/13/thetax">Defending the Tax</a> for a nice overview of the discussion.</li></ol><img src="http://feeds.feedburner.com/~r/GrokCode/~4/vBu5h_0xMgw" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://grokcode.com/538/java-build-systems-a-sad-state-of-affairs/feed/</wfw:commentRss> <slash:comments>47</slash:comments> </item> <item><title>Knuth’s TAOCP Vol. 4A Now Available For Pre-order</title><link>http://grokcode.com/484/knuths-taocp-vol-4a-now-available-for-preorder/</link> <comments>http://grokcode.com/484/knuths-taocp-vol-4a-now-available-for-preorder/#comments</comments> <pubDate>Mon, 20 Sep 2010 01:52:44 +0000</pubDate> <dc:creator>Jess Johnson</dc:creator> <category><![CDATA[Books & Tools]]></category> <category><![CDATA[algorithms]]></category> <category><![CDATA[books]]></category> <category><![CDATA[computer science]]></category> <category><![CDATA[Knuth]]></category> <category><![CDATA[TAOCP]]></category> <category><![CDATA[The Art of Computer Programming]]></category> <guid isPermaLink="false">http://grok-code.com/?p=484</guid> <description><![CDATA[&#8220;Combinatorial Algorithms,&#8221; the 4th Volume of Knuth&#8217;s seminal work, The Art of Computer Programming, has been a long time in the making (Volume 3 was published in 1973), but it is now available for pre-order from Amazon. TAOCP is widely regarded as the most comprehensive book on its topic and is included in GrokCode&#8217;s list [...]]]></description> <content:encoded><![CDATA[<p>&#8220;Combinatorial Algorithms,&#8221; the 4th Volume of Knuth&#8217;s seminal work, The Art of Computer Programming, has been a long time in the making (Volume 3 was published in 1973), but it is now available for pre-order from Amazon. TAOCP is widely regarded as the most comprehensive book on its topic and is included in GrokCode&#8217;s list of <a
href="http://grokcode.com/60/5%C2%BD-more-books-in-a-hacker%E2%80%99s-bookshelf/">essential books for programmers</a>.<span
id="more-484"></span></p><p><a
href="http://www.amazon.com/gp/product/0321751043?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321751043"><img
class="size-full wp-image-486 alignleft" title="The Art of Computer Programming Vols 1-4" src="http://grokcode.com/wordpress/wp-content/uploads/taocp1-41.jpg" alt="The Art of Computer Programming Vols 1-4" width="298" height="243" /></a>If Computer Science has one definitive text, then TAOCP is it. So if you don&#8217;t have a copy in your library already, now is as good a time as any to pick it up.</p><p>You can pre-order <a
href="http://www.amazon.com/gp/product/0321751043?ie=UTF8&amp;tag=grok-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0321751043">Volumes 1-4A of TAOCP</a> from Amazon now. All Amazon pre-orders come with a price guarantee, so if the price drops before the book ships, you will automatically get the lower price.</p><p>The boxed set includes Volume 1: Fundamental Algorithms, Volume 2: Seminumerical Algorithms, Volume 3: Sorting and Searching, plus the new Volume 4A: Combinatorial Algorithms.</p><p>The 4th volume is the first part in a series on Combinatorial Algorithms. Its coverage begins with Boolean functions and bitwise tricks and techniques, then treats in depth the generation of all tuples and permutations, all combinations and partitions, and all trees.</p><p>Here is the full table of contents for the new volume:</p><h2>Volume 4A: Combinatorial Algorithms, Part 1</h2><ul><li>7. Introduction<ul><li>7.1. Zeros and ones<ul><li>7.1.1. Boolean basics</li><li>7.1.2. Boolean evaluation</li><li>7.1.3. Bitwise tricks and techniques</li><li>7.1.4. Binary decision diagrams</li></ul></li><li>7.2. Generating all possibilities<ul><li>7.2.1. Combinatorial generators<ul><li>7.2.1.1. Generating all n-tuples</li><li>7.2.1.2. Generating all permutations</li><li>7.2.1.3. Generating all combinations</li><li>7.2.1.4. Generating all partitions</li><li>7.2.1.5. Generating all set partitions</li><li>7.2.1.6. Generating all trees</li><li>7.2.1.7. History and further references</li></ul></li></ul></li></ul></li></ul> <img src="http://feeds.feedburner.com/~r/GrokCode/~4/WZ2kBb_QT78" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://grokcode.com/484/knuths-taocp-vol-4a-now-available-for-preorder/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss><!-- Dynamic page generated in 0.764 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-02-21 23:30:56 --><!-- Compression = gzip -->

