<?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>malvasia bianca &#187; Programming</title>
	<atom:link href="http://malvasiabianca.org/archives/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://malvasiabianca.org</link>
	<description></description>
	<lastBuildDate>Sat, 04 Feb 2012 05:55:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>polishing fragments</title>
		<link>http://malvasiabianca.org/archives/2012/01/polishing-fragments/</link>
		<comments>http://malvasiabianca.org/archives/2012/01/polishing-fragments/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 19:31:07 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=5794</guid>
		<description><![CDATA[A while back, I mentioned that I&#8217;d written a little microblogging platform called &#8216;fragments&#8217;. At the time, it was a little unpolished; since then, I&#8217;ve cleaned up the code a bit (most importantly, separated the content from the guts of publishing, though presentation is probably more interwoven with the latter than would be ideal), enough [...]]]></description>
			<content:encoded><![CDATA[<p>A while back, I <a href="http://malvasiabianca.org/archives/2011/11/fragments/">mentioned</a> that I&#8217;d written a little microblogging platform called &#8216;fragments&#8217;. At the time, it was a little unpolished; since then, I&#8217;ve cleaned up the code a bit (most importantly, separated the content from the guts of publishing, though presentation is probably more interwoven with the latter than would be ideal), enough so that I don&#8217;t mind putting it up on <a href="https://github.com/davidcarlton/fragments">github</a>. I&#8217;d be surprised if anybody else found it useful, but you never know; if somebody else out there wants a way to write extremely spare and unlinked small posts, is running their own web server, and wants to write posts in a text editor instead of through a web interface, then have at it!</p>
<p>If anybody is looking at the source code: the main way in which it&#8217;s not representative of how I normally program is the fact that most classes don&#8217;t have unit tests. This sometimes happens to me when I&#8217;m gluing stuff together: there&#8217;s not much in the way of logic, and the ultimate test of a fair bit of that code is how it looks in the web browser, so I&#8217;m not sure where unit tests would be useful. In situations like that, though, I do like to throw in some kind of overall acceptance test that at least detects whether or not I&#8217;m inadvertently changing the HTML output. And, of course, it&#8217;s much smaller than software that I work on at work! Other than that, though, it&#8217;s reasonably representative: functions and classes are pretty small but there&#8217;s room for further shrinking, I&#8217;ve taken a bit of care to remove duplication, but I wouldn&#8217;t present it as anything like a shining, polished gem.</p>
<p>I&#8217;ve also added a <a href="http://fragments.malvasiabianca.org/">front page</a> for the site, so you can see the fragments (at least the most recent 20 ones&mdash;no pagination yet) without having to go to the <a href="http://fragments.malvasiabianca.org/fragments.xml">feed</a>. (Incidentally, Safari isn&#8217;t correctly doing feed autodetection right; I&#8217;ll look into that eventually, but if somebody happens to why that isn&#8217;t working, please tell me.)</p>
<p>&nbsp;</p>
<p>It&#8217;s turned out differently from how I expected it to be. In particular, I labeled it as a &#8220;microblogging platform&#8221; above, but you&#8217;ll see if you look at the front page that that isn&#8217;t accurate, that &#8220;miniblogging&#8221; is more the size posts are turning out. Also, in the original post, I talked about &#8220;mosaics&#8221;; support for them is still there, but I&#8217;ve only written one, and that one was a proof of concept instead of something that I really felt compelled to do. So, instead of figuring out how to represent mosaics on the front page, I just left them off the front page entirely, and am not advertising the mosaics RSS feed, either; I&#8217;d be surprised if I ever write another one, though who knows.</p>
<p>What does seem to be the case is that the fragments blog is turning into my &#8216;morose blog&#8217;. Something about the fact that it feels hidden&mdash;very few readers (almost all of whom are people I know and feel quite comfortable talking to in person), combined with a complete lack of comments and an almost complete lack of analytics&mdash;makes it feel more private than it actually is. (Because I don&#8217;t want to kid myself: it&#8217;s on the web, it&#8217;s accessible by search engines, so any mistakes I make there will be available to be uncovered!) The result of which is that I spend some amount of time digging into in-person interactions, and the in-person interactions that I think about the most are ones where I feel out of place. That gives entries a morose tone, to the extent that I end up backtracking on that within the blog itself, because I certainly don&#8217;t feel like a morose person the vast majority of the time! Still, I think I&#8217;ll stop backtracking/apologizing for that within the blog: this paragraph is the context you&#8217;re going to get for the tone, the fragments themselves should be minimal and unapologetic.</p>
<p>And, unless something changes, this post and its predecessor is all the talking I&#8217;m planning to do about the fragments blog: it&#8217;s been a successful enough experiment that I&#8217;ve added a link to it to the right-hand column on this blog, and I imagine the fragments will spur ideas that play out here in a larger scale, but in general I&#8217;m going to leave it tucked away. No more discussion of it here, no automatic forwarding of posts there to Facebook or Google+ or whatever. I doubt that the vast majority of you reading this would find anything at all interesting there: it&#8217;s primarily targeted at myself (which, admittedly, is the case for this blog, too!), and I don&#8217;t think people who haven&#8217;t interacted quite a bit with me would find anything of interest there.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2012/01/polishing-fragments/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>an apple-focused personal history of computing</title>
		<link>http://malvasiabianca.org/archives/2011/12/an-apple-focused-personal-history-of-computing/</link>
		<comments>http://malvasiabianca.org/archives/2011/12/an-apple-focused-personal-history-of-computing/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 06:57:48 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Lean / Agile]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=5541</guid>
		<description><![CDATA[When Steve Jobs died, I felt I should write about him. Probably about Apple, really: I don&#8217;t know anything about Jobs, but Apple (the company and its products) occupies a surprising amount of my psychic space. It took me quite some time to get around to writing the post, however; and, when I started typing, [...]]]></description>
			<content:encoded><![CDATA[<p>When Steve Jobs died, I felt I should write about him. Probably about Apple, really: I don&#8217;t know anything about Jobs, but Apple (the company and its products) occupies a surprising amount of my psychic space.</p>
<p>It took me quite some time to get around to writing the post, however; and, when I started typing, I realized why. To dig into Apple&#8217;s place in my psyche, I had to explain my history with Apple products, and indeed with computers in general. And, as it turns out, that takes a while. The result is a post where the tail is rather wagging the dog; interesting to me, at least, but one that could most charitably be described as ungainly. (Feel free to skip ahead to the <a href="#apple">Apple bits.</a>)</p>
<p>At any rate: the computers I have owned, and why I am fascinated with Apple.</p>
<h3>Prehistory</h3>
<p>My parents bought us an Apple ][+ in May 1982; I was in fifth grade at the time. That was the only computer we had at home through at least 1989, when I went off to college (my brother got a computer when he went to college a few years earlier); hard to imagine these days. I'm not sure when my parents got a second computer, and I know they continued using the Apple ][+ for several years after I left home, at the very least to run a program they wrote to help manage their finances.</p>
<p>I programmed some on that Apple ][+ (the high point being a text adventure that I wrote), but my memory is that I didn't program particularly seriously on it.  I used it to write papers (and for some other writing projects, I went through a phase when I wrote short stories and a novella). And I played quite a few games on it, high points being various <a href="http://www.bactrian.org/~carlton/dbcdb/274/">Infocom</a> games and the first four <cite>Ultima</cite> games, but I also think fondly of <a href="http://www.bactrian.org/~carlton/dbcdb/1307/"><cite>Robot Odyssey</cite></a>, <cite>Le Prisonnier</cite>, <cite>Lode Runner</cite>, and <a href="http://www.bactrian.org/~carlton/dbcdb/765/"><cite>Wizardry</cite></a>.</p>
<p>In 1987 (my junior year of high school) I started hanging out more at Oberlin College, and I spent quite a bit of time in the various computer clusters in the school library. I got to be a rather fluent VAX/VMS user, and (presumably through some of the math courses I was taking?) started hanging out with some computer science majors. They got me interested in learning to program in C and Scheme, and in the 1988&ndash;1989 school year I started using Unix more. I also remember helping one of them install GNU Emacs on that VMS cluster. (At the time, the computer science&#8217;s Unix cluster actually had Gosmacs installed instead of (or at least in preference to?) GNU Emacs.)</p>
<p>Oberlin College could send e-mail to other institutions via Bitnet, and had a DECnet connection with a half-dozen or so other colleges. (DECnet was pretty cool.) It also had Usenet feeds. It was not yet on any of the TCP/IP-based networks that became the internet.</p>
<h3>College</h3>
<p>When I went off to college in the fall of 1989, my parents brought me a Macintosh SE/30; I used it to write papers in non-technical subjects, play games, and do some amount of programming. (I wrote my papers on technical subjects in LaTeX; I&#8217;m honestly not sure whether I mostly typed those on my Mac or on one of the clusters mentioned below.) Continuing my habits from the last two years of high school, however, I spent much much more time on the various computer clusters around the college.  I begged an account on the math department&#8217;s Sun workstation cluster, though the sysadmin and I had an iffy enough relationship that I didn&#8217;t spend very much time there. I begged an account on the computer science department&#8217;s Sun workstation cluster as well, where I spent more time. (There were probably Ultrix machines in that cluster, too?) And I got a part time sysadmin helper job on the general school cluster. (Mostly Ultrix machines, initially with dumb terminals but X terminals showed up fairly soon.)</p>
<p>I probably spent most of my time on the general school cluster: programming, playing around, and doing system administration work. Coming out of that, I was much more comfortable on Unix than in any other computing environment, and had installed various bits of free software (mostly GNU tools of various sorts) over and over again. I also had a friend from Oberlin who was then working at the Free Software Foundation, so I was getting a strong free software philosophical dose from him as well.</p>
<p>I took a couple of computer science courses (an intro theory course, a compilers course), but not many: mostly because I could learn how to program computers just fine on my own, partly because I had enough other interests competing for my course time. Also, at that time Harvard&#8217;s computer science department didn&#8217;t have the buzz that I&#8217;d gotten from Oberlin. (Though there were students and faculty members that I learned a lot from, don&#8217;t get me wrong.) I was into programming languages and compilers at the time: I did some sort of undergrad research project on compilers, I was a course assistant for a few courses on programming languages and compilers, and I spent three out of my four summers during that period doing programming-related work. (One summer at MITRE, one at DEC, one being a course assistant at Boston College; the fourth summer was spent at a math research program whose main benefit was that I became a not-hopelessly-incompetent cook.)</p>
<p>During this period, I had access to TCP/IP-based networks: ARPAnet had evolved into NSFnet, with the internet coming. The web poked its head out right at the end of this period, but it certainly wasn&#8217;t clear to me that it was anything more than a peer to the various other network protocol that were floating around at the time.</p>
<h3>Life as a Mathematician</h3>
<p>Then, after a year&#8217;s interlude, I went to math grad school in 1994. I still had my old Mac, Jordan bought a new Mac (that I played <a href="http://www.bactrian.org/~carlton/dbcdb/460/"><cite>Marathon</cite></a> on), Liesl bought a 486 machine running Windows 3.1 (I played <a href="http://www.bactrian.org/~carlton/dbcdb/1065/"><cite>Myst</cite></a>, <a href="http://www.bactrian.org/~carlton/dbcdb/464/"><cite>System Shock</cite></a>, and <a href="http://www.bactrian.org/~carlton/dbcdb/462/"><cite>Dark Forces</cite></a> on that), and at some point I was given an X terminal that I could use at home. Most of my computer time was spent on the math department machines, though; and I essentially wasn&#8217;t programming at all during this time period. Also, a friend of mine gave me an <a href="http://www.bactrian.org/~carlton/dbcdb/492/">NES</a>, which started me on a spiral of depravity that I still haven&#8217;t emerged from. (One of the first things I did after getting my postdoc acceptance letter was to get a <a href="http://www.bactrian.org/~carlton/dbcdb/297/">Nintendo 64</a>; good thing my thesis was almost completely written by then&#8230;) Actually, though, my dominant leisure activity during that time period was reading books, I averaged more than a book a day over the course of grad school.</p>
<p>I can&#8217;t remember if I moved my old (9 years old at the time!) Mac with me when we went to Stanford in 1998; we moved Liesl&#8217;s computer, but I&#8217;m not sure if we ever turned it on. In general, I did my computing on the machine in my office at the math department; I can&#8217;t remember its specs (though I believe it had 4 GB of hard drive space?), but it was running an early Red Hat Linux version. I still wasn&#8217;t programming significant amounts: I was busy being a mathematician and a parent (Miranda was born in 1999), trying to figure out how to teach well, and playing video games, doing the latter almost exclusively on consoles instead of computers.</p>
<p>Returning to the Apple theme that triggered this post: during this period, my interest in Apple was quite low. I had a Mac, but barely used it; I certainly wasn&#8217;t going to use Windows machines, but really my focus was on Unix. (So, in terms of recent computing deaths, Dennis Ritchie&#8217;s is a lot more relevant.) I was at least partly anti-Apple at the time: the Free Software Foundation and the League for Programming Freedom had boycotted Apple because of their use of user interface patents, and that had an effect on me.</p>
<h3>Transitioning</h3>
<p>In 2002, academia and I came to a mutual decision that we weren&#8217;t as good a fit as I had thought. Fortunately, the Stanford math department was willing to let me hang around for another year; so I spent half my time that year teaching calculus and half my time brushing up my programming skills. I learned C++ and Java (object-oriented programming was far from dominant when I was an undergraduate), and contributed a fair number of patches to GDB.</p>
<p>It also became clear that I wouldn&#8217;t be able to depend on my employer to provide my computing resources; so I bought domains to use for my various internet presences, and, for the first time since 1989 (13 years!), acquired a new computer. It was a Dell Inspiron 8200 laptop, a behemoth that was barely portable (and that, fortunately, I rarely needed to carry anywhere); we set it up to dual-boot Windows and Linux, and I spent the vast majority of the time on the Linux side.</p>
<p>Also, befitting my academic nature, I started reading books and going to talks. A lot of the books that I read were C++-specific (and I learned a lot from them, C++ is an extremely interesting language); in terms of non-language-specific books, the <a href="http://www.bactrian.org/~carlton/dbcdb/1147/">refactoring book</a> had a big impact. The talk that had the most impact on me was one that a couple of researchers in a local corporate think-tank (?) gave about their experiences with something called &#8220;eXtreme Programming&#8221;; that was my first exposure to Agile software development.</p>
<p>The GDB work led to consulting work at a startup called Kealia, and I started working there full-time when I left academia in the summer of 2003. We got acquired by Sun a year later; soon after the acquisition, I became a manager, albeit a manager who spent a lot of time programming.</p>
<h3>Agile</h3>
<p>I spent a lot of time trying to understand Agile software development over the next five or seven years. At first, I was just trying to do this on a personal level, practicing refactoring and trying out test-driven development. Kealia&#8217;s legacy code provided some interesting challenges on the former front; the company also already had a bit of a testing culture when I showed up, and we experimented with going farther in that direction. And becoming a manager got me interested in other aspects of Agile: the more explicitly people-focused aspects, the planning aspects. And, as part of planning, the idea that programmers don&#8217;t make all of the design decisions (which was quite a change from working on GDB!): other people have a better idea of what the end users really value, what will work well in their context.</p>
<p>As an academic, I&#8217;d been quite ivory tower (at least aside from my interest in teaching); that changed. I was working at a startup which got acquired by a larger company that had suffered a lot over the last few years; part of startup life is trying to figure out how to make your business work, and Sun was trying to figure that out at a larger scale. Sun also put enough resources behind StreamStar (Kealia&#8217;s video server project) that we had quite a lot of room to experiment with different business strategies, trying to find one that would stick. (Far too much room: the fact that Sun didn&#8217;t cancel StreamStar years before I eventually left was a sign of Sun&#8217;s own management problems.)</p>
<p>My boss was a big fan of <a href="http://www.bactrian.org/~carlton/dbcdb/1276/">Clayton Christensen&#8217;s disruption theories</a>, and I got to see both sides of the difficulties of disruption first-hand. Sun was a large company that was already far along the path of being disrupted by commodity hardware running Linux, and was trying to figure out how to deal with that; StreamStar was trying to disrupt the existing broadcast television infrastructure, replacing it with IP-based solutions. In neither case did we navigate the difficulties well, but I have quite a bit of sympathy for both sets of difficulties: surviving being disrupted is extremely difficult, and when it comes to broadcast television, you have to deal not only with the existing technological infrastructure but with the existing broadcasters and existing content providers. So it&#8217;s not surprising that we failed to disrupt broadcast television delivery, whereas Youtube was much more successful with its end run around the last two issues.</p>
<p>During this time, I won an iPod (one of the hard-drive based models), and a couple of years later, an iPod Nano at company raffles. I wouldn&#8217;t have bought the first iPod on my own, but its presence made my jogging a lot more presence; I probably wouldn&#8217;t have bought the iPod Nano on my own, but I was quite surprised how much more I liked its small size, the lack of skipping, and the general elegance of its design.</p>
<p>Our Dell laptop died in 2006, and had been showing its age enough by then that I was already planning to replace it. For my own Linux use, we got a Sun Ultra 20; to have a computer that Liesl could use and that I could run iTunes on, I got a MacBook Pro. This was the first model after the Intel transition; I felt more comfortable going back to the Mac instead of having a Windows machine around, and the fact that there was now Unix underneath MacOS was a real bonus. (Incidentally, back in 2003 I&#8217;d turned down a job offer working on GDB for Apple: I like Unix and the GNU toolchain, but I wasn&#8217;t really interested in specializing in the latter.)</p>
<p>At some point while I was at Sun (probably in 2008), I got an iPod Touch. That was really a revelation to me: it was wonderful having a little computer in my pocket, one that was already fairly versatile and was becoming more so every year; I had Wi-Fi access most of the places I spent time (there was even spotty Wi-Fi available from Google when wandering around Mountain View), but I could tell that having a phone network provide almost constant network access would be so much better.</p>
<p>But more than that: Tweetie made me sit up and take notice. That was the Twitter client that eventually became the first-party Twitter client; and despite running on this quite small device, I far preferred using it to any Twitter interface I had available on computers that didn&#8217;t fit in my pocket. That didn&#8217;t make much sense to me; clearly there was something going on with design that I didn&#8217;t understand and that could make a real difference.</p>
<p>At this time, I was also getting more and more tired with having Unix on my desktop. I love Emacs, but it&#8217;s stuck in the stone age in so many ways: what really drove that home was once when I fired it up on a machine where I didn&#8217;t have my standard .emacs file and realized that, by default, Emacs put the scroll bars on the left. That may have been a perfectly reasonable decision when it was first made, but it wasn&#8217;t any more and hadn&#8217;t been for at least a decade; did I really want to be working with tools that were so willfully ignorant about design conventions? GNOME had helped civilize X Windows, but it had only brought the experience up to a minimally acceptable level, and even so there were too many non-GNOME applications around.</p>
<h3>Reaching the Present</h3>
<p>So, when I started work at Playdom, I asked for a Mac for my work machine: that way I could have a Unix command line and tools combined with a GUI that accepted the idea that design was a virtue. Which the IT department was oddly hostile to: you&#8217;d think that a company with a large contingent of graphics artists that deploys software to Unix servers would be a natural fit for Macs, but Playdom had its quirks, and its IT department was definitely one of those quirks.</p>
<p>At around this time we got a second Mac laptop at home, and I got an iPhone. (My first cell phone; I am a luddite at times.) The Ultra 20 died; I decided that I wanted to continue to run a Linux server (e.g. to host this blog), but that I would prefer to interact with it through an ssh connection, so I got a virtual machine at Rackspace.  Also, I was getting older, and carrying around a laptop during GDC 2010 put a surprising strain on my back; the iPad had been announced, so I decided I&#8217;d get one the next time I went to a conference. Which happened sooner than I expected, since I decided to go to <a href="http://www.glsconference.org/2010/">GLS</a> later that spring.</p>
<p>My back thanked me for the iPad purchase; but my psyche thanked me as well, to a surprising extent. I found that I preferred reading e-mail on the iPad to reading e-mail in a web browser, and that I far far preferred reading blogs in Reeder than through Google Reader&#8217;s web interface, whether I used the latter to go to the blogs&#8217; web pages or stuck with the RSS feed. In both cases, the iPad acted like a wonderfully adaptable piece of paper: the words I wanted were right there, with enough style to be pleasant (unlike the Google Reader web interface) but without any surrounding crap (unlike blogs&#8217; web pages). Having a screen that was much smaller than computer monitors that I was used to, and that was in portrait mode instead of landscape mode, turned out to be excellent for letting me focus on what I was reading. (As it turned out, I even slightly prefer reading blogs through Reeder on my iPhone over reading them through a web interface on a standard computer, despite the rather-too-small size of the former&#8217;s screen.)</p>
<p>In early 2011, one of our laptops died; rather than replace it with another laptop, we got an iMac and a second iPad. Our current technology roster is an iMac and a MacBook (one of the white plastic ones); two iPads (one from each generation); three iPhones (one from each of the last three generations, though the oldest one is being used by Miranda as an iPod Touch instead of as a phone); a virtual machine located elsewhere running Linux; and half a dozen game consoles. (My rate of technology purchases has increased enormously since 1998.) Also in 2011, I started working at Sumo Logic; as is typical in startups around here (at least judging from the ones I&#8217;ve interviewed at), it&#8217;s largely a Mac shop for development (with deployment happening on Linux virtual machines), and my coworkers generally prefer various Apple products for personal use, though there&#8217;s more variation on the personal side.</p>
<p><a name="apple">&nbsp;</a></p>
<p>So: that&#8217;s the computers and other technology that I&#8217;ve used over the course of my life. Apple played a large role when I was young and more recently, but in the middle there was a long phase where my norm was Unix + GNU toolchain, with a strong free software ethos. Why did I shift out of that, what&#8217;s behind my recent fascination with Apple&#8217;s products and, increasingly, Apple as a company?</p>
<h3>Habitable Software</h3>
<p>The first is the concept of &#8220;habitable software&#8221;. I talked about this <a href="http://malvasiabianca.org/archives/2010/04/habitable-software/">last year</a>: the idea is that there is software that my brain shies away from using, and there&#8217;s software that I actively look forward to using, where the thought of using it relaxes me or brings a smile to my face.</p>
<p>I actually think that console gaming gave me my first nudge in this direction. You stick the cartridge into the machine, you pick up a controller with a relatively constrained set of inputs, you turn on the machine, and it just works.  Note too that a console controller, unlike a mouse and a keyboard, is explicitly designed for the task at hand: yes, gamepads may have a few too many or too few buttons and sticks for a given game, but at least it&#8217;s focused on the domain of playing games. (Hmm, maybe the controller/game match is why I think back on text adventures with so much fondness?) I keep on installing Windows on machines with the thought that I&#8217;ll finally play the many important PC games that are missing from my background; and I keep on deciding that no, I really don&#8217;t want to put up with the crap that PC gaming makes you deal with.</p>
<p>But shifting from X Windows back to the Mac also gave me a huge shove towards being sensitive to habitable software; and going from the Mac to iPhone/iPad software like Tweetie and Reeder was, in its own way, just as large a leap. Every time I use X, I find something that feels wrong; a Mac feels neutral, but I don&#8217;t generally look forward to turning it on; Tweetie and Reeder make me actively happy. It&#8217;s not just software that I&#8217;m learning from, either: I was surprised how much happier I was with the iPod Nano because of its small size, light weight, pleasant screen, and lack of skipping.</p>
<p>The Unix command line also makes me actively happy. It&#8217;s wonderfully coherent; for certain tasks related to writing and, especially, deploying software, it&#8217;s just what I want, I love the interface that it presents to me. So it&#8217;s no coincidence that I do my programming on machines where a Unix terminal window is one key combination away, and that I use virtual machines running Linux to deploy software on: I feel completely at home in those contexts when working on those tasks.</p>
<h3>Designing Software</h3>
<p>Habitability is how I like to express the importance of design in software to me as a user. But I&#8217;m a programmer as well, so I see design from that side as well.</p>
<p>When I was younger, I spent much of my programming time concerned with tools for programmers: thinking about programming languages and compilers, working on GDB. In those contexts, I didn&#8217;t have to think too hard about design: I was an acceptable proxy for the end user for the software, so if something felt good for me, then that was good enough.</p>
<p>That&#8217;s a relatively unusual subset of software, however; as I started to work about other kinds of products, I realized that my design instincts wouldn&#8217;t do a very good job. And, at the same time, I got interested in Agile: and one of Agile&#8217;s main tenets is that design concerns (personified as the &#8220;Customer&#8221;) are paramount when deciding what to work on. Not that the technical details aren&#8217;t important as well&mdash;you get great benefits from keeping your code flexible and well-architected&mdash;but ultimately it&#8217;s not programmers&#8217; jobs to decide what&#8217;s important to present to the users.</p>
<p>Even though it carves out a space where design can happen, Agile isn&#8217;t actually very good at giving you advice at how to design well: specific recommendations are much more focused on the programming side of things (e.g. refactoring, test-driven development) or the programming/design interface (estimating, iterating) than on the design side of things. Also, my talents and instincts are much stronger on programming than on design: I still have a lot of room for improvement, but I&#8217;ve got some understanding of what&#8217;s involved in writing code that&#8217;s clean and functional from a technical point of view, whereas I have <em>much</em> less understanding of what&#8217;s involved in developing a product that people are actively happy to use.</p>
<p>And, to produce really great products, I&#8217;m not convinced by Agile&#8217;s engineering/customer representative split. The Lean concept of a Chief Engineer who&#8217;s immersed in both worlds seems much more powerful to me, and I see around me wonderful pieces of software written by single individuals, or startups (including Sumo Logic!) run by people with both a vision for what they want to produce and the technical chops to help bring that into existence.</p>
<p>Apple can probably be argued as providing evidence on either side of the argument about that split, but there are clearly individuals who made a huge difference in its products. Apple also points out how ludicrous it is to label the designer as the &#8220;Customer&#8221; if you really want to produce something new and great, and at the limits of the analytics-focused mindset that I saw so much of at Playdom; in general, Apple&#8217;s approach to iteration seems interestingly different from yet related to Agile norms. And their systems approach gives Apple many more design knobs to turn than they would if they were exclusively a software company. (Or exclusively a hardware company, of course.)</p>
<h3>Business Success</h3>
<p>Back in my academic days, I didn&#8217;t care about practical applications of my research. When I started working for startups, though, that changed: if you don&#8217;t have your eyes on how you&#8217;re going to make money out of your startup, you&#8217;re doing the wrong thing. (Not that startups don&#8217;t have a heavy dose of ego satisfaction in them, of scratching your own itch.)</p>
<p>Once I started paying more attention to making money, it turns out to be totally fascinating: if you like complex systems, capitalism is full of them. Just figuring out cash flow: where money is coming in, where money is going out, the difference between those two in quantity and in in time. So many possibilities there!</p>
<p>Apple&#8217;s business success over the last decade is staggering, of course. But they are fascinating far beyond their simple profit figures: the consequences of their systems approach to design, their use of their savings to buy vast quantities of parts from their component vendors (and even to allow those vendors to purchase tooling!), the role of their physical stores, the list goes on and on. There&#8217;s still a stereotype of Apple as making overpriced products, but their competitors are finding it very difficult to build products with the hardware quality of the iPad or MacBook Air while maintaining any sort of profit margin at all.</p>
<p>Of course, lots of startups <em>aren&#8217;t</em> focused on being profitable: Silicon Valley is full of company that are trying to get eyeballs, hoping that profitability will come somehow, and perfectly happy to sell the company to somebody else who can worry about that problem. We see echoes of this in the Android / iPhone fight, and these days I&#8217;m generally more interested in making money than having users without a good business model; but the iPod shows that you don&#8217;t always have to compromise, that you can win on both fronts.</p>
<h3>Disruption</h3>
<p>I mentioned <a href="http://www.bactrian.org/~carlton/dbcdb/1276/">Clayton Christensen&#8217;s disruption theory</a> above: living in Silicon Valley, there&#8217;s no end of startups trying to remake an industry, no end of once dominant companies that stumbled, got bought, died.</p>
<p>Apple looked like it was following that latter trajectory; it pulled out of its decline like no other company. And did so in a very interesting way: not only did it disrupt other industries, it also disrupted itself, with the iPhone cannibalizing iPod sales and with the iPad cannibalizing laptop sales. This is <em>extremely</em> difficult to do: existing successes almost always lead to institutional antibodies that attack new products, leaving that success to newcomers.</p>
<p>Over the last decade, we&#8217;ve all become aware of disruption; the companies that can figure out how to repeatedly harness the powers of disruption will be the ones that flourish (the ones that survive at all!) over the next few decades. They will have to learn from Apple. And if I&#8217;m going to continue to build a career working at exciting companies, I&#8217;m going to want to learn from Apple, too, to help me figure out what sorts of qualities to look for the next time I&#8217;m on the job market, to pick employers that will disrupt successfully!</p>
<h3>Repeatable Creativity</h3>
<p>Disruption aside, though, there&#8217;s something amazing about Apple&#8217;s run of products over the last decade: one interestingly new product after another. I wish I knew how they did that.</p>
<p>It&#8217;s easy to ascribe this to a solo genius theory; but, while I don&#8217;t want to minimize Steve Jobs&#8217;s contributions, I don&#8217;t think that&#8217;s all that&#8217;s going on here. Pixar is another relevant datum: they&#8217;ve also managed to be consistently creative, and they continued to do that after Jobs sold the company to Disney. Perhaps because of the domain, people don&#8217;t credit Jobs with the same influence on Pixar&#8217;s repeated creative success as they do with Jobs; but, to me, the two companies suggest that Jobs has learned something about helping groups to innovate repeatably in a way that goes well beyond his personal contributions.</p>
<p>Over the last couple of years, stories have come out about some sort of Apple University, which seems to be trying to systematize those ideas. This reminds me of Toyota&#8217;s conscious efforts to improve themselves as a learning company; Apple is, sadly, much more secretive than Toyota, but I hope more of Apple&#8217;s methods will become public over the next decade. And, of course, I hope that Apple will be able to continue to innovate over the next decade, that their innovation really is due in part to a systematizable process.</p>
<h3>Bad Apple</h3>
<p>During the mid-90&#8242;s, I was down on Apple. I hoped that had gone away with the new decade, however: their user interface patents had gone away, and they were active open source contributors, though that clearly wasn&#8217;t the company&#8217;s main focus.</p>
<p>Unfortunately, those problems have come back in spades. By far the one that I find most distasteful is their aggressive use of patents: I think software patents are bad for the industry, bad for the world, and while I&#8217;m more and more bored by other companies that seem to largely be trying to produce knockoffs of Apple&#8217;s products, I very much support allowing those companies to do so.</p>
<p>Apple&#8217;s recent systems are also much more closed than computing platforms I&#8217;d used before then. I would expect that to bother me; for whatever reason, though, it actually doesn&#8217;t particularly. Certainly it would if I didn&#8217;t have ample access to other computing platforms, or if the tools to develop for iOS platforms weren&#8217;t so readily available; and while Apple teeters on the edge of behaving in a manner I find unacceptable in their application approval process, for whatever reason I generally think they&#8217;re okay. (I&#8217;m actually more worried about Amazon&#8217;s behavior in that regard.)</p>
<p>I&#8217;m being ungenerous in saying this, but: these days, when I read Richard Stallman complaining about Apple&#8217;s closed systems, part of my brain interprets that as RMS wanting it not to be his fault if other people don&#8217;t have software they want to use: RMS has made an open system, it&#8217;s other people&#8217;s fault if they don&#8217;t take advantage of that. These open systems are, in all serious, a great good: but actually having good software on your computer is also worthy, and having software that&#8217;s a joy to use is a great good. It&#8217;s fine if having well-crafted software for the non-programming public isn&#8217;t RMS&#8217;s concern, there&#8217;s no reason why it should be; but I see him as a single-issue voter whose issue is no longer dominant to me, and who is willfully blind to other issues that are important to me.</p>
<p>&nbsp;</p>
<p>To those of you who have read this far: I salute you. And to those of you who don&#8217;t like Apple&#8217;s products, who don&#8217;t care about what Apple has done as a company: that&#8217;s great, there&#8217;s no reason why others&#8217; interests should be my own. And there&#8217;s no question that company has flaws, does things I really don&#8217;t like. But I&#8217;m fascinated for many reasons by what Apple has done over the last decade, and I fully expect to be trying to sort out the implications for much of the next decade.</p>
<hr />
<p>Some Jobs-related posts that I particularly enjoyed:</p>
<ul>
<li>John Shook asking <a href="http://www.lean.org/shook/DisplayObject.cfm?o=1925">Was Steve Lean?</a></li>
<li>Another lean-focused post, this time from <a href="http://www.evolvingexcellence.com/blog/2011/10/stretching-the-eulogical-boundaries.html">Evolving Excellence</a></li>
<li>Horace Dediu on what <a href="http://www.asymco.com/2011/10/06/steve-jobs-didnt/">Steve Jobs didn&#8217;t</a> do.</li>
<li>A podcast reminiscence from <a href="http://5by5.tv/hypercritical/37-a-story-of-triumph">John Siracusa</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/12/an-apple-focused-personal-history-of-computing/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>fragments</title>
		<link>http://malvasiabianca.org/archives/2011/11/fragments/</link>
		<comments>http://malvasiabianca.org/archives/2011/11/fragments/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 11:34:41 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=5504</guid>
		<description><![CDATA[I&#8217;ve started another blog (or blog-like thing), &#8220;Malvasian Fragments&#8221;, whose intent is to give me a space to explore nascent thoughts, thoughts that are too long for Twitter but aren&#8217;t well-developed enough to fit in this blog. (Insert snark about the lack of coherence of a lot that does show up in this blog!) The [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve started another blog (or blog-like thing), &#8220;Malvasian Fragments&#8221;, whose intent is to give me a space to explore nascent thoughts, thoughts that are too long for Twitter but aren&#8217;t well-developed enough to fit in this blog. (Insert snark about the lack of coherence of a lot that does show up in this blog!)</p>
<p>The contents would probably fit in fine on Tumblr, but I decided not to go that route, for better or for worse. For one thing, all things being equal I&#8217;d rather have my writings show up on platforms that I control; for another thing, it lets me experiment with form more than I could otherwise. The posts on the fragments blog are extremely bare, completely devoid of bloggy apparatus such as links (not even links to the next/previous posts) and comments; I&#8217;m curious to see what effect those formal concerns will have on the content.  It lends itself to a feeling of isolation, reinforcing a certain morose nature of the posts there; I&#8217;m okay with that for now.</p>
<p>The software allows me to assemble these fragments into &#8220;mosaics&#8221;: those mosaics consist of chains of fragments, with optional nesting. Part of my motivation there comes from my fascination with sutras and commentary: the form supports that, though it supports other compound forms as well. To be honest, I&#8217;m not at all sure how often I&#8217;ll write mosaics: if my brain is in a mode where it&#8217;s thinking about writing content of that length, I may find that my brain is really composing a post for this blog instead. We&#8217;ll see; the possibility is there.</p>
<p>Right now, it exists only as RSS feeds: one for <a href="http://fragments.malvasiabianca.org/fragments.xml">fragments</a> and one for <a href="http://fragments.malvasiabianca.org/mosaics.xml">mosaics</a>. (Both feeds contain the full text for the posts in question, so there&#8217;s very little reason to actually go to the website.)  You can go to the <a href="http://fragments.malvasiabianca.org/">top level page</a> for the site and the index pages for <a href="http://fragments.malvasiabianca.org/fragments/">fragments</a> and <a href="http://fragments.malvasiabianca.org/mosaics/">mosaics</a>, but you&#8217;ll currently get a blank page if you do any of those. I plan to fix that at some point over the next month or so, but doing so isn&#8217;t a top priority for me. (And I&#8217;m not at all sure what those aggregating pages should look like in the first place.) I&#8217;d also like to improve the presentation of fragments and mosaics on the iPad and (especially) the iPhone; doing that is a slightly higher priority.</p>
<p>As is probably clear from the above, I rolled the software for the new blog myself. It&#8217;s all quite straightforward, using a <a href="https://github.com/tanoku/redcarpet">markdown-to-HTML</a> converter plus a bit of Ruby glue. (I used <a href="https://github.com/bct/atom-tools/wiki">atom-tools</a> to generate the RSS feeds.) It uses plain text files as the source, and spits out flat files that are served up by Apache: no databases, no run-time web page generation. I imagine I&#8217;ll throw it up on github once I&#8217;ve teased apart the presentation parts from the text for the fragments themselves. Though I&#8217;m also not entirely sure what I&#8217;ll get out of doing that: I doubt anybody else will ever want to use the software, and it&#8217;s not particularly representative of my programming style, in particular containing rather fewer tests than I normally write. It&#8217;s certainly nice how easy it is to roll your own blog these days, it&#8217;s just a few hundred lines of code in total if you don&#8217;t count the libraries that I&#8217;m depending on.</p>
<p>In general, I expect that the audience for these fragments will be quite small: certainly I doubt that most people who read this blog will find anything interesting there, and I&#8217;m not committing to writing there long-term at all. It&#8217;s probably only for people who know me personally, and not even for most of them; there&#8217;s a pretty good chance, in fact, that I&#8217;m the only audience member for the fragments! If interesting thoughts come out of my writings there, those thoughts will make their way over here.</p>
<p>&nbsp;</p>
<p>I&#8217;ll use this as an excuse to write down all the places where you can find me. Besides this main blog and the new one, other places where I write are:</p>
<ul>
<li><a href="https://twitter.com/#!/davidcarlton">Twitter.</a></li>
<li><a href="http://links.malvasiabianca.org/">My linkblog.</a></li>
<li><a href="http://scenes.malvasiabianca.org/">My gaming diary.</a>
</li>
</ul>
<p>You can also find me online playing games and talking about games on Thursday evenings with the <a href="http://vghvi.org/">Video Games and Human Values Initiative</a>.  (Which I highly recommend, the conversation over the last few months has been great.)  I&#8217;m <a href="http://live.xbox.com/en-US/profile/profile.aspx?pp=0&#038;GamerTag=malvasia+bianca">malvasia bianca</a> on Xbox Live and &#8220;davidcarlton&#8221; on Game Center; I have PSN and Steam accounts, but never use them, so I&#8217;m not even going to go to the effort of looking up what the account names are. And I have accounts on <a href="http://www.facebook.com/davidcarlton">Facebook</a> and <a href="https://plus.google.com/117009701496008151356">Google+</a>, though the content there is a subset of the above, so there&#8217;s no particular reason to link to me on either of those networks. (In particular, my Facebook wall consist entirely of forwarded Twitter posts and links to the posts on my various blogs.) If you&#8217;re particularly obsessed with the minutia of my life, you can look at the list of <a href="http://www.bactrian.org/~carlton/dbcdb/recently-played">games I&#8217;m playing</a> (all of which eventually get mentioned on this blog anyways) and <a href="http://www.bactrian.org/~carlton/dbcdb/recently-read">books I&#8217;m reading</a>, but I recommend seeking professional help instead of going that far.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/11/fragments/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>rock band driven development</title>
		<link>http://malvasiabianca.org/archives/2011/09/rock-band-driven-development/</link>
		<comments>http://malvasiabianca.org/archives/2011/09/rock-band-driven-development/#comments</comments>
		<pubDate>Wed, 28 Sep 2011 04:26:03 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Music]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=5313</guid>
		<description><![CDATA[I&#8217;ve been playing through a bunch of Billy Joel songs this month in Rock Band, and I&#8217;ve thoroughly enjoyed the experience. Mostly repeated chords and chord progressions, but they&#8217;re interesting enough chord progressions for me to have fun playing them, and there&#8217;s a fair amount of melody interspersed throughout the songs as well. One song [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been playing through a bunch of <a href="http://scenes.malvasiabianca.org/tag/billy-joel/">Billy Joel</a> songs this month in <a href="http://www.bactrian.org/~carlton/dbcdb/1483/"><cite>Rock Band</cite></a>, and I&#8217;ve thoroughly enjoyed the experience. Mostly repeated chords and chord progressions, but they&#8217;re interesting enough chord progressions for me to have fun playing them, and there&#8217;s a fair amount of melody interspersed throughout the songs as well.</p>
<p>One song that stood out, however, was She&#8217;s Always A Woman. It&#8217;s full of chords and chord progressions, to be sure; but the chords are all arpeggiated, and the chord changes are relatively frequent. That (combined with the fact that the game only has you playing with your right hand, so you don&#8217;t have the grounding of the bass part) means that, while the chordal structure of the piece is on display, it&#8217;s hidden a little bit more than in the other pieces: you can feel it in your hands, but there&#8217;s an extra layer of artistry masking it.</p>
<p>&nbsp;</p>
<p>I&#8217;d <a href="http://malvasiabianca.org/archives/2011/08/with-four-part-harmony-and-feeling/">been looking</a> for a finger picking piece to learn on the guitar, and I found a good candidate last week: a really lovely arrangement of <a href="http://www.gametabs.net/anime/kikis-delivery-service/breeze-on-a-hill">風の丘</a> (Kaze no Oka, which means something like Windy Hill) from <cite>Kiki&#8217;s Delivery Service</cite>. It&#8217;s everything that I was looking for: not just lovely to listen to, it also has distinct melody and bass lines, with arpeggiation relating the two.</p>
<p>These two pieces are both somewhat similar, with arpeggiation hiding underlying chordal structure. In 風の丘, you have the added benefit of the bass line grounding you, but the flip side is that the arpeggios aren&#8217;t as worked out and there are more purely melodic bits, so on the whole the structure is a bit more hidden. </p>
<p>Or maybe it&#8217;s just as obvious but I&#8217;m simply a much worse guitar player than piano player (that last part is unquestionably true), so my hands aren&#8217;t nearly as good at seeing the structure that&#8217;s there? Certainly it&#8217;s the case that trying to memorize 風の丘 is like pulling teeth: I&#8217;ll play a couple of measures, and by the time I&#8217;m done with the second measure I&#8217;ll have completely forgotten the notes that began the first one. Or at least that&#8217;s the case if I&#8217;m approaching the song as a collection of notes: if I can find a chord that&#8217;s a decent match for a half-measure, then I have a chance at being able to remember that half-measure the next time I play it.</p>
<p>Only a chance, though: I&#8217;m <em>very</em> bad at translating melodic relations between notes into places to put my finger on a guitar, frequently not even choosing the correct string.  Also, for me, every guitar chord is an island, I just don&#8217;t have common chord progressions ingrained into my hands yet. I&#8217;m amazed at how much more easily I can pick out melodies on a violin than on a guitar: the technical challenge should be very similar indeed, and I&#8217;m certainly not a good violinist, but apparently those middle school orchestra years stuck with me more than I realized?</p>
<p>&nbsp;</p>
<p>Anyways: programming. One of my favorite parts of programming is refactoring; which is a good thing, because I seem to unable to not spend a lot of time reworking legacy code! When it&#8217;s going well, refactoring can be magical, with latent the latent structure of the code being teased into visibility by your fingers.</p>
<p>And when I was playing She&#8217;s Always A Woman, my main thought was: why isn&#8217;t programming like this for me more often? That reaction is certainly a sign that I should step up my game more, really dive whole-heartedly into code and see what I can learn from reworking it.</p>
<p>I&#8217;m not sure that this is analogy between musical structure and programming structure is a particularly good one, but if we run with it, where does it lead us? One of the interesting things about She&#8217;s Always A Woman is that the structure <em>isn&#8217;t</em> completely obvious: there&#8217;s an extra level of arpeggiation on top of the chords. Should I try to imitate that while programming, getting close enough to the core structures so that they provide a solid foundation for my code, while masking them with an extra layer of artistry?</p>
<p>Or maybe I&#8217;m wrong in fixating on chords: maybe the arpeggiation itself should be thought of as an extra layer of structure, increasing the structural richness of the piece rather than hiding it? I&#8217;m fairly sure that my difficulties with 風の丘 support this interpretation, because while figuring out the best chord to match each half-measure has been a huge help, it&#8217;s clearly only a first step.  In particular, the fact that I&#8217;m not comfortable with melody on the guitar, that I can&#8217;t play through scale after scale, is a significant hindrance.</p>
<p>Also, returning to chords: it&#8217;s not just chords that are important, it&#8217;s chord progressions, relationships between chords. Abstracting a bit, what this is pointing out is that patterns alone aren&#8217;t sufficient, you really want a pattern language to relate them.</p>
<p>(And: dissonance! Glorious, wonderful dissonance!)</p>
<p>&nbsp;</p>
<p>Having written this, I still don&#8217;t know how much to make of this analogy, though the response I got from the eight-tweet version of this blog post suggests that I&#8217;m not the only person who is drawn to both sides of this discussion.  Be that as it may, the next steps are clear: dive into the details, on both the musical side (memorizing 風の丘!) and the programming side, and I&#8217;ll be a better person when I come out the other end.</p>
<p>And I should listen to my hands.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/09/rock-band-driven-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>testing updates via unobtrusive javascript</title>
		<link>http://malvasiabianca.org/archives/2011/07/testing-updates-via-unobtrusive-javascript/</link>
		<comments>http://malvasiabianca.org/archives/2011/07/testing-updates-via-unobtrusive-javascript/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 01:43:29 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=5098</guid>
		<description><![CDATA[When talking about upgrading memory to Rails 3.0, I mentioned that I&#8217;d had trouble testing a bit of the unobtrusive JavaScript code. Specifically, I had a file answer.js.erb that contained the following: $('answer').update("&#60;%= escape_javascript(render :partial =&#62; 'answer', :object =&#62; @item) %&#62;"); and I wanted to take apart the HTML returned by that render :partial section. [...]]]></description>
			<content:encoded><![CDATA[<p>When talking about <a href="http://malvasiabianca.org/archives/2011/07/upgrading-memory-to-rails-3-0/">upgrading memory to Rails 3.0</a>, I mentioned that I&#8217;d had trouble testing a bit of the unobtrusive JavaScript code.  Specifically, I had a file <code>answer.js.erb</code> that contained the following:</p>
<p><code>
<pre>
$('answer').update("&lt;%= escape_javascript(render :partial =&gt;
'answer', :object =&gt; @item) %&gt;");
</pre>
<p></code></p>
<p>and I wanted to take apart the HTML returned by that <code>render :partial</code> section.</p>
<p>I eventually came up with a solution that I&#8217;m happy with, so I&#8217;ll mention it here in case anybody else runs into the same problem and ends up here via Googling.</p>
<p>The partial in question contained a <code>p</code> element with class <code>qa</code>; let&#8217;s assume that it&#8217;s body is supposed to be <code>text_to_assert_on</code>. Then here&#8217;s the test that I ended up with:</p>
<p><code>
<pre>
  def unescape_javascript(escaped)
    escaped.gsub("\\'", "'").gsub("\\\"", "\"").gsub("\\n", "\n").
      gsub("\\\\", "\\").gsub("&lt;\\/", "&lt;/")
  end

  def assert_encoded_update(body, element_to_update)
    assert_not_nil(/\$\('(.*)'\)\.update\("(.*)"\);/ =~ body)
    assert_equal(element_to_update, $1)
    yield(HTML::Document.new(unescape_javascript($2)).root)
  end

  def test_get_answer
    get :index
    post :answer, :format => 'js', :item => @one.id

    assert_encoded_update(response.body, "answer") do |replacement|
      assert_select(replacement, "p.qa", "text_to_assert_on")
    end
  end
</pre>
<p></code></p>
<p>I don&#8217;t claim that this is perfect (there are probably more cases that <code>unescape_javascript</code> should handle), but it worked well for my purpose.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/07/testing-updates-via-unobtrusive-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>being on call</title>
		<link>http://malvasiabianca.org/archives/2011/07/being-on-call/</link>
		<comments>http://malvasiabianca.org/archives/2011/07/being-on-call/#comments</comments>
		<pubDate>Sat, 23 Jul 2011 04:58:12 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Lean / Agile]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=5091</guid>
		<description><![CDATA[At work, our service has been in a pre-alpha mode for the last month or so. Which has been a fascinating experience, one that I&#8217;ve never been so heavily involved in before: in the StreamStar group, we were selling a product rather than running a service, so there wasn&#8217;t the same visibility into how well [...]]]></description>
			<content:encoded><![CDATA[<p>At work, our service has been in a pre-alpha mode for the last month or so. Which has been a fascinating experience, one that I&#8217;ve never been so heavily involved in before: in the StreamStar group, we were selling a product rather than running a service, so there wasn&#8217;t the same visibility into how well it was working at any given moment, and at Playdom, I joined the team for a game that had been around for more than long enough to be past the scaling issues. Whereas with the product I&#8217;m working on now, we&#8217;re feeling out those early issues. In general, we&#8217;re staying ahead of scaling problems, but we&#8217;re also trying to be very heads-up on alerts so we fix things before anybody else notices them.</p>
<p>Which means that people sometimes get woken up in the middle of the night. Initially, it was the same couple of people, but that&#8217;s obviously completely unfair (and goes against the Whole Team philosophy that I prefer), so now we&#8217;re rotating that job among all the developers.  I had the pleasure of being on call a couple of weeks ago, and it was a lot more interesting experience than I expected.</p>
<p>And yes, part of that interesting experience involved staying up later in a couple of evenings than I would have liked, and being woken up a couple of times.  The problems there happened to involve a piece of code that I was relatively familiar with; in fact, during that week I&#8217;d already been experimenting in test deployments to see where and how it would fall over, I just didn&#8217;t manage to get far enough ahead of production scaling to give us quite enough breathing room! But at least it meant that I had some idea of what to look for and what to do, which certainly helped.  (And don&#8217;t get me wrong, even when I was the primary person on call, a lot of other people were ready and eager to help as necessary, and somebody else implemented the initial stability fix.)</p>
<p>It turned out, though, that being the primary person on call when issues like that come up has an interesting affect on my brain. In the past, when people had talked to me about issues that had come up when they were on call, I was happy to help fix things, but my brain was treating the problem somewhat abstractly and as a distraction to what I&#8217;d been planning to do that day. Whereas running into problems when I&#8217;m on call rather quickly puts my brain into problem solving mode, with the result that when I showed up at work the next day I knew exactly what I wanted to be working on, what steps I wanted to take, and where I needed to advocate for further work. So the upshot was that I felt a lot more focused for the rest of the week (well, when I wasn&#8217;t feeling sleep-deprived!), and it carried over to the next couple of weeks: I can program pretty effectively when I&#8217;m trying to answer the question of &#8220;what can I do to prevent other people from being woken up for similar reasons?&#8221;.</p>
<p>I am, of course, hoping not to always have to keep that motivation in the front of my mind when I&#8217;m programming. (And fully expecting that to be the case: we&#8217;re doing a very good job of leaping on small problems now and trying to take a systemic approach to solving them instead of a patchwork approach.)  But it&#8217;s a helpful reminder of the virtues of Whole Team: exposing everybody to problems means that everybody has a chance to really feel their effects and get their brains directly interested in solving those problems.</p>
<p>And, as a side effect, it means that non-bug work can go a lot faster, too: in particular, it&#8217;s been great this week to have much faster startup speed for the component involved in the aforementioned issue, because that made it so much easier to run experiments. Goodness all around.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/07/being-on-call/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>upgrading memory to rails 3.0</title>
		<link>http://malvasiabianca.org/archives/2011/07/upgrading-memory-to-rails-3-0/</link>
		<comments>http://malvasiabianca.org/archives/2011/07/upgrading-memory-to-rails-3-0/#comments</comments>
		<pubDate>Wed, 13 Jul 2011 04:24:40 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=5071</guid>
		<description><![CDATA[I wrote a program to help me memorize stuff a few years, partly for reviewing Japanese vocabulary (and grammar) and partly to give me an excuse to learn Rails. It&#8217;s done very well in the former regard; it was somewhat useful in the latter regard, but it&#8217;s simple enough (and used by few enough people) [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote a <a href="http://malvasiabianca.org/archives/2009/09/multiuser-memorization/">program to help me memorize stuff</a> a few years, partly for reviewing Japanese vocabulary (and grammar) and partly to give me an excuse to learn Rails. It&#8217;s done very well in the former regard; it was somewhat useful in the latter regard, but it&#8217;s simple enough (and used by few enough people) that it certainly hasn&#8217;t turned me into a Rails expert.</p>
<p>Rails is a moving target, and in particular the release of Rails 3.0 last year brought a fair amount of changes. I didn&#8217;t upgrade immediately, partly because I was busy with other things and partly because <a href="https://github.com/binarylogic/authlogic">authlogic</a> took a while to be upgraded to work with Rails 3.0. Eventually, though, authlogic got fixed, and Rails 3.1 release candidates started to appear, so I figured I should upgrade sooner rather than later or I&#8217;d be setting myself up for even more pain in the future.</p>
<p>As always, there was a very helpful <a href="http://railscasts.com/episodes/225-upgrading-to-rails-3-part-1">Railscast</a>. So with the help of it and the <a href="https://github.com/rails/rails_upgrade">rails_upgrade plugin</a>, I created a branch and started working at it.</p>
<p>Getting the basics working wasn&#8217;t too hard, so after a couple of hours I had something that passed all of my automated tests without any deprecation warnings. Unfortunately, when I fired it up in a browser, I found that the code to show the answer to a question didn&#8217;t work. I wasn&#8217;t completely shocked to see that, because I was aware that the move to unobtrusive JavaScript was one of the big changes in Rails 3; I knew some of the things I had to do (make sure that I included <code>rails.js</code> and the <code>csrf_meta_tag</code>), but the exact details of how to handle replacing part of a web page with code from the back end wasn&#8217;t entirely clear to me, and I didn&#8217;t find a web page that gave a completely braindead cookbook.</p>
<p>Having said that, it didn&#8217;t take <em>too</em> long to figure out an answer. And, in case it helps anybody else, here&#8217;s what I did: I started with a section of my view that looked like this:</p>
<p><code>
<pre>
&lt;% form_remote_tag :url =&gt; { :action =&gt; :answer, :item =&gt; ask },
:update =&gt; "answer", :html =&gt; { :id =&gt; "show-answer" } do %&gt;
&lt;%= submit_tag "Answer" %&gt;
&lt;% end %&gt;
</pre>
<p></code></p>
<p>and ended up with this:</p>
<p><code>
<pre>
&lt;%= form_tag url_for(:action =&gt; :answer, :item =&gt; ask),
:remote =&gt; true, :id =&gt; "show-answer" do %&gt;
&lt;%= submit_tag "Answer" %&gt;
&lt;% end %&gt;
</pre>
<p></code></p>
<p>And in the controller method I removed the <code>render :partial</code> line at the end, and added a view <code>answer.js.erb</code> containing the following:</p>
<p><code>
<pre>
$('answer').update("&lt;%= escape_javascript(render :partial =&gt;
'answer', :object =&gt; @item) %&gt;");
</pre>
<p></code></p>
<p>Which is quite straightforward, and certainly the generated HTML is nice. The one thing that I don&#8217;t like about it is that I don&#8217;t know how to do a good job of testing what the controller method returns: when the controller method rendered HTML, I could use <code>assert_select</code>, but that gets harder when it renders JavaScript. (<strong>Update:</strong> <a href="http://malvasiabianca.org/archives/2011/07/testing-updates-via-unobtrusive-javascript/">I figured out a good way to test this.</a>)</p>
<p>The next issue ws that the keyboard shortcut for pressing that button didn&#8217;t work. This had actually been an issue when I originally wrote that code, and the method I&#8217;d used then (calling the <code>onclick</code> action) no longer worked.  The solution I came up with was to modify <code>rails.js</code> to make <code>handleRemote</code> public, and to call it directly, but I&#8217;m not thrilled with that, because there&#8217;s the danger that the code paths for clicking and for using the keyboard shortcut could diverge.  Eventually I&#8217;ll probably switch over to using jQuery instead of Prototype, maybe <code>$(...).click()</code> will do the right thing there?</p>
<p>At that point, I pushed the code live, quickly realized that the display for newlines was broken, and reverted back.  I&#8217;d already converted to using the new automatic HTML escaping mechanisms when they hit Rails 2.x; unfortunately, they changed in Rails 3.0.8 (and stayed changed in Rails 3.0.9), in a way that meant that the result of concatenating <code>html_safe</code> strings was no longer <code>html_safe</code>. I solved it by sticking an <code>html_safe</code> at the end of the entire block, but I don&#8217;t like that because it makes it too easy to accidentally introduce HTML-escaping bugs; maybe I&#8217;ll file a bug report on the issue.</p>
<p>After that, everything worked, and from start to finish it probably took around five or six hours in total (spread over a week or so), which is a quite reasonable amount of time for a major upgrade.  And it feels to me like the code is faster after the upgrade, which was a pleasant bonus!  Also, it got me chatting with a friend of mine who also uses memory, resulting in my improving the layout on his Android phone (to match the way it looks on iPhones); always nice to have an excuse to improve software like that. And I&#8217;m glad I got this done before Rails 3.1 appeared.</p>
<p>But I also wish I&#8217;d been paying a bit more attention to Rails&#8217;s evolution, so I would have been a bit more familiar with what I was in for.  Honestly, I still feel a little bit conflicted about this&mdash;I don&#8217;t currently plan to become a Rails expert, and I expect I&#8217;ll give <a href="http://liftweb.net/">Lift</a> a try the next time I want to write a web app&mdash;but I like Ruby and Rails enough that I don&#8217;t want to lose touch with them.  (And I really do depend on this memory program, so I very much want to keep it working!)  For now, I&#8217;ve subscribed to the <a href="http://groups.google.com/group/rubyonrails-talk?pli=1">Ruby on Rails: Talk</a> mailing list; the signal-to-noise ratio there is, unfortunately, a lot worse than I&#8217;d like, but there&#8217;s enough signal that I&#8217;m sticking with it for the time being. And I&#8217;ll try to find time to watch a higher percentage of Railscasts than I had been doing.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/07/upgrading-memory-to-rails-3-0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>getting (lots of) things done</title>
		<link>http://malvasiabianca.org/archives/2011/06/getting-lots-of-things-done/</link>
		<comments>http://malvasiabianca.org/archives/2011/06/getting-lots-of-things-done/#comments</comments>
		<pubDate>Sat, 04 Jun 2011 01:00:10 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[GTD]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=5006</guid>
		<description><![CDATA[As I&#8217;ve said before, GTD isn&#8217;t actually about getting lots of things done: it&#8217;s about doing what you most want to do at any given moment. Having said that, ever since I stopped putting tasks on my Next Action list that are more than two weeks out, I have in fact been Getting Things Done. [...]]]></description>
			<content:encoded><![CDATA[<p>As I&#8217;ve said before, GTD isn&#8217;t actually about getting lots of things done: it&#8217;s about doing what you most want to do at any given moment. Having said that, ever since I <a href="http://malvasiabianca.org/archives/2011/04/task-control-gtd/">stopped putting tasks on my Next Action list that are more than two weeks out</a>, I have in fact been Getting Things Done.</p>
<p>In particular, we&#8217;ve taken care of a ridiculous amount of house stuff. Earlier this year, we got the only major bit of planned house work taken care of, namely fixing our front door / steps. (And that was before the GTD implementation changes.) But there were a lot of small items to take care of, too, items that had been bugging me for months (some of them for years, actually).</p>
<p>So, when I looked at those items, I decided that yes, they really were high enough priority for me to keep them on my Next Action list. The result was that, within half a week, I&#8217;d made a phone call to kick off getting non-plumbing house items taken care of; and as soon as that was done, I made another phone call to start dealing with the plumbing.  The upshot:</p>
<ul>
<li>Our dryer is no longer blowing lint into our crawl space.</li>
<li>We are no longer being driven crazy by flickering lights in the kitchen.</li>
<li>Two towel racks and a rag hook are now firmly attached to the wall.</li>
<li>Two sinks have working drain catches.</li>
<li>The showers are all regulating their heat properly.</li>
<li>The upstairs toilet doesn&#8217;t drip.  (I can&#8217;t take (almost) any credit for that one, though, it was all Liesl&#8217;s doing.)</li>
</ul>
<p>Which is great! And the best thing is: it was really easy. All I had to do was decide that these tasks were important: I actually already had phone numbers for people to call. In one of the cases (the non-plumbing case, I&#8217;d already used the plumber in question twice before), I wasn&#8217;t sure that he was the right person for the job, but that worked out great. Which means that it will be even easier for us to take care of this sort of thing in the future: in particular, in a couple of years we&#8217;re probably going to do some kitchen work, and now we know whom to call when we decide to think seriously about that. Obviously it would have been harder if I hadn&#8217;t already had an idea of whom to call, but still, the same principal applies: decide that something&#8217;s important, figure out the next step to make progress towards it, and do it.</p>
<p>So, with the house work out of the way, what next? I&#8217;m actually working on a few too many things right now: each of <a href="http://www.bactrian.org/~carlton/dbcdb/1483/"><cite>Rock Band 3</cite></a> and <a href="http://www.bactrian.org/~carlton/dbcdb/1506/"><cite>Minecraft</cite></a> is taking up rather more time than I&#8217;m used to spending on a single video game, I&#8217;m going through <a href="http://www.bactrian.org/~carlton/dbcdb/1545/">a book on iOS programming</a>, and I&#8217;m <a href="http://www.bactrian.org/~carlton/dbcdb/1559/">reading about CoffeeScript</a> and using it to write a bare-bones game framework for a project that Miranda and I are vaguely working on. And those are all substantial enough that it&#8217;s hard to make progress on all of them.</p>
<p>So I should wind them down. <cite>Rock Band 3</cite> is far too rewarding for me to want to stop it now&mdash;I&#8217;m just getting to where I&#8217;m actually learning to play guitar!&mdash;so I think I&#8217;ll keep going with in for the indefinite future. (And, honestly, given that I&#8217;ve been playing one <cite>Rock Band</cite> game or another for three and a half years straight, why stop now?) And the game project with Miranda is the most potentially rewarding of anything on the list, so I&#8217;ll keep on going with that.</p>
<p>I don&#8217;t have as much active energy to write iOS software now as I did two or three months ago, however; so, while I plan to finish going through that book, I probably won&#8217;t actually do anything concrete with that knowledge in the short term. And, as much as I love <cite>Minecraft</cite>, I may be starting to reach a point of diminishing rewards, so it may be the case that, after finishing <a href="http://scenes.malvasiabianca.org/2011/05/minecraft-working-on-the-railroad/">my train stations</a>, I&#8217;ll give that game a pause, too.</p>
<p>Or maybe not! Who knows, maybe at some point over the summer somebody will come up with a great iPad game proposal to work on with me, and I&#8217;ll dive into that; or maybe the <cite>Minecraft</cite> railroad work will suggest further projects that I have to build. I suppose it&#8217;s even possible that I&#8217;ll get frustrated with <cite>Rock Band</cite> Pro Guitar and give up on it in a month or two. All I&#8217;m committing to is what I&#8217;m doing in the short term, and I&#8217;m planning to keep all four of those strands going for the next few weeks; after that, all bets are off.</p>
<p>At any rate: yay for limiting (and being honest about!) work in progress.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/06/getting-lots-of-things-done/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>some recent java experiences</title>
		<link>http://malvasiabianca.org/archives/2011/05/some-recent-java-experiences/</link>
		<comments>http://malvasiabianca.org/archives/2011/05/some-recent-java-experiences/#comments</comments>
		<pubDate>Sun, 08 May 2011 04:02:44 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=4923</guid>
		<description><![CDATA[I&#8217;m more excited about learning Scala, but some Java experiences I had last week: I was making some changes to a third-party library that was already using mockito in its unit tests, so I decided to give it a try. And, after a half-day of experiences, I will tentatively declare myself to be a fan. [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m more excited about learning Scala, but some Java experiences I had last week:</p>
<ul>
<li>I was making some changes to a third-party library that was already using <a href="http://mockito.org/">mockito</a> in its unit tests, so I decided to give it a try. And, after a half-day of experiences, I will tentatively declare myself to be a fan. My previous mocking experience was with <a href="http://www.jmock.org/">jMock</a>, and while jMock may work as well for code that was written in a <a href=http://www.bactrian.org/~carlton/dbcdb/1351/">GOOS</a> style from the beginning, I really appreciated the fact that mockito didn&#8217;t insist on tracing every single application; its willingness to mock classes by default was useful in the context of the work I was doing as well. And I liked not having to go to the extra weight of subclassing Expectations in every single test. So I recommend that anybody programming in Java who is curious about mocking but is worried about what it will involve should give mockito a try: it&#8217;s remarkably light-weight and pleasant.</li>
<li>I wanted to add a polling thread wrapper around a metrics class that I&#8217;d written, and rather than do that by hand, I decided to look into Java&#8217;s reflection / dynamic proxies facility. And wow, writing a dynamic proxy in Java is easy! Maybe it&#8217;s not <em>quite</em> as trivial as overloading <code>method_missing</code>, but it&#8217;s only a little bit more work than that: I had a proxy up and running in a handful of minutes, and it was doing everything I wanted only took an hour or so. (And the vast majority of my code was talking about threads and caching, which is exactly what I wanted it to be talking about.)  So score one for Java.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/05/some-recent-java-experiences/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>come work for sumo logic!</title>
		<link>http://malvasiabianca.org/archives/2011/04/come-work-for-sumo-logic/</link>
		<comments>http://malvasiabianca.org/archives/2011/04/come-work-for-sumo-logic/#comments</comments>
		<pubDate>Mon, 11 Apr 2011 02:40:36 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=4774</guid>
		<description><![CDATA[I&#8217;ve been at Sumo Logic for about a month and a half now, and I&#8217;m really enjoying myself: very interesting programming, great coworkers, and I&#8217;m quite optimistic about our product. So if you live in the Bay Area and think it would be fun to write Scala code to do real-time analytics on very large [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been at <a href="http://www.sumologic.com/">Sumo Logic</a> for about a month and a half now, and I&#8217;m really enjoying myself: very interesting programming, great coworkers, and I&#8217;m quite optimistic about our product. So if you live in the Bay Area and think it would be fun to write Scala code to do real-time analytics on very large data sets, <a href="http://hire.jobvite.com/CompanyJobs/Careers.aspx?c=qj29Vfw9&#038;v=1&#038;page=Jobs">we&#8217;re hiring, please join us</a>! Or, if Scala isn&#8217;t your thing, we also have a product manager opening, a dev ops opening, test automation openings, and a user experience opening.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/04/come-work-for-sumo-logic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>java, maven, and include files</title>
		<link>http://malvasiabianca.org/archives/2011/03/java-maven-and-include-files/</link>
		<comments>http://malvasiabianca.org/archives/2011/03/java-maven-and-include-files/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 05:17:44 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=4676</guid>
		<description><![CDATA[Libraries, Interfaces, and Dependencies The code base for my new job is rather larger than the code base at my last job, which means that I have to start thinking about the build process more than I&#8217;ve been in the habit of doing recently. I know how to set up a good build system for [...]]]></description>
			<content:encoded><![CDATA[<h4>Libraries, Interfaces, and Dependencies</h4>
<p>The code base for my new job is rather larger than the code base at my last job, which means that I have to start thinking about the build process more than I&#8217;ve been in the habit of doing recently.  I know how to set up a good build system for C-based languages (hint: <code>gcc -MD</code> is your friend), but I&#8217;ve never felt as comfortable with the options for Javaish environments, even for relatively straightforward projects that are just building a single program.</p>
<p>And we&#8217;re not building a single program: it&#8217;s a distributed system, with a collection of programs using some common libraries and some distinct libraries.  Which is quite similar to the situation at Kealia, but the build system feels rather different.  Part of that is related to the source code layout (we&#8217;re putting each module in its own git repository), but part of that is due to differences in the Java/Scala way of compilation and the C-language way of compilation.</p>
<p>At Kealia, our product code was spread across three directories: <code>interface</code>, which had one subdirectory for each library, containing the public header files for that library; <code>lib</code>, which had one subdirectory for each library, containing the <code>.cpp</code> files and private header files for that library; and <code>prog</code>, which had one subdirectory for each program, containing the code specific to that program that we didn&#8217;t feel like pulling out to a library. So the build process was in two phases: it built all the library code in parallel, and then all the program code in parallel.  (If I&#8217;m remembering it correctly, actually, the build system was happy to start working on program code even if some of the libraries weren&#8217;t done building, but at any rate dependency chains at the library/program conceptual level were never more than two deep.)</p>
<p>In Javaish languages, though, that doesn&#8217;t work, for the simple reason that the language doesn&#8217;t have a notion of a header file: if library A depends on library B, then you have to build library B before library A.  Java programmers like to talk about how, in C++, header files mean that you have to write your class interfaces twice; that&#8217;s a quite valid complaint, but it bites you in situations like this.  Though the situation isn&#8217;t quite as simple as that description makes it sound: in a lot of situations, Java interfaces end up acting a lot like C++ header files, giving you some amount of separation of compilation while also requiring you to write some of your class interfaces twice. Certainly proper use of interfaces is important in reducing long dependency chains; I don&#8217;t think we&#8217;ll be able to get down to two levels of dependencies, but what is the shortest chain that we can reasonably get to?</p>
<p>One answer might be three: break each library up into an interface part and an implementation part, like the <code>include</code> and <code>lib</code> directories from my C++ example.  Programs should only depend on libraries and interfaces, and library implementations should only depend on other libraries&#8217; interfaces, never on their implementations.  That sounds plausible to me, both in terms of being achievable and in terms of being a good idea, but I&#8217;m not sure that it&#8217;s enough to get us to three levels of dependencies.  The problem is that one library&#8217;s interface can reasonably depend on another library&#8217;s interface: e.g. if you happen to be writing a video server, you might reasonably have some generic MPEG classes that are referred to in the interfaces of multiple libraries, which means that they themselves have to be in a separate library.  So that&#8217;s four levels of dependency; I can even imagine that it would be hard to avoid introducing a fifth level, because you might have some fundamental data structures (e.g. some sort of widely used numeric abstraction or custom collection) that shows up in the interface of shared classes that are a bit more domain specific.</p>
<p>So: five levels of dependency.  That doesn&#8217;t sound like a very good rallying cry, does it? Still, at least it&#8217;s a stake in the ground, and having those five layers be well defined (programs, library implementations, library interfaces, shared interfaces, and a handful of core interfaces) is something.</p>
<p>Is even that achievable, though? C++ header files define a few different sorts of concepts.  There are abstract interfaces; these are a lot like Java interfaces. There are ADTs; these belong in my interface layer above, but contain actual implementation as well. And there are methods that you call without having an object instance at hand: static methods, but also constructors.</p>
<p>What do you do about this latter class of functions?  In C-family languages, the linker happily resolves them for you; what&#8217;s the analogue for that in Java?  I guess the answer there is: if you have a static method (including class constructors) associated to a class that&#8217;s not plausibly an ADT, then you have to make sure that there&#8217;s an extra layer of indirection involved to let you do the wiring at the program level instead of at the cross-library level.  In other words, you have to get serious about dependency injection: library A shouldn&#8217;t depend on the implementation of library B, even to do the basic setup for that library.  Instead, library B should abstract all those static methods out into an interface, library A should be written in terms of that interface, and every program that uses library A should pass an implementation of that interface to library A.  (It can get that implementation from a static method in library B, but the point here is that it&#8217;s the program layer that&#8217;s grabbing the static method from library B, not library A&#8217;s implementation layer.)</p>
<p>At first blush, I think that should work. Actually, it even seems plausible to me that it would lead to better structured programs than you would get if you didn&#8217;t worry about rigorously adhering to such standards. Five layers of dependencies: it&#8217;s good for your software!  (Not the best rallying cry I&#8217;ve ever heard&#8230;)</p>
<h4>Maven</h4>
<p>The other aspect of our setup at work that&#8217;s new to me is Maven. I&#8217;m really not sure what I think about Maven yet: I&#8217;m willing to believe it&#8217;s better than Ant, but I&#8217;m also willing to believe that that is not much of an accomplishment. I like its emphasis on convention, I like the way it&#8217;s good at pulling in known versions of external resources (your Scala compiler, your jUnit version, etc.).  But I&#8217;m less sold on its insistence in separating every artifact into a separate project: what happened to Recursive Make Considered Harmful? And it boggles my mind that, in this day and age, a build system would be written that only supports parallel builds as an experimental feature in its as-yet-unreleased third major revision number bump! We&#8217;ve known for most of a decade now that many cores are the way forward, yet I&#8217;m using a build system that can&#8217;t even keep two cores on my machine busy? That is ridiculous.</p>
<p>Another part of the picture is Hudson: our build system at work is set up so that you&#8217;re encouraged to have Hudson build artifacts that you&#8217;re not actively touching. (And Hudson is capable of doing those builds in parallel.  This perhaps makes it possible to live with the aforementioned Maven limitation, but in no sense excuses it: if I&#8217;m starting up a project, I absolutely should not be required to set up a continuous integration server just to get non-braindead compilation performance. I realize that the Java world is not known for its fondness for lightweight systems, but that is&#8230; Sigh. I will stop ranting now.) I haven&#8217;t yet figured out what the Maven way is here: is Maven perfectly happy for you to have all your build artifacts under your own control, is Maven actively hostile to you having all your build artifacts under your own control, or is Maven agnostic about that question?</p>
<p>This all also bears on the question of source code repositories that I mentioned above.  At first, once I got over my surprise, I kind of liked the idea of having each module in its own git repository: let&#8217;s take the idea of separate modules seriously. But once we start breaking up one conceptual module into an interface part and a library part, I&#8217;m less happy about having them in separate repositories: you&#8217;ll want to change an interface and the code that implements that interface in lockstep, which means that changes to them should be part of a single commit. And I&#8217;m also not sold on this idea that we should have Hudson in charge of building all these different artifacts for us: maybe I&#8217;m conservative, but I still like the idea of checking out a known version of the entire project&#8217;s source code, doing a build of it, and getting a reliable, reproducible result.</p>
<p>Lots of interesting questions to think about, lots that I still have to learn.  (And that&#8217;s without going into my discomfort about dependency info generation for Javaish languages!) Probably the best thing for me to do would be to start a project at home: I should come up with something to write (probably purely in Scala, I don&#8217;t think that mixing Java in will either make me happier or clarify the situation) that I can plausibly break out into multiple libraries, so I can really grapple with these dependency issues.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/03/java-maven-and-include-files/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>composing, decomposing, and recomposing methods</title>
		<link>http://malvasiabianca.org/archives/2011/03/composing-decomposing-and-recomposing-methods/</link>
		<comments>http://malvasiabianca.org/archives/2011/03/composing-decomposing-and-recomposing-methods/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 04:22:36 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Lean / Agile]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=4622</guid>
		<description><![CDATA[Applying Compose Method After I wrote that post on precedence, map, and function composition in Scala, I started to wonder: I&#8217;ve been thinking that I should experiment more with applying Compose Method. That refactoring recommends that, if I start with the original version of my code, data.foreach(s => writer.addDocument(createDocument s)) then I should extract the [...]]]></description>
			<content:encoded><![CDATA[<h4>Applying Compose Method</h4>
<p>After I wrote that post on <a href="http://malvasiabianca.org/archives/2011/02/underscores-and-precedence-in-scala/">precedence, map, and function composition in Scala</a>, I started to wonder: I&#8217;ve been thinking that I should experiment more with applying <a href="http://www.industriallogic.com/xp/refactoring/composeMethod.html">Compose Method</a>. That refactoring recommends that, if I start with the original version of my code,</p>
<p><code>data.foreach(s => writer.addDocument(createDocument s))</code></p>
<p>then I should extract the body to a method.  Which, I guess, would lead me to something like this?</p>
<p><code>data.foreach(addStringAsDocument(_, writer))</code></p>
<p>Except that that&#8217;s actually not what Compose Method really recommends: that&#8217;s merely one standard way of applying it to languages that are somewhat lacking in expressive possibilities. If all you have are manual looping constructs, and if you want to &#8220;keep all of the operations in a method at the same level of abstraction&#8221; (<a href="http://www.bactrian.org/~carlton/dbcdb/896/"><cite>Smalltalk Best Practice Patterns</cite></a>, p. 22), then yeah, you&#8217;ll pull out your loop bodies to methods, but there are other ways to reach that end.</p>
<p>So, looking at the code that I actually ended up with that post (with the kind help of my readers),</p>
<p><code>data.map(createDocument).foreach(writer.addDocument)</code></p>
<p>is everything there at the same level of abstraction? That&#8217;s not entirely clear to me: if I wanted to, I could certainly extract a couple of methods out of that, and end up with something like this:</p>
<p><code>addDocumentsToWriter(createDocuments(data), writer)</code></p>
<h4>Examining Alternatives</h4>
<p>We&#8217;ve seen four examples of how that code could look; let&#8217;s replace the first of those with one that <a href="http://malvasiabianca.org/archives/2011/02/underscores-and-precedence-in-scala/#comment-129122">raichoo suggested</a> on the previous post, giving us the following list:</p>
<ol>
<li><code>data.foreach(createDocument _ andThen writer.addDocument)</code></li>
<li><code>data.foreach(addStringAsDocument(_, writer))</code></li>
<li><code>data.map(createDocument).foreach(writer.addDocument)</code></li>
<li><code>addDocumentsToWriter(createDocuments(data), writer)</code></li>
</ol>
<p>Anybody want to argue for any of these being noticeably better or worse than all of the others? I&#8217;ll have to say: while they all seem fine to me, I can&#8217;t get too worked up over the need for using Compose Method in this case. Though, as I&#8217;ve been typing them up, I&#8217;ve wanted to add &#8220;fromString&#8221; in various places, which suggests that the method name <code>createDocument</code> is perhaps not as well chosen as it could be: maybe I should have called it something like <code>stringToDocument</code> instead?</p>
<p>Hard to say, I&#8217;m still happy enough with the third option. It says fairly directly that I&#8217;m starting with a bunch of data, turning it into a bunch of documents, and adding them to the writer: fine by me.  (The first option seems approximately similarly expressive to me, as well.)  There are, of course, situations where one or the other composed method would be preferable (as I said at the end of that earlier post, I ran into one an hour after I ran into the above!), but this doesn&#8217;t seem like one.</p>
<h4>Recomposing and Natural Transformations</h4>
<p>Maybe it&#8217;s the category theorist in me, but this also raises one other question: consider the two composed methods, 2 and 4 in the above list. Say that you reflexively went with option 2, but then decided that it didn&#8217;t seem quite right. You could (probably would) inline the function, and then distribute and regroup to end up with the fourth version; that seems like a pretty standard sort of thing to want to do. (It wouldn&#8217;t be too much of an abuse of language to call it a natural transformation!)</p>
<p>So: if we&#8217;re going to make a taxonomy of micro refactorings, might we not only also want to list ways of composing them (as, indeed, <a href="http://www.bactrian.org/~carlton/dbcdb/1147/"><cite>Refactoring</cite></a> itself suggests; see also <a href="http://www.bactrian.org/~carlton/dbcdb/1536/"><cite>Refactoring to Patterns</cite></a> or the hierarchies of patterns in <a href="http://www.bactrian.org/~carlton/dbcdb/413/"><cite>A Pattern Language</cite></a>), but also ways of undoing them and composing them differently, along the lines of associativity laws?</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/03/composing-decomposing-and-recomposing-methods/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gdc 2011: friday</title>
		<link>http://malvasiabianca.org/archives/2011/03/gdc-2011-friday/</link>
		<comments>http://malvasiabianca.org/archives/2011/03/gdc-2011-friday/#comments</comments>
		<pubDate>Sat, 05 Mar 2011 18:50:39 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Music]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=4400</guid>
		<description><![CDATA[The Game Design of Starcraft II: Designing an E-Sport Hybrid Orchestration – Scoring Need for Speed The Game Design Challenge 2011: Bigger than Jesus An Apology for Roger Ebert Message Queuing on a Large Scale: IMVU’s Stateful Event Architecture 9:30am&#8211;10:30am: &#8220;The Game Design of Starcraft II: Designing an E-Sport&#8221;, by Dustin Browder 2005. Dawn of [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="#browder">The Game Design of Starcraft II: Designing an E-Sport</a></li>
<li><a href="#need-for-speed">Hybrid Orchestration – Scoring Need for Speed</a></li>
<li><a href="#game-design-challenge">The Game Design Challenge 2011: Bigger than Jesus</a></li>
<li><a href="#moriarty">An Apology for Roger Ebert</a></li>
<li><a href="#watte">Message Queuing on a Large Scale: IMVU’s Stateful Event Architecture</a></li>
</ul>
<h3><a name="browder">9:30am&ndash;10:30am: </a><a href="http://schedule.gdconf.com/session/12248">&#8220;The Game Design of <cite>Starcraft II</cite>: Designing an E-Sport&#8221;</a>, by Dustin Browder</h3>
<p>2005. <cite>Dawn of War</cite> just shipped: 4 sides, 63+ units, with more to come. <cite>Supreme Commander</cite> about to ship: 4 sides 100+ units. <cite>Starcraft 2</cite> planned with 3 sides, 45 units. (Some of which are effectively identical!)</p>
<p>This sounded crazy to him: units = choices = gameplay = fun. They need more!</p>
<p>The response: this is an e-sport. That&#8217;s new, hard to do. Think of this as &#8220;basketball 2&#8243;. That means it needs to be: watchable: clear, simple, skill-based, uncertain.</p>
<p>Let&#8217;s drill down into these. &#8220;Clear&#8221; is why the artists hate him. He gives an example of an ultralisk: it&#8217;s not nearly as impressive as it could be, it would look a lot better if it were bigger. But if he did that, it would hide smaller units (he showed it hiding 20 zerglings), destroying clarity/readability. Especially important in the case of effects: you don&#8217;t want them making an imprecise light show all over the screen, you want to know exactly who is affected and whether it succeeded. </p>
<p>Simple: minimum number of units. For <cite>Starcraft</cite>, 12-15 units per race. Too many and viewers are confused, pros have to guess, and some units end up functioning as reskins. But: you still need tons of choices with that small number of units. They started by just experimenting with movers and shooters, fiddling with the stats to bring out differences. (Including area of influence, how they move.)</p>
<p>Interlude on upgrades. Banelings are better than marines; but marines + stim are better than marines. So upgrades don&#8217;t just make a unit more like itself, they flip relationships. (And that relationship can get flipped again with a handling upgrade.) Or the roach can be upgraded in two different ways: 1 unit, 3 uses.</p>
<p>Skill: micromanagement is important to them. It&#8217;s part of the game: an RTS isn&#8217;t just a really fast turn-based game. (Also, micromanagement is fun to watch, important for a sport!) And it allows for degrees of skill, degrees of success/failure. Force field example: easy to use it at a choke point; hard to use it to protect a group on the field; still harder to use it to split an opponent force. (And you can do any of these better or worse: a better player won&#8217;t leave as many gaps between force fields.)</p>
<p>(Flanking and terrain examples that I didn&#8217;t quite understand)</p>
<p>Uncertainty: that&#8217;s why the Zerg rush is there. Anything is possible in the first few minutes of the game. A rush is always going to be possible at some point in the game: so why push out the possibility away from the start?</p>
<p>Those are the core values; now on to ripple effects.</p>
<p>Story: as discussed above, units on screen are smaller than would be ideal for narrative purposes. So they exaggerate in the other direction in story art, so you&#8217;ll be able to imagine how cool the units are. Similarly, units are tiny ants on the battlefield, so make them over-the-top characters in story mode.</p>
<p>Solo tech: they had cool, fun units, but they overlapped with other units. So they weren&#8217;t suitable for e-sport usage, but still valuable content.</p>
<p>Missions: the narrative arc for the e-sport is exposition (scouting), complication (early battles), climax (deciding battle), resolution (gg, post-game analysis). With single player, though, it didn&#8217;t work the same way: a real cost to losing an individual battle, so players would play defensively until they had an overwhelming advantage, at which point there would be a long mop-up period. So they added in lots of different mechanics to the single-player game, to shift the narrative arc. E.g. outbreak: night = terror, day = payback. (Still too much mop-up, though.)</p>
<h3><a name="need-for-speed">11:00am&ndash;12:00pm: </a><a href="http://schedule.gdconf.com/session/12420">&#8220;Hybrid Orchestration &#8211; Scoring <cite>Need for Speed</cite>&#8220;</a>, by Troels Folmann and Charles Deenen</h3>
<p>They&#8217;re talking about <cite>Need for Speed Shift 2: Unleashed</cite>.</p>
<p>Charles started:</p>
<p>Development wants cinematic <cite>Gladiator</cite>-liked score. Marketing wants youth-relevant licensed songs. Traditionally, you separate these two; they decided to merge them into a single hybrid score. Take very popular tracks, reorchestrate / rescore them.</p>
<p>Different music styles: epic = driver&#8217;s win, dirty = battle, two others that I didn&#8217;t catch in time. (Surreal = preparation, I think, and then special purpose for full-motion-video?)</p>
<p>They did a concept with a single 30 Seconds to Mars track; worked surprisingly well. So let&#8217;s go with it! But required signoffs from lots of different people; and its a huge amount of work even with the bare minimum of 10 songs. And very tight pipeline, with serious risk of having signoffs denied late in the process.</p>
<p>They decided to start with a test bed to get early approval from one of the bands, to reduce risk. They had different composers produce sample orchestrations in the different styles, to see what would work. (Same audio tracks, but everything else was different.) Made about 20; sent top 7-8 to band.</p>
<p>And, fortunately, the band really liked it! Kept feeling of the song while reinterpreting it in really cool ways. This helped convince execs and other bands, too. (Eventually, all 10 targeted bands signed off.)</p>
<p>Now Troels speaking:</p>
<p>The Four Noble Truths: everything is suffering, suffering arises from attachment to desires, &#8230; (Ed.: one of the more unexpected slides I&#8217;ve seen in a GDC presentation.)</p>
<p>And: what does &#8220;hybrid&#8221; mean? One important consequence: don&#8217;t follow a traditional song structure; this is hard! Also, refine concepts: epic alone isn&#8217;t good enough: need epic clean, epic emotion. So a specific hybridization for this project.</p>
<p>(Previous example: mismatch between sound, game. Kill your darlings, listen to client / game. Surprised he was invited back.)</p>
<p>Created a template for this hybridization. Focused on percussive elements, also mention of strings and brass that I didn&#8217;t understand. (And what is &#8220;RMX and deep-sampled percussion&#8221;?) Ethnic choirs, custom signature samples.</p>
<p>First example: &#8220;Night of the Hunter&#8221; by 30 Seconds to Mars. Showed various refinements, &#8230;</p>
<p>Second: &#8220;Issues&#8221;, Escape the Fate. Lots of revisions. What&#8217;s the right number of revisions? 7 was definitely too much.</p>
<p>So he hit the wall. How to overcome this? Communicate; find personal joy; make mockups; face the wall; ignore the wall. Took the last strategy: took three days off completely. Sat in his garden, recorded bees, turned them into different songs. (Hi-hat, Hammond, &#8230;) Made a pretty amazing video out of it. Also tried various objects: crowbar, light bulbs, coffee pot, playground poles.</p>
<p>Third: &#8220;Take a Load Off&#8221;, Stone Temple Pilots. Went a lot faster this time, only a few revisions.</p>
<p>Fourth: (unreleased song) 7 revisions, but all small, so not a big deal.</p>
<p>Back to Charles.</p>
<p>Postproduction. Increased clarity, better instrument and frequency separation, more TV-friendly sound, even composer agreed it was worth it.</p>
<p>Post-mortem: how to approach hybrid? Create template, ensure everything connects textually, identify signature sounds, identify rhythmic elements that merge with orchestral and synth elements.</p>
<h3><a name="game-design-challenge">12:30pm&ndash;1:30pm: </a><a href="http://schedule.gdconf.com/session/12287">&#8220;The Game Design Challenge 2011: Bigger than Jesus&#8221;</a>, by John Romero, Jason Rohrer, Eric Zimmerman, and Jenova Chen</h3>
<p>Eric Zimmerman (moderator). For this year&#8217;s theme, he wanted to merge games and religion: create a game that could be a religion. (Not about religion: the game itself and the act of playing should be a religion.)</p>
<p>Jason Rohrer</p>
<p><cite>Chain World</cite>: A humanistic video game religion that someone will play today. Religions used to try to explain physical mysteries; that role has been usurped by science and technology recently. He talks about a detour that I-77 had to take around a town in Ohio because of a fight his grandfather led. Talks more about visiting that town, about things his grandfather allegedly said. Lots of details about his grandfather that he doesn&#8217;t really know whether or not they&#8217;re true: his grandfather is turning more into a saint-like figure. We become like gods to those who come after us.</p>
<p>His game idea: you control a world, then pass it on to the next player. Game designer is god, he passes the start state to the player, leading to an end state. But what if your end states somebody else&#8217;s start state? Each player is like a god to the next.</p>
<p>You want to do this in a game where modifications don&#8217;t screw up the playing field for the next player. (So not like <cite>Mario</cite>, where you modify the world by destroying blocks.) Players might have intent for how they want to modify the world for the next player; players might wonder what the previous player intended with an aspect of the world.</p>
<p>That&#8217;s the frame idea; what&#8217;s the actual game? <cite>Minecraft</cite>! A specific world on a specific USB stick. Play the game, don&#8217;t erect signs with text, play until you die. Save, pass it on, never play again.</p>
<p>John Romero</p>
<p>What is a religion? Deity, worshippers, devotion. In the beginning, there were lots of gods, one true god emerged <a href="http://twitter.com/#!/God6502">@God6502</a>; he had a son <a href="http://twitter.com/#!/Messiah6502">@Messiah6502</a>. Follow him on Twitter: first twelve followers are his apostles. They come down to the front of the room; quite a distinguished bunch. Each gets a pad of sticky notes, to gather followers.</p>
<p>The winner: the apostle with the most miracles: some of the sticky notes have star markers. (<a href="http://twitter.com/#!/SquirrelTweets">@SquirrelTweets</a>) But: to win the game, you must kill him, John Romero. (<cite>Doom</cite> image.)</p>
<p>Jenova Chen</p>
<p><a href="http://jenovachen.com/temp/GDC11/GameDesignChallenge2011.pdf">Here are his slides.</a></p>
<p>He&#8217;s Chinese, so supposed to be an atheist. Did lots of research. Chinese believe in gods, but not the same sort of belief that you see in modern religions: a god is an unknown, a value. Dao = way of life, how to live. Recent China: socialism, then developmentism, then consumerism. These three are all about being happy, which seems fairly fundamental. Or: belief in something bigger.</p>
<p>Inspiration: Campbell, Csíkszentmihályi, Darwin.</p>
<p>What drives happiness? Money is useful at first, but beyond a certain level more money is irrelevant. Hierarchy of needs: top is self-actualization, not addressed by money.</p>
<p>At the end of the hero&#8217;s journey, he returns, giving something back to the community.</p>
<p>What is our purpose? He wants one that works for primitive humans, even for nonhumans. Circle of life: propagation is the more interesting part. These days, propagation of ideas is more important.</p>
<p>But what ideas should we propagate? Evolution says: look at the ones that survive, refine them. How does selection happen? Unknown: god. (Editorial note: not really, no&#8230;)</p>
<p>TED: Ideas worth spreading. But they&#8217;re not good game designers: the website is very passive, even the slogan is. TED: Influence with your ideas. No ranking for videos: rank by view count, or better by number of people inspired by them. Give each video a page, showing whom you&#8217;re influencing. Twitter follower count, badges in a Chinese twitter-like site.</p>
<p>Badges alone aren&#8217;t a game: you need a feedback loop. So: badges / points lead to promotion system that help draw other people to watch your video.</p>
<p>Propagationism.</p>
<p>(Rohrer won.)</p>
<h3><a name="moriarty">2:00pm&ndash;3:00pm: </a><a href="http://schedule.gdconf.com/session/12430">&#8220;An Apology for Roger Ebert&#8221;</a>, by Brian Moriarty</h3>
<p>(<a href="http://www.ludix.com/moriarty/apology.html">Here&#8217;s the text of Moriarty&#8217;s talk.</a>)</p>
<p>&#8220;I am, in fact, Professor Moriarty.&#8221; This is an apology not in the sense of anything done wrong, but in the sense of a defense.</p>
<p>(Discussion of 2005 Ebert article, 2010 flaring up of the argument.)</p>
<p>Why return to this? He wants to discuss Ebert&#8217;s claim that there isn&#8217;t a game worth of comparison with the treasures of world literature, movies, music, paintings.</p>
<p>Discussion of painting: <a href="http://www.flickr.com/photos/9739200@N08/5104405613/">Northcote, Chess Players</a>, c1730. Two chess players: the game industry, self absorbed, satisfied. The golden boy is art itself, looking at us, pointing at a paper containing his secrets.</p>
<p>Read lots of art history; never saw games mentioned as art. (Ed. Nobody stood up for go? Oy.) Math is elegant, but nobody confuses mathematics with art, they&#8217;re different categories! Considering games as art is radical; then again, the idea of great works of art is also radical, only 500 years old.</p>
<p>Photography, movies entered realms of art relatively recently; why shouldn&#8217;t video games? Because games are old: if chess and go aren&#8217;t art, why should video games be?</p>
<p>Interlude: we know what video games are. But we don&#8217;t know how to define art, let alone great art. C.f. Duchamp urinal. Also, games can clearly contain great art from other media. But that&#8217;s not enough: mechanics and affordances are key. Can mechanics and affordances be considered art?</p>
<p>(Taste, intersubjectivity. Not all movies are Art.)</p>
<p>Eliciting emotion isn&#8217;t enough for art. Art is about attraction. (Ed. really??) But how to distinguish sublime art?</p>
<p>Kitsch. Is it art? Somebody claims: yes, art with three characteristics. Highly charged with stock emotions. Instantly and effortlessly recognizable. Does not enrich our associations. Nearly all popular art is kitsch. (Bombast: all adaptations are kitsch? Oy.)</p>
<p>More on games as kitsch, whee.</p>
<p>Celebration of kitsch = camp. Ultimately an evasive strategy.</p>
<p>Big studios won&#8217;t make art. Indies won&#8217;t. Who will make art? Those who would make art anyways: the artists. Warning: don&#8217;t just follow the trappings, then you&#8217;ll get something arty.</p>
<p>Technology of film largely stable for more than 100 years.</p>
<p>Structural reasons why games won&#8217;t produce sublime art. Ebert talks about direction of artist, inevitability of meaning. (Oy.) Romantic point of view. Schopenhauer: free will and individual choice are illusions, desire a prison. Leap off the wheel of desire via the contemplation of sublime art. Transcends will, frees us from agony of contingency and causality.</p>
<p>&#8220;Flow is an an-aesthetic.&#8221;</p>
<p>If the purpose of sublime art is to solve the mystery of choice, then &#8230;</p>
<p>Sublime art is the still evocation of the inexpressible.</p>
<p>All sublime art is devotional.</p>
<p><strong>Edit:</strong> I thought <a href="http://emshort.wordpress.com/2011/03/05/four-talks-at-gdc/">Emily Short&#8217;s discussion of this talk</a> was quite good.</p>
<h3><a name="watte">3:30pm&ndash;4:30pm: </a><a href="http://schedule.gdconf.com/session/12290">&#8220;Message Queuing on a Large Scale: IMVU&#8217;s Stateful Event Architecture&#8221;</a>, by Jon Watte</h3>
<p><a href="http://www.slideshare.net/JonWatte/message-queuing-on-a-large-scale-imvus-stateful-realtime-message-queue">His slides:</a></p>
<div style="width:425px" id="__ss_7237109"><object id="__sse7237109" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=16x9large-scalemessagingatimvu-110311162842-phpapp02&#038;stripped_title=message-queuing-on-a-large-scale-imvus-stateful-realtime-message-queue&#038;userName=JonWatte" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse7237109" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=16x9large-scalemessagingatimvu-110311162842-phpapp02&#038;stripped_title=message-queuing-on-a-large-scale-imvus-stateful-realtime-message-queue&#038;userName=JonWatte" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
<p>Want: any-to-any messaging with ad-hoc structure. Lightweight (in-memory) state maintenance. Added queues as a building block, with two kinds of messaging: events and states. Integrated into a bigger system.</p>
<p>User to queue: connect, listen, send. Queue to game server: validate users/requests, notification. Game server to queue (didn&#8217;t catch it).</p>
<p>Design goal of 1M simultaneous users. (10x current use.) Real-time, meaning 100ms end-to-end. 20M queue creations/day.</p>
<p>Existing solutions didn&#8217;t work. (Wished they could buy Gtalk, AIM, etc. solutions!) Inspired by mochiweb: 1M users on a single machine, written in Erlang.</p>
<p>Implementation.</p>
<p>(Journey of a Message diagram: send to queue, validate, forward to other users listening to queue.)</p>
<p>Queue: multiple mounts (chat &#8211; message; scores &#8211; state; subscriber list).</p>
<p>One machine isn&#8217;t enough: doing some math on volumes and memory speed, would take over 3 seconds per message. So need to scale across machines.</p>
<p>Scale in two dimensions: gateway machines and queue machines, connected via a consistent hashing mechanism that allows moving chunks of queues via a central map of buckets to nodes.</p>
<p>Erlang. I&#8217;ll skip the details, but: basically, custom designed to solve their problem.</p>
<p>(Dozed off some: load balancing; marshaling via protocol buffers.)</p>
<p>Have a boss node keeping track of what gateway, queue nodes are doing. Looks like a single point of failure, but things keep running without it, you just can&#8217;t add more nodes until the boss is restarted.</p>
<p>Message could go out via a different node than where it entered; led to time skew. So sent messages out via entry node.</p>
<p>Hot add node diagram: make sure to forward messages while move is in process.</p>
<p>Problem cases. User goes silent; detect via ping. Reconnection of user, possibly to a different gateway: user-specific queue arbitrates. Node crashes (yet to happen in production, go Erlang!): state is ephemeral, user might get logged out. Gateway crashes: client reconnects, gets resent missed updates, application above queue API doesn&#8217;t notice. Sometimes want reliable messages; higher level API stores it in database. Firewalls: use proprietary protocol on port 80/443.</p>
<p>Build and test. Continuous integration, continuous deployment. Erlang supports in-place code updates, but too heavy for them; use failover instead.</p>
<p>Future: replication; scalability limits; open source what they can.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/03/gdc-2011-friday/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>gdc 2011: monday</title>
		<link>http://malvasiabianca.org/archives/2011/02/gdc-2011-monday/</link>
		<comments>http://malvasiabianca.org/archives/2011/02/gdc-2011-monday/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 04:09:56 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Video Games]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=4381</guid>
		<description><![CDATA[This year, unlike previous years, I&#8217;m taking notes in my iPad instead of in my notebook. That means that I can generally read my notes, which is good; but it also increases my tendency to just write down slides with minimal commentary, editing, or even formatting. (And I&#8217;m sure that amusing iPad autocorrects will slip [...]]]></description>
			<content:encoded><![CDATA[<p>This year, unlike previous years, I&#8217;m taking notes in my iPad instead of in my notebook. That means that I can generally read my notes, which is good; but it also increases my tendency to just write down slides with minimal commentary, editing, or even formatting. (And I&#8217;m sure that amusing iPad autocorrects will slip through, too.) So I apologize in advance for such infodumps: I wish I had time to do a better job, but if I let these posts pile up, I&#8217;ll be pretty unhappy.</p>
<p>In retrospect, it was kind of amazing how many talks I went to today: two sessions were really three separate talks each, so that adds up to 11 talks! Wow.</p>
<ul>
<li><a href="#component">Creating Your Building Blocks: Modular Component AI Systems</a></li>
<li><a href="#sicart">Ethics for Developers</a></li>
<li><a href="#thirion">Game Design by Accidents</a></li>
<li><a href="#skaggs">Click Zen: Zynga&#8217;s Evolution from <cite>FarmVille</cite> to <cite>CityVille</cite></a></li>
<li><a href="#smith">Leave Enough Room: Design that Supports Player Expression</a></li>
<li><a href="#todd">Turning Depression into Inspiration</a></li>
<li><a href="#aaa-indie">From AAA to Indie: Three Start-Up Stories</a></li>
</ul>
<h3><a name="component">10:00am&ndash;11:00am: </a><a href="http://schedule.gdconf.com/session/12339">&#8220;Creating Your Building Blocks: Modular Component AI Systems&#8221;</a>, by Brett Laming, Joel McGinnis, and Alex Champandard</h3>
<p>This talk (or at least its first third) was my surprise favorite for the day: I&#8217;m pretty sure there&#8217;s a lot of object-oriented wisdom here, if I understood what was going on better. Anybody have recommended books on the approach presented here?</p>
<p>It was really three talks in one; the first, by Brett Laming on &#8220;Component Systems Revisited&#8221;, presented the basic foundation.</p>
<p>He started off with problematic approaches:</p>
<ul>
<li>The class hierarchy <code>Ogre : Monster</code> is simply wrong.</li>
<li>Next, he presented a complex inheritance diagram with multiple inheritance, including a diamond. Worse, you run into situations where you have existing classes A and B where A derives from B, but you want A&#8217;s behavior but not B&#8217;s. So &#8220;deep class&#8221; is a problem.</li>
<li>Next, you push common functionality up, leading to a &#8220;fat class&#8221;.</li>
<li>Or you use aggregation to get plugins; lots of indirection, though.</li>
<li>A data driven approach comes next, but it&#8217;s hard to debug.</li>
</ul>
<p>There are seeds of good ideas in all of these, but you need to know what to pick and choose from them. The metaphor that he suggests is that of a &#8220;component&#8221;, e.g. as on a circuit board: it gives a broad classification (diode, resistor, capacitor, &#8230;), with key properties (that <em>aren&#8217;t</em> visible in the class hierarchy!), with defined inputs and outputs, that are interchangeable.</p>
<p>He also added a note on reusable AI: its outputs feed to the gameplay, its inputs come from the gameplay world. And disciplined gameplay is naturally linked to good organization, purposeful data, and sensible lifetimes.</p>
<p>The body of his talk was on five aspects of a component architecture.  The first was inheritance:</p>
<ul>
<li>Classify where necessary, to define key slots. (Surprising mention of RTTI, e.g. for sorting.)</li>
<li>Name: RTTI Factory creation; ability to serialize.</li>
<li>Combined: Data driven approach, with a shallow hierarchy.</li>
</ul>
<p>This discussion of run-time type surprised me, because I generally see it as a smell.  But he was pretty emphatic about its virtues: he called RTTI &#8220;as important a tool as a smart pointer or a weak reference&#8221;! I think naming is one key route into what he&#8217;s thinking: he wants to be able to serialize and deserialize objects in a very flexible manner, to increase the power of tools at game designers&#8217; disposal, and sees RTTI as a key part to that.  (But I don&#8217;t think that&#8217;s the only thing going on.) He also gave examples of macros to help with RTTI (as opposed to leaning solely on what C++ provides), which also makes it more efficient.</p>
<p>The next aspect was structure:</p>
<ul>
<li>Spatial: reference frame, world transform</li>
<li>Functional: composition and aggregation</li>
<li>Dependency tracking: conflict resolution, job ordering</li>
</ul>
<p>The third aspect was data flow:</p>
<ul>
<li>Data flow: world state -&gt; AI -&gt; gameplay -&gt; world state</li>
<li>Changes to structure: messages upstream/downstream</li>
<li>Changes to properties: signaling downstream/upstream, message for spatial barriers</li>
</ul>
<p>The fourth was compartmentalization:</p>
<ul>
<li>Smart objects, reconstructable via RTTI</li>
<li>This is nearly free, given good structure</li>
<li>External instructions: AI, animation, etc., carried by signaling</li>
</ul>
<p>And finally, parallelization:</p>
<ul>
<li>The ideal is still a way off</li>
<li>But AI/gameplay still parallelizes, even in game graphs! (Mention of indirection, aliasing)</li>
<li>Candidates for parallelization:  Leaf output: animation, navigation, component update. Leaf input: sensory info, blackboards, ray tests</li>
</ul>
<p>He ended with some design tricks:</p>
<ul>
<li>Remove temptation: minimal data (if per frame, put it on the stack), minimal lifetime (use new/delete boundary, object pools)</li>
<li>Favor derivation: no equation contradiction, no duplicate data</li>
<li>Potential deep class problem: generalize</li>
<li>Locality of reference: abstraction+composition, placement new, embedded lists, object pools</li>
<li>Minimize NULL checks: use Null Objects instead when necessary</li>
<li>Non-virtual pathways: use RTTI filtering</li>
<li>Many virtual pointers: package once and carry downstream</li>
</ul>
<p>And his conclusion:</p>
<ul>
<li>Gameplay gives us fun buttons to press: tight gameplay leads to good, reusable AI</li>
<li>Think: minimal classes, data lifetime, locality of reference</li>
<li>Use: generalization, RTTI, placement new/delete, object pools</li>
</ul>
<p>Next, Joel McGinnis on &#8220;AI Design Patterns&#8221;.</p>
<p>The pressures you&#8217;re under are: resources (compute cycles, memory), and design specificity (or lack thereof&#8230;). Component architectures give you flexibility, and allow performance balancing. He warned that it&#8217;s not a blueprint, though: you still need to architect, so it&#8217;s not a solution, but a framework for how things can get built.</p>
<p>One antipattern he mentioned was putting data on AI component.  Instead, think about the data that the AI component needs to consume: focal point, targetable object, cover markup, interaction point, trigger volume&#8230; Granularity is great with component architectures, gives lots of flexibility.</p>
<p>Pattern: Component Matrix</p>
<p>Entities, behavior tree, pathfinding, targeting system, animation, standard movement. Makes it easy to substitute parts out: e.g. if going from lithe enemy to hulking enemy, prototype by swapping out pathfinding component. Lets you answer design questions with minimal investment.</p>
<p>Pattern: Find Via Registration</p>
<p>E.g. target selection looks for targetable objects; both halves register with the targeting system, so you don&#8217;t need to search all objects in the world.  Reduces the search space by scoping, simplifies construction of behavior, easily done via lifecycle management.</p>
<p>Pattern: Late Construction of Types</p>
<p>Lets you change your minds late in the game, do load balancing: try it everywhere, keep it where most effective.  Requires things to be light weight, and data driven helps</p>
<p>And the third talk was Alex Champandard on &#8220;Performance and Multi-Threading&#8221;.</p>
<p>His talk used influence maps as an example component. How do you make it high performance?  You want to use vectorization: SIMD instructions give a 4x performance boost. Then parallelization might give another 4x performance boost.</p>
<p>The solution is to build your build your engine as modularly as your entities.  And use the same breakdown in both cases.</p>
<p>He gave an entity example. Then he talked about the system, which does: batching and prioritization. Don&#8217;t process individual requests, instead schedule jobs. Custom allocation by jobs to allow interleaving, SIMD.  (C.f. the mention of placement new in Brett Laming&#8217;s talk.)</p>
<p>Summary: very lightweight, simple interface, handles events, data-driven.  Pay attention to memory allocation, computation limits, batching, prioritization. This leads to jobs that are computationally intense and support parallelization.</p>
<h3><a name="sicart">11:15am&ndash;11:40am: </a><a href="http://schedule.gdconf.com/session/12237">&#8220;Ethics for Developers&#8221;</a>, by Miguel Sicart</h3>
<p>His question: what kind of ethical knowledge do future game developers need to know?  But first, definitions:</p>
<ul>
<li>Morality: a public system, governs behavior towards overs and how to avoid harm.   A system of rules, and principles for evaluating those rules; principles stem from ethics.</li>
<li>Ethics: the philosophical study of morality. Framework for analysis of moral issues via a coherent, philosophically argued scheme. Provides evaluative standards for development of principles/morals, not only to avoid harm but also to help human flourishing.</li>
</ul>
<p>There are moral issues of: profession, art form/medium, games in society, and play. We need guidelines.  And his outline of a method for acting ethically was: Identify potential moral issues.  Analyze and contextualize them. Deliberate about them, applying ethical theories.</p>
<p>He then talked about four ethical theories, linking each with a problem.</p>
<p>The first theory was consequence-based ethics: decisions should be taken based on consequences. Evaluate based on most desirable outcome for society. This is either act-utilitarianism or rule-utilitarianism.</p>
<p>Data mining and profiling raise moral concerns, especially profiling. Utilitarianism suggests: informed profiling is good as long as most players feel it as not harmful.</p>
<p>His second theory was duty-based ethics: centered on obligations towards others, trying to pursue happiness without harming others. The golden rule.</p>
<p>Duty applies to software and hardware dev: duty of developers to players (which is different from consumers!). Software must allow for play (anti-piracy software problems); some games (e.g. educational) need to be played on legacy platforms.</p>
<p>His third theory was contract-based ethics: contracts between individuals that form society. Often used in the case of right-based issues.</p>
<p>Community management shows how you can use this: a game is not just an entertainment product, but also an implicit contract between developer and players. Developers should understand that the way their communities are managed should allow for ethical reflection.</p>
<p>And his fourth theory was character-based ethics: instead of rules, consequences, contracts, we should focus on <em>being</em> good. Development of virtues and good characteristics leads to general morally good behavior, even in unexpected/new cases.</p>
<p>This helps inform our understanding of player behavior: it&#8217;s done within spaced created by developers. Developers should think about good virtues of good players, and create appropriate affordances in the design.</p>
<p>One approach towards ethical issues is via professional codes: these give guidelines for solving issues. If an issue affects the profession, professional codes should help. E.g. crunch, bad management, sexism.  Do we need a professional code for game developers?</p>
<p>(Time ran out here.)</p>
<h3><a name="thirion">11:50am&ndash;12:15pm: </a><a href="http://schedule.gdconf.com/session/12192">&#8220;Game Design by Accidents&#8221;</a>, by Steph Thirion</h3>
<p>His basic thesis here is that coding is an idea generator: seeing how code behaves is a great way to confront yourself with surprising realities.</p>
<p>Exhibit A: A programmer making a game based on pentominoes, in order to explore a new computer. No graphics, text-based.  He&#8217;d just implemented bit where pressing key rotates the piece, and spent a while playing with it: this real-time component is surprisingly powerful, opens up a new world.</p>
<p>He simplifies pieces, adds gravity, leads to <cite>Tetris</cite>. But: when he started programming it, he didn&#8217;t even have the idea yet!</p>
<p>Exhibit B: Jonathan Blow talking about how billiards would change if you could see the future. He did prototype, felt weird seeing it unfold, how the balls ended up where they were supposed to. He didn&#8217;t figure out how to make a game out of it, but it sparked ideas that led to <cite>Braid</cite>.</p>
<p>Exhibit C: A Game Mod workshop for graphic design students with no coding experience. He started by giving them a <cite>Breakout</cite> clone with no void at the bottom (so balls never went away), implemented in a relatively friendly language called Processing.</p>
<p>He told students to download Processing and the code, to change it, and to make something awesome in six hours. He then showed a video of students&#8217; results, which I thought was really impressive.</p>
<p>Exhibit D: He talked about his background: started as graphic designer, evolved into coder, where in his game <cite>Eliss</cite> almost everything is produced by code rather than static images.</p>
<p>The takeaways:</p>
<ul>
<li>Code makes you stumble into ideas.</li>
<li>Coding is: complex; precise; unpredictable.</li>
<li>Code is already there: if you discover something while coding, it&#8217;s working right in front of your eyes!</li>
<li>Simplicity first: you can feel the complexity of code, so it encourages you to keep things simple.</li>
</ul>
<p>Finally, he ended with a live example using Ruby-Processing. Starts with static circle, adds random movement. Leaves trail, which is kind of interesting; then redraws background to remove trail. Makes background white, circle black.</p>
<p>Then does same thing with 100 circles at once: starts as growing blob, then individual circles emerge from it.  Plays with size of circles: makes them small, more like particles. Large, makes everything a big blob. Random starting position, turns whole screen back, but then puts in outline. Then fills them with alpha, leads to smoggy cloud.</p>
<p>I really liked this example: at several points I was really surprised at shapes and behavior that emerged from such simple changes.</p>
<h3>Lunch</h3>
<p>I had a very nice chat with Ben Abraham, Jorge Albor, and Brendan Keogh.</p>
<h3><a name="skaggs">1:45pm&ndash;2:45pm: </a><a href="http://schedule.gdconf.com/session/12526">&#8220;Click Zen: Zynga&#8217;s Evolution from <cite>FarmVille</cite> to <cite>CityVille</cite>&#8220;</a>, by Mark Skaggs</h3>
<p>Impossible 1.0: <cite>Red Alert 2</cite>: made by a team with no RTS experience, made it in 9 months.</p>
<p>Leading up to <cite>FarmVille</cite>: Zynga was &#8220;small&#8221;, <cite>Mafia Wars</cite> was the big dog. His team was trying to make a medieval RTS game, but was stuck in design limbo. Bing Gordon: &#8220;Wy don&#8217;t you just make a farm game?&#8221; Decided to take a small team and go for it.</p>
<p>Fast, light, and right. Single strong voice, passionate team, mission. 5 minute design: if you can&#8217;t figure out how to make something more fun, just go with the obvious solution. Only design screens and flows: what the player sees and does. Help from organization: took <cite>YoVille</cite> avatars, borrowed people.</p>
<p>Decision time: Zynga hardware or Amazon cloud? Zynga&#8217;s center ran out of space and power; would have had to wait 6 weeks for more servers, so went to Amazon, which turned out to be crucial for rapid scaling.</p>
<p>Minimal art content for shipping. RTS interface to remove friction, set context sensitive cursor, add queuing.</p>
<p>True Minimum Viable Product: no monetization, almost no metrics at launch! Not at parity feature-wise with other farm games, but a better user experience.</p>
<p>Team goal: 400k DAUs by June 30: 11 days after launch. SVP Biz Dev: if you hit 1M DAUs in 30 days, we&#8217;ll take you to the French Laundry. CFO: if you do it in 11 days, we&#8217;ll send you all to Paris! They hit it in 5 days; they got the dinner, but not the trip&#8230;</p>
<p>That&#8217;s Impossible 2.0: people kept thinking growth would stall at various points, it didn&#8217;t. Thank goodness that they were on the cloud. But still: had to watch the servers, had to scale the team.</p>
<p>Also unusual: keep the brand pure. Would Disney put this in <cite>Finding Nemo</cite>?  Target audience is moms; don&#8217;t want anything in there that moms wouldn&#8217;t like; this led to tension with <cite>Mafia Wars</cite><cite> ads. </p>
<p>One surprise: everything is <em>much</em> harder after launch.</p>
<p>Leading up to <em>CityVille</em>: Zynga was much bigger, they&#8217;d had another six games under their belt. <em>FarmVille</em> was still the biggest; Facebook had changed what was allowed, players&#8217; expectations had changed, Zynga&#8217;s best practices had changed.</p>
<p>So: what&#8217;s Impossible 3.0? The wisdom at the time: </cite><cite>FarmVille</cite> was a once in a lifetime success, Facebook policies mean you&#8217;ll never pass 10M DAUs, their internal model showed a city sim stopping at 5M. Lots of questions: gameplay style, who should develop it (send to their Austin studio?), full featured versus Minimum Viable Product. They spent too much time in paper design which led to imagining problems that might not materialize, so they switched to producing prototypes.</p>
<p>They set a date, locked in art style and rules. Lessons and features from <cite>FrontierVille</cite>: quests, stories, <a href="http://tamibaribeau.com/?p=350">doobers</a> (loot drops). Converged in Aug/Sep: narrowed scope, get real about date, push for quality. Still, story was missing, and fun wasn&#8217;t quite there.</p>
<p>Key mile markers:</p>
<ul>
<li>Aug/Sep: team gels</li>
<li>Sep: game playable, but not fun</li>
<li>Late Sep: first bits of fun emerge</li>
<li>Oct/Nov: team plays the game</li>
<li>Nov: hold for quality, public announcements. Was supposed to be launch date, but game wasn&#8217;t good enough. Very different approach compared to <cite>FarmVille</cite> launch.</li>
</ul>
<p>Proactive launch steps: lined up external teams to help with live services. Quality high: easier to fix bugs before launch. Feature roadmap. Was smooth compared to other Zynga launches.</p>
<p>They reached 8M DAUs in 2 weeks, 14M in 30 days, over 20M now.</p>
<p>What turned out well: Social: people&#8217;s faces, franchising your business. Game loop: right balance of simple sim. Quests.</p>
<p>Could be better: Trains are only kind of cool. Simpler interface for franchises. Expansions were too easy to get. Longer runway on the simulation. More surprises and easter eggs.</p>
<p>Could be better in the process: Didn&#8217;t have single strong voice with clear vision. Bigger product, hence more test and integration time. Maybe should have done Minimum Viable Product; not at all clear, though. No scaling plan. No features in the back product, ready for quick deployment after launch.</p>
<p>Meta lessons for social game developers: It&#8217;s entertainment: good looking, fun art, fun core gameplay loop. You&#8217;re building a product, a team, a 24/7 business, a platform. The battle is won before the launch, fix bugs then. Learn the space, know key features/recipes, know the audience. Speed wins: get to market quickly, and it&#8217;s a web experience, so performance matters. Deliver fun: &#8220;you can&#8217;t make up for boring with volume&#8221;.</p>
<h3><a name="smith">3:00pm&ndash;3:25pm: </a><a href="http://schedule.gdconf.com/session/12382">&#8220;Leave Enough Room: Design that Supports Player Expression&#8221;</a>, by Randy Smith</h3>
<p>He started off with pictures from <cite>Fallout 3</cite> that involved posing large numbers of teddy bears.</p>
<p>Is player expression for you? (I.e. indies, this was part of the indie games track.) Yes: indie attainable, indie appropriate, for the good of the art form.</p>
<p>How? Don&#8217;t have a string of pearls guiding users down a specific route. Don&#8217;t include single solution puzzles. Then a <cite>Scrabble</cite> example: the game looks expressive, but to do well you need to use words that never get used in real life and that don&#8217;t say annoying you&#8217;d want to express. So: scoring can harm expressiveness.</p>
<p>Example from in-progress Tiger Style game: need to grow biomass to progress. But: all lifeforms contribute biomass, not much is needed to progress. So: tell the player &#8220;just play the game&#8221;, but there&#8217;s also depth on demand.</p>
<p>Also, units have multiple functions: can be enemies or allies depending on the context, depending on what you&#8217;re trying to accomplish at the time.</p>
<p>Empower the user to generate data; I didn&#8217;t quite catch the example here.</p>
<p>Finally, let the user use the generated data. (E.g. players sharing screenshots of avatars / levels.) Achievements also help acknowledge what the player is trying to do. Stats can do that, too: largest web, longest jump, not just a single score. (In particular, these stats in Spider never block your progress, they&#8217;re depth on demand.)</p>
<h3><a name="todd">3:35pm&ndash;4:00pm: </a><a href="http://schedule.gdconf.com/session/12194">&#8220;Turning Depression into Inspiration&#8221;</a>, by Michael Todd</h3>
<p>Indie developers work at a job that can cause stress, overwork, being unhealthy, being poor, being lonely. And there are also potential personal causes of depression. So: some indie devs are depressed! Not always easily solvable, so need techniques for developing while depressed.</p>
<p>Being unproductive and being depressed reinforce each other. Or: if you can be productive, this gives control over our work, our lives. So, ways to increase productivity.</p>
<p>1) Work on rewarding projects</p>
<p>These are good to build. Get to the gameplay, don&#8217;t get bogged down. But be careful: don&#8217;t front load the fun stuff to the extent that there&#8217;s only slog left over. Instead, make as much of the project be reward as possible!</p>
<p>Complete vs. progressive gameplay. Progressive is semi-playable almost at once; a complete game needs almost all the systems before its playable. Lean towards the latter.</p>
<p>Awesome/crazy ideas are more rewarding, easier to keep the faith.</p>
<p>And: design for yourself. Keeps up day to day interest.</p>
<p>2) Try to stop being a perfectionist.</p>
<p>Don&#8217;t overthink everything. Get other people to play the game. Skype somebody else to tell them about the flaw you&#8217;re worrying about, they tell you you&#8217;re worrying too much. Play lots of games (Steam, XBLIG, demos.)</p>
<p>3) Shorter projects</p>
<p>That way you spend more of your building time in the phase where you&#8217;re excited about the game. So: small bad is no good, want small awesome!</p>
<p>4) Measure your hours</p>
<p>Otherwise, you&#8217;ll work less and less when depressed.</p>
<p>5) Design the game to suit your abilities</p>
<p>What do you love? What do you hate? Use the resources that are available to you. The trick is understanding what you have.</p>
<p>Finally: how does being depressed change how you work?</p>
<p>A game is a thousand tiny choices. These are affected by your mood, your priorities. The distinct choices of a personality can be an advantage; bad experiences can be a particular advantage. (Artists in love are boring, ones that have gotten screwed over in love aren&#8217;t.) And depression is an experience.</p>
<h3><a name="aaa-indie">4:15pm&ndash;5:15pm: </a><a href="http://schedule.gdconf.com/session/12421">&#8220;From AAA to Indie: Three Start-Up Stories&#8221;</a>, by Jake Kazdal, Daniel Cook, and Ichiro Lambe</h3>
<p>Another three-speaker talk. First was Jake Kazdal: &#8220;From AAA to aaa&#8221;. I mostly napped during this.</p>
<p>Next, Daniel Cook: &#8220;Spry Fox, Year One: Lessons Learned&#8221;</p>
<p>A portfolio approach is key. Great games are not enough: have to hit right platform at right time with right theme. Portfolio model helps reduce that risk.</p>
<p>Flash portals are so used to taking games essentially for free that they don&#8217;t understand your asking for money. Very few portals that respect the needs of developers at all. They also don&#8217;t understand payment systems, microtransactions. Most important: bring people off of portal back to your website.</p>
<p>Too many designers are like too many cooks. His teams converge on the fun so much faster now that there&#8217;s a single creative director for a project.</p>
<p>Teams should aspire to iterate <em>daily</em>. A week is bad; two week iterations and your design may never converge.</p>
<p>Building meaningful hobbies is hard, but worth it. Want people to be playing ten years from now. Tend to be multiplayer, tend to be a service, tend to monetize well, tend to build relationships. But really, really hard to build. And game developers don&#8217;t traditionally have those skills, that&#8217;s why web developers are doing better in the social game space.</p>
<p>When hiring people, make them do a real project: that lets you see if they can finish. Great teammate: reliable, able to see big picture, works well with others, respects the game designer.</p>
<p>Missing from list: willing to work long hours. (Crunch is wrong.) Passion isn&#8217;t enough, and can mean obstinate. And no need for people to be located in North America.</p>
<p>Finally, Ichiro Lambe; I didn&#8217;t catch the name of his talk.</p>
<p>Think holistically. Conventional wisdom: wear many hats. True, but the mistake is thinking of things as separate problems, instead weave them together. (E.g. marketing + bug support.)</p>
<p>Tie marketing into design. Conventional view: marketing = getting people to buy crap they don&#8217;t want. Instead, create a game that people give hard-earned money for it, and that is remarkable! Make a game that&#8217;s both a game you want to make and a game that people want to buy. So: create a game that we&#8217;re excited about, and that will sell for stated reasons.</p>
<p>He ended with a bit on postmortems / retrospectives.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/02/gdc-2011-monday/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>underscores and precedence in scala</title>
		<link>http://malvasiabianca.org/archives/2011/02/underscores-and-precedence-in-scala/</link>
		<comments>http://malvasiabianca.org/archives/2011/02/underscores-and-precedence-in-scala/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 04:39:26 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=4405</guid>
		<description><![CDATA[At work recently, I was writing some code which wanted to add all the elements of a collection of strings to a document writer. This seemed like a classic case for foreach, so I wrote something like this: data.foreach(s => writer.addDocument(createDocument s)) (Warning: I&#8217;m typing this from memory, without trying it out in the Scala [...]]]></description>
			<content:encoded><![CDATA[<p>At work recently, I was writing some code which wanted to add all the elements of a collection of strings to a document writer. This seemed like a classic case for <code>foreach</code>, so I wrote something like this:</p>
<p><code>data.foreach(s => writer.addDocument(createDocument s))</code></p>
<p>(Warning: I&#8217;m typing this from memory, without trying it out in the Scala CLI, and I&#8217;m new enough to Scala that it&#8217;s entirely possible that I&#8217;m making silly syntax errors.) That was great, but Scala lets you use underscores in place of explicit argument names for arguments that you&#8217;re only going to use once, so I tried doing this instead:</p>
<p><code>data.foreach(writer.addDocument(createDocument _))</code></p>
<p>That, however, didn&#8217;t work. After looking at the error message and talking to some coworkers, it seemed like Scala was parsing it as the following:</p>
<p><code>data.foreach(writer.addDocument(s => createDocument s))</code></p>
<p>And there isn&#8217;t a version of <code>addDocument</code> that takes a function argument.  Which is good: if there had been, it might have compiled but not done what I wanted, which  would have been even more confusing!  Still, I was frustrated: why can&#8217;t Scala just read my mind? But, honestly, the compiler&#8217;s choice was a perfectly reasonable way to parse that expression, and I certainly wouldn&#8217;t want Scala&#8217;s parsing to be dependent on the types that function calls accept.  So I was willing to leave it at that.</p>
<p>Except that, as one of my coworkers then pointed out, there was another way of breaking it down: instead of writing as a single <code>foreach</code> call, I would write it as <code>map</code> plus <code>foreach</code>, as follows:</p>
<p><code>data.map(createDocument).foreach(writer.addDocument)</code></p>
<p>Which is much nicer! So, actually, Scala&#8217;s parse error was gently nudging me in the correct direction: yes, this sort of thing is potentially ambiguous to parse, but if you break down your function composition properly, then that ambiguity goes away. So it was nice of the compiler to help me write my code elegantly!</p>
<p>The funny thing was, I ran into a very similar situation an hour later: it involved two <code>map</code>s plus a <code>foreach</code>, but the exact same principle applied.  That time, though, after writing it out as a chain of three collection functions, I didn&#8217;t really like the result: it was going too far into the details of how to use a library that I was integrating with, and I didn&#8217;t find the result particularly evocative. So I ended up going back to the single-<code>foreach</code> version, but this time I pulled out the function that I was applying to a member function, so I could give it a name that explained what was going on. It&#8217;s nice to have different tools in your toolkit, because ultimately you need to be guided by what makes your code the most expressive rather than falling in love with the most powerful tool.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/02/underscores-and-precedence-in-scala/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>a few early scala notes</title>
		<link>http://malvasiabianca.org/archives/2011/02/a-few-early-scala-notes/</link>
		<comments>http://malvasiabianca.org/archives/2011/02/a-few-early-scala-notes/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 05:57:37 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=4345</guid>
		<description><![CDATA[I haven&#8217;t started programming Scala in earnest yet, though I&#8217;ve been going through some books and typed a bit into the interpreter. (Whee, JVM startup times.) I had the Odersky book recommended to me, but I actually first read the PragProg book: I&#8217;ve had good luck with some of their books recently, it&#8217;s quite a [...]]]></description>
			<content:encoded><![CDATA[<p>I haven&#8217;t started programming Scala in earnest yet, though I&#8217;ve been going through some books and typed a bit into the interpreter. (Whee, JVM startup times.) I had the <a href="http://www.bactrian.org/~carlton/dbcdb/1522/">Odersky book</a> recommended to me, but I actually first read the <a href="http://www.bactrian.org/~carlton/dbcdb/1515/">PragProg book</a>: I&#8217;ve had good luck with some of their books recently, it&#8217;s quite a bit shorter, and there is a tradition of excellent short introductions to programming languages in the field. I won&#8217;t exactly say I regret that choice, but the PragProg book isn&#8217;t anything special; I&#8217;m only 85 pages into the Odersky book, but I&#8217;m enjoying it quite a bit more.</p>
<p>A few things that amuse me so far, as a C++ fan:</p>
<p>Yet another book which has to explain that a variable being immutable doesn&#8217;t mean that the object it&#8217;s pointing to is immutable (just that you can&#8217;t reassign the variable to point to something else), and that there&#8217;s in fact no way to create immutable objects (assuming that the class allows mutation at all, of course). Is C++ really the only language that has a reasonable story about this?</p>
<p>Admittedly, C++&#8217;s story is far from perfect as well: all you have to do is hold a member variable via a pointer and then it&#8217;s up to the class implementor to declare const methods honestly, the compiler won&#8217;t have your back for you in that case. And that also points at C++&#8217;s main advantage in this area, that you can have variables that <em>aren&#8217;t</em> held via pointers: maybe without that, automatically enforcing constness is impossible, and without that there&#8217;s no benefit in letting class implementers declare which methods are const? I&#8217;ll have to think about that one; still, it&#8217;s certainly not an area that I would have thought C++ would be relatively unique in when I first ran into the language.</p>
<p>And after reading so many complaints about how you can&#8217;t tell what &#8220;a + b&#8221; means in C++ code, it&#8217;s great to see another language that unabashedly embraces operator overloading. And having operators that end in a colon be magically reversed to be methods of the object on their right is simply brilliant: not only does it naturally handle the <code>cons</code> case of</p>
<p><code>1 :: List(2,3)</code></p>
<p>but having <code>/:</code> be an alias for <code>foldLeft</code> is just brilliant: I think writing</p>
<p><code>(0 /: <em>list</em>) { _ + _ }</code></p>
<p>to sum the elements of <em>list</em> is super natural, much more so than a syntax with 0 and <em>list</em> reversed would be. (Think of it as smooshing down <em>list</em> starting with 0 at the front and with the function argument telling you how to do the smooshing.)</p>
<p>So yeah, Scala and I are going to get along just fine, I think.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/02/a-few-early-scala-notes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>job search and narrative</title>
		<link>http://malvasiabianca.org/archives/2011/02/job-search-and-narrative/</link>
		<comments>http://malvasiabianca.org/archives/2011/02/job-search-and-narrative/#comments</comments>
		<pubDate>Sat, 19 Feb 2011 06:30:54 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=4310</guid>
		<description><![CDATA[Beginnings As soon as Disney&#8217;s acquisition of Playdom closed, e-mails from recruiters started appearing regularly in my inbox. Most of them I essentially ignored: I&#8217;d been having a great time at Playdom, and while I didn&#8217;t expect to stay there for the six years that I&#8217;d stayed in my previous job, I certainly wasn&#8217;t planning [...]]]></description>
			<content:encoded><![CDATA[<h3>Beginnings</h3>
<p>As soon as Disney&#8217;s acquisition of Playdom closed, e-mails from recruiters started appearing regularly in my inbox.  Most of them I essentially ignored: I&#8217;d been having a great time at Playdom, and while I didn&#8217;t expect to stay there for the six years that I&#8217;d stayed in my previous job, I certainly wasn&#8217;t planning to leave after just over a year. So I sent polite notes back to the recruiters saying that I wasn&#8217;t interested, and promptly forgot about them.</p>
<p>Eventually, though, one of those e-mails snuck through my defenses. It was from a startup that I had vague warm feelings about, enough so that I clicked through to their job ads; and, when I did so, I found that they used both Ruby on Rails and Scala.  These are two technologies that I&#8217;m quite interested in, and that I wasn&#8217;t likely to get to play around with at Playdom; also, at that point I was in a bit of a rut at my current role at Playdom. So I responded to that e-mail in a more positive fashion.</p>
<p>That was the first chink in my armor; a little while after that, I got an e-mail from an industry recruiter whom I&#8217;d noticed appearing on my twitter followers list a week or two before. So, out of curiosity (or perhaps vanity), I responded to her as well.</p>
<p>This was the middle of December, so it was close enough to Christmas break that not much happened with those conversations for the rest of the year. But the conversations had planted a seed in my brain, enough to shift my mental story so that, when relatives asked me over Christmas how work was going, my answer was &#8220;fine, but I&#8217;ve been a little bored recently&#8221;.</p>
<h3>Changing Stories</h3>
<p>In retrospect, that was the key turning point. Before, the dominant stories playing in my head were all strongly in favor of my being at Playdom: the story about being in the games industry, the story about how Playdom was on the right side of an <a href="http://www.bactrian.org/~carlton/dbcdb/1276/"><cite>Innovator&#8217;s Dilemma</cite></a> market shift, the story of being part of a startup destined for great things, the story of learning new technologies. The first two stories were holding up fine; but Playdom wasn&#8217;t a startup anymore (and I was a late enough hire that I didn&#8217;t have much of a financial incentive to stick around waiting for options to vest), and there weren&#8217;t any technologies on the horizon at Playdom that I was actively excited about, so the third and fourth stories were losing their power. And we hadn&#8217;t had meetings within Playdom for a while that were reinforcing those stories or generating new stories to replace them.  (Playdom had an all-hands meeting in early February that excited me an a couple of ways; if that had happened in December, maybe I never would have responded to that earlier e-mail.) </p>
<p>This meant that my brain had a narrative gap that it wanted to fill. And, right at that moment, the best new stories were coming from seeds planted by recruiters: maybe I wanted to be at a startup again, maybe I wanted to explore Ruby or functional programming. The very act of talking to recruiters and companies gave this a boost: such conversations inevitably turn fairly soon to the question of what you&#8217;re interested in, so unless you want to sabotage your chances immediately, you&#8217;ll come up with an answer expressing a story leading away from your current company and towards whomever you&#8217;re talking to. Yes, you&#8217;re doing that because of your audience; still, telling them those stories has a cumulative effect, and if you spin enough such stories, they&#8217;ll combine to lead you in a different direction.</p>
<h3>Crafting a New Story</h3>
<p>But that travel is more haphazard than I&#8217;d like. And potentially dangerous: if other people are driving the conversations and leading the stories, they&#8217;re not particularly likely to go in directions that will turn out well for me. So that suggested two courses of action:</p>
<ol>
<li>I should think hard about what I wanted.</li>
<li>I should talk to as many people as I could manage, to maximize options and prevent any single external story from having undue influence.</li>
</ol>
<p>The outcome of the first course of action was:</p>
<ul>
<li>I wanted to explore different technologies, Ruby and functional programming languages in particular.</li>
<li>I wanted to be some place that was into the technical side of agile, that focused more on craftsmanship.</li>
<li>I wanted to be at a startup again, and a smaller one: I&#8217;d tried 50-person and 100+-person startups, I&#8217;d tried large companies, and it seemed time to head down to the 25-person range.</li>
</ul>
<p>None of which I was likely to get at Playdom.  Now, I like playing and thinking about games, which meant that I liked being in the games industry; but I like thinking about programming, too, and about everything entailed in the art of creating software. And when it comes down to which of those two I&#8217;d most be able to make a rewarding career out of, I don&#8217;t think there&#8217;s much comparison: I&#8217;ll do better (both personally and financially) if I follow my nose as a programmer. So it wasn&#8217;t crazy to think that I&#8217;d gotten most of what I was going to get technically out of Playdom, and move on.</p>
<p>And the outcome of the second question was that I should cast my net more broadly: in particular, I talked to a couple of recruiters that had helped me land with Playdom originally. One of whom was at a different firm, so now I was talking to three recruiting firms plus a handful of companies that I&#8217;d met through other means, mostly LinkedIn e-mails that they&#8217;d sent.</p>
<h3>Going for a Ride</h3>
<p>Let me tell you: those recruiters did not mess around.  They all did a very good job, and I&#8217;d happily work with all of them again: they&#8217;d come up with a first pass of ten or so companies that seemed to them to be plausible fits, I&#8217;d look at them and agree that all of them were plausible but pick out a few that particularly caught my eye for some reason, and they&#8217;d both set up conversations with those few and use that information to come up with further excellent suggestions.</p>
<p>The upshot of this was that I was spending a lot of time on the phone talking to various companies, and some amount of time (mercifully mostly on evenings or holidays) interviewing in person. (It was quite lucky that it was good weather, because I spent a lot of lunch breaks sitting in a nearby park and talking.) And it was nice to feel wanted!</p>
<p>But also a little disconcerting. I&#8217;d like to pretend that I&#8217;m so super-awesome that anybody would love to hire me; the truth is, though, that while I&#8217;m fairly sure I do have several good attributes, there&#8217;s also quite a bit of luck involved. I know several other people whom I have a lot of respect for who have had more protracted job searches recently; I&#8217;m not about to chalk that up to some sort of essential difference, it means instead that right now I&#8217;m in a situation where people are happy to work with me to spin stories where I sound good. So I need to understand what&#8217;s going on there, and see how to best take advantage of it and set myself up in the future.</p>
<p>I wasn&#8217;t consciously thinking about this during the job search, but I turned 40 last Tuesday. I&#8217;m in an industry that, to some extent, overvalues youth; so far I haven&#8217;t had any problems with that, but it&#8217;s an example of how future job searches could be a lot more prolonged and a lot less fun than this one was. Which helped confirm my feeling that now was the right time to leave Playdom: from a strictly mercenary point of view, it&#8217;s almost certainly going to be the case that I have a significantly higher expected value from playing up the story of &#8220;being part of a company that has sold for a good amount recently in a high-profile industry&#8221; than from the Disney stock options that I&#8217;d be giving up by changing jobs.</p>
<h3>Ambition</h3>
<p>The upshot of this was that I decided that I needed to change the story that I was telling myself and others still more, and to do so by increasing its ambition. Following the nose of technologies that I&#8217;m interested in but not yet fully fluent in remained important (both for personal fulfillment reasons and for setting myself up for further growth), but I didn&#8217;t want to go too far in that direction at the expense of underplaying everything that I&#8217;ve learned over the last decade.</p>
<p>Also, I ended up prioritizing functional programming languages over Ruby: Ruby&#8217;s been around enough that I&#8217;m definitely playing catchup there compared to a lot of other programmers, whereas I&#8217;m hearing a surprising amount of buzz about Scala while not yet getting the feel that there&#8217;s a huge amount of existing expertise in the language. (And I&#8217;m quite confident that my brain will do well at turning me into a very good Scala programmer: it&#8217;s good at that sort of thing.) I&#8217;m pretty optimistic that going in that direction will open up a lot of interesting doors a few years from now, positioning me well on the adoption curve.</p>
<p>In terms of company size, I should go still smaller: coming into a 25-person company would be interesting, but even then you&#8217;ve missed a lot of the early decisions. I didn&#8217;t quite want to be a co-founder or first hire, but being in the 10-15 person range seemed like it would be a plausible fit.</p>
<p>And then there&#8217;s <cite>The Innovator&#8217;s Dilemma</cite>. You can never predict what will turn out to be successful, but I figured there&#8217;s no sense not swinging for the fences. Which meant looking for companies that could tell a story involving disruption on a significant scale, and companies whose founders have the chops to pull it off.</p>
<p>This all adds up to a great story going forward: I&#8217;ll have worked at multiple successful startups, I&#8217;ll have had increasingly important roles within those startups, I&#8217;ll have a lot of experience in dealing with very large quantities of data, with cloud technologies, with new programming paradigms (or with half-century old programming paradigms that are making a deserved resurgence!), I&#8217;ll have the agile chops to look beyond my day-to-day programming to help the effectiveness of the organization as a whole. That is a story that I can get behind, and it will convert my getting older from a potential liability into a tale of valuable experience.</p>
<h3>Outcome</h3>
<p>At least that&#8217;s how I&#8217;d like things to go; then again, I certainly wouldn&#8217;t have predicted two years ago anything that has happened since then, so I don&#8217;t want to get too tied up in this particular story! I&#8217;m very glad to have spent time thinking about it, but in the mean time I need to dive in, start programming, work as hard as I can to help make my next company successful, and see where the future leads.</p>
<p>Which means I needed to pick the next step in my future! I was very fortunate to have the opportunity to talk to some very interesting companies indeed; I ended up joining <a href="http://www.sumologic.com/">Sumo Logic</a>, and I&#8217;m super-excited about them. They have a great disruption story, their founders can pull it off if anybody can, I interviewed with all nine of the current employees and am very much looking forward to having all of them as colleagues. What they&#8217;re doing and the way they&#8217;re working fits well enough with my prior experience that I should be able to hit the ground running and contribute well, but there&#8217;s enough new that I&#8217;ll come out of it knowing quite a bit more than I know going in. It looks like a great fit from my point of view, and they seem to agree; I&#8217;m looking forward to spending the next several years with them, it&#8217;ll be quite a ride.</p>
<p>And I will pay more attention to the stories that are going through my head in the future: they are powerful, they control me more than I realize.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2011/02/job-search-and-narrative/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>gospel morality: matthew 8-9</title>
		<link>http://malvasiabianca.org/archives/2010/12/gospel-morality-matthew-8-9/</link>
		<comments>http://malvasiabianca.org/archives/2010/12/gospel-morality-matthew-8-9/#comments</comments>
		<pubDate>Fri, 24 Dec 2010 16:00:32 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Lean / Agile]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=4040</guid>
		<description><![CDATA[And now we take a break from the context-free sermonizing, and turn to narrative. Specifically, about Jesus curing people right and left; hard not to like that! And, consistent with what we&#8217;ve seen earlier, he doesn&#8217;t want word getting around about his actions. (Though, as you might expect, it didn&#8217;t really work out that way&#8230;) [...]]]></description>
			<content:encoded><![CDATA[<p>And now we take a break from the context-free sermonizing, and turn to narrative. Specifically, about Jesus curing people right and left; hard not to like that! And, consistent with what we&#8217;ve seen earlier, he doesn&#8217;t want word getting around about his actions.  (Though, as you might expect, it didn&#8217;t really work out that way&#8230;)</p>
<p>Part of me feels like I should be bothered by the man of great faith who got a long-distance cure for his household member; but I&#8217;m really not.  &#8220;Let the dead bury their dead&#8221; (Matthew 8:22) seems a bit harsh, but only a bit.</p>
<p>Matthew 9 repeats much of the same themes, but there&#8217;s some new stuff, too. It starts off by saying that Jesus cures blasphemers, too, confirming my feeling that I shouldn&#8217;t be bothered by the man of great faith by the previous chapter. In fact, he turns this into a lesson on forgiveness, which I rather like: &#8220;For whether is easier, to say, Thy sins be forgiven thee; or to say, Arise, and walk?&#8221; (Matthew 9:5)</p>
<p>And then he goes to eat with &#8220;publicans and sinners&#8221; (Matthew 9:11). Which is a word I had to <a href="http://en.wikipedia.org/wiki/Publican">look up</a>, and Lattimore translates that it as &#8220;tax collectors and sinners&#8221; instead. At any rate, an interesting pairing, especially in today&#8217;s political climate that pairs an absolutist anti-tax line with a refusal to examine the benefits that those taxes are bringing us.</p>
<p>Take, for example, health care. Yes, it would be great if we could have the son of God wandering around healing us whenever we get sick. But even two millennia ago that didn&#8217;t come close to scaling to meet the actual need, and these days our shortage of healing deities is even more sorely lacking. Fortunately, our health care has improved enormously over the intervening millennia, though (pace <a href="http://www.bactrian.org/~carlton/dbcdb/1482/"><cite>The Rational Optimist</cite></a>) I won&#8217;t credit government with much of the improvement there. But I will credit government with <em>some</em> of the improvement, and we need a health care system of last resort, one that will look after those who aren&#8217;t financially able to pay for their own care; hence, taxes.</p>
<p>Anyways, continuing on: not sure how I feel about the whole bit about Jesus eating instead of fasting, justified with &#8220;Can the children of the bridechamber mourn, as long as the bridegroom is with them?&#8221; (Matthew 9:15): I&#8217;m all for moderation in appropriate contexts, but I don&#8217;t think that&#8217;s what&#8217;s going on here. Still, I certainly won&#8217;t blame Jesus for wanting to have some food in his stomach, though, especially given what&#8217;s going to happen to him.</p>
<p>I also can&#8217;t say that I understand the &#8220;No man putteth a piece of new cloth unto an old garment&#8221; bit that follows next (Matthew 9:16)&mdash;I get the feeling that I should be learning something there, but it doesn&#8217;t quite fit into the narrative flow to me. Or maybe I should read those verses as an affront against the virtues of refactoring, or as a caution that it can be taken too far?</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2010/12/gospel-morality-matthew-8-9/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>i am getting old</title>
		<link>http://malvasiabianca.org/archives/2010/11/i-am-getting-old/</link>
		<comments>http://malvasiabianca.org/archives/2010/11/i-am-getting-old/#comments</comments>
		<pubDate>Wed, 01 Dec 2010 06:05:40 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=3976</guid>
		<description><![CDATA[Earlier this evening, I wanted to dust off some JavaScript code I&#8217;d written a little while ago. The editor I&#8217;d used while writing it initially was TextMate, which I&#8217;d liked okay but not enough to convince me that it was worth spending fifty bucks on once the trial period expired. So I opened up the [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier this evening, I wanted to dust off some JavaScript code I&#8217;d written <a href="http://malvasiabianca.org/archives/2010/06/tdd-and-javascript/">a little while ago</a>. The editor I&#8217;d used while writing it initially was <a href="http://macromates.com/">TextMate</a>, which I&#8217;d liked okay but not enough to convince me that it was worth spending fifty bucks on once the trial period expired. So I opened up the code in Emacs, and started reading around in it.</p>
<p>And then I started making changes, at which point I hit the tab key, and Emacs indented the line by four spaces.  The problem is, the file used two spaces for tabs.  But I&#8217;ve done this enough times, surely I can quickly figure out how to configure this? Let&#8217;s see: C-h tab-width looks promising, but it has the value 8, so surely it isn&#8217;t relevant.  The first answer while googling mentions c-basic-offset, which sounds just dubious enough (that c- prefix) to be right; but its value, rather than being a number, is &#8220;set-from-style&#8221;.</p>
<p>At this point, I have a few options.  I can set c-basic-offset to a number, to see if that works, and then figure out the appropriate mode hook to do that for me.  I can figure out what set-from-style means, to do it right.  I can do more googling, to find a better answer.</p>
<p>But, I think, the best answer is: realize that I have better things to do with my life than to put up with that sort of user interface crap.  (Or with the absolute joke that is Emacs&#8217;s &#8220;Preferences&#8221; menu item.)</p>
<p>(Another charming instance of Emacs&#8217;s user interface: on a lark, I thought I might as well go through the motions of looking through menus, though I&#8217;d be shocked if anything relevant was found there. And, of course, I didn&#8217;t find anything relevant; but what I did discover was that one of the menu options was &#8220;Read Mail (with RMAIL).&#8221; How many people in the entire freaking world are using RMAIL? Is there even one such person?  I read my e-mail in Emacs for a very long time, but even I moved off of RMAIL more than a decade before I gave up on reading e-mail in Emacs.)</p>
<p>So, I guess, that&#8217;s the reason why I&#8217;ll buy TextMate: because I want an editor that doesn&#8217;t have an actively hostile UI (and no, don&#8217;t suggest vi, its UI is at least as hostile), that can be used for programming, and that isn&#8217;t as super-bloated as IntelliJ or NetBeans or Eclipse or whatever. (Admittedly, I haven&#8217;t used NetBeans and Eclipse much, so maybe I&#8217;m mischaracterizing them.  But I doubt it.) $50 still seems like a ridiculous price to pay for it, and I&#8217;m worried by its apparently stalled development, but it has enough supporters that maybe it has virtues that I&#8217;m missing? If anybody has other editor suggestions, though, I&#8217;m all ears.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2010/11/i-am-getting-old/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>looking back at my first year at playdom</title>
		<link>http://malvasiabianca.org/archives/2010/11/looking-back-at-my-first-year-at-playdom/</link>
		<comments>http://malvasiabianca.org/archives/2010/11/looking-back-at-my-first-year-at-playdom/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 05:59:56 +0000</pubDate>
		<dc:creator>David Carlton</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Lean / Agile]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://malvasiabianca.org/?p=3953</guid>
		<description><![CDATA[It&#8217;s been a little more than a year since I joined Playdom, so I figured I should collect my thoughts about how it&#8217;s gone so far and get ideas about what I might want my next year to look like. Looking back, it&#8217;s kind of amazing how many different things I&#8217;ve done over that last [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been <a href="http://malvasiabianca.org/archives/2009/09/change-of-scene/">a little more than a year</a> since I joined Playdom, so I figured I should collect my thoughts about how it&#8217;s gone so far and get ideas about what I might want my next year to look like.  Looking back, it&#8217;s kind of amazing how many different things I&#8217;ve done over that last year; it&#8217;s certainly been a lot of fun!</p>
<p>Things I&#8217;ve liked:</p>
<ul>
<li>Great teammates: I&#8217;ve been on two teams here, and quite enjoyed being a part of both groups.</li>
<li>Having what I do make a difference in somebody else&#8217;s life in a matter of days or even hours; a <em>huge</em> change from my last job.</li>
<li>Being able to talk to people on the business side about what I&#8217;m doing, showing them the current state and asking for (and responding to!) feedback.</li>
<li>Learning technologies I wasn&#8217;t previously familiar with: JavaScript, a bit of ActionScript, a bit of Hadoop. And getting a chance to put a CSS Zen approach to concrete use, too.</li>
<li>Tools supporting agile programming: getting to use an IDE with refactoring support; using a mocking framework.</li>
<li>Brushing up on Java isn&#8217;t a bad idea, though not inherently exciting; at least it helps reduce my risk of being pigeonholed as a C++ guy.</li>
<li>Doing front-end work; I love getting to work with what our artists create.</li>
<li>Being a programmer instead of a manager.</li>
<li>Working with games; getting back to playing board games regularly.</li>
<li>Deepening my appreciation of testing by looking at business metrics.</li>
<li>Getting experience with growing a successful product.</li>
</ul>
<p>I could probably write one or more blog posts about each of those; lots of great experiences, in retrospect it&#8217;s a bit hard to believe all that happened over one year! But that&#8217;s last year, what do I want out of next year?</p>
<p>More exposure to new technologies would be nice, though I imagine the rate there will slow down. Still, there are some possibilities: I imagine I&#8217;ll get more familiar with ActionScript, I might get exposed to Lua.  (And I might get more exposed to PHP, though I can&#8217;t say that I&#8217;m excited about that.) Might get to learn more about data scaling ideas, too.</p>
<p>Helping add significant new features to an existing game has been rather interesting, and I&#8217;m glad I did it.  On the flip side, though, I&#8217;d like to work on a new game at some point, to get a better feel for the tradeoffs that are relevant there.</p>
<p>And then there are teams and roles.  I&#8217;d been a manager on a team where we had some agile theory but had a hard time putting it into practice, especially on the business side.  It&#8217;s been nice being a non-manager, and having a much tighter turnaround for the customers and customer proxies.</p>
<p>Ideally, I&#8217;d like to be on a team merging some of my previous experience with the virtues of my recent experience. Adding a bit more agile theory (and lean theory) to what we&#8217;re doing at Playdom would help, I think, but not at the cost of losing the virtues of our current approach. And the more the team (broadly conceived, of course, not just the programmers) works as empowered individuals evolving a common creative vision, the better. (I don&#8217;t want to be a manager, but I don&#8217;t want to be told what to do by a manager, either!)</p>
<p>Good times past; looking forward to good times future.</p>
]]></content:encoded>
			<wfw:commentRss>http://malvasiabianca.org/archives/2010/11/looking-back-at-my-first-year-at-playdom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced (User agent is rejected)
Database Caching 6/17 queries in 0.059 seconds using disk: basic

Served from: malvasiabianca.org @ 2012-02-09 14:44:16 -->
