<?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>Brian E. Granger</title>
	<atom:link href="http://brianegranger.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://brianegranger.com</link>
	<description>Physics ∩ Computing</description>
	<lastBuildDate>Thu, 10 Jan 2013 16:59:31 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Personal Reflections on Features and Scope</title>
		<link>http://brianegranger.com/?p=261</link>
		<comments>http://brianegranger.com/?p=261#comments</comments>
		<pubDate>Wed, 09 Jan 2013 18:44:01 +0000</pubDate>
		<dc:creator>Brian Granger</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://brianegranger.com/?p=261</guid>
		<description><![CDATA[<p>In a previous <a title="previous blog post" href="http://brianegranger.com/?p=249" target="_blank">blog post</a>, I talked about the problem of ever expanding feature sets in open source software projects.  I discussed the hidden  costs and liabilities of adding new features and proposed practical ways of tackling these problems.  However, I think that story is incomplete.  Of course open source [...]]]></description>
			<content:encoded><![CDATA[<p>In a previous <a title="previous blog post" href="http://brianegranger.com/?p=249" target="_blank">blog post</a>, I talked about the problem of ever expanding feature sets in open source software projects.  I discussed the hidden  costs and liabilities of adding new features and proposed practical ways of tackling these problems.  However, I think that story is incomplete.  Of course open source projects will want to add features, even some with massive costs and liabilities, but how should that happen?  How should projects decide which features to add?  What criteria should be used?  To answer these questions, I want to describe a few of my own experiences in dealing with features and scope in IPython and PyZMQ.</p>
<p>First, <a title="IPython" href="http://ipython.org/" target="_blank">IPython</a>.  Anyone who is familiar with IPython will probably read my previous blog post and say, &#8220;wait, hasn&#8217;t IPython experienced a massive amount of feature creep over the last few years.  It started out as a simple terminal based interactive shell, but has grown to include parallel computing, a web application and a GUI application.  The IPython developers, including yourself, have shown little, if any restraint in adding features.&#8221;</p>
<p>Back in 2004, IPython was the 3 year old child of Fernando Perez.  At that point, it was already a popular, enhanced interactive Python shell.  I had started to work on parallel computing libraries for Python, when Fernando visited me at Santa Clara University (we had been classmates in graduate school starting in 1996).  We stayed up until 3 am talking about Python&#8217;s rapidly evolving ecosystem of scientific computing libraries, interactive computing environments and the future of IPython and my parallel computing libraries.  IPython was a fantastic tool, but both of us wanted more.  We wanted a web based IPython Notebook.  We wanted integrated parallel computing tools.  We began to see that all of these things required the same architecture: a stateful computational engine, the IPython Kernel, that could run user code and send back results over a network.  Once that existed, everything else could be layered on top, even the terminal based IPython.  The vision that emerged that night was specific and, while ambitious, was ultimately finite.  As Fernando describes, in this <a title="History of the IPython Notebook" href="http://blog.fperez.org/2012/01/ipython-notebook-historical.html" target="_blank">blog post</a>, it took us ~6 years and multiple attempts to build this architecture.  Now, we have a terminal, QtConsole, web-based notebook and parallel computing library all built on top of a common IPython Kernel and message specification.  While these things may look like feature creep from the outside, they have been part of a deliberate and calculated plan.</p>
<p>What I have learned from this experience is that it is absolutely critical for the core developers of an open source project to consciously and deliberately set the scope and vision for the project.  This vision can even be ambitious.  Once that scope is set, choosing which features to add becomes easy: to first order, you add features within that scope.  That doesn&#8217;t mean you don&#8217;t count the cost of those features or that you add all possible features within the scope.  The scope provides an upper bound on the feature set.  So why does IPython have parallel computing tools?  Because we set the scope early on to include that.</p>
<p>Second, <a title="PyZMQ" href="https://github.com/zeromq/pyzmq" target="_blank">PyZMQ</a>.  As we developed IPython&#8217;s architecture, we realized that we needed better networking/messaging libraries.  This led to the creation of PyZMQ in 2010, which is a set of Python bindings for <a title="ZeroMQ" href="http://www.zeromq.org/" target="_blank">ZeroMQ</a>.  Notice the scope of PyZMQ: Python bindings for ZeroMQ.  Fast forward to Spring of 2012.  In the course of working on the IPython Notebook, I had written some additional code for building PyZMQ based web applications: a module for simple, PyZMQ-based RPC and a module for running Tornado event handlers in a scalable and distributed manner using PyZMQ.  I submitted two <a title="pull request 1" href="https://github.com/zeromq/pyzmq/pull/177" target="_blank">pull</a> <a title="pull request 2" href="https://github.com/zeromq/pyzmq/pull/174" target="_blank">requests</a> to include these modules in PyZMQ.  One of them was quickly merged and the other languished in code review for almost a year.  Min began to sense that these modules, while useful, were not a good match for inclusion in PyZMQ.  Their API was very unstable and they hadn&#8217;t been well tested.  They would require a much faster release cycle compared to the rest of PyZMQ, which was very stable and well tested.  This Christmas break, I finally woke up to the real problem.  These modules were outside the scope of PyZMQ.  They involved an implicit and undiscussed increase in scope from &#8220;Python bindings for ZeroMQ&#8221; to &#8220;A general place for ZeroMQ based tools in Python.&#8221;  Once I realized this, Min and I pulled them out of PyZMQ and created separate projects for them.  Again, the important thing is to set the scope of a project.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://brianegranger.com/?feed=rss2&#038;p=261</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Features and Scope in Open Source Software</title>
		<link>http://brianegranger.com/?p=249</link>
		<comments>http://brianegranger.com/?p=249#comments</comments>
		<pubDate>Wed, 09 Jan 2013 03:49:20 +0000</pubDate>
		<dc:creator>Brian Granger</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://brianegranger.com/?p=249</guid>
		<description><![CDATA[<p>Follow up: I have created another blog post to clarify some of these issues <a title="Follow up post." href="http://brianegranger.com/?p=261" target="_blank">here</a>.</p> <p>The IPython project, through UC Berkeley and Cal Poly San Luis Obispo, just received a $1.15 million dollar grant from the Alfred P. Sloan Foundation to develop the IPython Notebook over a two year period. [...]]]></description>
			<content:encoded><![CDATA[<p>Follow up: I have created another blog post to clarify some of these issues <a title="Follow up post." href="http://brianegranger.com/?p=261" target="_blank">here</a>.</p>
<p>The IPython project, through UC Berkeley and Cal Poly San Luis Obispo, just received a $1.15 million dollar grant from the Alfred P. Sloan Foundation to develop the IPython Notebook over a two year period.  More details about this grant can be found on the <a title="IPython website" href="http://ipython.org/sloan-grant.html" target="_blank">IPython website</a>.  This is really exciting for us because, so far, we have mostly developed IPython in our spare time.  But I think there is also a potential danger here.  <strong>The danger is that we will add lots of new features.</strong>  What, you say, lots of features will endanger IPython?  What else are you going to do with a million dollars if you are not going to add lots of new features?  The answer is simple: we are going to add as few features as possible and knock each of them out of the park.  The future of the project depends on this.</p>
<p>This is a topic that I have been thinking about a lot lately: how do open source projects decide which features to implement.  Most active open source projects I am involved in see a continual stream of new features.  Just hop onto the GitHub pages for <a title="SymPy GitHub" href="https://github.com/sympy/sympy/pulls" target="_blank">SymPy</a> or <a title="IPython GitHub" href="https://github.com/ipython/ipython/pulls" target="_blank">IPython</a> and watch the activity.  Anyone with the right skill set can fork a project on GitHub and submit a pull request within a few hours.  Amazingly, this is happening all the time; apparently people love to code.  While each new feature is an asset for the project, it also brings a cost, or liability, with it.  If a project ignores those costs, it can have long term, detrimental effects on the project.  What are these liabilities and costs associated with new features?</p>
<ul>
<li>Each new feature adds complexity to the code base.  Complexity makes a code base less hackable, maintainable, extensible.</li>
<li>Each new feature increases the &#8220;bug surface&#8221; of the project.  When a feature also adds complexity, those bugs become harder to find and fix.</li>
<li>Each new feature requires documentation to be written and maintained.</li>
<li>Each new feature requires support over email or IRC.</li>
<li>Endless feature expansion, or feature creep, requires developers to specialize.  They can&#8217;t follow the entire project, so they have to focus on a subset that can fit into their brain and schedule.</li>
<li>Each new feature has to be tested on a wide variety on platforms (Linux, Mac, Windows) and environments (PyPy, Python 2, Python 3).</li>
<li>Each new feature adds complexity to the user experience.  Sometimes it&#8217;s the documentation, other times the UI or configuration options.</li>
<li>When you spend on one feature, another feature or bug fix didn&#8217;t get worked on.  If you didn&#8217;t prioritize things beforehand, you just spent time on something less important to your users.  Either that or you did shoddy work while trying to do it all.</li>
<li>Features multiply like bunnies.  How many times have you heard, &#8220;wow, that new feature is really cool, could you make it do X as well?&#8221;</li>
<li>Features are easy to add, difficult to remove.  Once you add a feature, you are stuck with the costs and liabilities.</li>
</ul>
<p>For a typical open source project, what percentage of features get used regularly by most users?  15%? 40%?.  Let&#8217;s be really optimistic and say that number is 60%.  That means that developers are spending 40% of their time and effort on features that don&#8217;t really get used.  Ouch.  Then why do open source projects keep adding features without counting the cost?  I think there are a number of factors that lead to this, but one in particular comes to my mind.  <strong>It is hard to say no.</strong>  When an end user submits a feature request over email or on GitHub issues, it is hard to tell them, &#8220;great idea, but we are not doing that.&#8221;  It is even more difficult to say no after someone submits a pull request that implements a new feature.  It is difficult to build a vibrant project community if you are always saying no in these contexts.</p>
<p>Clearly, we need a better way of limiting feature expansion in open source projects.  What can we do to better evaluate the hidden costs of adding new features so we can make informed, strategic decisions about which features to add?  Here are some ideas that have emerged out of my recent reading and conversations.</p>
<ul>
<li>Create a wiki page for your project, where you list all of the features you are <strong>not</strong> going to implement.  Publicize this list, discuss it and make it an important part of the development workflow.  Another way of phrasing this is to decide on a finite scope for the project.  When you are going through this exercise, come up with an initial scope and then force yourself to reduce it.</li>
<li>Make features fight hard to be accepted and implemented.  Communicate to the community and developers that the default answer to feature requests is no (it&#8217;s not personal!) and don&#8217;t even consider implementation until the much of the community is crying &#8220;we absolutely must have this.&#8221; Even then, you don&#8217;t have to say yes.</li>
<li>Create a workflow that separates feature requests from other tickets/issues.  When people submit new feature requests, encourage discussion, but don&#8217;t automatically promote the feature to the project&#8217;s todo list.  Then you can promote them, as needed, to the project&#8217;s todo list in an informed and prioritized manner.</li>
<li>When new feature requests appear, discuss the specific costs and liabilities associated with the feature.  Build this thinking into your development DNA.</li>
<li>Communicate to the community and its developers why it is important to fight against feature expansion.  Focus on the benefits of waging this war: smaller, simpler code base, fewer bugs, more time to focus on important features, easier to support, etc.</li>
<li>Remove features that have too great a cost or that few users actually use.  Maybe even create a special exception you can raise (FeatureReductionWarning?) to help people transition away from them.</li>
<li>Refactor the codebase to reduce complexity.  While this doesn&#8217;t directly reduce the number of features, it can mitigate the cost of existing and future features.  Extra bonus points if you can implement a new feature while dramatically reducing the complexity of the code base.</li>
<li>Improve testing.  Again, this is mitigation.</li>
</ul>
<p>As you discuss and evaluate features, here are some questions you can ask yourself and the community:</p>
<ul>
<li>What fraction of your user base will use the feature?  How often will they use it?  If it won&#8217;t be used by most of your users, just say no.</li>
<li>Can the feature be added as a third party plugin or library?  This is especially useful if the new feature would increase the overall scope of the project, but make a great standalone project.</li>
<li>How difficult will it be to test, debug, document, and maintain the feature?  What fraction of your development team is capable or interested in doing this work?  If the maintanence is huge and only one person is willing to do it, it is time to rethink it.</li>
<li>Can you implement the functionality in a more limited, but much simpler manner?  Developers absolutely love to implement features in the most general way possible.  It requires developer discipline and focus to resist this temptation.</li>
<li>One way that developers over engineer things is by making every conceivable thing configurable.  Can you simplify the feature by removing configurability and just choosing great defaults?</li>
</ul>
<p>One thoughtful discussion of these issues is in the book <a title="Getting Real" href="http://gettingreal.37signals.com/" target="_blank">Getting Real</a>, by some of the folks at <a title="37signals" href="http://37signals.com/" target="_blank">37signals</a>.  They propose something quite radical for handling feature requests in commercial web applications.  Here is what they say: &#8220;How do you manage them?  You don&#8217;t.  Just read them and then throw them away.&#8221;  Their experience is that the important features will keep coming up.  When this happens, you know they are important and you don&#8217;t have to write them down to keep track of them.  This is definitely my experience in developing the IPython Notebook.  The most important features, the ones that I am going to spend time on this year, are probably not written down anywhere, but everyone in the community is discussing them and couldn&#8217;t possibly forget them.  So why on earth do we currently have <a title="177 open enhancement issues for IPython" href="https://github.com/ipython/ipython/issues?direction=desc&amp;labels=type-enhancement&amp;page=1&amp;sort=updated&amp;state=open" target="_blank">177 open new feature issues</a> (we call them &#8220;enhancements&#8221;) on IPython&#8217;s GitHub site?</p>
<p>In an open source project, I don&#8217;t think it makes sense to literally throw away feature requests; sometimes the ensuing discussion is valuable and worth preserving.  But what about allowing the discussion to occur, for example in the context of a GitHub issue, but then closing the issue.  If someone wants to re-open the feature request at a later time to voice their support, they should be encouraged to do that.  But again, once discussion stops, the issue should be re-closed.  As this process repeats itself, the community is essentially voting for the features they want.  This would also dramatically reduce the number of open issues, which helps developers to better manage the active work on the project.</p>
<p>I don&#8217;t think this is the only way to manage feature requests intelligently in an open source project.  I would love to hear other ideas.  How are you managing these things in your own projects?  I realize that I am far from the first person to write about these things.  What other resources do you know of that address these problems?</p>
]]></content:encoded>
			<wfw:commentRss>http://brianegranger.com/?feed=rss2&#038;p=249</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>PyData NY</title>
		<link>http://brianegranger.com/?p=235</link>
		<comments>http://brianegranger.com/?p=235#comments</comments>
		<pubDate>Thu, 29 Nov 2012 05:36:31 +0000</pubDate>
		<dc:creator>Brian Granger</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://brianegranger.com/?p=235</guid>
		<description><![CDATA[<p>This past month, I attended <a title="PyData NY" href="http://nyc2012.pydata.org/" target="_blank">PyData NY</a> in midtown Manhattan. This is the second PyData conference and the folks at <a title="Continuum Analytics" href="http://continuum.io/" target="_blank">Continuum Analytics</a> have done a spectacular job in promoting and running this conference. In less than a year PyData has grown to over 200 attendees.  The timing [...]]]></description>
			<content:encoded><![CDATA[<p>This past month, I attended <a title="PyData NY" href="http://nyc2012.pydata.org/" target="_blank">PyData NY</a> in midtown Manhattan. This is the second PyData conference and the folks at <a title="Continuum Analytics" href="http://continuum.io/" target="_blank">Continuum Analytics</a> have done a spectacular job in promoting and running this conference. In less than a year PyData has grown to over 200 attendees.  The timing (right after <a title="Strata" href="http://strataconf.com/" target="_blank">Strata</a>) and location (NY and Bay Area) of the PyData conferences are definitely a strong part of the success.</p>
<p>The conference had a wide range of talks from a fantastic set of speakers. It is very clear that the community is growing in leaps and bounds and that there are a lot of bright people writing great code.  It is always fun to think back on where the community and various projects were in the past.  Just think, it wasn&#8217;t that long ago, that <a title="Pandas" href="http://pandas.pydata.org/" target="_blank">Pandas</a> didn&#8217;t exist!  Where will we be in another 3 years?</p>
<p>The representation of IPython at the conference was amazing.  Not only did I present two talks on the IPython Notebook and IPython.parallel, but many of the other presenters used the IPython Notebook in their talks.  Ultimately, in developing the IPython Notebook we are scratching our own itch.  We are working scientists who need better tools for our research.  But it is seriously gratifying to see that how useful other people find it.  That makes developing it one of the most enjoyable things I have ever done.</p>
<p>Continuum has put all of the talks on Vimeo <a title="here" href="http://vimeo.com/continuumanalytics" target="_blank">here</a>, but I wanted to point out a few related to IPython:</p>
<p>First, I gave a talk about the <a title="IPython Notebook" href="http://vimeo.com/53051817" target="_blank">IPython Notebook</a>.  With 45 minutes, I was able to give a talk that was almost tutorial in nature.  In preparing this talk, I went through the IPython example Notebooks and organized/updated all of them.  This should provide a much nicer set of materials for people wanting to learn about the Notebook.  We are currently in the process of reviewing the pull request for these updates.</p>
<p>Second, I gave a talk about <a title="IPython parallel" href="http://vimeo.com/53056634" target="_blank">IPython.parallel</a>.  For this talk, I mostly followed a set of materials that Min Ragan-Kelley prepared for previous SciPy/PyCon tutorials.  Min has done a fantastic job with IPython.parallel and this set of materials really goes into great depth on all of the details.  This material is hosted <a href="https://github.com/ipython/talks" target="_blank">here</a>.</p>
<p>Third, Michael Selik gave a nice talk entitled <a title="IPython as a teaching tool" href="http://vimeo.com/53105125" target="_blank">IPython as a teaching tool</a>, which explores using the IPython Notebook in a teaching context.  It is becoming clear that the Notebook is particularly useful in this context and it was very helpful to have someone reflect on how that was going for them.</p>
<p>Finally, Massimo di Stefano is doing some <a title="amazing things" href="http://vimeo.com/53094837" target="_blank">amazing things</a> with the Notebook and GIS.  He is really leveraging the ability of the Notebook to embed arbitrary HTML.  He even has a &#8220;gearth&#8221; function that embeds Google Earth in an output cell!  Here is one of his <a title="GIS Notebook" href="http://nbviewer.ipython.org/url/epi.whoi.edu/esr/GIS_GRASS-R_Example.ipynb" target="_blank">Notebooks</a> on nbviewer.ipython.org.</p>
<p>Unfortunately, many people left early because of hurricane Sandy, so the sprints were sparsely attended.  I was glad to catch my flight back to the west coast only hours before JFK closed.  Can&#8217;t wait for <a title="PyData Silicon Valley" href="http://sv2013.eventbrite.com/" target="_blank">PyData in Silicon Valley</a> after PyCon.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://brianegranger.com/?feed=rss2&#038;p=235</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blogging with the IPython Notebook</title>
		<link>http://brianegranger.com/?p=215</link>
		<comments>http://brianegranger.com/?p=215#comments</comments>
		<pubDate>Fri, 05 Oct 2012 02:54:59 +0000</pubDate>
		<dc:creator>Brian Granger</dc:creator>
				<category><![CDATA[Computing]]></category>

		<guid isPermaLink="false">http://brianegranger.com/?p=215</guid>
		<description><![CDATA[<p>The IPython dev team gets a lot of questions about how IPython Notebooks can be used on various blogging platforms. There have been a number of different attempts to use nbconvert to export a notebook to HTML and then embedding that HTML in the blogging platform. With the introduction of <a title="IPython Notebook Viewer" href="http://nbviewer.ipython.org" [...]]]></description>
			<content:encoded><![CDATA[<p>The IPython dev team gets a lot of questions about how IPython Notebooks can be used on various blogging platforms. There have been a number of different attempts to use nbconvert to export a notebook to HTML and then embedding that HTML in the blogging platform. With the introduction of <a title="IPython Notebook Viewer" href="http://nbviewer.ipython.org" target="_blank">nbviewer</a> it is trivial to embed a Notebook in any web page using iframes.  Here is a simple example:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;iframe src=&quot;http://nbviewer.ipython.org/3835181/&quot; width=&quot;800&quot; height=&quot;1500&quot;&gt;&lt;/iframe&gt;</div></div>
<p>Which produces the embedded Notebook shown below.  The only subtle part is that you have to set the width and height attributes manually to avoid having scroll bars on the iframe.</p>
<p><iframe src="http://nbviewer.ipython.org/3835181/" width="800" height="1500"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://brianegranger.com/?feed=rss2&#038;p=215</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cal Poly Physics department cluster</title>
		<link>http://brianegranger.com/?p=123</link>
		<comments>http://brianegranger.com/?p=123#comments</comments>
		<pubDate>Tue, 08 Mar 2011 20:42:49 +0000</pubDate>
		<dc:creator>Brian Granger</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Physics]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.brianegranger.com/?p=123</guid>
		<description><![CDATA[<p>Here are some photos of the new cluster, which we are calling &#8220;dirac&#8221;, in the Physics department.  This cluster will be used for research in a broad range of fields in the department including:</p> Quantum information Atomic and molecular physics Parallel and distributed computing Astrophysics and cosmology Particle and nuclear physics Particle beam physics Seismology [...]]]></description>
			<content:encoded><![CDATA[<p>Here are some photos of the new cluster, which we are calling &#8220;dirac&#8221;, in the Physics department.  This cluster will be used for research in a broad range of fields in the department including:</p>
<ul>
<li>Quantum information</li>
<li>Atomic and molecular physics</li>
<li>Parallel and distributed computing</li>
<li>Astrophysics and cosmology</li>
<li>Particle and nuclear physics</li>
<li>Particle beam physics</li>
<li>Seismology</li>
</ul>

<a href='http://brianegranger.com/?attachment_id=124' title='IMG_1093'><img width="150" height="150" src="http://brianegranger.com/wp-content/uploads/2011/03/IMG_1093-150x150.jpg" class="attachment-thumbnail" alt="IMG_1093" title="IMG_1093" /></a>
<a href='http://brianegranger.com/?attachment_id=125' title='IMG_1094'><img width="150" height="150" src="http://brianegranger.com/wp-content/uploads/2011/03/IMG_1094-150x150.jpg" class="attachment-thumbnail" alt="IMG_1094" title="IMG_1094" /></a>
<a href='http://brianegranger.com/?attachment_id=126' title='IMG_1096'><img width="150" height="150" src="http://brianegranger.com/wp-content/uploads/2011/03/IMG_1096-150x150.jpg" class="attachment-thumbnail" alt="IMG_1096" title="IMG_1096" /></a>
<a href='http://brianegranger.com/?attachment_id=127' title='IMG_1097'><img width="150" height="150" src="http://brianegranger.com/wp-content/uploads/2011/03/IMG_1097-150x150.jpg" class="attachment-thumbnail" alt="IMG_1097" title="IMG_1097" /></a>

<p>The system specs are as follows:</p>
<ul>
<li>4x Dell R710 servers</li>
<li>Dual Xeon 5650 CPUs (6 core)</li>
<li>48 GB RAM</li>
<li>5x 1 TB hot plug, 6Gb/s SAS drives</li>
<li>4x Gb ethernet</li>
</ul>
<p>This works out to a total of 48 cores, 192 GB RAM and 20 TB of storage.</p>
]]></content:encoded>
			<wfw:commentRss>http://brianegranger.com/?feed=rss2&#038;p=123</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why Python?</title>
		<link>http://brianegranger.com/?p=38</link>
		<comments>http://brianegranger.com/?p=38#comments</comments>
		<pubDate>Wed, 13 May 2009 21:48:45 +0000</pubDate>
		<dc:creator>Brian Granger</dc:creator>
				<category><![CDATA[Computing]]></category>

		<guid isPermaLink="false">http://bgranger.webfactional.com/?p=38</guid>
		<description><![CDATA[<p>I began playing with computers back in the early 80&#8242;s when my elementary school got an Apple II. I was immediately drawn to it and began coming in whenever I could and playing around. I began with LOGO (remember the turtle) and later moved on to BASIC. Eventually, I convinced my parents that we really [...]]]></description>
			<content:encoded><![CDATA[<p>I began playing with computers back in the early 80&#8242;s when my elementary school got an Apple II. I was immediately drawn to it and began coming in whenever I could and playing around. I began with LOGO (remember the turtle) and later moved on to BASIC. Eventually, I convinced my parents that we really needed a computer and they purchased an Apple IIc &#8220;for the family.&#8221; We had this computer until I went to college in 1990. Thus began my enjoyment of computers and programming.</p>
<p>While in graduate school in Physics, I began to use Unix and Linux and learned C, C++ and Perl. During this time, my research in theoretical Physics involved lots of computational work. At the time most physicists around me were working in Fortran. But, I figured that learning C and C++ would be more useful in the long run. As I began working in C++, however, I realized that I had a dilemma: the major computing libraries for Linear Algebra (BLAS and LAPACK) were written in Fortran. Furthermore, C and C++ did not have a robust, built in-multidimensional array type like Fortran (for Linear Algebra). So C++ gave me all the niceties of an object oriented language, but none of of basic tools that I needed for my research. Surely, I was not the only person to have dealt with this problem when moving to a more modern language than Fortran.</p>
<p>My solution at the time, while not efficient in terms of human effort, was to write my own object oriented C++ library for performing matrix and array manipulations. This took a lot of time as I really wanted to get things right. I used C++ templates to define matrices for the different basic types of data (int, float, double). To keeps things computationally efficient, I had my classes call LAPACK for all of the time consuming things. I ended up using this library for all of my scientific codes during graduate school and my postdoc. Once I started using my library to write scientific code the benefits were obvious. I could code complex algorithms rapidly, with few bugs. While this was wonderful, the cost was also huge. I probably spent 6 months of full time work in graduate school writing and maintaining my C++ linear algebra library.  I didn&#8217;t know about open source at the time, so I did this all on my own and kept it to myself.</p>
<p>At the beginning of my postdoc, a friend of mine introduced me to Python and open source software. My friend claimed that Python and open source software opened up completely new ways of approaching scientific computing. Python was object oriented, dynamically typed, could be used interactively (like Mathematica or Matlab), and there were high quality, open source libraries for scientific computation (NumPy, Scipy, IPython, Matplotlib, SymPy) and interfacing with other languages (Swig, Weave, f2py, Cython, Ctypes).</p>
<p>I first tried a few smaller projects using Python. I was amazed at how quickly I could write and debug code. Working interactively was a dream &#8211; no more endless edit, compile, debug, recomplie, execute cycles! Within a short period of time, I had made the decision to start all of my new projects in Python.  Since then I have used Python on a number of scientific codes and I have been extremely happy with it. Most importantly, I am having more fun with computing than I ever have before and I have found that Python has freed me up to think differently about computing, and consequentially about Physics.  Looking back, I can&#8217;t believe how painful everything used to be with my C++/bash/perl/Grace toolchain.</p>
]]></content:encoded>
			<wfw:commentRss>http://brianegranger.com/?feed=rss2&#038;p=38</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
