<?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>Coffee on the Keyboard &#187; mozilla</title>
	<atom:link href="http://coffeeonthekeyboard.com/tag/mozilla/feed/" rel="self" type="application/rss+xml" />
	<link>http://coffeeonthekeyboard.com</link>
	<description>by James Socol</description>
	<lastBuildDate>Fri, 20 Apr 2012 22:17:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/>		<item>
		<title>Performance is a Feature</title>
		<link>http://coffeeonthekeyboard.com/performance-is-a-feature-623/</link>
		<comments>http://coffeeonthekeyboard.com/performance-is-a-feature-623/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 16:00:05 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=623</guid>
		<description><![CDATA[What do I mean when I say &#8220;performance  is a feature?&#8221; For a long time, I got this wrong. When I explained myself, I&#8217;d say that performance was as important as any other feature and worth spending as much time on as any other feature, and you shouldn&#8217;t trade it lightly, like you wouldn&#8217;t trade [...]]]></description>
			<content:encoded><![CDATA[<p>What do I mean when I say &#8220;<em>performance  is a feature</em>?&#8221;</p>
<p>For a long time, I got this wrong. When I explained myself, I&#8217;d say that performance was as important as any other feature and worth spending as much time on as any other feature, and you shouldn&#8217;t trade it lightly, like you wouldn&#8217;t trade any other feature lightly.</p>
<p>The thing is, especially on a small team, you might not come back to any particular feature for a few months. So, would this mean you only come back to performance every few months?</p>
<p>Thanks to <a href="https://twitter.com/mikebrittain">Mike Brittain</a> at <a href="http://codeascraft.etsy.com/">Etsy</a>, I&#8217;ve figured out just how wrong I was.</p>
<p><em>Performance is a feature</em>, and just like any other feature, it must be <em>continuously monitored and tested</em>. What happens when a test breaks or a regression is found in any other feature? Regressions are usually considered top-priority bugs. The same must be true for performance regressions. Just because your small development team isn&#8217;t focusing on a particular feature at the moment doesn&#8217;t mean it&#8217;s OK to break it.</p>
<p>Performance testing isn&#8217;t exactly like most feature testing, but that doesn&#8217;t matter. One of my favorite statements from a QA lead boiled down to &#8220;don&#8217;t get hung up on the tool, focus on what you&#8217;re assuring.&#8221; Use the tools—like <a href="https://github.com/jsocol/pystatsd">graphs</a>, external and <a href="https://github.com/andymckay/django-statsd">on-site performance monitoring</a>—you need to use to make sure performance doesn&#8217;t regress.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/performance-is-a-feature-623/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thank You, Steve</title>
		<link>http://coffeeonthekeyboard.com/thank-you-steve-614/</link>
		<comments>http://coffeeonthekeyboard.com/thank-you-steve-614/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 05:17:12 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=614</guid>
		<description><![CDATA[Thank you, Steve. I didn&#8217;t really realize until today exactly what I owe to Steve Jobs&#8217; vision and dedication. So much of my life and career has been influenced and guided by an interest in screwing about with computers that goes back to the first Mac Plus I had—with its whole 1 megabyte of RAM [...]]]></description>
			<content:encoded><![CDATA[<p>Thank you, <a href="http://www.apple.com/stevejobs/">Steve</a>.</p>
<p>I didn&#8217;t really realize until today exactly what I owe to Steve Jobs&#8217; vision and dedication. So much of my life and career has been influenced and guided by an interest in screwing about with computers that goes back to the first Mac Plus I had—with its whole 1 megabyte of RAM and 40-megabyte SCSI hard drive—and my dad&#8217;s Macintosh II at work.</p>
<p>It&#8217;s a long, meandering story and probably not terribly interesting, but it really starts in 1993 or so, with Macintosh, and leads inexorably to my entire life now.</p>
<p>Thank you, Steve.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/thank-you-steve-614/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>So You Want Me to Hire You</title>
		<link>http://coffeeonthekeyboard.com/so-you-want-me-to-hire-you-606/</link>
		<comments>http://coffeeonthekeyboard.com/so-you-want-me-to-hire-you-606/#comments</comments>
		<pubDate>Tue, 23 Aug 2011 14:00:54 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[developers]]></category>
		<category><![CDATA[hiring]]></category>
		<category><![CDATA[mozilla]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=606</guid>
		<description><![CDATA[I vacillated quite a bit on the title of this post. It is, after all, not me that is hiring you. Nor do I have the power to hire folks at will: it&#8217;s a team decision. But I also don&#8217;t want to claim to speak for anyone else, least of all for Mozilla—my excellent employer [...]]]></description>
			<content:encoded><![CDATA[<p>I vacillated quite a bit on the title of this post. It is, after all, not <em>me</em> that is hiring you. Nor do I have the power to hire folks at will: it&#8217;s a team decision. But I also don&#8217;t want to claim to speak for anyone else, least of all for Mozilla—my excellent employer and we are, indeed, <strong><a href="http://www.mozilla.com/careers">hiring</a></strong>—since this is really just the things that I know matter to me.</p>
<p>I suspect they matter to a lot of people.</p>
<p>Since I&#8217;ve been doing a lot of interviews lately, I&#8217;ve been thinking about how candidates can help themselves, the things that I need to know, and how someone starts themselves off on the right foot.</p>
<ul>
<li><strong>Have a resume or CV.</strong> I know it feels archaic and yes, <a href="https://github.com">Github</a> weighs more in my decision-making, but there&#8217;s a reason these documents have existed for so long: I need to know <strong>where you&#8217;ve worked</strong> and <strong>what your job was</strong>. This stuff matters. You don&#8217;t even need the fancy PDF (please, no .doc or .docx, though .rtf is fine) just have a thorough, up-to-date LinkedIn account. And put in details! Brag! What were your roles, your responsibilities? What new processes or tools did you introduce and how did they help? <strong>How did you kick ass?</strong></li>
<li><strong>Have a Github account</strong>. I will accept <a href="https://bitbucket.org/">BitBucket</a>, but the UI isn&#8217;t as nice. (Also, I use git, we use git. Learning git is a good idea.) Put <strong>your website on Github</strong>. No one is going to steal your personal site and make millions, and it gives me some guaranteed code to browse. But way more importantly&#8230;</li>
<li><strong>Contribute to open source projects!</strong> This isn&#8217;t just &#8220;Mozilla likes Open Source,&#8221; though we do (and I do). This is about <strong>code samples</strong>. Often when we have to ask for code samples, we get contrived projects that don&#8217;t solve any real problems. Contributions to real projects <strong>show me how you write real code</strong> and, at the same time, <strong>how you work with others</strong>. Open source projects are communities, teams. Do you communicate well in pull requests or bugs? Do you revise patches based on feedback? Or, as a maintainer, how do you treat contributions from others?</li>
<li><strong>Have a blog</strong>. The cool thing is that<strong> I don&#8217;t even care if you write about code</strong>. In fact, I&#8217;d love to see that you write about other interests! But because it&#8217;s another website (I am looking for web developers, after all) and it&#8217;s yet another form of communication for me to think about. This is especially if you know you get nervous and don&#8217;t interview well.</li>
</ul>
<p>And that&#8217;s it! Well, OK, that&#8217;s not really it, not even close. But these are mechanical things, things that are easy to do, for various values of &#8220;easy.&#8221; <strong>I notice the absence</strong> of these things<em>.</em></p>
<p>Obviously there&#8217;s a lot more involved, but this is basic information that helps me, and helps me <strong>before we even talk</strong>. That&#8217;s a great place to start an interview.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/so-you-want-me-to-hire-you-606/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Acronyms you should know: MTTD and MTTR</title>
		<link>http://coffeeonthekeyboard.com/acronyms-you-should-know-mttd-and-mttr-597/</link>
		<comments>http://coffeeonthekeyboard.com/acronyms-you-should-know-mttd-and-mttr-597/#comments</comments>
		<pubDate>Tue, 10 May 2011 19:32:47 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[continuous deployment]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sumo]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=597</guid>
		<description><![CDATA[If you&#8217;re a SUMO contributor, there are two acronyms you will start to hear more often from us developers: MTTD and MTTR. They mean &#8220;mean time to detect&#8221; and &#8220;mean time to resolve,&#8221; respectively, and they refer to how long it takes to detect an issue in production, and how long it takes to resolve that [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re a <a href="https://support.mozilla.com/">SUMO</a> contributor, there are two acronyms you will start to hear more often from us developers: <strong>MTTD</strong> and <strong>MTTR</strong>.</p>
<p>They mean &#8220;<strong>mean time to detect</strong>&#8221; and &#8220;<strong>mean time to resolve</strong>,&#8221; respectively, and they refer to how long it takes to <strong>detect</strong> an issue in production, and how long it takes to <strong>resolve</strong> that issue once it&#8217;s detected.</p>
<p>As we move toward <strong><a href="http://coffeeonthekeyboard.com/the-future-of-sumo-development-511/">continuous deployment</a></strong>, these are two of the metrics we&#8217;ll be using to gauge the effectiveness of our tools and processes.</p>
<p>For major production issues, <strong>our MTTR is actually fairly good</strong> right now—if it&#8217;s something that cannot wait until the next scheduled release, it takes us 60-90 minutes from becoming aware of an issue to pushing a fix. I think we can do better with better release processes, but we&#8217;re starting off pretty good and going to <strong>get better</strong>, which is great.</p>
<p>Our <strong>MTTD</strong>, on the other hand, needs work. <a href="http://moxie.jamessocol.com/bugstats/sumo/2.8.1">SUMO 2.8.1</a> upgraded <a href="http://www.djangoproject.com/">Django</a> and included a sweeping change to our CSRF protection—this necessarily affected every form on the site. We discovered three related issues that warranted immediate hotfixes, but we didn&#8217;t discover two of them for <strong>almost two days</strong> when our contributors brought them to our attention.</p>
<p>It&#8217;s <strong>great</strong> that our contributors pointed out these issues to us. Our <strong>community is a critical part</strong> of &#8220;detection&#8221; and I want to encourage everyone to point out issues in the <a href="https://support.mozilla.com/forums/contributors">forums</a> or <a href="irc://irc.mozilla.org/sumodev">IRC</a>. It&#8217;s extremely helpful!</p>
<p>But there are things we can do, too, to <strong>notice things faster</strong>. One thing we are working to add is <a href="http://codeascraft.etsy.com/2010/12/08/track-every-release/"><strong>business metric graphs</strong></a>. We have useful data in <a href="http://ganglia.sourceforge.net/">Ganglia</a> right now, but we will be using <a href="http://graphite.wikidot.com/">Graphite</a> and <a href="http://codeascraft.etsy.com/">Etsy</a>&#8216;s <a href="https://github.com/etsy/statsd">StatsD</a> to peer into <strong>what our users are doing</strong>. If we deploy a change and notice that no one is <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=654827">previewing articles</a>, for example, we know immediately that we have an issue and can <strong>start diagnosing and fixing it</strong>.</p>
<p>If you follow SUMO development, you&#8217;ll hear us start using terms like MTTD, MTTR, &#8220;detection,&#8221; more, and talking about how to reduce them. We welcome your input and ideas as we start working on these challenges. And of course, keep telling us when things are broken!</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/acronyms-you-should-know-mttd-and-mttr-597/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pride and Joy: Firefox 4 is Out!</title>
		<link>http://coffeeonthekeyboard.com/pride-and-joy-firefox-4-is-out-589/</link>
		<comments>http://coffeeonthekeyboard.com/pride-and-joy-firefox-4-is-out-589/#comments</comments>
		<pubDate>Tue, 22 Mar 2011 20:03:06 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[damnproud]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=589</guid>
		<description><![CDATA[Since it was officially released around 7 hours ago, Firefox 4 has been downloaded nearly 2.4 million times. I feel many things today. I&#8217;m deeply proud and humbled to be a part of the Mozilla community and contribute in my own small way to what I honestly believe is a fantastic product and the best [...]]]></description>
			<content:encoded><![CDATA[<p>Since it was officially released around 7 hours ago, <a href="http://www.mozilla.com/">Firefox 4</a> has been downloaded nearly <a href="http://glow.mozilla.org/">2.4 million times</a>.</p>
<p>I feel many things today. I&#8217;m deeply <strong>proud</strong> and <strong>humbled</strong> to be a part of the <strong>Mozilla community</strong> and contribute in my own small way to what I honestly believe is a fantastic product and the <strong>best choice in web browsers</strong> right now.</p>
<p>I&#8217;m filled with <strong>joy</strong> at seeing a product so many people have worked so hard on finally get released to everyone.</p>
<p>And I&#8217;m a little bit <strong>sad</strong> that I&#8217;m not in Mountain View for the release.</p>
<p>Finally, I&#8217;m <strong>excited</strong>, because just in the time I&#8217;ve been at Mozilla, the <strong>web has gotten so much better</strong>.</p>
<ul>
<li>All the <strong>modern browsers are <a href="http://arewefastyet.com/">fast</a></strong>.</li>
<li>Browsers quickly<strong> <a href="http://blog.mozilla.com/security/2010/08/27/http-strict-transport-security/">getting</a> <a href="http://blog.mozilla.com/security/2010/03/31/plugging-the-css-history-leak/">more</a> <a href="http://engineering.twitter.com/2011/03/improving-browser-security-with-csp.html">secure</a></strong>.</li>
<li>Modern browsers <a href="http://caniuse.com/">are</a> <strong><a href="http://fractal.io/">so</a> <a href="https://demos.mozilla.org/en-US/">much</a> <a href="http://diveintohtml5.org/">more capable</a></strong>.</li>
</ul>
<p>The future of the web is <strong>bright</strong>. There are challenges—not just for Firefox but for the web itself—but I&#8217;m confident we have the <strong>ingenuity</strong> and <strong>passion</strong> to overcome them.</p>
<p>So if you haven&#8217;t tried it yet, go get <a href="http://www.mozilla.com/"><strong>Firefox 4</strong></a>, and <strong>experience a better web</strong>!</p>
<p>Here are my favorite parts:</p>
<ul>
<li>App tabs.</li>
<li>Panorama.</li>
<li>WebGL.</li>
<li>Developer console.</li>
<li>Fast, fast, fast!</li>
<li>Tabs on top.</li>
<li>Switch to Tab.</li>
<li>Sync.</li>
<li>Restartless Add-ons.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/pride-and-joy-firefox-4-is-out-589/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A brief SumoDev update</title>
		<link>http://coffeeonthekeyboard.com/a-brief-sumodev-update-578/</link>
		<comments>http://coffeeonthekeyboard.com/a-brief-sumodev-update-578/#comments</comments>
		<pubDate>Sat, 12 Mar 2011 18:54:52 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[continuous deployment]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[sumo]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=578</guid>
		<description><![CDATA[A little while ago, I said that I thought we got a B in Q1, but we could move up to an A with a little more work. (This is my favorite grading system: everyone starts at 0 and works up.) Well, we landed two things: Initial JavaScript tests. (And for showfor.) Stuck a crontab [...]]]></description>
			<content:encoded><![CDATA[<p>A <a title="SUMO in Q2" href="http://coffeeonthekeyboard.com/sumo-in-q2-563/">little while ago</a>, I said that I thought we got a B in Q1, but we could move up to an A with a little more work. (This is my favorite grading system: everyone starts at 0 and works up.)</p>
<p>Well, we landed two things:</p>
<ul>
<li>Initial <a href="https://github.com/jsocol/kitsune/commit/1b03a4de5">JavaScript tests</a>. (And for <a href="https://github.com/jsocol/kitsune/commit/c28ee79bfc0">showfor</a>.)</li>
<li>Stuck a <a href="https://github.com/jsocol/kitsune/commit/bb98aede2">crontab</a> in git.</li>
</ul>
<p>I said these two things would bring us up to an A, so, way to go team!</p>
<p>We entered this quarter with 5 goals around <a href="https://wiki.mozilla.org/Support:Sumodev/Continuous_Deployment#Q1_2011">Continuous Deployment</a>. We&#8217;ve hit three. The other two were stretch goals, and it looks like we&#8217;ll miss them. It&#8217;s been a particularly busy quarter for IT, and there&#8217;s just a bunch of work left to get the JS tests into CI. We&#8217;ll carry those forward into Q2 along with our goals of releasing every week and dropping the &#8216;next&#8217; branch.</p>
<p>I&#8217;m really proud of my team and the work we&#8217;ve done this quarter. We&#8217;ve not only done great work improving the user experience across the site—especially for mobile users—we&#8217;ve also made significant progress toward simplifying and streamlining our releases, which will be crucial to CD.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/a-brief-sumodev-update-578/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Weekly Update for 11/3/11</title>
		<link>http://coffeeonthekeyboard.com/weekly-update-for-11311-575/</link>
		<comments>http://coffeeonthekeyboard.com/weekly-update-for-11311-575/#comments</comments>
		<pubDate>Fri, 11 Mar 2011 23:55:58 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[node python]]></category>
		<category><![CDATA[sumo]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[weekly update]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=575</guid>
		<description><![CDATA[Been a busy week! Helped run down an issue with our ads on Reddit. Updated django-multidb-router. Learned a little about ContextDecorator and how to do that in Python 2.6. Shipped SUMO 2.6.1. Wrapped up SUMO 2.6.2, ready to go this weekend. Rolling through activity logs in SUMO 2.7. Building models. Reviewing code. Did some work [...]]]></description>
			<content:encoded><![CDATA[<p>Been a busy week!</p>
<ul>
<li>Helped run down an issue with our ads on Reddit.</li>
<li>Updated <a href="https://github.com/jbalogh/django-multidb-router">django-multidb-router</a>.
<ul>
<li>Learned a little about <a href="http://docs.python.org/dev/whatsnew/3.2.html#contextlib">ContextDecorator </a>and how to do that in Python 2.6.</li>
</ul>
</li>
<li>Shipped <a href="http://moxie.jamessocol.com/bugstats/sumo/2.6.1">SUMO 2.6.1</a>.</li>
<li>Wrapped up <a href="http://moxie.jamessocol.com/bugstats/sumo/2.6.2">SUMO 2.6.2,</a> ready to go this weekend.</li>
<li>Rolling through activity logs in <a href="http://moxie.jamessocol.com/bugstats/sumo/2.7">SUMO 2.7</a>.
<ul>
<li>Building models.</li>
<li>Reviewing code.</li>
</ul>
</li>
<li>Did some work on <a href="http://rasputinproject.org">Rasputin</a>:
<ul>
<li>Github let me have the URL <a href="https://github.com/rasputin">github.com/rasputin</a>!</li>
<li><a href="https://github.com/rasputin/rasputin-node">rasputin-node</a> is way more node-like.
<ul>
<li>I could really use input on the <a href="https://github.com/rasputin/rasputin-node/tree/amqp">AMQPBackend</a>.</li>
</ul>
</li>
<li>Added better threaded and multiprocess dispatchers to <a href="https://github.com/rasputin/rasputin">rasputin for Django</a>.
<ul>
<li>I think I need to punt on the logging module and go with <a href="https://github.com/mitsuhiko/logbook">Logbook</a>.</li>
<li>Want to get an AMQPBackend started.</li>
</ul>
</li>
</ul>
</li>
<li>Updated <a href="https://github.com/jsocol/logbot">logbot</a> to work with node 0.5.0 and <a href="https://github.com/indexzero/daemon.node">daemonize.node</a>.</li>
<li>Fixed a <a href="https://github.com/jsocol/bleach/commit/d9f2cf6cc">Bleach bug</a>.</li>
<li>Spent a long time tracking down an issue with celery: it just won&#8217;t quit. Literally, it doesn&#8217;t much care about SIGINT and SIGTERM.</li>
</ul>
<p>Now to start a busy weekend!</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/weekly-update-for-11311-575/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Weekly Update 04/03/2011</title>
		<link>http://coffeeonthekeyboard.com/weekly-update-04032011-558/</link>
		<comments>http://coffeeonthekeyboard.com/weekly-update-04032011-558/#comments</comments>
		<pubDate>Fri, 04 Mar 2011 19:01:41 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[weekly update]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=558</guid>
		<description><![CDATA[OK, in line with my 2011 goals and because I&#8217;m sick of not remembering what I did last week, I&#8217;m restarting the weekly update posts. I hope you like hearing about the minutia of my job! (Just kidding. I write these for me.) I&#8217;m going to try a &#8220;sometime Friday&#8221; schedule instead of weekends or [...]]]></description>
			<content:encoded><![CDATA[<p>OK, in line with my <a href="http://coffeeonthekeyboard.com/2011-goals-520/">2011 goals</a> and because I&#8217;m sick of not remembering what I did last week, I&#8217;m restarting the weekly update posts. I hope you like hearing about the minutia of my job! (Just kidding. I write these for me.) I&#8217;m going to try a &#8220;sometime Friday&#8221; schedule instead of weekends or at night.</p>
<p>Also, this one will cover the last four-and-a-half-ish weeks, since it&#8217;s been a while.</p>
<ul>
<li>Released <a href="http://pypi.python.org/pypi/bleach">Bleach 1.0</a> to almost no fanfare. Still, it&#8217;s an improvement and you should upgrade.</li>
<li>Demoed <a href="https://github.com/jsocol/django-waffle">Waffle</a> at <a href="http://hackandtell.org/">Hack and Tell</a> to <a href="http://hackandtell.blip.tv/file/4738389/">moderate interest</a> and good feedback.</li>
<li>Started pushing <a href="https://github.com/jsocol/phake">old</a> <a href="https://github.com/jsocol/maveric">projects</a> to Github. Next up? Old WordPress plugins.</li>
<li>Kinda/sorta released <a href="https://github.com/jsocol/rasputin">Rasputin</a> and <a href="https://github.com/jsocol/rasputin-node">Rasputin-Node</a> super-pre-alpha code.</li>
<li>Wrote <a href="http://pypi.python.org/pypi/django-dnt">Django-DNT</a>.</li>
<li>Wrote <a href="https://github.com/jsocol/django-adminplus">Django AdminPlus</a>. (<a title="O Hai Django AdminPlus" href="http://coffeeonthekeyboard.com/o-hai-django-adminplus-568/">blog post</a>)</li>
<li>Was in Mountain View for three days, during which:
<ul>
<li>Helped Luke put together a development <a href="https://wiki.mozilla.org/MDN/MDNv1">roadmap for MDN</a>.</li>
<li>Agreed to help Sid put together a <a href="http://dnt.mozilla.org/">Do-Not-Track demo</a>.</li>
<li>Helped, for my part, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=622752">move SUMO to Phoenix</a>.</li>
<li>Was interviewed on camera for <a href="http://rypple.com/tour">Rypple</a>.</li>
<li>Interviewed an awesome intern candidate.</li>
<li>Went to <a href="http://www.flickr.com/photos/jamessocol/sets/72157626036265594/">Alcatraz</a>. (It&#8217;s OK, they let me out.)</li>
</ul>
</li>
<li>Released <a href="http://moxie.jamessocol.com/bugstats/sumo/2.5">SUMO 2.5</a>. <a href="http://2.bp.blogspot.com/_47mDU4vB2hk/S7YlsUtcLRI/AAAAAAAAAP8/giQXGFkYuIg/s1600/fireworks.jpg">Nice work, team</a>!</li>
<li>Patched and released a quick <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=634608">SUMO 2.5.1</a>.</li>
<li>Release <a href="http://moxie.jamessocol.com/bugstats/sumo/2.6">SUMO 2.6</a>.</li>
<li>Releasing <a href="http://moxie.jamessocol.com/bugstats/sumo/2.6.1">SUMO 2.6.1</a> on Tuesday.</li>
<li>Rolling on <a href="http://moxie.jamessocol.com/bugstats/sumo/2.6.2">SUMO 2.6.2</a>. Lots of reviews, lots of little things.
<ul>
<li>Including an <a href="https://wiki.mozilla.org/PostCrash#API">API for Socorro</a> for our Post Crash experience.</li>
</ul>
</li>
<li>Finished fixing <a href="https://hudson.mozilla.org/job/sumo-next/?">Hudson builds for our &#8220;next&#8221; branch</a>.</li>
<li>Wrote up a design doc for a new SUMO feature.</li>
<li>Started planning out Q2, both our feature roadmap and our <a title="SUMO in Q2" href="http://coffeeonthekeyboard.com/sumo-in-q2-563/">Continuous Deployment progress</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/weekly-update-04032011-558/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O Hai Django AdminPlus</title>
		<link>http://coffeeonthekeyboard.com/o-hai-django-adminplus-568/</link>
		<comments>http://coffeeonthekeyboard.com/o-hai-django-adminplus-568/#comments</comments>
		<pubDate>Fri, 04 Mar 2011 15:28:03 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[webdev]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=568</guid>
		<description><![CDATA[Last night, as happens sometimes, I was wishing it was possible to add some of our custom admin views to the Django admin&#8217;s index page. It&#8217;s kind of a pain to have to type the URL every time, especially when talking to other people: &#8220;It&#8217;s in the admin, but no, you can&#8217;t&#8230; just go to [...]]]></description>
			<content:encoded><![CDATA[<p>Last night, as happens sometimes, I was wishing it was possible to add some of our custom admin views to the Django admin&#8217;s index page. It&#8217;s kind of a pain to have to type the URL every time, especially when talking to other people: &#8220;It&#8217;s in the admin, but no, you can&#8217;t&#8230; just go to this URL.&#8221;</p>
<p>So I was reading the <a href="http://docs.djangoproject.com/en/dev/ref/contrib/admin/">Django admin docs</a> and, frankly, they aren&#8217;t great. They tell you about the benefits of subclassing <code>AdminSite</code>, or running multiple <code>AdminSite</code>s, but they never really mention <em>how to do it</em>.</p>
<p>So, with a little trial and error, I wrote my <code>AdminSite</code> subclass and figured out how to use it. It simplified a bunch of code in our custom admin app, so I thought I would share it.</p>
<p>Here&#8217;s <a href="https://github.com/jsocol/django-adminplus">Django AdminPlus</a> (and <a href="http://pypi.python.org/pypi/django-adminplus">on PyPI</a>).</p>
<p>AdminPlus adds a method, <code>admin.site.register_view</code>, that connects an arbitrary view function to your admin, and puts a link to it on the admin index page. If you put calls to <code>register_view</code> in <code>someapp/admin.py</code>, they&#8217;re picked up during the normal <code>admin.autodiscover()</code> process.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1"># myapp/admin.py</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> django.<span class="me1">contrib</span> <span class="kw1">import</span> admin</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> django.<span class="me1">shortcuts</span> <span class="kw1">import</span> render_to_response</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">def</span> my_admin_view<span class="br0">&#40;</span>request<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> render_to_response<span class="br0">&#40;</span><span class="st0">&#8216;myapp/admin/view.html&#8217;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">admin.<span class="kw3">site</span>.<span class="me1">register_view</span><span class="br0">&#40;</span><span class="st0">&#8216;mypath&#8217;</span>, my_admin_view<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># With an optional &#8216;name&#8217; parameter:</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">def</span> my_other_admin_view<span class="br0">&#40;</span>request<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> render_to_response<span class="br0">&#40;</span><span class="st0">&#8216;myapp/admin/other.html&#8217;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">admin.<span class="kw3">site</span>.<span class="me1">register_view</span><span class="br0">&#40;</span><span class="st0">&#8216;otherpath&#8217;</span>, my_other_admin_view, <span class="st0">&#8216;Fancy Stuff!&#8217;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Assuming your admin URLs start with <code>admin/</code>, this will make <code>my_admin_view</code> available at <code>admin/mypath</code> and <code>my_other_admin_view</code> available at <code>admin/otherpath</code>, but it also puts them in a new section on the admin index, so you don&#8217;t even need to worry about the URL.</p>
<p>If no name is given we try to guess from the name of the view function.</p>
<p>That&#8217;s about it! Read the <a href="https://github.com/jsocol/django-adminplus#readme">README</a> and <a href="https://github.com/jsocol/django-adminplus/tree/master/docs">the other docs</a> and enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/o-hai-django-adminplus-568/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SUMO in Q2</title>
		<link>http://coffeeonthekeyboard.com/sumo-in-q2-563/</link>
		<comments>http://coffeeonthekeyboard.com/sumo-in-q2-563/#comments</comments>
		<pubDate>Wed, 02 Mar 2011 21:28:13 +0000</pubDate>
		<dc:creator>James</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[kitsune]]></category>
		<category><![CDATA[mozilla]]></category>
		<category><![CDATA[sumo]]></category>
		<category><![CDATA[waffle]]></category>
		<category><![CDATA[web dev]]></category>

		<guid isPermaLink="false">http://coffeeonthekeyboard.com/?p=563</guid>
		<description><![CDATA[At the end of 2010, I issued a challenge to my team: deploy support.mozilla.com continuously by the end of 2011. So, as we move into the last part of Q1, how are we doing, and what&#8217;s next? So Far This quarter we&#8217;ve managed to completely break free from our old svn repository. All our code [...]]]></description>
			<content:encoded><![CDATA[<p>At the end of 2010, I issued a challenge to my team: <a title="The future of SUMO development" href="http://coffeeonthekeyboard.com/the-future-of-sumo-development-511/">deploy support.mozilla.com continuously</a> by the end of 2011. So, as we move into the last part of Q1, how are we doing, and what&#8217;s next?</p>
<h3>So Far</h3>
<p>This quarter we&#8217;ve managed to completely <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=616703">break free from our old svn</a> repository. All our <a href="https://github.com/jsocol/kitsune">code is in git</a> now. This has simplified our deployments significantly. We&#8217;ve also <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=616702">moved a bunch of code</a> from difficult-to-maintain RewriteRules into the product and made it easier to manage.</p>
<p>We&#8217;ve still got some work to do on JavaScript unit tests and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=625376">moving our crontab into version control</a>, but these are both on track for this quarter, we just have to make sure we make the time.</p>
<p>Overall, I think we&#8217;ve done pretty well so far this quarter. I would give us a B, and we can still get to an A if we can tackle JS tests and crontabs.</p>
<h3>Coming Up</h3>
<p>The two things I&#8217;d like to see next are <strong>faster cycles</strong> and moving toward a <strong>more CD friendly</strong> way of building things. There are two challenges these help address.</p>
<p>Faster release cycles will get us thinking about managing time and planning work when releases aren&#8217;t centered around a big piece of functionality. Instead of starting with a big thing and picking a set of little things to lump in with it, we&#8217;ll need to balance fixing little things with work on bigger features.</p>
<p>By the beginning of June, I want us to <strong>release every week</strong>, whether there&#8217;s something big or not.</p>
<p>CD also presents a new challenge for big features: how do you deal with code that isn&#8217;t completely ready yet?</p>
<p>There are a couple of ways of handling this. One is to use longer-lived feature branches. That works pretty well for desktop software like Firefox where you can hand someone a binary and say &#8220;test this.&#8221; But it&#8217;s a challenge with a web app because, unless we move our staging environments around all the time, it blocks QA from testing something until it&#8217;s not only ready but, in fact, <em>already on production</em>.</p>
<p>A better solution is to use feature flags to hide new functionality until it&#8217;s ready. In this model, everything lives on the same branch (you still do feature branches for bug fix/review and for those times something does need to live a little longer before merging) and all staging servers—and eventually production—run the same code, but with a different set of flags turned on. You can turn a feature on in production after it&#8217;s been verified on stage.</p>
<p>This isn&#8217;t easier. It means structuring code differently, thinking about a new set of constraints. It&#8217;s what we should do.</p>
<p><em>W</em><em>e will screw up</em>, probably a couple of times, before we get this down. That&#8217;s why we should start now, when our mistakes will be confined to staging servers.</p>
<p>In Q2 I want us to <strong>stop using the &#8216;next&#8217; branch</strong> and start using <a title="Introducing Waffle for Django" href="http://coffeeonthekeyboard.com/introducing-waffle-for-django-541/">Waffle</a> to control features until they&#8217;re ready.</p>
<p>Not everything needs to hide behind a flag: small bug fixes obviously don&#8217;t. This may be giving us a window into what QA is like under CD: big things are manually tested before we turn them on, but little fixes, already verified by the developer and reviewer, make it through to production without manual intervention from QA.</p>
<p>We also need to start planning time to remove flags and dead code once a feature has shipped. That is part of the development cost of a feature, and will hopefully be offset by reducing the time it takes to get something to production once it is ready.</p>
<h3>Big Changes</h3>
<p>While Q1 has been about a larger set of smaller, more concrete and isolated changes, Q2 is going to be about a smaller set of much bigger changes.</p>
<p>Q1 was about changing our code. Q2 is about changing our thinking.</p>
<p>I&#8217;m excited about diving into these challenges. I can&#8217;t wait for Q2.</p>
]]></content:encoded>
			<wfw:commentRss>http://coffeeonthekeyboard.com/sumo-in-q2-563/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

